@open-agent-toolkit/cli 0.2.58 → 0.2.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/configuration.md +16 -0
  3. package/assets/docs/cli-utilities/workflow-gates.md +88 -3
  4. package/assets/docs/contributing/skills.md +27 -5
  5. package/assets/docs/provider-sync/commands.md +23 -0
  6. package/assets/docs/workflows/projects/autonomy.md +5 -2
  7. package/assets/docs/workflows/projects/dispatch-ceiling.md +43 -7
  8. package/assets/docs/workflows/projects/implementation-execution.md +5 -2
  9. package/assets/docs/workflows/projects/lifecycle.md +4 -3
  10. package/assets/public-package-versions.json +4 -4
  11. package/assets/skills/oat-project-autonomous/SKILL.md +1 -1
  12. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +45 -38
  13. package/assets/skills/oat-project-design/SKILL.md +10 -5
  14. package/assets/skills/oat-project-discover/SKILL.md +10 -5
  15. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +45 -38
  16. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  17. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +43 -9
  18. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +14 -8
  19. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +45 -38
  20. package/assets/skills/oat-project-import-plan/SKILL.md +29 -4
  21. package/assets/skills/oat-project-next/SKILL.md +29 -2
  22. package/assets/skills/oat-project-plan/SKILL.md +29 -4
  23. package/assets/skills/oat-project-plan-writing/SKILL.md +95 -1
  24. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +45 -38
  25. package/assets/skills/oat-project-progress/SKILL.md +12 -1
  26. package/assets/skills/oat-project-quick-start/SKILL.md +29 -4
  27. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +45 -38
  28. package/assets/skills/oat-project-review-provide/SKILL.md +13 -6
  29. package/assets/skills/oat-project-review-provide-remote/SKILL.md +12 -5
  30. package/assets/templates/state.md +4 -1
  31. package/dist/commands/gate/index.d.ts.map +1 -1
  32. package/dist/commands/gate/index.js +102 -8
  33. package/dist/commands/init/index.d.ts.map +1 -1
  34. package/dist/commands/init/index.js +16 -1
  35. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  36. package/dist/commands/project/dispatch-ceiling/index.js +10 -1
  37. package/dist/commands/remove/skill/remove-skill.d.ts.map +1 -1
  38. package/dist/commands/remove/skill/remove-skill.js +10 -1
  39. package/dist/commands/shared/frontmatter.d.ts +32 -1
  40. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  41. package/dist/commands/shared/frontmatter.js +92 -0
  42. package/dist/commands/status/index.d.ts.map +1 -1
  43. package/dist/commands/status/index.js +8 -1
  44. package/dist/commands/sync/apply.d.ts.map +1 -1
  45. package/dist/commands/sync/apply.js +40 -6
  46. package/dist/commands/sync/index.d.ts.map +1 -1
  47. package/dist/commands/sync/index.js +11 -17
  48. package/dist/commands/sync/sync.types.d.ts +6 -6
  49. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  50. package/dist/config/resolve.d.ts +16 -0
  51. package/dist/config/resolve.d.ts.map +1 -1
  52. package/dist/config/resolve.js +16 -8
  53. package/dist/engine/execute-plan.d.ts.map +1 -1
  54. package/dist/engine/execute-plan.js +6 -0
  55. package/dist/manifest/index.d.ts +2 -1
  56. package/dist/manifest/index.d.ts.map +1 -1
  57. package/dist/manifest/index.js +1 -1
  58. package/dist/manifest/manager.d.ts +40 -0
  59. package/dist/manifest/manager.d.ts.map +1 -1
  60. package/dist/manifest/manager.js +35 -0
  61. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.58"
3
+ "oatVersion": "0.2.59"
4
4
  }
@@ -367,6 +367,22 @@ Repo-local and user config can also hold workflow defaults, including
367
367
  example, one user may prefer `claude -p` as a gate target while another prefers
368
368
  `codex exec`.
369
369
 
370
+ ### Per-project gate posture
371
+
372
+ Project state is a separate surface from the five config layers. One project can
373
+ disable a configured lifecycle gate for itself through
374
+ `oat_skill_gate_overrides` in that project's `state.md`, keyed by gate-aware
375
+ skill name with the single permitted value `disabled`.
376
+
377
+ Config layers decide whether a gate exists; the project override then decides
378
+ whether an existing gate runs for that project. An override never creates
379
+ configuration, never mutates any config layer, and is never written by a
380
+ non-interactive run. Resolve it with
381
+ `oat gate resolve <skill> --project <path-or-name> --json`; without `--project`
382
+ the command keeps its original raw output. See
383
+ [Workflow gates](./workflow-gates.md) for the full resolution envelope and the
384
+ phase-review and autonomous exclusions.
385
+
370
386
  In practice, you usually inspect these via:
371
387
 
372
388
  ```bash
@@ -68,6 +68,83 @@ in skill frontmatter with `oat_gateable: true`, and
68
68
  `oat internal validate-oat-skills` warns when config targets a missing or
69
69
  non-gateable skill.
70
70
 
71
+ ### Per-project gate overrides
72
+
73
+ Gate configuration is shared, but one project can opt out of a configured
74
+ lifecycle gate without changing any config layer. The override lives only in
75
+ that project's `state.md`:
76
+
77
+ ```yaml
78
+ oat_skill_gate_overrides:
79
+ oat-project-implement: disabled
80
+ ```
81
+
82
+ The map is strict. Keys are gate-aware skill names and the only permitted value
83
+ is the literal `disabled`. Arrays, booleans, `enabled`, unknown values,
84
+ duplicate keys, and malformed maps are rejected with the offending project state
85
+ path. An absent map means follow configuration; keeping every gate leaves the
86
+ map absent.
87
+
88
+ Override keys are accepted only for skills that declare `oat_gateable: true`.
89
+ A configured gate may still be resolved and executed for a lifecycle skill that
90
+ is not gate-aware — `oat-project-discover` and `oat-project-design` are the
91
+ current examples — but because no override key for such a skill is accepted,
92
+ their configured gates apply to every project and cannot be disabled per
93
+ project.
94
+
95
+ Precedence is layered, not merged: config layers decide whether a gate exists
96
+ at all, and the project override then decides whether an existing gate runs for
97
+ that project. An override never creates configuration, so a project may record
98
+ an override for a skill that has no configured gate; the gate stays absent.
99
+ Overrides never mutate shared, local, or user config, and config changes never
100
+ rewrite a project's override.
101
+
102
+ Interactive project setup offers a keep-or-disable choice per configured gate,
103
+ one skill at a time; there is no single switch that disables every gate.
104
+ Non-interactive runs never prompt and never write a new map, and an explicit
105
+ existing map is preserved unchanged on resume and import.
106
+
107
+ Resolution is opt-in. Without `--project`, `oat gate resolve` keeps returning
108
+ the raw `GateConfig | null` that existing consumers parse:
109
+
110
+ ```bash
111
+ oat gate resolve oat-project-implement --json
112
+ ```
113
+
114
+ With project context it returns a discriminated envelope instead:
115
+
116
+ ```bash
117
+ oat gate resolve oat-project-implement --project "$PROJECT_PATH" --json
118
+ ```
119
+
120
+ The envelope's `resolution` is one of three values:
121
+
122
+ | `resolution` | Meaning | `configuredGate` | `effectiveGate` |
123
+ | -------------------------------- | ----------------------------------------- | ---------------- | --------------- |
124
+ | `configured` | A configured gate runs for this project. | the gate | the gate |
125
+ | `configured_disabled_by_project` | Configured, but this project disabled it. | the gate | `null` |
126
+ | `not_configured` | No gate is configured for this skill. | `null` | `null` |
127
+
128
+ `configured_disabled_by_project` retains `configuredGate` so evidence of a
129
+ deliberate opt-out can never be mistaken for absent configuration. It also
130
+ carries `configSource` and a `projectOverride` record naming the
131
+ `state.md:oat_skill_gate_overrides` source.
132
+
133
+ `configSource` reports the layer that owned the decision. For
134
+ `not_configured` it is the layer that explicitly declared the skill `null`, and
135
+ `null` only when no layer mentions the skill at all, so a deliberate
136
+ layer-level disable stays distinguishable from an absent declaration.
137
+ `configuredGate` is `null` in both cases, so neither reads as configured.
138
+
139
+ Disabled is a posture, not an outcome. A project-disabled gate launches no
140
+ process and never enters the passed, missing, or failed branches. Project
141
+ progress reports every active override by skill key so the deliberate posture
142
+ stays visible to reviewers.
143
+
144
+ This mechanism covers configured lifecycle skill gates only. It does not affect
145
+ the optional `oat_phase_review_gate`, HiLL policy, or autonomous design-gate
146
+ behavior, and it cannot disable every gate with one project-wide boolean.
147
+
71
148
  ### Implementation exit-gate closeout
72
149
 
73
150
  For `oat-project-implement`, the configured skill gate is a final, resumable
@@ -82,14 +159,22 @@ configured command. The state records:
82
159
 
83
160
  - `pending`, `allowed`, `blocked`, or `stale` status;
84
161
  - a `configured` or `no_gate` resolution;
85
- - `passed`, `warned`, `prompt_approved`, or `no_gate` allowed dispositions;
162
+ - `passed`, `warned`, `prompt_approved`, `project_disabled`, or `no_gate`
163
+ allowed dispositions;
86
164
  - the resolved configuration fingerprint, reviewed HEAD, implementation
87
165
  fingerprint, gate run, envelope, and receive provenance; and
88
166
  - launch and receive reconciliation data needed to resume without duplicating
89
167
  an accepted run or completed receive.
90
168
 
91
- A `null` resolution is explicit success for that closeout generation:
92
- `allowed/no_gate` with `disposition: no_gate`. Configured success becomes
169
+ Only a `not_configured` resolution is explicit success for that closeout
170
+ generation: `allowed/no_gate` with `disposition: no_gate`. A null, missing,
171
+ malformed, or unrecognized resolver result fails closed as unresolved and is
172
+ never treated as no gate. A gate this project disabled
173
+ persists `allowed/configured` with `disposition: project_disabled`, the
174
+ configured command retained as never-executed evidence, null launch and receive
175
+ provenance, and a `project_override` record. `config_fingerprint` covers the
176
+ resolved override state, so re-enabling the gate changes the fingerprint and a
177
+ stored `project_disabled` result is routed as stale instead of reused. Configured success becomes
93
178
  `allowed/passed`; `warn` and an explicit `prompt` continuation persist their
94
179
  own allowed dispositions only for a validated, receive-eligible `blocked`
95
180
  envelope after eligible receive completes durably. Unresolved, malformed,
@@ -277,15 +277,37 @@ Use `create-agnostic-skill` or `create-oat-skill` as the starting point; both in
277
277
 
278
278
  ## Gate-aware skills
279
279
 
280
- A skill that supports configured final gates must declare `oat_gateable: true`
280
+ A skill that supports configured final gates should declare `oat_gateable: true`
281
281
  in frontmatter and include a final Gate Execution step in its process contract.
282
- Without both pieces, a configured `workflow.gates.skills.<skill>` entry is a
283
- validation warning rather than an executable contract.
282
+ Without both pieces, a configured `workflow.gates.skills.<skill>` entry raises a
283
+ `Configured gate targets skill without oat_gateable: true` validation warning.
284
+
285
+ The warning does not make the gate inert. `oat_gateable` governs per-project
286
+ override eligibility, not executability: `oat gate resolve` runs the same
287
+ lookup for every skill name, so a configured gate on a non-gate-aware skill
288
+ still resolves as `configured` and still executes if that skill carries a Gate
289
+ Execution step. `oat-project-discover` and `oat-project-design` are the current
290
+ examples. Because no `oat_skill_gate_overrides` key is accepted for a skill
291
+ outside `oat_gateable`, their configured gates apply to every project and can
292
+ never resolve `configured_disabled_by_project`. Prefer declaring
293
+ `oat_gateable: true` for any skill whose gate should be disableable per project.
284
294
 
285
295
  The Gate Execution step should:
286
296
 
287
- 1. Run `oat gate resolve <this-skill> --json`.
288
- 2. Treat `null` as "no gate configured."
297
+ 1. Run `oat gate resolve <this-skill> --project "$PROJECT_PATH" --json`
298
+ (`$PROJECT_PATH` is the resolved project path exported in step 3).
299
+ Project context is required. Without `--project` the command returns the
300
+ legacy raw gate and can never report a project override, so the skill would
301
+ silently run a gate the project deliberately disabled.
302
+ 2. Handle all three `resolution` values explicitly:
303
+ - `configured` - run `effectiveGate` exactly as configured.
304
+ - `configured_disabled_by_project` - the project disabled this configured gate. Do not launch any process; emit `configured but disabled by project override`, including the project path and the `projectOverride` source, and finish the skill. The returned `configuredGate` is evidence only and is never executed.
305
+ - `not_configured` - no gate is configured; finish the skill.
306
+
307
+ A null, missing, malformed, or unrecognized result is an operational failure
308
+ that fails closed as unresolved. Never treat it as "no gate configured." See
309
+ [Per-project gate overrides](../cli-utilities/workflow-gates.md#per-project-gate-overrides).
310
+
289
311
  3. Export the resolved path with `export PROJECT_PATH` before launching the
290
312
  command shell.
291
313
  4. For `oat gate review`, require the configured command to use
@@ -88,6 +88,29 @@ Key behavior:
88
88
  `versionSkew` array (`{ scope, producingVersion, invokingVersion }`) in both
89
89
  `--dry-run` and apply envelopes; a scope without skew is omitted from the
90
90
  array.
91
+ - When a run's only effect is that restamp — no planned operations and no
92
+ failures, but skew present — apply reports
93
+ `Manifest version refreshed; no content changes required.` instead of
94
+ `No changes required.`, so a manifest write is never described as a no-op.
95
+
96
+ `oat sync` is not the only command that replaces a manifest's producer version.
97
+ `oat init`, `oat remove skill`, and `oat status` each capture the manifest's
98
+ pre-mutation `oatVersion` while loading and planning, compare it with the
99
+ invoking CLI version, and log the same advisory immediately before a qualifying
100
+ save when the two differ:
101
+
102
+ ```text
103
+ Manifest version restamp [init user]: manifest produced by oat "0.2.58" will be restamped to oat "0.2.59".
104
+ ```
105
+
106
+ The advisory sits immediately before the save, so a run that aborts earlier
107
+ never announces a restamp it did not perform; a save that fails after the
108
+ advisory still leaves the manifest unrestamped. An equal or absent version stays
109
+ quiet. JSON mode suppresses the human warning; `oat init` and `oat remove skill`
110
+ report the applied restamps under a top-level `manifestVersionRestamps` array of
111
+ `{ scope, producingVersion, invokingVersion }` entries. The `oat remove skill`
112
+ dry-run payload omits the field rather than naming a restamp no save will
113
+ perform.
91
114
 
92
115
  Preview project and user cleanup before applying it:
93
116
 
@@ -136,8 +136,11 @@ At final closeout, autonomy follows the same authoritative order as an
136
136
  interactive run: final verification, mandatory final lifecycle review,
137
137
  configured implementation exit gate, pre-approval sequence, final HiLL
138
138
  approval, post-approval sequence, then implementation completion and success
139
- output. A null gate resolution persists an explicit no-gate allowance before
140
- the sequence starts.
139
+ output. A `not_configured` resolution persists an explicit no-gate allowance
140
+ before the sequence starts; a null, missing, or unrecognized resolver result
141
+ fails closed as unresolved. A gate this project disabled persists an
142
+ `allowed/configured` result with `disposition: project_disabled` and never
143
+ launches the configured command.
141
144
 
142
145
  Autonomy does not turn an ordinary independent review into configured-gate
143
146
  provenance. A configured review must produce a gate-originated artifact with
@@ -438,7 +438,8 @@ write authority. See
438
438
  ## Dispatch Report V1 and Producer Provenance
439
439
 
440
440
  Resolver calls that pass `--report-scope` and `--report-action` include a
441
- `dispatchReport` object in JSON output. Consumers must require
441
+ `dispatchReport` object in JSON output, plus the additive `dispatchStamp`
442
+ string described below. Consumers must require
442
443
  `dispatchReport.schemaVersion: 1` before dispatch. The report keeps these
443
444
  concerns separate:
444
445
 
@@ -485,18 +486,53 @@ also retain a parseable compatibility stamp for later review gates:
485
486
  Dispatch: scope=p06-t03 action=implementation role=implementer producer=gpt-5.6-sol provenance=declared model_axis=selected:gpt-5.6-sol effort_axis=selected:high dispatch_policy=high dispatch_ceiling=high target=oat-phase-implementer-gpt-5-6-sol-high
486
487
  ```
487
488
 
488
- The stamp must be derived through `toDispatchStampRecord(dispatchReport)` and
489
- `formatDispatchStamp`; callers must not reconstruct it from policy labels, role
490
- names, candidate strings, or target names. `producer` is the runtime model slug
491
- when OAT can establish it; otherwise it is `unknown`. `provenance` is
492
- `declared`, `observed`, `inferred`, or `unknown`. Selected model and effort axes
493
- can remain exact even when runtime producer identity is not reported.
489
+ `producer` is the runtime model slug when OAT can establish it; otherwise it is
490
+ `unknown`. `provenance` is `declared`, `observed`, `inferred`, or `unknown`.
491
+ Selected model and effort axes can remain exact even when runtime producer
492
+ identity is not reported.
494
493
 
495
494
  Before launching an implementation, fix, or reviewer, surface the structured
496
495
  notices in `dispatchReport.notices` and render the report. Structured notices
497
496
  and runtime disclosure use the effective target returned by that resolver call,
498
497
  never a target inferred from the bundled recommendation version.
499
498
 
499
+ ### The additive `dispatchStamp` field
500
+
501
+ JSON responses that carry `dispatchReport` also carry `dispatchStamp`, a single
502
+ canonical string produced by the same formatter that owns the grammar above:
503
+
504
+ ```json
505
+ {
506
+ "status": "resolved",
507
+ "dispatchReport": { "schemaVersion": 1 },
508
+ "dispatchStamp": "Dispatch: scope=p06-t03 action=implementation role=implementer ..."
509
+ }
510
+ ```
511
+
512
+ Field eligibility matches report eligibility exactly. The field is present when
513
+ and only when `dispatchReport` is present, so non-report resolver calls and
514
+ error envelopes never carry it. `DispatchReportV1`, its schema version, and the
515
+ stamp grammar are unchanged; the field is purely additive.
516
+
517
+ Eligibility tracks report presence, not dispatch authorization or exit code. A
518
+ `status: blocked` response that was asked for report context therefore carries
519
+ both `dispatchReport` and `dispatchStamp` while still exiting `1`: the stamp
520
+ records what OAT resolved, and a blocked resolution is a resolved fact about an
521
+ unusable route rather than a missing report. Only a call without report context,
522
+ or an error envelope that never built a report, omits the field.
523
+
524
+ Consumers read `dispatchStamp` directly, validate that it is a non-empty string
525
+ beginning with the canonical `Dispatch:` prefix, and copy it byte-for-byte into
526
+ dispatch and audit metadata. Reformatting the report through
527
+ `toDispatchStampRecord(dispatchReport)` and `formatDispatchStamp` is an optional
528
+ corroboration where that library is already loaded; it is never the normal path,
529
+ and no out-of-tree shim is required. Callers must not reconstruct the stamp from
530
+ policy labels, role names, candidate strings, or target names.
531
+
532
+ A stamp carrying `producer=unknown provenance=unknown` is truthful, not
533
+ degraded: the resolver reports configured invocation, and those fields stay
534
+ `unknown` until an independent runtime observation exists.
535
+
500
536
  ## Legacy Compatibility
501
537
 
502
538
  The following remain readable during migration:
@@ -250,8 +250,11 @@ for another.
250
250
 
251
251
  Resolution and policy outcomes are explicit:
252
252
 
253
- - A null resolution persists `allowed/no_gate` for the current implementation
254
- basis.
253
+ - A `not_configured` resolution persists `allowed/no_gate` for the current
254
+ implementation basis; a null, missing, or unrecognized resolver result fails
255
+ closed as unresolved instead.
256
+ - A gate the project disabled persists `allowed/configured` with
257
+ `disposition: project_disabled` and never launches.
255
258
  - A configured passing review persists `allowed/passed` after any eligible
256
259
  review receive is durably completed.
257
260
  - `warn` persists `allowed/warned`; `prompt` proceeds only after explicit
@@ -56,9 +56,10 @@ Implementation closeout has one authoritative order:
56
56
 
57
57
  The configured exit gate is independent from the mandatory lifecycle review,
58
58
  root-owned phase reviews, and optional `oat_phase_review_gate`. It must reach an
59
- allowed and fresh disposition before pre-approval work starts. A null
60
- configuration is recorded explicitly as `allowed/no_gate`; it is not inferred
61
- from missing state.
59
+ allowed and fresh disposition before pre-approval work starts. A
60
+ `not_configured` resolution is recorded explicitly as `allowed/no_gate`; it is
61
+ not inferred from missing state, and a null, missing, or unrecognized resolver
62
+ result fails closed as unresolved instead.
62
63
 
63
64
  After implementation closeout finishes:
64
65
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.58",
3
- "docs-config": "0.2.58",
4
- "docs-theme": "0.2.58",
5
- "docs-transforms": "0.2.58"
2
+ "cli": "0.2.59",
3
+ "docs-config": "0.2.59",
4
+ "docs-theme": "0.2.59",
5
+ "docs-transforms": "0.2.59"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-autonomous
3
- version: 1.0.10
3
+ version: 1.0.11
4
4
  description: Use when a user explicitly asks to run an OAT project autonomously end-to-end. Activates session-only autonomy, resumes the correct lifecycle phase, and drives the existing OAT skills through final PR or a reported boundary.
5
5
  argument-hint: '<goal | project-slug | ticket-ref>'
6
6
  disable-model-invocation: true