@open-agent-toolkit/cli 0.2.62 → 0.2.64
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.
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/config-and-local-state.md +1 -0
- package/assets/docs/cli-utilities/configuration.md +10 -8
- package/assets/docs/cli-utilities/project-log.md +16 -0
- package/assets/docs/cli-utilities/tool-packs.md +83 -0
- package/assets/docs/cli-utilities/workflow-gates.md +124 -16
- package/assets/docs/contributing/skills.md +42 -7
- package/assets/docs/provider-sync/commands.md +3 -0
- package/assets/docs/provider-sync/instruction-sync.md +107 -0
- package/assets/docs/provider-sync/manifest-and-drift.md +105 -0
- package/assets/docs/reference/cli-reference.md +16 -6
- package/assets/docs/reference/oat-directory-structure.md +32 -31
- package/assets/docs/workflows/projects/lifecycle.md +45 -0
- package/assets/docs/workflows/projects/picking-up-projects.md +14 -0
- package/assets/docs/workflows/skills/explainer-kit.md +10 -4
- package/assets/docs/workflows/skills/repo-improve.md +15 -1
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/create-agnostic-skill/SKILL.md +9 -7
- package/assets/skills/create-agnostic-skill/references/skill-template.md +9 -7
- package/assets/skills/oat-explainer-kit/SKILL.md +14 -1
- package/assets/skills/oat-explainer-kit/references/config-contract.md +12 -0
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +57 -10
- package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +28 -5
- package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +371 -0
- package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +123 -1
- package/assets/skills/oat-project-autonomous/SKILL.md +10 -1
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +122 -121
- package/assets/skills/oat-project-complete/SKILL.md +134 -4
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +122 -121
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +38 -6
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +122 -121
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +122 -121
- package/assets/skills/oat-project-next/SKILL.md +62 -19
- package/assets/skills/oat-project-plan/SKILL.md +31 -5
- package/assets/skills/oat-project-pr-final/SKILL.md +281 -6
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +122 -121
- package/assets/skills/oat-project-progress/SKILL.md +12 -3
- package/assets/skills/oat-project-quick-start/SKILL.md +264 -4
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +122 -121
- package/assets/skills/oat-project-summary/SKILL.md +34 -23
- package/assets/skills/oat-repo-improve/SKILL.md +40 -5
- package/assets/skills/oat-repo-improve/references/plan-template.md +84 -7
- package/dist/agents/canonical/resolve.d.ts.map +1 -1
- package/dist/agents/canonical/resolve.js +25 -4
- package/dist/commands/config/index.d.ts +1 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +401 -18
- package/dist/commands/doctor/index.d.ts +7 -0
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +10 -2
- package/dist/commands/gate/index.d.ts +3 -1
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +699 -211
- package/dist/commands/init/tools/index.d.ts.map +1 -1
- package/dist/commands/init/tools/index.js +68 -36
- package/dist/commands/init/tools/shared/skill-script-references.d.ts +126 -0
- package/dist/commands/init/tools/shared/skill-script-references.d.ts.map +1 -0
- package/dist/commands/init/tools/shared/skill-script-references.js +311 -0
- package/dist/commands/instructions/instructions.types.d.ts +63 -0
- package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.d.ts +51 -2
- package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.js +201 -4
- package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
- package/dist/commands/instructions/sync/sync.js +12 -1
- package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
- package/dist/commands/instructions/validate/validate.js +12 -1
- package/dist/commands/project/log/append.d.ts +195 -0
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +1034 -11
- package/dist/commands/shared/frontmatter.d.ts +51 -0
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +118 -6
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +5 -3
- package/dist/commands/sync/index.d.ts +14 -0
- package/dist/commands/sync/index.d.ts.map +1 -1
- package/dist/commands/sync/index.js +21 -0
- package/dist/commands/tools/info/index.d.ts.map +1 -1
- package/dist/commands/tools/info/index.js +14 -1
- package/dist/commands/tools/info/info-tool.d.ts +12 -0
- package/dist/commands/tools/info/info-tool.d.ts.map +1 -1
- package/dist/commands/tools/info/info-tool.js +54 -6
- package/dist/commands/tools/info/skill-views.d.ts +86 -0
- package/dist/commands/tools/info/skill-views.d.ts.map +1 -0
- package/dist/commands/tools/info/skill-views.js +383 -0
- package/dist/commands/tools/install/index.d.ts.map +1 -1
- package/dist/commands/tools/install/index.js +3 -25
- package/dist/commands/tools/list/list-tools.d.ts +2 -0
- package/dist/commands/tools/list/list-tools.d.ts.map +1 -1
- package/dist/commands/tools/list/list-tools.js +23 -4
- package/dist/commands/tools/remove/index.d.ts.map +1 -1
- package/dist/commands/tools/remove/index.js +35 -42
- package/dist/commands/tools/remove/remove-tools.d.ts +3 -2
- package/dist/commands/tools/remove/remove-tools.d.ts.map +1 -1
- package/dist/commands/tools/remove/remove-tools.js +14 -4
- package/dist/commands/tools/shared/auto-sync.d.ts +12 -1
- package/dist/commands/tools/shared/auto-sync.d.ts.map +1 -1
- package/dist/commands/tools/shared/auto-sync.js +20 -4
- package/dist/commands/tools/shared/format-pack-inventory.d.ts +12 -1
- package/dist/commands/tools/shared/format-pack-inventory.d.ts.map +1 -1
- package/dist/commands/tools/shared/format-pack-inventory.js +48 -6
- package/dist/commands/tools/shared/in-process-sync.d.ts +11 -0
- package/dist/commands/tools/shared/in-process-sync.d.ts.map +1 -0
- package/dist/commands/tools/shared/in-process-sync.js +79 -0
- package/dist/commands/tools/shared/pack-evidence.d.ts +78 -2
- package/dist/commands/tools/shared/pack-evidence.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-evidence.js +96 -2
- package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts +11 -0
- package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-lifecycle-outcome.js +24 -3
- package/dist/commands/tools/shared/pack-provider-evidence.d.ts +73 -0
- package/dist/commands/tools/shared/pack-provider-evidence.d.ts.map +1 -0
- package/dist/commands/tools/shared/pack-provider-evidence.js +161 -0
- package/dist/commands/tools/shared/provider-context.d.ts +88 -0
- package/dist/commands/tools/shared/provider-context.d.ts.map +1 -0
- package/dist/commands/tools/shared/provider-context.js +77 -0
- package/dist/commands/tools/shared/provider-reachability.d.ts +93 -0
- package/dist/commands/tools/shared/provider-reachability.d.ts.map +1 -0
- package/dist/commands/tools/shared/provider-reachability.js +358 -0
- package/dist/commands/tools/shared/sync-evidence.d.ts +57 -0
- package/dist/commands/tools/shared/sync-evidence.d.ts.map +1 -0
- package/dist/commands/tools/shared/sync-evidence.js +147 -0
- package/dist/commands/tools/update/index.d.ts +0 -4
- package/dist/commands/tools/update/index.d.ts.map +1 -1
- package/dist/commands/tools/update/index.js +22 -40
- package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
- package/dist/commands/tools/update/update-tools.js +23 -8
- package/dist/config/json.d.ts +36 -0
- package/dist/config/json.d.ts.map +1 -1
- package/dist/config/json.js +135 -3
- package/dist/config/oat-config.d.ts +41 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +111 -0
- package/dist/drift/index.d.ts +2 -0
- package/dist/drift/index.d.ts.map +1 -1
- package/dist/drift/index.js +1 -0
- package/dist/drift/skill-view-diagnostic.d.ts +197 -0
- package/dist/drift/skill-view-diagnostic.d.ts.map +1 -0
- package/dist/drift/skill-view-diagnostic.js +343 -0
- package/dist/validation/skills.d.ts +1 -0
- package/dist/validation/skills.d.ts.map +1 -1
- package/dist/validation/skills.js +181 -19
- package/package.json +2 -2
|
@@ -84,6 +84,111 @@ An exact alias is `in_sync`; an absent alias is `missing`; and a broken,
|
|
|
84
84
|
replaced, foreign, or otherwise unverifiable alias is `drifted`. Provider list
|
|
85
85
|
and inspect output summarize collection ownership separately from copy mode.
|
|
86
86
|
|
|
87
|
+
### Resolution-time skill view classes
|
|
88
|
+
|
|
89
|
+
Drift states answer "does the tracked view still match?", which presupposes a
|
|
90
|
+
manifest entry. A canonical skill that was never synced has no entry at all, so
|
|
91
|
+
`oat tools info <name>` adds a second, additive classification beside the
|
|
92
|
+
unchanged drift state. Provider and path identity for an untracked projection
|
|
93
|
+
come from the active provider set and the adapter's scope mappings, not from
|
|
94
|
+
the manifest.
|
|
95
|
+
|
|
96
|
+
- `missing-additive` — active, supported, no manifest entry, nothing at the expected path: the only true projection gap
|
|
97
|
+
- `removed` — a manifest entry exists but the provider file is gone
|
|
98
|
+
- `modified` — a manifest entry exists and the view no longer agrees with what the last sync recorded, or its version has fallen behind canonical. A `copy` view also reaches this class through the known limitation below, where the difference may be nothing but the generated banner
|
|
99
|
+
- `in-sync` — a symlinked, collection-aliased, or natively read view _is_ the canonical file; a `copy` view matches the content recorded at its last sync
|
|
100
|
+
- `untracked` — something exists at the expected path that no manifest entry tracks; stray detection skips provider entries whose name matches a canonical entry, so `oat status` does not report it as a stray and reports the untracked projection as `missing` instead
|
|
101
|
+
- `unverified` — the view's state is unknown: either a manifest entry arrived with no drift observation, or reading that one view failed and the row carries the redacted reason
|
|
102
|
+
- `inactive`, `unsupported`, `excluded` — no projection is expected in this scope, so none of them is reported as missing
|
|
103
|
+
|
|
104
|
+
`unsupported` and `excluded` are defensive: no shipped adapter or config
|
|
105
|
+
produces them today. Every shipped adapter maps skills in both scopes and the
|
|
106
|
+
command passes no canonical-path filter. The branches exist so a future adapter
|
|
107
|
+
or filter cannot be silently reported as a projection gap. `unverified` is
|
|
108
|
+
reachable: an unreadable provider path makes drift detection throw, and that one
|
|
109
|
+
view degrades to `unverified` with its reason.
|
|
110
|
+
|
|
111
|
+
A row for `inactive`, `unsupported`, or `excluded` prints neither a projection
|
|
112
|
+
qualifier nor a path, because no view is projected for it: naming an expected
|
|
113
|
+
path and a sync strategy for a file that is never produced described work that
|
|
114
|
+
is never going to happen.
|
|
115
|
+
|
|
116
|
+
Only `missing-additive`, `removed`, and `modified` carry a repair, and it is
|
|
117
|
+
always one concrete `oat sync --scope project` or `oat sync --scope user` for
|
|
118
|
+
the scope where the gap was observed. Versions are compared only for `copy`
|
|
119
|
+
views: a symlinked, collection-aliased, or natively read view is the canonical
|
|
120
|
+
file, so it has no second version.
|
|
121
|
+
|
|
122
|
+
If reading the sync config or the manifest fails — an invalid, unreadable, or
|
|
123
|
+
otherwise non-loadable `.oat/sync/config.json` or `.oat/sync/manifest.json`, for
|
|
124
|
+
instance — the section for that scope reports `unavailable` with the reason, and
|
|
125
|
+
the rest of the command is unaffected. A failure while reading one provider's
|
|
126
|
+
view, such as drift detection throwing on an unreadable provider path, is
|
|
127
|
+
narrower: only that row degrades, to `unverified` with the same redacted reason,
|
|
128
|
+
and the other providers keep their real rows. The
|
|
129
|
+
diagnostic is additive evidence, so it never changes the exit code or removes
|
|
130
|
+
the tool detail of a user whose sync state is already broken. A broken sync
|
|
131
|
+
config is one of the likeliest reasons a provider view is missing, which is
|
|
132
|
+
exactly what this command is run to explain, so it is reported rather than
|
|
133
|
+
dropped: printing no section at all would read as "no providers configured".
|
|
134
|
+
An absent `.oat/sync/config.json` is a different case and not a failure — it
|
|
135
|
+
resolves to the defaults, and the scope is diagnosed normally. Reasons are
|
|
136
|
+
redacted; the scope root becomes `<project>` or `~` (only at a path boundary, so
|
|
137
|
+
a sibling directory that merely shares the prefix is left alone), and any
|
|
138
|
+
absolute path outside it is replaced entirely with `<path>`, quoted or not and
|
|
139
|
+
whatever punctuation precedes it. A manifest `providerPath` that escapes its own
|
|
140
|
+
scope is redacted the same way rather than rendered in the row, and no version
|
|
141
|
+
is read from it: its `SKILL.md` is a file outside the tree the command was asked
|
|
142
|
+
about.
|
|
143
|
+
|
|
144
|
+
A drift state and a view class can legitimately disagree. Drift compares a copy
|
|
145
|
+
against the hash recorded at its last sync, so a copy that was never re-synced
|
|
146
|
+
after a canonical edit still matches its own manifest entry and reads as
|
|
147
|
+
`in_sync`. When the two versions differ, the view class is `modified` and the
|
|
148
|
+
drift state is reported unchanged beside it.
|
|
149
|
+
|
|
150
|
+
The manifest is keyed by `(canonicalPath, provider)` and never by path, so a
|
|
151
|
+
manifest entry can track a view somewhere other than the adapter's expected
|
|
152
|
+
projection path — reachable after a `providerDir` change or from a manifest
|
|
153
|
+
written under an older layout. Drift resolves the entry's own `providerPath`, so
|
|
154
|
+
in that case the row names the tracked path rather than the expected one, and
|
|
155
|
+
its `--json` record carries the expected path separately as
|
|
156
|
+
`expectedProviderPath`. The detail says which path the state describes and
|
|
157
|
+
whether anything exists at the expected path. A drift verdict computed for one
|
|
158
|
+
path is never attached to a row labelled with another: doing so reported `removed`
|
|
159
|
+
with "the provider file is gone from disk" against a healthy file that was
|
|
160
|
+
sitting at the expected path all along.
|
|
161
|
+
|
|
162
|
+
Both sides resolve their version through the same shared reader, so
|
|
163
|
+
`metadata.version` takes precedence over the deprecated top-level `version`
|
|
164
|
+
alias for a projected view exactly as it does for the canonical source; the only
|
|
165
|
+
extra step for a view is stripping the generated banner. When a projected
|
|
166
|
+
`SKILL.md` contradicts itself — a top-level `version` and a differing
|
|
167
|
+
`metadata.version` — or declares a version the reader cannot use at all, the
|
|
168
|
+
comparison is withheld rather than decided: no version is reported for that
|
|
169
|
+
view, and the class is left to the drift state alone. That is deliberately
|
|
170
|
+
conservative and has a cost, since a copy in that state could be genuinely
|
|
171
|
+
stale and would not be reported as such. The view's detail names the two
|
|
172
|
+
declared values and says the comparison was skipped, so the ambiguity is
|
|
173
|
+
visible rather than silently resolved. When the resolver's answer happens to
|
|
174
|
+
agree with canonical, nothing is withheld and the detail says so instead.
|
|
175
|
+
|
|
176
|
+
### Known limitation: copy-strategy skill views
|
|
177
|
+
|
|
178
|
+
A `copy` skill view is reported `modified` immediately after a successful sync,
|
|
179
|
+
and stays that way. The engine writes an OAT-managed banner into the copied
|
|
180
|
+
`SKILL.md` and an `.oat-generated` sentinel beside it, and neither is accounted
|
|
181
|
+
for in the manifest hash, so `oat status` reports `drifted:modified` and every
|
|
182
|
+
later `oat sync --dry-run` plans another `update_copy`. Because no sync clears
|
|
183
|
+
that state, `oat tools info` prints no repair line when a `modified` copy's
|
|
184
|
+
version still matches canonical.
|
|
185
|
+
|
|
186
|
+
That suppression is a conservative heuristic rather than a proof: equal versions
|
|
187
|
+
do not establish equal bodies, so an edit to the canonical source or to the copy
|
|
188
|
+
that kept the version reaches the same branch, and a sync _would_ repair that
|
|
189
|
+
one. The class detail says so and names the concrete scope command to run if you
|
|
190
|
+
know either side was edited. Tracked as `BL-260908-make-copy-strategy-skill`.
|
|
191
|
+
|
|
87
192
|
## Stray adoption
|
|
88
193
|
|
|
89
194
|
`oat init` and `oat status` can offer adoption of unmanaged provider entries into canonical `.agents`.
|
|
@@ -149,7 +149,7 @@ Notable commands introduced in the current CLI surface:
|
|
|
149
149
|
- `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. Lite plans must contain exactly one phase, declare no parallel groups, and give every Validation Criteria bullet either a backticked command or a `manual:` instruction. See [Implementation Execution](../workflows/projects/implementation-execution.md#parallel-phase-groups).
|
|
150
150
|
- `oat project log append|check|synthesize|rollup` - manage the optional append-only project observation log: append validated judgment or structural entries, inspect grammar and synthesis status, complete end-of-run synthesis, and roll observations into `summary.md` plus the configured repository ledger. See [Project Log](../cli-utilities/project-log.md).
|
|
151
151
|
- `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
|
|
152
|
-
- `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_missing` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. `artifact_missing` means an accepted child exited cleanly without an artifact; fix synchronous review/artifact completion and start a new run, without review-receive or same-run remediation. For `targeting_correlation_failed`, correct the project declaration or artifact routing and start a new run; do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../cli-utilities/workflow-gates.md).
|
|
152
|
+
- `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_missing` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. `artifact_missing` means an accepted child exited cleanly without an artifact; fix synchronous review/artifact completion and start a new run, without review-receive or same-run remediation. For `targeting_correlation_failed`, correct the project declaration or artifact routing and start a new run; do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. When post-selection work fails after the reviewer already committed a run-correlated artifact, the gate re-validates that selected snapshot through the same eligibility path rather than re-parsing whatever the path now holds, never re-dispatching, and returns the ordinary `ok` or `blocked` envelope with additive `postSelectionRecovery: true`; the artifact must still be present and unchanged for re-validation to succeed. When nothing recovers, `review_failed` names the failing sub-step in `postSelection.step` and its cause in `postSelection.code`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../cli-utilities/workflow-gates.md).
|
|
153
153
|
- `oat gate route --expect-runtime <runtime> --expect-model <model> --can-await <true|false> --json` - return the headless child route (`inline`, `delegate-sync`, or `refuse`) from provider-marker and model evidence. Ambiguous or contradictory evidence never routes inline.
|
|
154
154
|
- `oat gate exec <prompt...>` / `oat gate cross-provider-exec <prompt...>` - run a generic target prompt. `--timeout-ms` uses the same validated CLI override; untyped runs otherwise retain the legacy default path.
|
|
155
155
|
- `oat gate target set <id> --invocation-model <model|provider-default> --invocation-reasoning-effort <effort|provider-default>` - persist optional configured invocation metadata alongside an exec target without inferring it from the target command.
|
|
@@ -159,15 +159,25 @@ Notable commands introduced in the current CLI surface:
|
|
|
159
159
|
|
|
160
160
|
## `oat config` surface flags
|
|
161
161
|
|
|
162
|
-
`oat config set`
|
|
162
|
+
`oat config set` and `oat config unset` support the same mutually exclusive surface flags, which control the config file the write or removal lands in:
|
|
163
163
|
|
|
164
|
-
- `--shared` — write to `.oat/config.json` (committed team repo settings)
|
|
165
|
-
- `--local` — write to `.oat/config.local.json` (per-developer repo state, gitignored)
|
|
166
|
-
- `--user` — write to `~/.oat/config.json` (user-level fallback, applies across all repos)
|
|
164
|
+
- `--shared` — write to or remove from `.oat/config.json` (committed team repo settings)
|
|
165
|
+
- `--local` — write to or remove from `.oat/config.local.json` (per-developer repo state, gitignored)
|
|
166
|
+
- `--user` — write to or remove from `~/.oat/config.json` (user-level fallback, applies across all repos)
|
|
167
167
|
|
|
168
168
|
When no flag is passed, the CLI picks a sensible default per key type: structural keys (`projects.root`, `documentation.*`, etc.) go to shared, state keys (`activeProject`, etc.) go to local, workflow preferences (`workflow.*`) go to local. Pass at most one flag — the command rejects multiple surface flags.
|
|
169
169
|
|
|
170
|
-
Per-key restrictions apply
|
|
170
|
+
Per-key restrictions apply identically to `set` and `unset`: structural keys can only be written at shared scope, most state keys can only be written at local scope (`activeIdea` is the exception — it accepts both local and user), and workflow preference keys accept any non-auto surface. Legacy `autoReviewAtCheckpoints` remains shared-only; prefer `workflow.autoReviewAtHillCheckpoints`.
|
|
171
|
+
|
|
172
|
+
`oat config unset <key>` removes the key from the selected surface and prunes any parent object it empties, so the resolved value falls back through the remaining surfaces to the built-in default. Removing a key the surface does not hold is not an error: it reports an already-unset outcome and exits 0. With `--json` the envelope adds a `removed` boolean, which is the machine-readable way to tell a real removal from an already-unset no-op, since both exit 0. A stored value that fails validation is still removed, matching `oat config set`, which repairs the same file.
|
|
173
|
+
|
|
174
|
+
`unset` refuses five classes of key, each with exit code 1:
|
|
175
|
+
|
|
176
|
+
- **Unknown keys**, including keys OAT reads but does not expose in the `oat config` catalog (`documentation.index`). These are not removable by any `oat config` command.
|
|
177
|
+
- **Lifecycle state** (`activeProject`, `lastPausedProject`) — cleared with `oat config set <key> ''` instead.
|
|
178
|
+
- **Pack intent** (`tools.*`) — removed with `oat tools remove --pack <pack> --scope project`, which also removes the installed pack files. Clearing the intent alone would leave them behind.
|
|
179
|
+
- **Aggregate read views** (`workflow.dispatchCeiling`, `workflow.dispatchCeiling.providers`) — these are assembled for `get` from the leaf keys and are not stored as such. Unset `workflow.dispatchCeiling.preset` or `workflow.dispatchCeiling.providers.<provider>` instead.
|
|
180
|
+
- **Environment-shadowed keys with nothing stored on the target surface** — when `OAT_PROJECTS_ROOT`, `OAT_PROJECTS_DEFAULT_SCOPE`, or `OAT_WORKTREES_ROOT` supplies the effective value and the surface holds nothing to remove, clear the environment variable in your shell. When the surface _does_ hold a stored value, `unset` removes it (as `set` would rewrite it) and warns that the override still supplies the effective value.
|
|
171
181
|
|
|
172
182
|
## `workflow.*` preference keys
|
|
173
183
|
|
|
@@ -110,37 +110,38 @@ Legacy `.oat/active-project` / `.oat/projects-root` / `.oat/active-idea` files m
|
|
|
110
110
|
|
|
111
111
|
Current schema keys:
|
|
112
112
|
|
|
113
|
-
| Key | Type | Default | Description
|
|
114
|
-
| ---------------------------------------------------------- | -------------------------- | ------------------------ |
|
|
115
|
-
| `version` | `number` | `1` | Schema version
|
|
116
|
-
| `worktrees.root` | `string` | `".worktrees"` | Root directory for git worktrees (repo-relative or absolute)
|
|
117
|
-
| `projects.root` | `string` | `".oat/projects/shared"` | Default root directory for OAT projects
|
|
118
|
-
| `projects.defaultScope` | `string` | `"synced"` | Scope used by project creation when `--scope` is omitted: `shared`, `local`, or `synced`. Environment override: `OAT_PROJECTS_DEFAULT_SCOPE`.
|
|
119
|
-
| `localPaths` | `string[]` | - | Gitignored directories to sync between main repo and worktrees. Supports glob patterns. Managed via `oat local add/remove`.
|
|
120
|
-
| `documentation.root` | `string` | - | Docs **app root** — the directory `oat docs init` scaffolds (e.g., `apps/docs`). Authored pages live under `<root>/docs`. See [Documentation path resolution](#documentation-path-resolution).
|
|
121
|
-
| `documentation.tooling` | `string` | - | Documentation framework identifier (`mkdocs` or `fumadocs`)
|
|
122
|
-
| `documentation.config` | `string` | - | Path to the documentation framework config file (e.g., `mkdocs.yml`, `next.config.js`)
|
|
123
|
-
| `documentation.index` | `string` | - | Path to the docs surface entry point: the generated app-root manifest `<root>/index.md` for Fumadocs, `mkdocs.yml` for MkDocs. Set by `oat docs init`. `oat docs generate-index` writes it only for the Fumadocs manifest transition and never for MkDocs.
|
|
124
|
-
| `documentation.excludes` | `string[]` | - | Globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. See [Excluding pages from the generated index](#excluding-pages-from-the-generated-index).
|
|
125
|
-
| `documentation.
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `workflow.
|
|
129
|
-
| `workflow.dispatchPolicy.
|
|
130
|
-
| `workflow.
|
|
131
|
-
| `workflow.dispatchCeiling.
|
|
132
|
-
| `workflow.dispatchCeiling.providers.<provider
|
|
133
|
-
| `workflow.dispatchCeiling.providers
|
|
134
|
-
| `workflow.
|
|
135
|
-
| `workflow.gates.
|
|
136
|
-
| `
|
|
137
|
-
| `archive.
|
|
138
|
-
| `archive.
|
|
139
|
-
| `archive.
|
|
140
|
-
| `archive.
|
|
141
|
-
| `archive.
|
|
142
|
-
|
|
143
|
-
|
|
113
|
+
| Key | Type | Default | Description |
|
|
114
|
+
| ---------------------------------------------------------- | -------------------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
115
|
+
| `version` | `number` | `1` | Schema version |
|
|
116
|
+
| `worktrees.root` | `string` | `".worktrees"` | Root directory for git worktrees (repo-relative or absolute) |
|
|
117
|
+
| `projects.root` | `string` | `".oat/projects/shared"` | Default root directory for OAT projects |
|
|
118
|
+
| `projects.defaultScope` | `string` | `"synced"` | Scope used by project creation when `--scope` is omitted: `shared`, `local`, or `synced`. Environment override: `OAT_PROJECTS_DEFAULT_SCOPE`. |
|
|
119
|
+
| `localPaths` | `string[]` | - | Gitignored directories to sync between main repo and worktrees. Supports glob patterns. Managed via `oat local add/remove`. |
|
|
120
|
+
| `documentation.root` | `string` | - | Docs **app root** — the directory `oat docs init` scaffolds (e.g., `apps/docs`). Authored pages live under `<root>/docs`. See [Documentation path resolution](#documentation-path-resolution). |
|
|
121
|
+
| `documentation.tooling` | `string` | - | Documentation framework identifier (`mkdocs` or `fumadocs`) |
|
|
122
|
+
| `documentation.config` | `string` | - | Path to the documentation framework config file (e.g., `mkdocs.yml`, `next.config.js`) |
|
|
123
|
+
| `documentation.index` | `string` | - | Path to the docs surface entry point: the generated app-root manifest `<root>/index.md` for Fumadocs, `mkdocs.yml` for MkDocs. Set by `oat docs init`. `oat docs generate-index` writes it only for the Fumadocs manifest transition and never for MkDocs. |
|
|
124
|
+
| `documentation.excludes` | `string[]` | - | Globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. See [Excluding pages from the generated index](#excluding-pages-from-the-generated-index). |
|
|
125
|
+
| `documentation.instructionPointerExcludes` | `string[]` | - | Repo-relative directories `oat instructions sync`/`validate` must not treat as pointer sites, additive to the documentation content root they skip by default. Normalized and de-duplicated; a malformed value (non-array, or an empty or non-string entry) is rejected with exit code `2`. Set as one comma-separated value with `oat config set`; absolute paths and paths escaping the repository are refused. See [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees). |
|
|
126
|
+
| `documentation.requireForProjectCompletion` | `boolean` | `false` | When `true`, OAT project completion gates require documentation to be updated |
|
|
127
|
+
| `git.defaultBranch` | `string` | `"main"` | Default branch for PR creation. Auto-detected during `oat init` via `gh repo view` or `origin/HEAD`. Used by `oat-project-pr-final` and `oat-project-pr-progress`. |
|
|
128
|
+
| `workflow.autoReviewAtHillCheckpoints` | `boolean` | unset | When `true`, completing a HiLL checkpoint automatically runs the extra lifecycle review. Does not control Tier 1 per-phase `oat-reviewer` gates. Can be overridden per-project via `oat_auto_review_at_hill_checkpoints` in `plan.md` frontmatter. Legacy `autoReviewAtCheckpoints` remains a fallback. |
|
|
129
|
+
| `workflow.dispatchPolicy.mode` | `string` | unset | Dispatch policy mode: `managed` lets OAT select model/effort controls; `inherit` leaves controls to the host/provider defaults. |
|
|
130
|
+
| `workflow.dispatchPolicy.policy` | `string` | unset | Managed dispatch policy: `economy`, `balanced`, `high`, `frontier`, or `uncapped`. Capped policies compile to provider targets; `uncapped` keeps OAT-managed preferred selection without provider caps. `inherit` mode is separate and leaves controls to the host/provider. |
|
|
131
|
+
| `workflow.dispatchCeiling.preset` | `string` | unset | Legacy compatibility preset for capped managed policy setup (`balanced`, `maximum`, `cost-conscious`). `maximum` maps to `high`; `cost-conscious` maps to `economy`. |
|
|
132
|
+
| `workflow.dispatchCeiling.providers.<provider>` | `object` or legacy scalar | unset | Reusable provider candidate ladder. The canonical shape maps `economy`, `balanced`, `high`, and `frontier` to ordered candidate cells; project and phase state record only a named maximum over that ladder. |
|
|
133
|
+
| `workflow.dispatchCeiling.providers.<provider>.<tier>` | `{ candidates: [...] }` | unset | One ordered candidate cell. Codex entries carry exact `model` plus `effort` and resolve to materialized roles; Claude entries carry a model; Cursor strings remain opaque and pass to Cursor byte-for-byte. The final candidate defines that tier's reviewer ceiling. |
|
|
134
|
+
| `workflow.dispatchCeiling.providers.{codex,claude,cursor}` | `string`, route, or target | unset | Legacy compatibility input normalized to a one-candidate ladder. New configuration should use tiered candidate cells. The flat keys `workflow.dispatchCeiling.codex` and `workflow.dispatchCeiling.claude` were removed without migration. |
|
|
135
|
+
| `workflow.gates.skills` | `object` | unset | Per-skill final gate config keyed by skill name. Managed with `oat gate set/unset`; gate-aware skills declare `oat_gateable: true`. |
|
|
136
|
+
| `workflow.gates.execTargets` | `object` | built-ins | Cross-runtime exec target registry keyed by opaque target id. Managed with `oat gate target set/unset`; built-ins cover Codex, Claude, and Cursor defaults. |
|
|
137
|
+
| `archive.s3Uri` | `string` | - | Base S3 URI for repo-scoped archived project sync, for example `s3://bucket/oat-archive` |
|
|
138
|
+
| `archive.s3SyncOnComplete` | `boolean` | `false` | When `true`, `oat-project-complete` uploads the archived project to the configured S3 archive after local archive succeeds |
|
|
139
|
+
| `archive.summaryExportPath` | `string` | - | Repo-relative directory where completion exports `summary.md` as a dated snapshot like `20260401-<project-name>.md` for durable tracked reference |
|
|
140
|
+
| `archive.wrapUpExportPath` | `string` | - | Repo-relative directory where `oat-wrap-up` writes dated reports like `20260413-wrap-up-past-week.md`; when unset, the skill falls back to `.oat/repo/reference/wrap-ups/` |
|
|
141
|
+
| `archive.awsProfile` | `string` | - | Optional AWS named profile forwarded as `AWS_PROFILE` to every `aws` invocation in archive flows (`oat-project-complete` S3 sync, `oat repo archive sync`). Overrides ambient shell `AWS_PROFILE` / `AWS_DEFAULT_PROFILE` when set. |
|
|
142
|
+
| `archive.awsRegion` | `string` | - | Optional AWS region forwarded as `AWS_REGION` to every `aws` invocation in archive flows. Overrides ambient shell `AWS_REGION` / `AWS_DEFAULT_REGION` when set. |
|
|
143
|
+
|
|
144
|
+
Most `documentation.*` keys are managed via `oat config get/set` and are set automatically by `oat docs init`. One has no `oat config set` entry and is edited directly in `.oat/config.json`: `documentation.index`, which `oat docs init` still seeds for you.
|
|
144
145
|
The `git.defaultBranch` key is auto-detected during `oat init` and can be overridden via `oat config set git.defaultBranch <branch>`.
|
|
145
146
|
Archive settings are managed via `oat config get/set`, and `oat config describe archive.s3Uri` (or the other archive keys) shows the lifecycle and ownership details from the CLI.
|
|
146
147
|
Workflow gate objects are structured config and are managed with `oat gate`, not the scalar `oat config set` surface. See [Workflow Gates](../cli-utilities/workflow-gates.md).
|
|
@@ -141,6 +141,51 @@ On completion, OAT treats archive handling as an explicit closeout choice:
|
|
|
141
141
|
ref. `oat project prune` is a separate destructive choice that removes
|
|
142
142
|
terminal ref reachability but preserves local and S3 archive snapshots.
|
|
143
143
|
|
|
144
|
+
### Absorbed-project retirement sweep
|
|
145
|
+
|
|
146
|
+
Retiring a project that a later project absorbed is a semantic claim, not a
|
|
147
|
+
filesystem operation. Deleting or archiving the old scaffold does not make the
|
|
148
|
+
roadmap stop promising its work, so completion checks the claim against the
|
|
149
|
+
prose that still makes it.
|
|
150
|
+
|
|
151
|
+
When a quick project consolidates earlier scaffolds, quick-start records
|
|
152
|
+
`absorbed_projects` and `absorbed_backlog_ids` in that project's `state.md`
|
|
153
|
+
frontmatter. Those two fields are the only inputs the sweep takes.
|
|
154
|
+
|
|
155
|
+
Recording them is a quick-mode step today. A lite project that consolidates
|
|
156
|
+
earlier scaffolds records nothing, so the sweep finds no inputs and degrades to
|
|
157
|
+
its recorded note rather than checking that project's surfaces.
|
|
158
|
+
|
|
159
|
+
Inside the project-log completion gate — after the log status probe and before
|
|
160
|
+
the roll-up and seal — completion searches the active planning surfaces for each
|
|
161
|
+
absorbed slug and backlog ID, and for future-oriented ownership language tied to
|
|
162
|
+
them:
|
|
163
|
+
|
|
164
|
+
- `.oat/repo/pjm/roadmap.md` (the Now/Next/Later lanes and the sequencing map)
|
|
165
|
+
- `.oat/repo/pjm/current-state.md`
|
|
166
|
+
- the Curated Overview in `.oat/repo/pjm/backlog/index.md`
|
|
167
|
+
- the scope-nested `state.md` of projects that are still active, under the
|
|
168
|
+
configured projects root, skipping the `archived` tree and any project already
|
|
169
|
+
recorded as complete
|
|
170
|
+
|
|
171
|
+
The sweep is advisory. A raw match is never a hard block on closeout: each hit
|
|
172
|
+
becomes a named finding carrying a recorded disposition: fixed in the same run,
|
|
173
|
+
accepted as historical with a reason, or — in an autonomous run — recorded as
|
|
174
|
+
`deferred advisory`. Prose that clearly describes
|
|
175
|
+
past state is exempt, so a dated history entry, a retro, a decision record, or a
|
|
176
|
+
changelog line reads as evidence rather than a stale claim.
|
|
177
|
+
|
|
178
|
+
Placement is the point. Dispositions are appended to the project log before the
|
|
179
|
+
roll-up, so the roll-up summarizes them and the completion seal remains the
|
|
180
|
+
final entry — no project-log append ever follows the seal. Three variations
|
|
181
|
+
change where and how the dispositions are recorded: an autonomous run records
|
|
182
|
+
each finding as a `deferred advisory` warning and continues, a project with no log reports them in the
|
|
183
|
+
final completion summary, and a resumed completion whose log already
|
|
184
|
+
carries a seal runs report-only and appends nothing.
|
|
185
|
+
|
|
186
|
+
Repositories that never adopted PJM skip the sweep with a one-line note. A
|
|
187
|
+
missing planning surface degrades the sweep, never the closeout.
|
|
188
|
+
|
|
144
189
|
### Phase status: `pr_open`
|
|
145
190
|
|
|
146
191
|
After `oat-project-pr-final` runs, `state.md` shows `oat_phase_status: pr_open`. This signals:
|
|
@@ -36,6 +36,20 @@ its parent is reported and skipped rather than adopted.
|
|
|
36
36
|
After adoption, set or open the project through the normal lifecycle command
|
|
37
37
|
you are using. Arrival-aware project skills pull before reading its artifacts.
|
|
38
38
|
|
|
39
|
+
An adopted quick-workflow project whose `plan.md` is not implementation-ready
|
|
40
|
+
resumes through `oat-project-quick-start`, which continues it in place without
|
|
41
|
+
re-scaffolding, rather than through `oat-project-implement`. `oat-project-plan`,
|
|
42
|
+
`oat-project-progress`, and `oat-project-next` all route by the single **quick
|
|
43
|
+
plan readiness** predicate that `oat-project-quick-start` defines; readiness is
|
|
44
|
+
never inferred from the presence of tasks alone.
|
|
45
|
+
|
|
46
|
+
`oat project status` and `oat project list` apply the same predicate. For a
|
|
47
|
+
quick project at the `plan` phase they recommend `oat-project-quick-start`, with
|
|
48
|
+
the unmet clause in the reason, until the plan carries ready frontmatter, a
|
|
49
|
+
durable `## Reviews` disposition, and a substantive task; only then do they
|
|
50
|
+
recommend `oat-project-implement`. Recommendations for lite, spec-driven, and
|
|
51
|
+
import projects are unchanged, because the predicate is quick-workflow policy.
|
|
52
|
+
|
|
39
53
|
## What travels
|
|
40
54
|
|
|
41
55
|
- The project ref carries the complete active artifact tree and its history.
|
|
@@ -420,10 +420,16 @@ Interactive project explainer and recap preferences resolve independently from
|
|
|
420
420
|
the built-in default is `ask`. A resolved project decision in `state.md`
|
|
421
421
|
outranks those preferences.
|
|
422
422
|
|
|
423
|
-
Autonomous mode has stricter policy: it always
|
|
424
|
-
a project explainer runs only when the kickoff request explicitly asks
|
|
425
|
-
one.
|
|
426
|
-
|
|
423
|
+
Autonomous mode has stricter policy: it always runs the project-recap gate,
|
|
424
|
+
while a project explainer runs only when the kickoff request explicitly asks
|
|
425
|
+
for one. The gate probes the five seams an unattended recap needs — author,
|
|
426
|
+
fact critic, browser session, visual critic, and set planner — before
|
|
427
|
+
generating. It attempts the recap only when all five resolve; when a seam has
|
|
428
|
+
no provider configured at all, it records a `skip` with source
|
|
429
|
+
`capability_probe` and a warning instead. A seam that is configured but invalid
|
|
430
|
+
is a configuration error and still fails closed. Lifecycle-triggered runs do
|
|
431
|
+
not publish automatically, and neither recap failure nor an unavailable seam
|
|
432
|
+
blocks project completion.
|
|
427
433
|
|
|
428
434
|
See [Project Artifacts](../projects/artifacts.md) for active and durable output
|
|
429
435
|
locations, and [Configuration](../../cli-utilities/configuration.md) for the
|
|
@@ -35,7 +35,7 @@ These are findings exclusions, not absolute read prohibitions. Improve may read
|
|
|
35
35
|
|
|
36
36
|
## Output boundary
|
|
37
37
|
|
|
38
|
-
External plans are not canonical OAT project `plan.md` files. They contain self-contained context, scope, steps, verification, done criteria, and STOP conditions, but no OAT phase/task IDs or lifecycle bookkeeping.
|
|
38
|
+
External plans are not canonical OAT project `plan.md` files. They contain self-contained context, scope, steps, verification, done criteria, and STOP conditions, but no canonical OAT phase/task IDs or lifecycle bookkeeping. External execution-readiness metadata is a separate thing and is carried deliberately: it describes whether the plan's own prerequisites have merged, not how an OAT project is moving through phases.
|
|
39
39
|
|
|
40
40
|
After generation, choose either execution path:
|
|
41
41
|
|
|
@@ -44,6 +44,20 @@ After generation, choose either execution path:
|
|
|
44
44
|
|
|
45
45
|
Project-sized candidates are split when possible. If inseparable work needs multiple design decisions or lacks one coherent verification boundary, improve recommends an OAT project workflow instead of emitting a mega-plan.
|
|
46
46
|
|
|
47
|
+
## Plan readiness and execution readiness
|
|
48
|
+
|
|
49
|
+
Improve scores candidates on two independent axes. A candidate is plan-ready when it is understood well enough to write a self-contained executable plan, and execution-ready when every hard dependency it names has already merged.
|
|
50
|
+
|
|
51
|
+
A blocked candidate is still planned. Rather than dropping work whose prerequisite has not landed, improve writes the plan and records the block:
|
|
52
|
+
|
|
53
|
+
- `oat_execution_status` is `READY` or `BLOCKED` in plan frontmatter.
|
|
54
|
+
- A typed `## Dependencies` table marks each row `Hard`, `Soft`, or `Satisfied`, and every `Hard` row names the state that would unblock it.
|
|
55
|
+
- `## Landing-event impact` records what to re-anchor when a named PR or project lands, and `## Revalidation Before Execution` records when the plan must be re-checked against live state.
|
|
56
|
+
|
|
57
|
+
Plan provenance is recorded as two separate SHAs: `oat_external_plan_commit` is the full SHA of the `HEAD` whose content was actually inspected, and `oat_external_plan_main_commit` is the fetched `origin/main` or merge-base used only for comparison. They may differ, and normally do when planning happens on a branch.
|
|
58
|
+
|
|
59
|
+
Plans written before this contract landed are read in legacy mode: a short SHA, a missing comparison SHA, missing sections, and a missing status (read as `READY`) are all accepted, and those plans are never rewritten.
|
|
60
|
+
|
|
47
61
|
## Optional tracking
|
|
48
62
|
|
|
49
63
|
Plans are always the primary output. Tracking is optional and source-aware:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-agnostic-skill
|
|
3
|
-
version: 1.4.
|
|
3
|
+
version: 1.4.2
|
|
4
4
|
description: Use when adding a reusable workflow skill for AI coding agents. Scaffolds a new .agents/skills skill using the Agent Skills open standard.
|
|
5
5
|
argument-hint: '[skill-name]'
|
|
6
6
|
disable-model-invocation: true
|
|
@@ -98,12 +98,13 @@ For detailed guidance, see `references/skill-template.md`.
|
|
|
98
98
|
```markdown
|
|
99
99
|
---
|
|
100
100
|
name: skill-name
|
|
101
|
-
version: 1.0.0
|
|
102
101
|
description: Use when [trigger condition]. [What it does for disambiguation].
|
|
103
102
|
argument-hint: '[arg1] [--flag]'
|
|
104
103
|
disable-model-invocation: true
|
|
105
104
|
allowed-tools: Read, Write, Glob, Grep
|
|
106
105
|
user-invocable: true
|
|
106
|
+
metadata:
|
|
107
|
+
version: 1.0.0
|
|
107
108
|
---
|
|
108
109
|
|
|
109
110
|
# Skill Title
|
|
@@ -172,9 +173,10 @@ Natural language request that triggers this skill
|
|
|
172
173
|
- `argument-hint`, `allowed-tools`, `user-invocable`, `context`, `hooks` are Claude Code specific
|
|
173
174
|
- Other agents ignore unknown frontmatter fields, so it's safe to include Claude-specific fields everywhere
|
|
174
175
|
- `name`: max 64 chars for cross-provider portability (Codex allows 100, but 64 is the spec limit)
|
|
175
|
-
- `version`: include valid semver and start new skills at `1.0.0`
|
|
176
|
+
- `metadata.version`: include valid semver and start new skills at `1.0.0`. The Agent Skills specification puts the version under `metadata`, and OAT resolves `metadata.version` first and the top-level `version` second — `resolveSkillVersion` in `packages/cli/src/commands/shared/frontmatter.ts` owns that order, backstopped by `packages/cli/src/commands/shared/frontmatter.test.ts`
|
|
177
|
+
- `version` (top-level): the deprecated alias, still read when `metadata.version` is absent. Do not set both to different values: OAT reports the conflict, skill validation fails on it, and canonical role identity rejects it
|
|
176
178
|
- `description`: **single line, ≤ 500 chars** (Codex enforces single-line ≤ 500 chars; spec allows 1024)
|
|
177
|
-
- Bump `version` on future edits: patch for fixes/clarifications, minor for backward-compatible behavior additions, major for breaking workflow/interface changes
|
|
179
|
+
- Bump `metadata.version` on future edits: patch for fixes/clarifications, minor for backward-compatible behavior additions, major for breaking workflow/interface changes
|
|
178
180
|
|
|
179
181
|
**Writing the `description` field:**
|
|
180
182
|
|
|
@@ -200,7 +202,7 @@ Create the skill at `.agents/skills/{skill-name}/SKILL.md`
|
|
|
200
202
|
**Key requirements:**
|
|
201
203
|
|
|
202
204
|
- Skill name matches directory name
|
|
203
|
-
- New skills include `version: 1.0.0` in frontmatter
|
|
205
|
+
- New skills include `metadata.version: 1.0.0` in frontmatter
|
|
204
206
|
- Workflow steps use "Step 1, 2, 3..." naming
|
|
205
207
|
- Include both "Basic Usage" and "Conversational" example styles
|
|
206
208
|
- Use imperative form for instructions
|
|
@@ -238,7 +240,7 @@ Verify:
|
|
|
238
240
|
|
|
239
241
|
- File created at `.agents/skills/{skill-name}/SKILL.md`
|
|
240
242
|
- Frontmatter syntax is valid
|
|
241
|
-
- Frontmatter includes valid semver `version:` (new skills start at `1.0.0`)
|
|
243
|
+
- Frontmatter includes valid semver `metadata.version:` (new skills start at `1.0.0`)
|
|
242
244
|
- Skill appears in `AGENTS.md`
|
|
243
245
|
- Examples include both invocation styles
|
|
244
246
|
- If the skill name starts with `oat-`, run `pnpm oat:validate-skills` and fix any findings
|
|
@@ -264,7 +266,7 @@ Provide:
|
|
|
264
266
|
|
|
265
267
|
- **Context window is a public good**—keep skills lean, challenge every paragraph
|
|
266
268
|
- Description is the trigger—include "when to use" in frontmatter, not just body
|
|
267
|
-
- Bump `version` for edits: patch = fixes/clarifications, minor = backward-compatible additions, major = breaking changes
|
|
269
|
+
- Bump `metadata.version` for edits: patch = fixes/clarifications, minor = backward-compatible additions, major = breaking changes
|
|
268
270
|
- Keep SKILL.md **under 500 lines / ~5,000 tokens** (spec constraint)
|
|
269
271
|
- Use clear, task-based headings
|
|
270
272
|
- Include working examples for both invocation styles
|
|
@@ -28,9 +28,6 @@ Adjust based on complexity—not all sections are required:
|
|
|
28
28
|
name: skill-name
|
|
29
29
|
# Required: kebab-case, max 64 chars, must match directory name
|
|
30
30
|
|
|
31
|
-
version: 1.0.0
|
|
32
|
-
# Required: semver. Start new skills at 1.0.0.
|
|
33
|
-
|
|
34
31
|
description: Use when [trigger condition]. [What it does as disambiguation keywords].
|
|
35
32
|
# Required: Single line, ≤ 500 chars. Lead with "when to use" — this is the routing trigger.
|
|
36
33
|
# Agents load ONLY name+description at startup to decide relevance.
|
|
@@ -38,9 +35,13 @@ description: Use when [trigger condition]. [What it does as disambiguation keywo
|
|
|
38
35
|
# === Spec-optional fields (recognized by some providers) ===
|
|
39
36
|
# license: Apache-2.0
|
|
40
37
|
# compatibility: Requires Node.js 18+
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
|
|
39
|
+
metadata:
|
|
40
|
+
version: 1.0.0
|
|
41
|
+
# Required: semver. Start new skills at 1.0.0. The spec carries the version
|
|
42
|
+
# under `metadata`; a top-level `version:` is a deprecated alias that is read
|
|
43
|
+
# only when `metadata.version` is absent.
|
|
44
|
+
# author: my-org
|
|
44
45
|
|
|
45
46
|
# === Claude Code / Cursor extension fields (ignored by Codex, safe to include) ===
|
|
46
47
|
argument-hint: '[required-arg] [--optional-flag]'
|
|
@@ -187,9 +188,10 @@ Successful completion means:
|
|
|
187
188
|
|
|
188
189
|
## Versioning Guidance
|
|
189
190
|
|
|
190
|
-
- Include `version
|
|
191
|
+
- Include `metadata.version` in frontmatter for every skill and use semver (`MAJOR.MINOR.PATCH`).
|
|
191
192
|
- Start new skills at `1.0.0`.
|
|
192
193
|
- Bump patch for fixes/clarifications, minor for backward-compatible behavior additions, major for breaking workflow/interface changes.
|
|
194
|
+
- A top-level `version:` is the deprecated alias for the same value: it is read only when `metadata.version` is absent, and a skill that carries both with different values is reported as a conflict that validation rejects. `resolveSkillVersion` in `packages/cli/src/commands/shared/frontmatter.ts` owns that order.
|
|
193
195
|
|
|
194
196
|
## Cross-Provider Portability Notes
|
|
195
197
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-explainer-kit
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.7
|
|
4
4
|
description: Use when building project explainers or recaps from OAT configuration, state, and lifecycle artifacts.
|
|
5
5
|
disable-model-invocation: false
|
|
6
6
|
user-invocable: true
|
|
@@ -18,6 +18,7 @@ Adapt OAT project context into the versioned request consumed by the canonical
|
|
|
18
18
|
- Resolve typed OAT configuration with source attribution.
|
|
19
19
|
- Derive canonical project or repository output roots.
|
|
20
20
|
- Bind OAT lifecycle artifacts to generic recipe source roles.
|
|
21
|
+
- Probe recap seam availability before an unattended run is attempted.
|
|
21
22
|
- Resolve project explainer and recap intent before invoking the core.
|
|
22
23
|
- Resolve one provider-neutral set planner for unattended project recaps.
|
|
23
24
|
- Require lifecycle callers to construct a brief-aware author seam.
|
|
@@ -79,6 +80,18 @@ source evidence, and medium rationale. The installed core continues reading
|
|
|
79
80
|
`project-recap@1` for replay; the adapter never rewrites a retained request's
|
|
80
81
|
recipe selector.
|
|
81
82
|
|
|
83
|
+
Before an unattended `project-recap`, call
|
|
84
|
+
`scripts/probe-recap-seams.mjs#probeRecapSeams` with the seam inputs you are
|
|
85
|
+
about to pass. The probe is pure and checks all five required seams — author,
|
|
86
|
+
fact critic, browser session, visual critic, and set planner — using the same
|
|
87
|
+
rules `run.mjs` applies. `seams-unavailable` means no provider is configured
|
|
88
|
+
for a required seam: pass the probe result to the intent resolver as
|
|
89
|
+
`seamProbe`, which returns a recordable `skip` with source `capability_probe`
|
|
90
|
+
and a warning. `seams-invalid` means a supplied seam violates a resolution
|
|
91
|
+
rule: fail closed and report the configuration error; it is never a skip. When
|
|
92
|
+
the probe returns `ok: true`, invoke the adapter with unchanged behavior, and
|
|
93
|
+
treat any later failure as `failed` rather than as a skip.
|
|
94
|
+
|
|
82
95
|
Before invocation, read `references/author-callback.md`. Unattended
|
|
83
96
|
`project-recap` runs require exactly one provider-neutral set planner:
|
|
84
97
|
in-process callers supply `planSet`, while JSON/CLI callers supply
|
|
@@ -27,6 +27,18 @@ do not write config. Recipe, slug, fact-base path, output root, per-run art
|
|
|
27
27
|
direction, and private wrapper lanes are invocation inputs rather than config
|
|
28
28
|
keys and are rejected from the runtime config-override map.
|
|
29
29
|
|
|
30
|
+
## Seams are invocation inputs, not configuration
|
|
31
|
+
|
|
32
|
+
No supported key names an author, fact critic, browser session, visual critic,
|
|
33
|
+
or set planner. Every seam is supplied per invocation as a callback or a module
|
|
34
|
+
entry point, so seam availability is discovered by
|
|
35
|
+
`scripts/probe-recap-seams.mjs#probeRecapSeams` against the inputs a caller is
|
|
36
|
+
about to pass, not read from stored config. A host on which those inputs are
|
|
37
|
+
absent has no configuration to correct: the probe reports `seams-unavailable`
|
|
38
|
+
and the lifecycle caller records a `skip / capability_probe` recap intent. The
|
|
39
|
+
`workflow.explainers.projectRecap` preference expresses whether a host _wants_
|
|
40
|
+
a recap and cannot make an unavailable seam available.
|
|
41
|
+
|
|
30
42
|
## Source-sensitive paths
|
|
31
43
|
|
|
32
44
|
A shared theme bundle path is repository-relative and must remain inside the
|