@open-agent-toolkit/cli 0.2.63 → 0.2.65
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/tool-packs.md +83 -0
- package/assets/docs/contributing/skills.md +52 -7
- package/assets/docs/provider-sync/manifest-and-drift.md +105 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/analyze/SKILL.md +2 -1
- package/assets/skills/authoring-docs/SKILL.md +2 -1
- package/assets/skills/compare/SKILL.md +2 -1
- package/assets/skills/create-agnostic-skill/SKILL.md +10 -7
- package/assets/skills/create-agnostic-skill/references/skill-template.md +9 -7
- package/assets/skills/deep-research/SKILL.md +2 -1
- package/assets/skills/explainer-kit/SKILL.md +2 -1
- package/assets/skills/oat-agent-instructions-analyze/SKILL.md +2 -1
- package/assets/skills/oat-agent-instructions-apply/SKILL.md +2 -1
- package/assets/skills/oat-brainstorm/SKILL.md +2 -1
- package/assets/skills/oat-cursor-cloud-projects/SKILL.md +2 -1
- package/assets/skills/oat-dispatch-subagents/SKILL.md +2 -1
- package/assets/skills/oat-docs/SKILL.md +2 -1
- package/assets/skills/oat-docs-analyze/SKILL.md +2 -1
- package/assets/skills/oat-docs-apply/SKILL.md +2 -1
- package/assets/skills/oat-docs-authoring/SKILL.md +2 -1
- package/assets/skills/oat-docs-bootstrap/SKILL.md +2 -1
- package/assets/skills/oat-doctor/SKILL.md +2 -1
- package/assets/skills/oat-explainer-kit/SKILL.md +2 -1
- package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +322 -2
- package/assets/skills/oat-idea-ideate/SKILL.md +2 -1
- package/assets/skills/oat-idea-new/SKILL.md +2 -1
- package/assets/skills/oat-idea-scratchpad/SKILL.md +2 -1
- package/assets/skills/oat-idea-summarize/SKILL.md +2 -1
- package/assets/skills/oat-pjm-add-backlog-item/SKILL.md +2 -1
- package/assets/skills/oat-pjm-decision/SKILL.md +2 -1
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -1
- package/assets/skills/oat-pjm-update-repo-reference/SKILL.md +2 -1
- package/assets/skills/oat-project-autonomous/SKILL.md +2 -1
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -0
- package/assets/skills/oat-project-capture/SKILL.md +2 -1
- package/assets/skills/oat-project-clear-active/SKILL.md +2 -1
- package/assets/skills/oat-project-complete/SKILL.md +2 -1
- package/assets/skills/oat-project-design/SKILL.md +2 -1
- package/assets/skills/oat-project-discover/SKILL.md +2 -1
- package/assets/skills/oat-project-dispatch-subagents/SKILL.md +2 -1
- package/assets/skills/oat-project-document/SKILL.md +2 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -0
- package/assets/skills/oat-project-implement/SKILL.md +2 -1
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -0
- package/assets/skills/oat-project-import-plan/SKILL.md +2 -1
- package/assets/skills/oat-project-lite/SKILL.md +2 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +1 -0
- package/assets/skills/oat-project-new/SKILL.md +2 -1
- package/assets/skills/oat-project-next/SKILL.md +2 -1
- package/assets/skills/oat-project-open/SKILL.md +2 -1
- package/assets/skills/oat-project-plan/SKILL.md +2 -1
- package/assets/skills/oat-project-plan-writing/SKILL.md +2 -1
- package/assets/skills/oat-project-pr-final/SKILL.md +282 -6
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -0
- package/assets/skills/oat-project-pr-progress/SKILL.md +2 -1
- package/assets/skills/oat-project-progress/SKILL.md +2 -1
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +2 -1
- package/assets/skills/oat-project-quick-start/SKILL.md +2 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -0
- package/assets/skills/oat-project-reconcile/SKILL.md +2 -1
- package/assets/skills/oat-project-retro/SKILL.md +2 -1
- package/assets/skills/oat-project-retro-file/SKILL.md +2 -1
- package/assets/skills/oat-project-review-provide/SKILL.md +2 -1
- package/assets/skills/oat-project-review-provide-remote/SKILL.md +2 -1
- package/assets/skills/oat-project-review-receive/SKILL.md +2 -1
- package/assets/skills/oat-project-review-receive-remote/SKILL.md +2 -1
- package/assets/skills/oat-project-revise/SKILL.md +2 -1
- package/assets/skills/oat-project-spec/SKILL.md +2 -1
- package/assets/skills/oat-project-split/SKILL.md +2 -1
- package/assets/skills/oat-project-summary/SKILL.md +2 -1
- package/assets/skills/oat-repo-improve/SKILL.md +1 -1
- package/assets/skills/oat-repo-knowledge-index/SKILL.md +2 -1
- package/assets/skills/oat-repo-maintainability-review/SKILL.md +2 -1
- package/assets/skills/oat-review-provide/SKILL.md +2 -1
- package/assets/skills/oat-review-provide-remote/SKILL.md +2 -1
- package/assets/skills/oat-review-receive/SKILL.md +2 -1
- package/assets/skills/oat-review-receive-remote/SKILL.md +2 -1
- package/assets/skills/oat-wave-execute/SKILL.md +2 -1
- package/assets/skills/oat-wave-program/SKILL.md +2 -1
- package/assets/skills/oat-worktree-bootstrap/SKILL.md +2 -1
- package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +2 -1
- package/assets/skills/oat-wrap-up/SKILL.md +2 -1
- package/assets/skills/recon/SKILL.md +2 -1
- package/assets/skills/skeptic/SKILL.md +2 -1
- package/assets/skills/subagent-orchestration/SKILL.md +2 -1
- package/assets/skills/synthesize/SKILL.md +2 -1
- package/dist/agents/canonical/resolve.d.ts.map +1 -1
- package/dist/agents/canonical/resolve.js +25 -4
- 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/init/tools/index.d.ts.map +1 -1
- package/dist/commands/init/tools/index.js +68 -36
- 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/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
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-explainer-kit
|
|
3
|
-
version: 1.0.7
|
|
4
3
|
description: Use when building project explainers or recaps from OAT configuration, state, and lifecycle artifacts.
|
|
5
4
|
disable-model-invocation: false
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.0.8
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# OAT Explainer Kit
|
|
@@ -104,11 +104,331 @@ function failure({
|
|
|
104
104
|
};
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
/**
|
|
108
|
+
* Read a skill's canonical version from its frontmatter, with
|
|
109
|
+
* `metadata.version` taking precedence over the deprecated top-level `version`
|
|
110
|
+
* alias.
|
|
111
|
+
*
|
|
112
|
+
* ACCEPTED EXCEPTION to the repository rule that only
|
|
113
|
+
* `packages/cli/src/commands/shared/frontmatter.ts` implements this precedence:
|
|
114
|
+
* this script is installed into user projects by pack install, where it can
|
|
115
|
+
* import neither that resolver nor the `yaml` package, so it carries a
|
|
116
|
+
* self-contained reader. The parity contract
|
|
117
|
+
* `tools/smoke/explainer-kit/check-core-version-parity.test.mjs` runs one
|
|
118
|
+
* shared fixture corpus — plus every bundled `SKILL.md` — through this reader
|
|
119
|
+
* and the canonical resolver and requires the same answer; a change to the
|
|
120
|
+
* canonical precedence rule must update those fixtures and this reader
|
|
121
|
+
* together.
|
|
122
|
+
*
|
|
123
|
+
* Anything the canonical resolver cannot resolve cleanly returns `null` so the
|
|
124
|
+
* compatibility check fails closed instead of guessing: a conflict between the
|
|
125
|
+
* two positions, a malformed block, a duplicate key, a tagged, anchored, or
|
|
126
|
+
* aliased scalar, and a plain scalar YAML would read as a number, boolean, or
|
|
127
|
+
* null.
|
|
128
|
+
*
|
|
129
|
+
* Deliberate limits of a parser-free reader, all of which fail closed rather
|
|
130
|
+
* than guess a version: flow collections (`metadata: {version: 1.2.3}`), block
|
|
131
|
+
* scalars, quoted keys, quote escape sequences, multi-line plain scalars, and
|
|
132
|
+
* document markers inside the block all return `null` even where a full YAML
|
|
133
|
+
* parser would resolve them. Nothing in the authoring templates emits those
|
|
134
|
+
* shapes.
|
|
135
|
+
*
|
|
136
|
+
* Every key and value in the block is checked, not just `version`, and the
|
|
137
|
+
* whole block is walked to any depth, so a syntax error anywhere in it fails
|
|
138
|
+
* closed rather than leaving a readable version behind. What remains outside
|
|
139
|
+
* the reader's reach is the content of a shape it refuses outright — the body
|
|
140
|
+
* of a block scalar, or anything inside a flow collection — which it never
|
|
141
|
+
* parses because it never accepts the shape that introduces it.
|
|
142
|
+
*/
|
|
143
|
+
export function readFrontmatterVersion(content) {
|
|
144
|
+
const block = frontmatterBlock(content);
|
|
145
|
+
if (block === null) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const root = readBlockMap(block.split('\n').map(classifyLine), -1);
|
|
150
|
+
if (root === null || (root.indent !== null && root.indent !== 0)) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
let topLevel;
|
|
155
|
+
let metadata;
|
|
156
|
+
let unusable = false;
|
|
157
|
+
|
|
158
|
+
for (const child of root.children) {
|
|
159
|
+
if (child.name === 'version') {
|
|
160
|
+
const scalar = declaredScalar(child);
|
|
161
|
+
if (scalar === null) {
|
|
162
|
+
unusable = true;
|
|
163
|
+
} else {
|
|
164
|
+
topLevel = scalar;
|
|
165
|
+
}
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (child.name === 'metadata') {
|
|
169
|
+
// A `metadata:` key with a scalar or flow value is not the block map the
|
|
170
|
+
// canonical resolver requires, and one with no children is a null scalar.
|
|
171
|
+
if (scalarText(child.value) !== '' || child.map.indent === null) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const nested = child.map.children.find(
|
|
175
|
+
(entry) => entry.name === 'version',
|
|
176
|
+
);
|
|
177
|
+
if (nested !== undefined) {
|
|
178
|
+
const scalar = declaredScalar(nested);
|
|
179
|
+
if (scalar === null) {
|
|
180
|
+
unusable = true;
|
|
181
|
+
} else {
|
|
182
|
+
metadata = scalar;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (unusable) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
if (metadata !== undefined) {
|
|
192
|
+
return topLevel !== undefined && topLevel !== metadata ? null : metadata;
|
|
193
|
+
}
|
|
194
|
+
return topLevel ?? null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function frontmatterBlock(content) {
|
|
198
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
109
199
|
return match?.[1] ?? null;
|
|
110
200
|
}
|
|
111
201
|
|
|
202
|
+
/**
|
|
203
|
+
* Sort one frontmatter line into the few shapes this reader understands.
|
|
204
|
+
*
|
|
205
|
+
* A key must be followed by `:` and then whitespace or the end of the line,
|
|
206
|
+
* which is what YAML requires of a block mapping: `version:1.2.3` is a plain
|
|
207
|
+
* scalar, not a key, and the canonical resolver reads no version from it. A tab
|
|
208
|
+
* in the indentation is never valid YAML indentation, and a quoted key is a
|
|
209
|
+
* shape this reader refuses rather than compares raw against a plain one.
|
|
210
|
+
*/
|
|
211
|
+
function classifyLine(line) {
|
|
212
|
+
if (line.trim() === '') {
|
|
213
|
+
return { kind: 'blank' };
|
|
214
|
+
}
|
|
215
|
+
const indentation = line.match(/^[ \t]*/)[0];
|
|
216
|
+
if (indentation.includes('\t')) {
|
|
217
|
+
return { kind: 'invalid' };
|
|
218
|
+
}
|
|
219
|
+
const indent = indentation.length;
|
|
220
|
+
const rest = line.slice(indent);
|
|
221
|
+
if (rest.startsWith('#')) {
|
|
222
|
+
return { kind: 'comment', indent };
|
|
223
|
+
}
|
|
224
|
+
const key = rest.match(/^([^\s:#]+):(?=[ \t]|$)([ \t].*)?$/);
|
|
225
|
+
// A key is a plain scalar too: a quoted key is a shape this reader refuses
|
|
226
|
+
// rather than compares raw against a plain one, and a key opening with an
|
|
227
|
+
// indicator is not a key at all.
|
|
228
|
+
if (key === null || /^["']/.test(key[1]) || !isPlainScalar(key[1])) {
|
|
229
|
+
return { kind: 'invalid', indent };
|
|
230
|
+
}
|
|
231
|
+
return { kind: 'key', indent, name: key[1], value: key[2] ?? '' };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Read one block map and everything under it, rejecting every structure this
|
|
236
|
+
* reader cannot validate: an inconsistent indent, a duplicate key at any depth,
|
|
237
|
+
* a value shape it cannot read, or a line it cannot classify. Rejection is
|
|
238
|
+
* always `null`, never a guess.
|
|
239
|
+
*/
|
|
240
|
+
function readBlockMap(lines, parentIndent) {
|
|
241
|
+
let indent = null;
|
|
242
|
+
const names = [];
|
|
243
|
+
const children = [];
|
|
244
|
+
|
|
245
|
+
for (let index = 0; index < lines.length; ) {
|
|
246
|
+
const line = lines[index];
|
|
247
|
+
if (line.kind === 'invalid') {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
if (line.kind === 'blank' || line.kind === 'comment') {
|
|
251
|
+
index += 1;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (line.indent <= parentIndent) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
if (indent === null) {
|
|
258
|
+
indent = line.indent;
|
|
259
|
+
}
|
|
260
|
+
if (line.indent !== indent) {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
const identity = keyIdentity(line.name);
|
|
264
|
+
if (names.includes(identity) || !isReadableValue(line.value)) {
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
names.push(identity);
|
|
268
|
+
|
|
269
|
+
let end = index + 1;
|
|
270
|
+
while (
|
|
271
|
+
end < lines.length &&
|
|
272
|
+
(lines[end].kind === 'blank' ||
|
|
273
|
+
lines[end].kind === 'comment' ||
|
|
274
|
+
lines[end].kind === 'invalid' ||
|
|
275
|
+
lines[end].indent > indent)
|
|
276
|
+
) {
|
|
277
|
+
end += 1;
|
|
278
|
+
}
|
|
279
|
+
const body = lines.slice(index + 1, end);
|
|
280
|
+
const map = body.some((entry) => entry.kind !== 'blank')
|
|
281
|
+
? readBlockMap(body, indent)
|
|
282
|
+
: { indent: null, children: [] };
|
|
283
|
+
// A key cannot own both a scalar and a nested map. This also refuses a
|
|
284
|
+
// multi-line plain scalar, whose continuation lines arrive here as
|
|
285
|
+
// children: folding one is beyond a parser-free reader, so it fails closed.
|
|
286
|
+
if (
|
|
287
|
+
map === null ||
|
|
288
|
+
(map.indent !== null && scalarText(line.value) !== '')
|
|
289
|
+
) {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
children.push({ ...line, map });
|
|
293
|
+
index = end;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return { indent, children };
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* The scalar a key declares, or `null` when it declares something this reader
|
|
301
|
+
* refuses to read as a version — including a multi-line scalar or a nested map,
|
|
302
|
+
* both of which arrive here as children.
|
|
303
|
+
*/
|
|
304
|
+
function declaredScalar(child) {
|
|
305
|
+
return child.map.indent === null ? scalarValue(child.value) : null;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Whether a raw value is a shape this reader can read at all. Every key's value
|
|
310
|
+
* is checked, not just `version`, so no syntax error is silently walked past:
|
|
311
|
+
* the canonical resolver rejects the whole document for any of them.
|
|
312
|
+
*/
|
|
313
|
+
function isReadableValue(raw) {
|
|
314
|
+
const text = raw.trim();
|
|
315
|
+
if (text === '' || text.startsWith('#')) {
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
if (/^["']/.test(text)) {
|
|
319
|
+
return quotedScalar(text) !== null;
|
|
320
|
+
}
|
|
321
|
+
return isPlainScalar(scalarText(text));
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Whether a comment-stripped value is a plain scalar YAML reads as a string.
|
|
326
|
+
*
|
|
327
|
+
* Refused: every character YAML forbids at the start of a plain scalar — the
|
|
328
|
+
* flow, block-scalar, anchor, alias, and tag indicators, and the reserved `@`,
|
|
329
|
+
* `` ` ``, and `%` — plus `-`, `?`, and `:` when whitespace or the end of the
|
|
330
|
+
* value follows, which is what makes them indicators rather than the first
|
|
331
|
+
* letter of a word. A `:` anywhere in the value gets the same treatment,
|
|
332
|
+
* because `: ` opens a nested mapping instead of continuing the scalar.
|
|
333
|
+
*
|
|
334
|
+
* Still readable, because none of these is an indicator in block context: a `:`
|
|
335
|
+
* inside a word (`https://example.com`), a `,` after the first character
|
|
336
|
+
* (`allowed-tools: Read, Write`), and a leading `-` or `?` that starts a word
|
|
337
|
+
* (`-word`).
|
|
338
|
+
*/
|
|
339
|
+
function isPlainScalar(plain) {
|
|
340
|
+
return (
|
|
341
|
+
!/^[&*!|>[\]{},@`%]/.test(plain) &&
|
|
342
|
+
!/^[-?](?:[ \t]|$)/.test(plain) &&
|
|
343
|
+
!/:(?:[ \t]|$)/.test(plain)
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* The identity YAML gives a mapping key, so two spellings of one key are caught
|
|
349
|
+
* as the duplicate they are: `true` and `True` are the same boolean key, and
|
|
350
|
+
* `1` and `01` the same integer key, even though their text differs.
|
|
351
|
+
*/
|
|
352
|
+
function keyIdentity(name) {
|
|
353
|
+
if (/^(null|Null|NULL|~)$/.test(name)) {
|
|
354
|
+
return 'null';
|
|
355
|
+
}
|
|
356
|
+
if (/^(true|True|TRUE)$/.test(name)) {
|
|
357
|
+
return 'bool:true';
|
|
358
|
+
}
|
|
359
|
+
if (/^(false|False|FALSE)$/.test(name)) {
|
|
360
|
+
return 'bool:false';
|
|
361
|
+
}
|
|
362
|
+
if (
|
|
363
|
+
/^[-+]?[0-9]+$/.test(name) ||
|
|
364
|
+
/^0x[0-9a-fA-F]+$/.test(name) ||
|
|
365
|
+
/^0o[0-7]+$/.test(name) ||
|
|
366
|
+
/^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$/.test(name)
|
|
367
|
+
) {
|
|
368
|
+
return `number:${Number(name)}`;
|
|
369
|
+
}
|
|
370
|
+
return `string:${name}`;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Strip a trailing comment from a raw value. YAML only starts a comment at a
|
|
375
|
+
* `#` preceded by whitespace, so `1.2.3#note` is the string it looks like.
|
|
376
|
+
*/
|
|
377
|
+
function scalarText(raw) {
|
|
378
|
+
const text = raw.trim();
|
|
379
|
+
if (text.startsWith('#')) {
|
|
380
|
+
return '';
|
|
381
|
+
}
|
|
382
|
+
const comment = text.search(/[ \t]#/);
|
|
383
|
+
return (comment === -1 ? text : text.slice(0, comment)).trim();
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function quotedScalar(text) {
|
|
387
|
+
const quoted =
|
|
388
|
+
text.match(/^"([^"\\]*)"(?:[ \t]+#.*)?$/) ??
|
|
389
|
+
text.match(/^'([^']*)'(?:[ \t]+#.*)?$/);
|
|
390
|
+
return quoted?.[1] ?? null;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Read one plain or quoted string scalar, returning `null` for every value the
|
|
395
|
+
* canonical resolver refuses to treat as a version string.
|
|
396
|
+
*/
|
|
397
|
+
function scalarValue(raw) {
|
|
398
|
+
const text = raw.trim();
|
|
399
|
+
if (text === '' || text.startsWith('#')) {
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (/^["']/.test(text)) {
|
|
404
|
+
const quoted = quotedScalar(text)?.trim();
|
|
405
|
+
return quoted === undefined || quoted === '' ? null : quoted;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const plain = scalarText(text);
|
|
409
|
+
if (plain === '') {
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
if (!isPlainScalar(plain)) {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
// Core-schema scalars that resolve to a non-string type: `version: 1.10` is
|
|
416
|
+
// the number 1.1, never the string an author meant to write.
|
|
417
|
+
if (
|
|
418
|
+
/^(null|Null|NULL|~)$/.test(plain) ||
|
|
419
|
+
/^(true|True|TRUE|false|False|FALSE)$/.test(plain) ||
|
|
420
|
+
/^[-+]?[0-9]+$/.test(plain) ||
|
|
421
|
+
/^0o[0-7]+$/.test(plain) ||
|
|
422
|
+
/^0x[0-9a-fA-F]+$/.test(plain) ||
|
|
423
|
+
/^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$/.test(plain) ||
|
|
424
|
+
/^[-+]?\.(inf|Inf|INF)$/.test(plain) ||
|
|
425
|
+
/^\.(nan|NaN|NAN)$/.test(plain)
|
|
426
|
+
) {
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
return plain;
|
|
430
|
+
}
|
|
431
|
+
|
|
112
432
|
function parseVersion(value) {
|
|
113
433
|
if (typeof value !== 'string') {
|
|
114
434
|
return null;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-idea-ideate
|
|
3
|
-
version: 1.2.2
|
|
4
3
|
description: Use when continuing an existing tracked idea or expanding an explicit scratchpad seed from {IDEAS_ROOT}/scratchpad.md. Do NOT use to start a brand-new, destinationless brainstorm; use oat-brainstorm for that.
|
|
5
4
|
argument-hint: '[--global]'
|
|
6
5
|
disable-model-invocation: true
|
|
7
6
|
user-invocable: true
|
|
8
7
|
allowed-tools: Read, Write, Bash, Glob, AskUserQuestion
|
|
8
|
+
metadata:
|
|
9
|
+
version: 1.2.3
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# Ideate
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-idea-new
|
|
3
|
-
version: 1.2.1
|
|
4
3
|
description: Use when starting ideation for a new concept or problem. Creates an idea directory for lightweight capture and handoff to ongoing ideation.
|
|
5
4
|
argument-hint: '<idea-name> [--global]'
|
|
6
5
|
disable-model-invocation: true
|
|
7
6
|
user-invocable: true
|
|
8
7
|
allowed-tools: Read, Write, Bash, Glob, AskUserQuestion
|
|
8
|
+
metadata:
|
|
9
|
+
version: 1.2.2
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# New Idea
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-idea-scratchpad
|
|
3
|
-
version: 1.2.0
|
|
4
3
|
description: Use when you need quick idea capture or want to review scratchpad entries. Manages lightweight idea seeds and optional notes.
|
|
5
4
|
argument-hint: '[review | capture] [--global]'
|
|
6
5
|
disable-model-invocation: true
|
|
7
6
|
user-invocable: true
|
|
8
7
|
allowed-tools: Read, Write, Bash, Glob, AskUserQuestion
|
|
8
|
+
metadata:
|
|
9
|
+
version: 1.2.1
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# Scratchpad
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-idea-summarize
|
|
3
|
-
version: 1.3.0
|
|
4
3
|
description: Use when an idea is mature enough to move from brainstorming into the backlog. Generates a summary document and adds the idea to the backlog.
|
|
5
4
|
argument-hint: '[--global]'
|
|
6
5
|
disable-model-invocation: true
|
|
7
6
|
user-invocable: true
|
|
8
7
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
8
|
+
metadata:
|
|
9
|
+
version: 1.3.1
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# Summarize Idea
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-pjm-add-backlog-item
|
|
3
|
-
version: 1.4.0
|
|
4
3
|
description: Use when the user requests or confirms adding a new repo backlog item — e.g. "add a backlog item for X", "capture that as backlog", "track that follow-up", "file a backlog ticket", or confirms a previously offered backlog capture. Do NOT auto-invoke when a follow-up is mentioned. Creates the item file in the file-per-item backlog structure, regenerates the index, and prompts for curated overview updates.
|
|
5
4
|
disable-model-invocation: false
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.4.1
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Add Backlog Item
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-pjm-decision
|
|
3
|
-
version: 1.1.0
|
|
4
3
|
description: Use when the user requests or confirms recording a durable repo decision — e.g. "capture that as a decision", "write an ADR for X", "record this architectural choice", or confirms a previously offered decision capture. Creates a file-per-record decision under reference/decisions/ via `oat decision new` and refreshes the generated decision index. Do NOT auto-invoke for routine choices that do not warrant durable history.
|
|
5
4
|
disable-model-invocation: false
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.1.1
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Record Repo Decision
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-pjm-review-backlog
|
|
3
|
-
version: 1.6.1
|
|
4
3
|
description: Use when prioritizing the file-backed repo backlog or evaluating roadmap alignment. Produces value-effort ratings, dependency mapping, execution recommendations, and an optional external-plan handoff.
|
|
5
4
|
argument-hint: '[backlog-root] [--roadmap=<path>] [--output=<path>]'
|
|
6
5
|
disable-model-invocation: true
|
|
7
6
|
allowed-tools: Read, Write, Glob, Grep, Bash(git:*), AskUserQuestion, Task
|
|
8
7
|
user-invocable: true
|
|
8
|
+
metadata:
|
|
9
|
+
version: 1.6.2
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# Review Backlog
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-pjm-update-repo-reference
|
|
3
|
-
version: 1.4.0
|
|
4
3
|
description: Use when repo reference artifacts need updating — roadmap, decision records, backlog status, or completed history. Frequently invoked at project completion, often chained from `oat-project-document`, to ensure active `.oat/repo/pjm/` state and durable `.oat/repo/reference/` records reflect what shipped.
|
|
5
4
|
disable-model-invocation: false
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.4.1
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Update Repo Reference
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-autonomous
|
|
3
|
-
version: 1.0.13
|
|
4
3
|
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
4
|
argument-hint: '<goal | project-slug | ticket-ref>'
|
|
6
5
|
disable-model-invocation: true
|
|
7
6
|
user-invocable: true
|
|
8
7
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion, Task
|
|
8
|
+
metadata:
|
|
9
|
+
version: 1.0.14
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# Autonomous OAT Project
|
|
@@ -193,6 +193,7 @@ remains.
|
|
|
193
193
|
| PRFINAL-02 | `oat-project-pr-final` | Missing title/base | Ask for title and resolve base | Use the documented ticket/conventional-title and base-branch resolution chains | `auto-resolve` | PR artifact frontmatter and command |
|
|
194
194
|
| PRFINAL-03 | `oat-project-pr-final` | Final review not passed | Ask whether to proceed anyway | Never proceed in autonomy; stop and route to final review/re-review | `boundary:unresolved-critical-findings` | Final review row and blocker report |
|
|
195
195
|
| PRFINAL-04 | `oat-project-pr-final` | Push/PR policy or credentials | Ask operator to authorize or authenticate | Stop when repository policy or missing credentials prevent push/PR creation | `boundary:repository-policy-approval` / `boundary:missing-credentials` | PR state and redacted command error |
|
|
196
|
+
| PRFINAL-05 | `oat-project-pr-final` | Unresolved review-ledger artifact path | Report the offending row and stop | Stop before push and PR creation; a `## Reviews` artifact path that does not resolve to a regular file inside the project is never auto-resolved, and repairing the row is the only route forward | `boundary:unresolved-critical-findings` | Offending ledger row (scope, type, artifact) |
|
|
196
197
|
| COMPLETE-01 | `oat-project-complete` | Batched completion/archive/summary/PR choices | Confirm completion and choose optional actions | Confirm only after gates pass; honor explicit config, refresh missing/stale summary, avoid duplicate PR, and archive only when configured | `auto-resolve` | Completion state and summary |
|
|
197
198
|
| COMPLETE-02 | `oat-project-complete` | Required documentation missing | Run document or explicitly skip | Run autonomous documentation; do not silently skip a required gate | `auto-resolve` / `boundary:repository-policy-approval` | Documentation state |
|
|
198
199
|
| COMPLETE-03 | `oat-project-complete` | Unsatisfied completion gates | Continue anyway | Never continue silently; unresolved final review is a review boundary and other hard policies remain boundaries | `boundary:unresolved-critical-findings` / `boundary:repository-policy-approval` | Combined gate report |
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-capture
|
|
3
|
-
version: 1.0.2
|
|
4
3
|
description: Use when work happened outside the OAT project workflow and needs retroactive project tracking. Creates a full project from an existing branch and conversation context.
|
|
5
4
|
disable-model-invocation: true
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.0.3
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Capture Untracked Work
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-clear-active
|
|
3
3
|
description: Use when switching context or cleaning up project state. Clears the active OAT project.
|
|
4
|
-
version: 1.2.0
|
|
5
4
|
disable-model-invocation: true
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Bash, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.2.1
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Clear Active Project
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-complete
|
|
3
|
-
version: 1.7.8
|
|
4
3
|
description: Use when all implementation work is finished and the project is ready to close. Marks the OAT project lifecycle as complete.
|
|
5
4
|
disable-model-invocation: true
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Bash, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.7.9
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Complete Project
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-design
|
|
3
|
-
version: 2.3.4
|
|
4
3
|
description: Use when discovery is complete and implementation-ready decisions are needed. Runs a collaborative, selective collaborative, or draft-and-review design flow, confirms requirements and produces both `spec.md` and `design.md`, and commits artifacts before the user-review gate.
|
|
5
4
|
disable-model-invocation: true
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Bash(git:*), Glob, Grep, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 2.3.5
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Design Phase
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-discover
|
|
3
|
-
version: 2.2.5
|
|
4
3
|
description: Use when the user explicitly asks to continue discovery for an active spec-driven OAT project — e.g. "continue discovery", "run discovery", or confirms a previously offered discovery step. Do NOT auto-invoke for new ideas or quick/lite-mode projects. Gathers requirements and context before spec/design.
|
|
5
4
|
disable-model-invocation: false
|
|
6
5
|
user-invocable: true
|
|
7
6
|
allowed-tools: Read, Write, Bash(git:*), Bash(oat:*), Bash(pnpm:*), Glob, Grep, AskUserQuestion
|
|
7
|
+
metadata:
|
|
8
|
+
version: 2.2.6
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Discovery Phase
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-dispatch-subagents
|
|
3
|
-
version: 1.1.4
|
|
4
3
|
description: Use when an OAT project lifecycle skill needs to translate project state, phase or task scope, gates, and write authority into a provider-neutral subagent dispatch.
|
|
5
4
|
disable-model-invocation: true
|
|
6
5
|
user-invocable: false
|
|
7
6
|
allowed-tools: Read, Bash
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.1.5
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Dispatching OAT Project Subagents
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-document
|
|
3
|
-
version: 1.8.2
|
|
4
3
|
description: Use when the user requests or confirms documenting an active OAT project — e.g. "document the project", "update the docs", "run oat-project-document", or confirms a previously offered documentation run. Do NOT auto-invoke when implementation completes. Analyzes project artifacts, presents a documentation delta plan, and applies approved changes.
|
|
5
4
|
argument-hint: '[project-path] [--auto]'
|
|
6
5
|
disable-model-invocation: false
|
|
7
6
|
user-invocable: true
|
|
8
7
|
allowed-tools: Read, Write, Edit, Bash(git:*), Bash(jq:*), Bash(oat pjm:*), Bash(oat project push:*), Bash(oat project scope:*), Bash(oat tools:*), Glob, Grep, AskUserQuestion, Skill
|
|
8
|
+
metadata:
|
|
9
|
+
version: 1.8.3
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# Project Documentation Sync
|
|
@@ -193,6 +193,7 @@ remains.
|
|
|
193
193
|
| PRFINAL-02 | `oat-project-pr-final` | Missing title/base | Ask for title and resolve base | Use the documented ticket/conventional-title and base-branch resolution chains | `auto-resolve` | PR artifact frontmatter and command |
|
|
194
194
|
| PRFINAL-03 | `oat-project-pr-final` | Final review not passed | Ask whether to proceed anyway | Never proceed in autonomy; stop and route to final review/re-review | `boundary:unresolved-critical-findings` | Final review row and blocker report |
|
|
195
195
|
| PRFINAL-04 | `oat-project-pr-final` | Push/PR policy or credentials | Ask operator to authorize or authenticate | Stop when repository policy or missing credentials prevent push/PR creation | `boundary:repository-policy-approval` / `boundary:missing-credentials` | PR state and redacted command error |
|
|
196
|
+
| PRFINAL-05 | `oat-project-pr-final` | Unresolved review-ledger artifact path | Report the offending row and stop | Stop before push and PR creation; a `## Reviews` artifact path that does not resolve to a regular file inside the project is never auto-resolved, and repairing the row is the only route forward | `boundary:unresolved-critical-findings` | Offending ledger row (scope, type, artifact) |
|
|
196
197
|
| COMPLETE-01 | `oat-project-complete` | Batched completion/archive/summary/PR choices | Confirm completion and choose optional actions | Confirm only after gates pass; honor explicit config, refresh missing/stale summary, avoid duplicate PR, and archive only when configured | `auto-resolve` | Completion state and summary |
|
|
197
198
|
| COMPLETE-02 | `oat-project-complete` | Required documentation missing | Run document or explicitly skip | Run autonomous documentation; do not silently skip a required gate | `auto-resolve` / `boundary:repository-policy-approval` | Documentation state |
|
|
198
199
|
| COMPLETE-03 | `oat-project-complete` | Unsatisfied completion gates | Continue anyway | Never continue silently; unresolved final review is a review boundary and other hard policies remain boundaries | `boundary:unresolved-critical-findings` / `boundary:repository-policy-approval` | Combined gate report |
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-implement
|
|
3
|
-
version: 2.3.6
|
|
4
3
|
description: Use when plan.md is ready for execution. Dispatches one phase implementer per phase, owns independent phase review and bounded fix routing, and supports plan-declared worktree-isolated parallel phases.
|
|
5
4
|
oat_gateable: true
|
|
6
5
|
argument-hint: '[--retry-limit <N>] [--dry-run]'
|
|
7
6
|
disable-model-invocation: true
|
|
8
7
|
user-invocable: true
|
|
9
8
|
allowed-tools: Read, Write, Bash(git:*), Bash(oat:*), Bash(oat project log:*), Glob, Grep, AskUserQuestion, Task
|
|
9
|
+
metadata:
|
|
10
|
+
version: 2.3.7
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
# Implementation Phase
|
|
@@ -193,6 +193,7 @@ remains.
|
|
|
193
193
|
| PRFINAL-02 | `oat-project-pr-final` | Missing title/base | Ask for title and resolve base | Use the documented ticket/conventional-title and base-branch resolution chains | `auto-resolve` | PR artifact frontmatter and command |
|
|
194
194
|
| PRFINAL-03 | `oat-project-pr-final` | Final review not passed | Ask whether to proceed anyway | Never proceed in autonomy; stop and route to final review/re-review | `boundary:unresolved-critical-findings` | Final review row and blocker report |
|
|
195
195
|
| PRFINAL-04 | `oat-project-pr-final` | Push/PR policy or credentials | Ask operator to authorize or authenticate | Stop when repository policy or missing credentials prevent push/PR creation | `boundary:repository-policy-approval` / `boundary:missing-credentials` | PR state and redacted command error |
|
|
196
|
+
| PRFINAL-05 | `oat-project-pr-final` | Unresolved review-ledger artifact path | Report the offending row and stop | Stop before push and PR creation; a `## Reviews` artifact path that does not resolve to a regular file inside the project is never auto-resolved, and repairing the row is the only route forward | `boundary:unresolved-critical-findings` | Offending ledger row (scope, type, artifact) |
|
|
196
197
|
| COMPLETE-01 | `oat-project-complete` | Batched completion/archive/summary/PR choices | Confirm completion and choose optional actions | Confirm only after gates pass; honor explicit config, refresh missing/stale summary, avoid duplicate PR, and archive only when configured | `auto-resolve` | Completion state and summary |
|
|
197
198
|
| COMPLETE-02 | `oat-project-complete` | Required documentation missing | Run document or explicitly skip | Run autonomous documentation; do not silently skip a required gate | `auto-resolve` / `boundary:repository-policy-approval` | Documentation state |
|
|
198
199
|
| COMPLETE-03 | `oat-project-complete` | Unsatisfied completion gates | Continue anyway | Never continue silently; unresolved final review is a review boundary and other hard policies remain boundaries | `boundary:unresolved-critical-findings` / `boundary:repository-policy-approval` | Combined gate report |
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-import-plan
|
|
3
|
-
version: 1.4.14
|
|
4
3
|
description: Use when you have an external markdown plan to execute with OAT. Preserves the source plan and normalizes it into canonical plan.md format.
|
|
5
4
|
argument-hint: '<path-to-plan.md> [--provider codex|cursor|claude] [--project <name>]'
|
|
6
5
|
oat_gateable: true
|
|
7
6
|
disable-model-invocation: true
|
|
8
7
|
user-invocable: true
|
|
9
8
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
9
|
+
metadata:
|
|
10
|
+
version: 1.4.15
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
# Import External Plan
|