|
| 1 | +# Open-Source Launch Plan — arazzo-cli |
| 2 | + |
| 3 | +## Current State |
| 4 | + |
| 5 | +- Readiness: ~72% |
| 6 | +- Spec coverage: ~91% (Phases 1-3 complete) |
| 7 | +- Codebase: 17,767 lines Rust, 199 tests passing, strict lints |
| 8 | +- CI: fmt + clippy + test + VS Code extension build |
| 9 | +- Gaps: packaging metadata, documentation, examples, distribution, testing breadth |
| 10 | + |
| 11 | +--- |
| 12 | + |
| 13 | +## Phase A: Foundations (Tier 1 blockers) |
| 14 | + |
| 15 | +Low effort, high impact. All required before tagging v0.1.0. |
| 16 | + |
| 17 | +### A1. Commit `Cargo.lock` |
| 18 | + |
| 19 | +Rust best practice for binary crates — ensures reproducible builds. |
| 20 | + |
| 21 | +- [ ] Remove `/Cargo.lock` from `.gitignore` if present |
| 22 | +- [ ] `cargo generate-lockfile` if missing |
| 23 | +- [ ] Commit |
| 24 | + |
| 25 | +### A2. Crate publishing metadata |
| 26 | + |
| 27 | +Add to `[workspace.package]` in root `Cargo.toml`: |
| 28 | + |
| 29 | +- [ ] `description = "Standalone Arazzo 1.0 workflow executor and debugger"` |
| 30 | +- [ ] `repository = "https://github.com/strefethen/arazzo-cli"` |
| 31 | +- [ ] `homepage = "https://github.com/strefethen/arazzo-cli"` |
| 32 | +- [ ] `keywords = ["arazzo", "openapi", "workflow", "api", "cli"]` |
| 33 | +- [ ] `categories = ["command-line-utilities", "web-programming"]` |
| 34 | +- [ ] `readme = "README.md"` |
| 35 | + |
| 36 | +Per-crate overrides where needed: |
| 37 | + |
| 38 | +- [ ] `arazzo-spec`: description = "Typed Arazzo 1.0 domain model" |
| 39 | +- [ ] `arazzo-validate`: description = "Arazzo YAML parser and structural validator" |
| 40 | +- [ ] `arazzo-expr`: description = "Arazzo expression language parser and evaluator" |
| 41 | +- [ ] `arazzo-runtime`: description = "Arazzo workflow execution engine" |
| 42 | +- [ ] `arazzo-cli`: description = "CLI for executing Arazzo 1.0 API workflow specifications" |
| 43 | +- [ ] `arazzo-debug-adapter`: description = "Debug Adapter Protocol server for Arazzo workflows" |
| 44 | + |
| 45 | +### A3. Flip `publish` flag |
| 46 | + |
| 47 | +Decide which crates to publish: |
| 48 | + |
| 49 | +- [ ] `arazzo-spec` → `publish = true` (useful standalone) |
| 50 | +- [ ] `arazzo-validate` → `publish = true` |
| 51 | +- [ ] `arazzo-expr` → `publish = true` |
| 52 | +- [ ] `arazzo-runtime` → `publish = true` |
| 53 | +- [ ] `arazzo-cli` → `publish = true` (enables `cargo install arazzo-cli`) |
| 54 | +- [ ] `arazzo-debug-adapter` → keep `publish = false` (tightly coupled to CLI) |
| 55 | + |
| 56 | +### A4. Crate-level rustdoc |
| 57 | + |
| 58 | +Add `#![doc = "..."]` or `//!` module doc comments to each `lib.rs`: |
| 59 | + |
| 60 | +- [ ] `arazzo-spec/src/lib.rs` — overview of domain types, link to Arazzo spec |
| 61 | +- [ ] `arazzo-validate/src/lib.rs` — parsing entry point, error types |
| 62 | +- [ ] `arazzo-expr/src/lib.rs` — expression syntax reference, `EvalContext` usage |
| 63 | +- [ ] `arazzo-runtime/src/lib.rs` — engine lifecycle, `Engine::new` → `execute` |
| 64 | +- [ ] `arazzo-debug-adapter/src/lib.rs` — DAP architecture summary |
| 65 | +- [ ] Verify with `cargo doc --workspace --no-deps --open` |
| 66 | + |
| 67 | +### A5. CHANGELOG.md |
| 68 | + |
| 69 | +- [ ] Create `CHANGELOG.md` following [Keep a Changelog](https://keepachangelog.com/) format |
| 70 | +- [ ] Document v0.1.0 feature set: |
| 71 | + - Arazzo 1.0.1 spec coverage (~91%) |
| 72 | + - Expression language (all `$` expressions, `{$expr}` interpolation, operators) |
| 73 | + - HTTP execution with parameter types (header, query, path, cookie, body) |
| 74 | + - Control flow (onSuccess/onFailure, goto, retry, end) |
| 75 | + - Workflow-level defaults (parameters, actions) |
| 76 | + - Multiple source descriptions with `{name}./path` routing |
| 77 | + - Sub-workflow calls via `workflowId` |
| 78 | + - Dry-run mode, execution traces with redaction |
| 79 | + - VS Code debugger (breakpoints, stepping, variables, watch, call stack) |
| 80 | + - CLI commands: run, validate, list, catalog, show, schema |
| 81 | + |
| 82 | +### A6. Update README expression surface |
| 83 | + |
| 84 | +The Expression Language section is missing Phase 3 additions: |
| 85 | + |
| 86 | +- [ ] Add `$url` |
| 87 | +- [ ] Add `$request.header.Name`, `$request.query.Name`, `$request.path.Name` |
| 88 | +- [ ] Add `$request.body`, `$request.body.path`, `$request.body#/pointer` |
| 89 | +- [ ] Add `$sourceDescriptions.{name}.url` |
| 90 | +- [ ] Add `$outputs.name` (workflow outputs) |
| 91 | +- [ ] Add `$response.body#/json/pointer` (JSON Pointer syntax) |
| 92 | +- [ ] Add `{$expr}` interpolation notation |
| 93 | +- [ ] Add `{sourceName}./path` operationPath routing |
| 94 | + |
| 95 | +### A7. Verify `cargo publish --dry-run` |
| 96 | + |
| 97 | +- [ ] Run `cargo publish -p arazzo-spec --dry-run` for each publishable crate |
| 98 | +- [ ] Fix any packaging errors (missing fields, excluded files, etc.) |
| 99 | + |
| 100 | +**Readiness after Phase A: ~85%** |
| 101 | + |
| 102 | +--- |
| 103 | + |
| 104 | +## Phase B: Examples & Testing (Tier 2) |
| 105 | + |
| 106 | +Medium effort. Establishes credibility and demonstrates capability breadth. |
| 107 | + |
| 108 | +### B1. Example specs |
| 109 | + |
| 110 | +Each should be self-contained with a comment header explaining what it demonstrates. |
| 111 | + |
| 112 | +- [ ] `examples/multi-api-orchestration.arazzo.yaml` — two source descriptions, `{sourceName}./path` routing, `$sourceDescriptions.{name}.url` in outputs |
| 113 | +- [ ] `examples/auth-flow.arazzo.yaml` — cookie parameters, `{$expr}` interpolation in Authorization header, chained auth → data flow |
| 114 | +- [ ] `examples/error-handling-retry.arazzo.yaml` — onFailure with retry action, workflow-level failureActions as fallback, success criteria |
| 115 | +- [ ] `examples/sub-workflow.arazzo.yaml` — parent workflow calling child via `workflowId`, passing inputs, reading child outputs |
| 116 | +- [ ] Move or copy relevant parts of `testdata/error-handling.arazzo.yaml` into examples if appropriate |
| 117 | + |
| 118 | +### B2. CLI integration tests |
| 119 | + |
| 120 | +Using `assert_cmd` or `trycmd`: |
| 121 | + |
| 122 | +- [ ] Add `assert_cmd` and `predicates` to `arazzo-cli` dev-dependencies |
| 123 | +- [ ] Test `validate` command with valid spec → exit 0, JSON output |
| 124 | +- [ ] Test `validate` command with invalid spec → exit non-zero, error message |
| 125 | +- [ ] Test `list` command → outputs workflow IDs |
| 126 | +- [ ] Test `catalog` command on `examples/` directory |
| 127 | +- [ ] Test `run --dry-run` → outputs planned requests without network |
| 128 | +- [ ] Test `schema` command → valid JSON Schema output |
| 129 | +- [ ] Test `--json` flag produces valid JSON on all commands |
| 130 | + |
| 131 | +### B3. arazzo-spec serde round-trip tests |
| 132 | + |
| 133 | +- [ ] Parse each example spec → serialize back → parse again → assert equality |
| 134 | +- [ ] Test that unknown fields are rejected or preserved as expected |
| 135 | +- [ ] Test default values for optional fields |
| 136 | + |
| 137 | +### B4. `cargo audit` in CI |
| 138 | + |
| 139 | +- [ ] Add step to `ci.yml` after test: |
| 140 | + ```yaml |
| 141 | + - name: Security audit |
| 142 | + run: cargo install cargo-audit && cargo audit |
| 143 | + ``` |
| 144 | +- [ ] Or use `actions-rs/audit-check@v1` |
| 145 | + |
| 146 | +### B5. Cross-platform CI |
| 147 | + |
| 148 | +- [ ] Add matrix to `ci.yml`: |
| 149 | + ```yaml |
| 150 | + strategy: |
| 151 | + matrix: |
| 152 | + os: [ubuntu-latest, macos-latest, windows-latest] |
| 153 | + ``` |
| 154 | +- [ ] Windows may need special handling for `tiny_http` tests (firewall prompts) |
| 155 | + |
| 156 | +### B6. MSRV policy |
| 157 | + |
| 158 | +- [ ] Decide on MSRV (recommend: current stable minus 2, e.g., 1.78) |
| 159 | +- [ ] Add `rust-version = "1.78"` to `[workspace.package]` |
| 160 | +- [ ] Add MSRV CI job using `dtolnay/rust-toolchain` with the MSRV version |
| 161 | +- [ ] Document in README |
| 162 | + |
| 163 | +**Readiness after Phase B: ~93%** |
| 164 | + |
| 165 | +--- |
| 166 | + |
| 167 | +## Phase C: Distribution (Tier 2) |
| 168 | + |
| 169 | +Medium effort. Makes the project installable without cloning. |
| 170 | + |
| 171 | +### C1. Release automation with `cargo-dist` |
| 172 | + |
| 173 | +- [ ] `cargo install cargo-dist` |
| 174 | +- [ ] `cargo dist init` — generates `.github/workflows/release.yml` |
| 175 | +- [ ] Configure targets: `x86_64-unknown-linux-gnu`, `aarch64-apple-darwin`, `x86_64-apple-darwin`, `x86_64-pc-windows-msvc` |
| 176 | +- [ ] Test with `cargo dist build` |
| 177 | +- [ ] Commit the generated workflow |
| 178 | + |
| 179 | +### C2. Tag and publish v0.1.0 |
| 180 | + |
| 181 | +Order matters — publish library crates before the binary crate: |
| 182 | + |
| 183 | +- [ ] `cargo publish -p arazzo-spec` |
| 184 | +- [ ] `cargo publish -p arazzo-validate` |
| 185 | +- [ ] `cargo publish -p arazzo-expr` |
| 186 | +- [ ] `cargo publish -p arazzo-runtime` |
| 187 | +- [ ] `cargo publish -p arazzo-cli` |
| 188 | +- [ ] `git tag v0.1.0 && git push --tags` → triggers release workflow |
| 189 | + |
| 190 | +### C3. Homebrew tap (optional) |
| 191 | + |
| 192 | +- [ ] Create `homebrew-tap` repo |
| 193 | +- [ ] Add formula pointing to GitHub Release tarball |
| 194 | +- [ ] Document `brew install strefethen/tap/arazzo-cli` in README |
| 195 | + |
| 196 | +**Readiness after Phase C: ~97%** |
| 197 | + |
| 198 | +--- |
| 199 | + |
| 200 | +## Phase D: Polish (Tier 3) |
| 201 | + |
| 202 | +Lower priority. Long-term maturity items. |
| 203 | + |
| 204 | +### D1. Doc-tests on public APIs |
| 205 | + |
| 206 | +- [ ] Add `/// # Examples` blocks to key public functions in arazzo-expr, arazzo-validate, arazzo-runtime |
| 207 | +- [ ] Ensure `cargo test --doc --workspace` passes |
| 208 | +- [ ] Hosted docs auto-publish on docs.rs after crates.io publish |
| 209 | + |
| 210 | +### D2. Clean up stale internal docs |
| 211 | + |
| 212 | +- [ ] Review `docs/rust-migration-plan.md` — likely stale, remove or archive |
| 213 | +- [ ] Review `docs/weekwise-plans.md` — planning artifact, not user-facing |
| 214 | +- [ ] Review `docs/30-ideas.md`, `docs/5-best-ideas.md` — brainstorm artifacts |
| 215 | +- [ ] Keep: architecture, debugger, trace schema, extension guide, internal API |
| 216 | + |
| 217 | +### D3. Phase 4 spec features (v0.2.0 milestone) |
| 218 | + |
| 219 | +Coverage: 91% → 96% |
| 220 | + |
| 221 | +- [ ] `$workflows.{id}.inputs.{name}` / `$workflows.{id}.outputs.{name}` |
| 222 | +- [ ] `!` (NOT) operator in conditions |
| 223 | +- [ ] `()` grouping in conditions |
| 224 | +- [ ] `Retry-After` response header override |
| 225 | + |
| 226 | +### D4. Phase 5 spec features (v0.3.0 milestone) |
| 227 | + |
| 228 | +Coverage: 96% → 100% |
| 229 | + |
| 230 | +- [ ] `dependsOn` — inter-workflow dependency ordering with cycle detection |
| 231 | +- [ ] Payload Replacement Object — RFC 6901 JSON Pointer mutation in request bodies |
| 232 | + |
| 233 | +**Readiness after Phase D: ~100%** |
| 234 | + |
| 235 | +--- |
| 236 | + |
| 237 | +## Execution Order |
| 238 | + |
| 239 | +| Step | Phase | Effort | Depends On | |
| 240 | +|------|-------|--------|------------| |
| 241 | +| A1. Commit Cargo.lock | A | Trivial | — | |
| 242 | +| A2. Crate metadata | A | Low | — | |
| 243 | +| A3. Flip publish flag | A | Trivial | A2 | |
| 244 | +| A4. Crate-level rustdoc | A | Low | — | |
| 245 | +| A5. CHANGELOG.md | A | Low | — | |
| 246 | +| A6. Update README | A | Low | — | |
| 247 | +| A7. Verify publish dry-run | A | Low | A2, A3, A4 | |
| 248 | +| B1. Example specs | B | Medium | — | |
| 249 | +| B2. CLI integration tests | B | Medium | — | |
| 250 | +| B3. Spec round-trip tests | B | Low | — | |
| 251 | +| B4. cargo audit in CI | B | Low | — | |
| 252 | +| B5. Cross-platform CI | B | Medium | — | |
| 253 | +| B6. MSRV policy | B | Low | — | |
| 254 | +| C1. Release automation | C | Medium | A7 | |
| 255 | +| C2. Tag v0.1.0 | C | Low | A (all), C1 | |
| 256 | +| C3. Homebrew tap | C | Low | C2 | |
| 257 | +| D1. Doc-tests | D | Medium | A4 | |
| 258 | +| D2. Clean stale docs | D | Low | — | |
| 259 | +| D3. Phase 4 spec | D | High | — | |
| 260 | +| D4. Phase 5 spec | D | Very High | D3 | |
| 261 | + |
| 262 | +--- |
| 263 | + |
| 264 | +## Success Criteria |
| 265 | + |
| 266 | +- `cargo publish --dry-run` succeeds for all publishable crates |
| 267 | +- `cargo doc --workspace --no-deps` produces clean docs with crate-level summaries |
| 268 | +- `cargo test --workspace` passes (including new CLI integration tests) |
| 269 | +- `cargo audit` reports no known vulnerabilities |
| 270 | +- CI passes on Linux, macOS, and Windows |
| 271 | +- 5+ example specs covering distinct feature categories |
| 272 | +- CHANGELOG documents all v0.1.0 features |
| 273 | +- GitHub Release exists with pre-built binaries for 3 platforms |
| 274 | +- `cargo install arazzo-cli` works from crates.io |
0 commit comments