fabro/docs/public
Bryan Helmkamp f07bb4aaba
feat(cli): support sparse input overrides (#222)
## Summary
- Add repeatable `-I` / `--input KEY=VALUE` CLI overrides for workflow
run inputs on `fabro run`, `fabro create`, and `fabro preflight`. CLI
inputs are sparse per-key overrides that merge over the resolved config
inputs (preserving unrelated inherited values), unlike TOML
`[run.inputs]` which still replaces wholesale.
- Manifest bundling and graph-level goal resolution render workflow
source with the effective inputs before structural scanning, so
input-driven `@prompt`, `import`, and `stack.child_workflow` paths get
bundled correctly.
- Persist raw `KEY=VALUE` strings on `ManifestArgs.input` so server-side
replay applies the same sparse overrides on top of merged config.
- Review-driven cleanups: shared `TemplateContext::for_input_scan`
helper for the recurring "render inputs but defer goal" idiom (replaces
4 sites), `#[derive(Default)]` on `ManifestBuildInput` to drop
boilerplate, inline trivial `apply_input_overrides` wrapper, drop a
redundant clone, and tighten the parser/test helpers.

## Test plan
- [ ] `cargo nextest run -p fabro-cli -p fabro-config -p fabro-server -p
fabro-template -p fabro-workflow`
- [ ] `cargo +nightly-2026-04-14 fmt --check --all`
- [ ] `cargo +nightly-2026-04-14 clippy -p fabro-cli -p fabro-config -p
fabro-server -p fabro-template -p fabro-workflow --all-targets -- -D
warnings`
- [ ] Smoke: `fabro run <workflow> -I key=value --input other=42`
overrides those keys while preserving unrelated inherited inputs
- [ ] Smoke: `-I` accepts strings, integers, floats, booleans, empty
values; rejects arrays, inline tables, datetimes; rejects missing `=`
and empty key
- [ ] Smoke: input-driven `@prompts/{{ inputs.foo }}` and
`stack.child_workflow="{{ inputs.bar }}/workflow.fabro"` paths bundle
correctly when overridden via `-I`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 10:00:35 -04:00
..
administration feat(cli): support sparse input overrides (#222) 2026-05-09 10:00:35 -04:00
agents docs: sync command output docs 2026-05-08 17:16:17 -07:00
api-reference feat(cli): support sparse input overrides (#222) 2026-05-09 10:00:35 -04:00
changelog docs(changelog): refresh recent product changes 2026-05-08 14:44:18 -07:00
core-concepts docs: sync public docs to recent runtime changes 2026-05-04 11:43:03 -04:00
examples fix(workflows): pin clippy and fmt to nightly-2026-04-14 2026-05-03 17:32:46 -04:00
execution feat(cli): support sparse input overrides (#222) 2026-05-09 10:00:35 -04:00
getting-started docs(deployment): split into local vs self-hosted, drop Render/Fly/DO 2026-05-01 09:26:35 -04:00
human-tools feat(workflows): add interview workflow 2026-05-08 07:44:33 -07:00
images refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00
integrations docs: sync public docs to recent runtime changes 2026-05-06 07:39:09 -04:00
languages refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00
logo refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00
reference feat(cli): support sparse input overrides (#222) 2026-05-09 10:00:35 -04:00
tutorials docs: sync public docs to recent runtime changes 2026-04-30 08:35:53 -04:00
workflows feat(cli): support sparse input overrides (#222) 2026-05-09 10:00:35 -04:00
.mintignore refactor(docs): move .mintignore into docs/public and update skill paths 2026-04-27 07:29:59 -07:00
docs.json docs(changelog): refresh recent product changes 2026-05-08 14:44:18 -07:00
dot-highlight.js refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00
favicon.svg refactor(docs): split docs/ into public/ and internal/ 2026-04-27 07:21:13 -07:00