Skip to content

Commit 57f586e

Browse files
strefethenclaude
andcommitted
chore: add crate metadata, rustdoc, changelog, and fix test StepTarget migration
- Add workspace metadata (repository, homepage, publish = false) - Add crate-level descriptions to all Cargo.toml files - Add rustdoc comments to arazzo-runtime and arazzo-cli - Migrate test Step constructions from old operation_path/workflow_id/operation_id fields to target: Some(StepTarget::*) across lib.rs and debug_*.rs tests - Update README expression surface with all Phase 3 additions - Correct spec version references from "1.0" to "1.0.1" throughout - Add CHANGELOG.md documenting v0.1.0 features - Add OSS-LAUNCH-PLAN.md with release readiness roadmap - Run cargo fmt on engine_impl.rs, helpers.rs, runtime_core.rs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 155542d commit 57f586e

File tree

21 files changed

+704
-200
lines changed

21 files changed

+704
-200
lines changed

CHANGELOG.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Changelog
2+
3+
All notable changes to this project will be documented in this file.
4+
5+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7+
8+
## [0.1.0] - 2026-02-23
9+
10+
### Added
11+
12+
#### CLI
13+
- `run` command — execute workflows with inputs, headers, timeout, dry-run, parallel, and trace options
14+
- `validate` command — parse and structurally validate Arazzo YAML specs
15+
- `list` command — list workflows in a spec
16+
- `catalog` command — discover specs across a directory tree
17+
- `show` command — display workflow details
18+
- `schema` command — print JSON Schema for any command's `--json` output
19+
- `--json` flag on all commands for structured output
20+
- `--trace <path>` execution trace output with automatic sensitive value redaction
21+
22+
#### Expression Language
23+
- `$inputs.name` — workflow input parameters
24+
- `$steps.<id>.outputs.<name>` — previous step outputs
25+
- `$env.VAR_NAME` — environment variables (`.env` auto-loaded)
26+
- `$statusCode` — HTTP response status code
27+
- `$method` — HTTP method (GET, POST, etc.)
28+
- `$url` — fully constructed request URL
29+
- `$response.header.Name` — response header (case-insensitive)
30+
- `$response.body.path` — JSON dot-path body access
31+
- `$response.body#/json/pointer` — RFC 6901 JSON Pointer body access
32+
- `$request.header.Name` — request header introspection
33+
- `$request.query.Name` — request query parameter introspection
34+
- `$request.path.Name` — request path parameter introspection
35+
- `$request.body` / `$request.body.path` / `$request.body#/pointer` — request body introspection
36+
- `$outputs.name` — workflow outputs map (within `workflow.outputs`)
37+
- `$sourceDescriptions.{name}.url` — source description URL lookup
38+
- `{$expr}` interpolation in string values
39+
- `//xpath/expression` — XML/HTML body extraction
40+
- Condition operators: `==`, `!=`, `>`, `<`, `>=`, `<=`, `&&`, `||`, `contains`, `matches`, `in`
41+
42+
#### Workflow Engine
43+
- HTTP execution with parameter types: header, query, path, cookie, body
44+
- Control flow via `onSuccess` / `onFailure` actions (goto, retry, end)
45+
- Workflow-level default `successActions` and `failureActions`
46+
- Workflow-level `parameters` with step-level override
47+
- Sub-workflow calls via `workflowId` with input/output passing
48+
- Multiple source descriptions with `{sourceName}./path` operationPath routing
49+
- Retry actions with configurable delay and limit
50+
- Parallel step execution via `--parallel`
51+
- Dry-run mode (`--dry-run`) — resolves requests without sending
52+
53+
#### VS Code Debugger
54+
- Full Debug Adapter Protocol (DAP) implementation
55+
- Breakpoints on steps, success criteria, actions, and outputs
56+
- Conditional breakpoints using runtime expressions
57+
- Step Over, Step In, Step Out, Continue, Pause controls
58+
- Variable inspection: Locals, Request, Response, Inputs, Steps scopes
59+
- Watch expressions and hover evaluation
60+
- Call stack with sub-workflow depth tracking
61+
- Three-thread coordinator architecture (no deadlocks during slow HTTP)
62+
63+
#### Crate Workspace
64+
- `arazzo-spec` — typed Arazzo 1.0.1 domain model
65+
- `arazzo-validate` — YAML parser with structural validation
66+
- `arazzo-expr` — expression parser/evaluator with proptest fuzzing
67+
- `arazzo-runtime` — execution engine with debug controller
68+
- `arazzo-cli` — CLI binary
69+
- `arazzo-debug-adapter` — DAP server
70+
71+
#### Quality
72+
- `unsafe_code = "forbid"` across all crates
73+
- `unwrap_used = "deny"`, `expect_used = "deny"` via workspace clippy lints
74+
- Execution trace redaction for Authorization, Cookie, API keys, passwords
75+
- 199 tests, all hermetic (tiny_http test servers, no external API calls)
76+
- Proptest fuzzing on expression evaluator
77+
- CI: format, clippy, test, VS Code extension typecheck + build

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ resolver = "2"
1313
version = "0.1.0"
1414
edition = "2021"
1515
license = "MIT"
16+
repository = "https://github.com/strefethen/arazzo-cli"
17+
homepage = "https://github.com/strefethen/arazzo-cli"
1618
publish = false
1719

1820
[workspace.lints.rust]

OSS-LAUNCH-PLAN.md

Lines changed: 274 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
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

Comments
 (0)