Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 30 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,34 +130,44 @@ services:
ports: { http: 8080 }
```

Then, **working today**:
Then, the **headline flow**:

```bash
devstack init # author workspace.yaml (interactive wizard, or --flags)
devstack doctor # probe docker / composeβ‰₯2.20 / gitβ‰₯2.30 / ports / state dir
devstack config validate # validate workspace.yaml + every devstack.yaml (file:line:col errors)
devstack generate # render compose + Dockerfiles deterministically into .devstack/
devstack generate --check # CI gate: fail if generated artifacts are stale
devstack template list # the built-in service templates
devstack ws clone # clone every repo in parallel (your SSH/credential setup)
devstack ws status # cross-repo git table (branch, ahead/behind, dirty); --check for CI
devstack up # network β†’ shared services (health-gated) β†’ provision β†’ compose up
devstack status # composite: services + health + cross-repo git + ref graph
devstack down # tear the project stacks down (shared infra stays warm, ref-counted)

devstack generate --check # CI gate: fail if generated artifacts are stale
devstack shared status # shared-service ref counts + consuming projects
devstack secrets ingest .env # convert a committed .env into secret:// refs + config vars
```

## Commands

| Command | Status | What it does |
|---|---|---|
| `doctor` | βœ… | Environment capability matrix with one-line remediations (`--json`). |
| `up` / `down` / `status` | βœ… | The lifecycle saga: ensure network β†’ shared services (health-gated) β†’ provision per-project DB β†’ `compose up`; resumable, ref-counted. `status` is the composite services + git + ref-graph view. |
| `init` | βœ… | Author a `workspace.yaml` β€” an interactive wizard on a TTY, flag-driven otherwise. |
| `doctor` | βœ… | Environment capability matrix with one-line remediations (`--json`, `--fix`, `--rebuild-state`). |
| `config validate` / `show` | βœ… | Load + validate the two-file config; `file:line:col` errors. |
| `generate` | βœ… | Render + compose-go-validate compose/Dockerfiles; `--check`, `--project`, `--profile`. |
| `template list/lint/test/init` | βœ… | Author and validate service templates. |
| `template list/lint/test/init/new` | βœ… | Author and validate service templates; `new` is the authoring wizard. |
| `ws clone/sync/status/git` | βœ… | Bounded-parallel multi-repo git over the workspace. |
| `shared status` | βœ… | Shared-service ref counts and consuming projects. |
| `self check` / `self update` | βœ… | Version check and checksum-verified self-update. |
| `shared status/gc/doctor` | βœ… | Shared-service ref counts + consuming projects; reclaim zero-ref services; reconcile the ledger. |
| `secrets keygen/ingest/login/logout/status` | βœ… | SOPS+age / AWS / Infisical secrets; `ingest` converts a `.env` into `secret://` refs + vars. |
| `trust install/uninstall/status` | βœ… | Local-HTTPS CA via `mkcert`. |
| `dns setup/status/remove` | βœ… | `*.localhost` resolver wiring. |
| `tunnel login/create/route` | βœ… | Cloudflare tunnel (default down; refuses secret-bearing services). |
| `self check/update` | βœ… | Version check and checksum-verified self-update. |
| `store init/path/show` | βœ… | The global `~/.devstack` store: config + custom templates + shared defs. |
| `alias add/remove/list` | βœ… | `argv[0]` alias symlinks (`rq`, `uranus`, …). |
| `up` / `down` / `shell` / `logs` | 🚧 | Lifecycle saga β€” shared infra + provisioning + compose up (M2/M6). |
| `secrets` / `trust` / `dns` / `tunnel` | 🚧 | Secrets (M4) and networking (M5). |
| `import` | βœ… | Convert a legacy devdock `project.yaml` β†’ the clean-slate two-file schema. |
| `workspace destroy` / `uninstall` | βœ… | Tear down this workspace's stacks / reverse all machine-global artifacts. |
| `shell` | 🚧 | Open a shell in a service container (planned). |
| `logs` | 🚧 | Stream / aggregate service logs (planned β€” [spec 16](docs/specs/16-logs-and-dashboard.md)). |

Every headline command supports `--json` and `--quiet` for scripting/CI.

Expand All @@ -184,21 +194,22 @@ Postgres. `devstack store show` lists the configured shared services;
workspace β†’ validates `workspace.yaml` + each `devstack.yaml` β†’ renders a typed
Compose model (validated by `compose-go`, written deterministically) β†’ ensures a
tool-owned external Docker network and the shared stack β†’ provisions per-project
DB/role/bucket on demand β†’ drives `docker compose`. A machine-global SQLite ledger,
Postgres role/db on demand β†’ drives `docker compose`. A machine-global SQLite ledger,
guarded by a cross-process `flock` and keyed by Docker context, tracks shared-service
**reference counts** and port allocations so infra starts on demand and is reclaimed
when unused. See **[ARCHITECTURE.md](docs/ARCHITECTURE.md)**.

## Status

🚧 **Pre-1.0, in active development.** Implemented and green on `make ci` + `make determinism`:
πŸ§ͺ **Beta (0.x), on the `v0.2+` line.** Everything below is implemented and green on `make ci` + `make determinism`:

- **M0** β€” CLI tree + `argv[0]` aliasing, `flock` lock, SQLite ledger (Docker-context-keyed),
XDG/WSL2 handling, read-only Docker client + `doctor`.
- **M1** β€” two-file config loader; the full deterministic **templating + generation** pipeline.
- **M2 (core)** β€” ledger ref-counting + self-healing reconcile, Postgres provisioning,
`shared status`. *Remaining:* the `up`/`down` daemon saga.
- **M0–M1** β€” CLI tree + `argv[0]` aliasing, `flock` lock, SQLite ledger (Docker-context-keyed), XDG/WSL2 handling, the read-only Docker client + `doctor`; the two-file config loader and the full deterministic **templating + generation** pipeline.
- **M2** β€” shared-services lifecycle: tool-owned network, ledger ref-counting + self-healing reconcile, per-project Postgres provisioning, port allocation, `shared status/gc/doctor`, and the **`up`/`down` saga** (network β†’ shared β†’ provision β†’ compose-up β†’ hooks, resumable).
- **M3** β€” multi-repo git (`gitx` + `ws clone/sync/status/git`).
- **M4–M7** β€” secrets (`secret://` + SOPS+age/AWS/Infisical, no plaintext on disk), networking (Caddy proxy, `mkcert` trust, cloudflared tunnel, `dns`), orchestration glue (health gating, lifecycle hooks, profiles), `doctor --fix`, `workspace destroy`/`uninstall`, and self-update + `devstack import`.
- **M8 (beta DX)** β€” `init` wizard, `template new` authoring, `secrets ingest` (`.env` β†’ secrets), and conventional-commit **release automation** (released **v0.2.0+** automatically).

**Next:** the **M9 local-cloud lane** (specs [26](docs/specs/26-cli-completeness.md)–[29](docs/specs/29-resource-commands.md)) β€” finish the CLI surface (`shell`, `logs`, `workspace list`), then a data-plane **resource layer** (databases/users, S3 buckets + lifecycle, queues, streams) and cloud-emulation **engines** (LocalStack, NATS, Kafka). The only command stubs today are `shell` and `logs`.

Then: secrets (M4) Β· networking/local-HTTPS (M5) Β· orchestrated onboarding + health
+ hooks (M6) Β· hardening + GA (M7). See **[ROADMAP.md](docs/ROADMAP.md)**.
Expand Down