@open-agent-toolkit/cli 0.3.15 → 0.3.17
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/NOTICES.md +48 -0
- package/assets/agents/oat-phase-implementer.md +26 -6
- package/assets/agents/oat-reviewer.md +51 -1
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/contributing/documentation.md +4 -0
- package/assets/docs/contributing/skills.md +3 -1
- package/assets/docs/getting-started/bootstrap.md +1 -1
- package/assets/docs/getting-started/index.md +0 -4
- package/assets/docs/getting-started/tool-packs.md +0 -7
- package/assets/docs/provider-sync/commands.md +21 -0
- package/assets/docs/reference/cli-reference.md +44 -2
- package/assets/docs/reference/config-and-local-state.md +11 -2
- package/assets/docs/reference/configuration.md +10 -2
- package/assets/docs/reference/project-artifacts.md +43 -8
- package/assets/docs/skills/index.md +1 -0
- package/assets/docs/skills/recon.md +8 -5
- package/assets/docs/skills/repo-improve.md +9 -7
- package/assets/docs/workflows/advanced/autonomy.md +50 -0
- package/assets/docs/workflows/advanced/workflow-gates.md +109 -10
- package/assets/docs/workflows/approvals-and-automation.md +3 -1
- package/assets/docs/workflows/backlog-and-planning/backlog-lifecycle.md +25 -24
- package/assets/docs/workflows/backlog-and-planning/remote-project-management.md +0 -7
- package/assets/docs/workflows/ideas/lifecycle.md +2 -7
- package/assets/docs/workflows/projects/closeout/closeout-skills.md +62 -1
- package/assets/docs/workflows/projects/execution/implementation-execution.md +23 -3
- package/assets/docs/workflows/projects/execution/project-log.md +6 -0
- package/assets/docs/workflows/projects/lifecycle.md +7 -0
- package/assets/docs/workflows/projects/reviews/index.md +63 -1
- package/assets/docs/workflows/projects/reviews/review-flavors.md +8 -0
- package/assets/docs/workflows/waves/wave-workflows.md +11 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-agent-instructions-apply/SKILL.md +14 -4
- package/assets/skills/oat-brainstorm/SKILL.md +17 -13
- package/assets/skills/oat-docs-apply/SKILL.md +13 -3
- package/assets/skills/oat-doctor/SKILL.md +11 -1
- package/assets/skills/oat-explainer-kit/SKILL.md +1 -1
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +6 -3
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-pjm-update-repo-reference/SKILL.md +28 -3
- package/assets/skills/oat-project-autonomous/SKILL.md +60 -5
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +210 -165
- package/assets/skills/oat-project-capture/SKILL.md +7 -3
- package/assets/skills/oat-project-complete/SKILL.md +39 -34
- package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +106 -28
- package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +30 -3
- package/assets/skills/oat-project-complete-auto/SKILL.md +388 -0
- package/assets/skills/oat-project-design/SKILL.md +12 -9
- package/assets/skills/oat-project-discover/SKILL.md +8 -4
- package/assets/skills/oat-project-document/SKILL.md +14 -5
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-implement/SKILL.md +6 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +34 -7
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-implement/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-implement/references/phase-execution.md +38 -6
- package/assets/skills/oat-project-import-plan/SKILL.md +20 -6
- package/assets/skills/oat-project-lite/SKILL.md +7 -5
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-new/SKILL.md +6 -2
- package/assets/skills/oat-project-next/SKILL.md +19 -2
- package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-plan/SKILL.md +14 -6
- package/assets/skills/oat-project-pr-final/SKILL.md +4 -3
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-progress/SKILL.md +27 -1
- package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +7 -3
- package/assets/skills/oat-project-quick-start/SKILL.md +47 -14
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-quick-start/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-reconcile/SKILL.md +8 -4
- package/assets/skills/oat-project-retro/SKILL.md +1 -1
- package/assets/skills/oat-project-retro/references/apply-procedure.md +6 -6
- package/assets/skills/oat-project-retro-file/SKILL.md +7 -3
- package/assets/skills/oat-project-review-provide/SKILL.md +23 -4
- package/assets/skills/oat-project-review-provide-remote/SKILL.md +19 -1
- package/assets/skills/oat-project-review-receive/SKILL.md +57 -14
- package/assets/skills/oat-project-review-receive/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-review-receive-remote/SKILL.md +7 -3
- package/assets/skills/oat-project-revise/SKILL.md +13 -5
- package/assets/skills/oat-project-spec/SKILL.md +8 -4
- package/assets/skills/oat-project-summary/SKILL.md +11 -7
- package/assets/skills/oat-repo-knowledge-index/SKILL.md +54 -20
- package/assets/skills/oat-repo-knowledge-index/scripts/refresh-owned.mjs +118 -0
- package/assets/skills/oat-review-provide/SKILL.md +7 -3
- package/assets/skills/oat-review-receive-remote/SKILL.md +14 -4
- package/assets/skills/oat-wave-execute/SKILL.md +72 -38
- package/assets/skills/oat-wave-execute/assets/wrapper-plan-template.md +16 -2
- package/assets/skills/oat-wave-program/SKILL.md +15 -6
- package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +45 -17
- package/assets/skills/oat-wrap-up/SKILL.md +9 -3
- package/assets/skills/oat-wrap-up/references/report-template.md +1 -1
- package/assets/skills/recon/SKILL.md +1 -1
- package/assets/skills/recon/references/packet-contract.md +18 -3
- package/assets/skills/recon/scripts/lib/contracts.mjs +16 -2
- package/assets/skills/recon/scripts/reconcile-ledger.mjs +20 -10
- package/assets/skills/recon/scripts/render-packet.mjs +31 -3
- package/assets/skills/recon/scripts/validate-packet.mjs +5 -5
- package/assets/templates/pjm-agents.md +38 -8
- package/assets/templates/repo-agents.md +5 -0
- package/assets/templates/repo-readme.md +5 -0
- package/assets/templates/state.md +7 -0
- package/dist/commands/backlog/archive.d.ts +3 -0
- package/dist/commands/backlog/archive.d.ts.map +1 -1
- package/dist/commands/backlog/archive.js +63 -26
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +3 -0
- package/dist/commands/backlog/rewrite-references.d.ts +5 -0
- package/dist/commands/backlog/rewrite-references.d.ts.map +1 -1
- package/dist/commands/backlog/rewrite-references.js +39 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +13 -0
- package/dist/commands/gate/index.d.ts +5 -0
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +270 -9
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +1 -0
- package/dist/commands/internal/commit-paths.d.ts +3 -0
- package/dist/commands/internal/commit-paths.d.ts.map +1 -0
- package/dist/commands/internal/commit-paths.js +31 -0
- package/dist/commands/internal/index.d.ts.map +1 -1
- package/dist/commands/internal/index.js +2 -0
- package/dist/commands/pjm/init.d.ts.map +1 -1
- package/dist/commands/pjm/init.js +37 -8
- package/dist/commands/project/archive/archive-utils.d.ts +6 -3
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +510 -104
- package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
- package/dist/commands/project/archive/push-runner.js +1 -0
- package/dist/commands/project/log/append.d.ts +2 -3
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +55 -101
- package/dist/commands/project/migrate/index.d.ts +1 -2
- package/dist/commands/project/migrate/index.d.ts.map +1 -1
- package/dist/commands/project/migrate/index.js +8 -2
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +4 -4
- package/dist/commands/project/promote/promote.d.ts +8 -0
- package/dist/commands/project/promote/promote.d.ts.map +1 -1
- package/dist/commands/project/promote/promote.js +37 -6
- package/dist/commands/project/status.d.ts.map +1 -1
- package/dist/commands/project/status.js +3 -0
- package/dist/commands/project/sync/ref-sync.d.ts +12 -1
- package/dist/commands/project/sync/ref-sync.d.ts.map +1 -1
- package/dist/commands/project/sync/ref-sync.js +347 -23
- package/dist/commands/shared/exact-path-commit.d.ts +32 -0
- package/dist/commands/shared/exact-path-commit.d.ts.map +1 -0
- package/dist/commands/shared/exact-path-commit.js +691 -0
- package/dist/commands/shared/frontmatter.d.ts +1 -1
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +1 -0
- package/dist/commands/state/generate.d.ts +1 -1
- package/dist/commands/state/generate.d.ts.map +1 -1
- package/dist/commands/state/generate.js +87 -8
- package/dist/commands/sync/apply.d.ts.map +1 -1
- package/dist/commands/sync/apply.js +31 -5
- package/dist/commands/sync/dry-run.d.ts.map +1 -1
- package/dist/commands/sync/dry-run.js +28 -11
- package/dist/commands/sync/sync.utils.d.ts +13 -0
- package/dist/commands/sync/sync.utils.d.ts.map +1 -1
- package/dist/commands/sync/sync.utils.js +21 -1
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +1 -0
- package/dist/config/oat-config.d.ts +1 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +3 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +1 -0
- package/dist/drift/detector.js +6 -6
- package/dist/engine/compute-plan.d.ts.map +1 -1
- package/dist/engine/compute-plan.js +87 -2
- package/dist/engine/engine.types.d.ts +10 -1
- package/dist/engine/engine.types.d.ts.map +1 -1
- package/dist/engine/engine.types.js +4 -0
- package/dist/engine/execute-plan.d.ts.map +1 -1
- package/dist/engine/execute-plan.js +42 -5
- package/dist/engine/managed-copy-hash.d.ts +4 -3
- package/dist/engine/managed-copy-hash.d.ts.map +1 -1
- package/dist/engine/managed-copy-hash.js +4 -3
- package/dist/fs/assets.d.ts.map +1 -1
- package/dist/fs/assets.js +7 -1
- package/dist/manifest/hash.d.ts +8 -10
- package/dist/manifest/hash.d.ts.map +1 -1
- package/dist/ui/output.js +1 -1
- package/dist/validation/skills.d.ts.map +1 -1
- package/dist/validation/skills.js +151 -11
- package/package.json +3 -2
|
@@ -204,15 +204,25 @@ function rewriteItemToken(token, context) {
|
|
|
204
204
|
if (isRelativeTarget(token)) {
|
|
205
205
|
const fromFile = resolve(context.baseDirectory, token);
|
|
206
206
|
if (fromFile === itemsPath) {
|
|
207
|
+
context.affectedReference = true;
|
|
207
208
|
return relativeFrom(context.currentDirectory, archivedPath, token);
|
|
208
209
|
}
|
|
210
|
+
if (fromFile === archivedPath) {
|
|
211
|
+
context.affectedReference = true;
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
209
214
|
// A token that already resolves to a different, existing file is a
|
|
210
215
|
// working link: never repoint it through a fallback base.
|
|
211
216
|
if (pathExistsSync(fromFile)) {
|
|
212
217
|
return null;
|
|
213
218
|
}
|
|
214
219
|
for (const base of [layout.repoRoot, layout.scanRoot]) {
|
|
220
|
+
if (base !== null && resolve(base, token) === archivedPath) {
|
|
221
|
+
context.affectedReference = true;
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
215
224
|
if (base !== null && resolve(base, token) === itemsPath) {
|
|
225
|
+
context.affectedReference = true;
|
|
216
226
|
return toPosix(relative(base, archivedPath));
|
|
217
227
|
}
|
|
218
228
|
}
|
|
@@ -487,6 +497,7 @@ export async function rewriteInboundReferences(backlogRoot, itemsPath, archivedP
|
|
|
487
497
|
const absoluteArchivedPath = resolve(archivedPath);
|
|
488
498
|
const displayRoot = layout.repoRoot ?? layout.scanRoot;
|
|
489
499
|
const rewritten = [];
|
|
500
|
+
const affectedPaths = [];
|
|
490
501
|
const warnings = [];
|
|
491
502
|
// The moved item goes first, so a failure on a later file never leaves its
|
|
492
503
|
// own links half-rebased: a retry (which skips the rebase) stays correct.
|
|
@@ -505,12 +516,39 @@ export async function rewriteInboundReferences(backlogRoot, itemsPath, archivedP
|
|
|
505
516
|
baseDirectory: moved ? dirname(absoluteItemsPath) : dirname(absoluteFile),
|
|
506
517
|
currentDirectory: dirname(absoluteFile),
|
|
507
518
|
warnings,
|
|
519
|
+
affectedReference: false,
|
|
508
520
|
};
|
|
509
521
|
const next = rewriteContent(content, context, moved);
|
|
510
522
|
if (next !== content) {
|
|
511
523
|
await replaceAtomically(absoluteFile, next, identity);
|
|
512
524
|
rewritten.push(context.fileName);
|
|
513
525
|
}
|
|
526
|
+
if (next !== content) {
|
|
527
|
+
affectedPaths.push(absoluteFile);
|
|
528
|
+
}
|
|
529
|
+
else if (options.recoverPendingArchive && context.affectedReference) {
|
|
530
|
+
// Existing archived links are not ownership evidence. Recover a prior
|
|
531
|
+
// repaired reference only when HEAD's same grammar still names the old
|
|
532
|
+
// item and this pending move has not yet been committed.
|
|
533
|
+
try {
|
|
534
|
+
const { stdout: headContent } = await execFileAsync('git', [
|
|
535
|
+
'show',
|
|
536
|
+
`HEAD:./${toPosix(relative(layout.scanRoot, absoluteFile))}`,
|
|
537
|
+
], { cwd: layout.scanRoot });
|
|
538
|
+
const historicalContext = {
|
|
539
|
+
...context,
|
|
540
|
+
baseDirectory: dirname(absoluteFile),
|
|
541
|
+
warnings: [],
|
|
542
|
+
affectedReference: false,
|
|
543
|
+
};
|
|
544
|
+
if (rewriteContent(headContent, historicalContext, false) !== headContent) {
|
|
545
|
+
affectedPaths.push(absoluteFile);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
catch {
|
|
549
|
+
// Without historical file bytes there is no proof of prior ownership.
|
|
550
|
+
}
|
|
551
|
+
}
|
|
514
552
|
}
|
|
515
|
-
return { rewritten, warnings };
|
|
553
|
+
return { rewritten, affectedPaths, warnings };
|
|
516
554
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAoBzC,OAAO,EASL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,EAQnB,KAAK,UAAU,EAqBhB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAoBzC,OAAO,EASL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,EAQnB,KAAK,UAAU,EAqBhB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuKpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kCAAkC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7E,2CAA2C,EAAE,CAC3C,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,gDAAgD,EAAE,CAChD,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,6CAA6C,EAAE,CAC7C,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,yBAAyB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACxE,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,mCAAmC,EAAE,OAAO,mCAAmC,CAAC;IAChF,0BAA0B,EAAE,OAAO,0BAA0B,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAoqHD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAqMT"}
|
|
@@ -94,6 +94,7 @@ const KEY_ORDER = [
|
|
|
94
94
|
'workflow.hillCheckpointDefault',
|
|
95
95
|
'workflow.archiveOnComplete',
|
|
96
96
|
'workflow.createPrOnComplete',
|
|
97
|
+
'workflow.autonomousComplete',
|
|
97
98
|
'workflow.postImplementSequence',
|
|
98
99
|
'workflow.retro.filing.repo',
|
|
99
100
|
'workflow.retro.filing.upstream',
|
|
@@ -600,6 +601,17 @@ const CONFIG_CATALOG = [
|
|
|
600
601
|
owningCommand: 'oat config set workflow.createPrOnComplete <true|false>',
|
|
601
602
|
description: 'Skip the "Open a PR?" prompt in oat-project-complete. When true, completion auto-triggers PR creation. Resolution: local > shared > user > default.',
|
|
602
603
|
},
|
|
604
|
+
{
|
|
605
|
+
key: 'workflow.autonomousComplete',
|
|
606
|
+
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
607
|
+
file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
|
|
608
|
+
scope: 'workflow',
|
|
609
|
+
type: 'boolean',
|
|
610
|
+
defaultValue: 'false',
|
|
611
|
+
mutability: 'read/write',
|
|
612
|
+
owningCommand: 'oat config set workflow.autonomousComplete <true|false>',
|
|
613
|
+
description: 'Standing opt-in for oat-project-complete-auto, the non-interactive completion companion that runs only when a workflow names it as a step (today oat-wave-execute closeout step 8 and the oat-wave-program completion checkpoint); its OAT_AUTONOMOUS lifecycle route refuses until a lifecycle skill names the companion, and none does today. When false (the default), that skill stops with "interactive completion required". The interactive oat-project-complete is unaffected. Resolution: local > shared > user > default.',
|
|
614
|
+
},
|
|
603
615
|
{
|
|
604
616
|
key: 'workflow.postImplementSequence',
|
|
605
617
|
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
@@ -1089,6 +1101,7 @@ function closedDispatchProviderValues(provider) {
|
|
|
1089
1101
|
const WORKFLOW_BOOLEAN_KEYS = new Set([
|
|
1090
1102
|
'workflow.archiveOnComplete',
|
|
1091
1103
|
'workflow.createPrOnComplete',
|
|
1104
|
+
'workflow.autonomousComplete',
|
|
1092
1105
|
'workflow.autoReviewAtHillCheckpoints',
|
|
1093
1106
|
'workflow.autoNarrowReReviewScope',
|
|
1094
1107
|
'workflow.autoArtifactReview.plan',
|
|
@@ -30,6 +30,7 @@ interface GateCommandDependencies {
|
|
|
30
30
|
processEnv: NodeJS.ProcessEnv;
|
|
31
31
|
writeGateRunMarker: (path: string, marker: GateRunMarker, warn: (message: string) => void) => Promise<boolean>;
|
|
32
32
|
removeGateRunMarker: (path: string, warn: (message: string) => void) => Promise<void>;
|
|
33
|
+
isProcessAlive: (pid: number) => boolean;
|
|
33
34
|
writeGateProjectLogReceipt: (path: string, receipt: GateProjectLogReceipt, warn: (message: string) => void) => Promise<boolean>;
|
|
34
35
|
sleep: (ms: number) => Promise<void>;
|
|
35
36
|
writeDiagnostic: (message: string) => void;
|
|
@@ -42,6 +43,10 @@ interface GateRunMarker {
|
|
|
42
43
|
reviewType: string | null;
|
|
43
44
|
reviewScope: string | null;
|
|
44
45
|
project: string;
|
|
46
|
+
/** Absolute, symlink-resolved project directory. */
|
|
47
|
+
projectRoot: string;
|
|
48
|
+
/** The gate process that owns the marker. */
|
|
49
|
+
pid: number;
|
|
45
50
|
startedAt: string;
|
|
46
51
|
budgetMs: number;
|
|
47
52
|
budgetSource: GateTimeoutSource;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { execFileSync } from 'node:child_process';
|
|
2
2
|
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
-
import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { link, mkdir, readdir, readFile, realpath, rmdir, rm, writeFile, } from 'node:fs/promises';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { basename, dirname, isAbsolute, join, relative, resolve, } from 'node:path';
|
|
6
6
|
import { buildCommandContext, } from '../../app/command-context.js';
|
|
@@ -46,6 +46,7 @@ const DEFAULT_DEPENDENCIES = {
|
|
|
46
46
|
processEnv: process.env,
|
|
47
47
|
writeGateRunMarker,
|
|
48
48
|
removeGateRunMarker,
|
|
49
|
+
isProcessAlive,
|
|
49
50
|
writeGateProjectLogReceipt,
|
|
50
51
|
sleep: async (ms) => {
|
|
51
52
|
await new Promise((settle) => setTimeout(settle, ms));
|
|
@@ -92,9 +93,20 @@ const GATE_CHECK_TIMEOUT_MS = 5_000;
|
|
|
92
93
|
const GATE_EXEC_TIMEOUT_MS = 15 * 60 * 1_000;
|
|
93
94
|
const GATE_LIVENESS_INTERVAL_MS = 30_000;
|
|
94
95
|
const AMBIENT_ACTIVITY_ATTRIBUTION = 'not attributable to this gate child';
|
|
96
|
+
/**
|
|
97
|
+
* Run markers and duplicate-run claims share one directory. A gate exports it
|
|
98
|
+
* to its reviewer child as `OAT_GATE_RUN_MARKER_DIR`, so a nested gate finds
|
|
99
|
+
* its parent's claim even when the child's TMPDIR differs.
|
|
100
|
+
*/
|
|
101
|
+
function gateRunMarkerDir(env) {
|
|
102
|
+
const exported = env.OAT_GATE_RUN_MARKER_DIR?.trim();
|
|
103
|
+
return exported && isAbsolute(exported)
|
|
104
|
+
? exported
|
|
105
|
+
: join(tmpdir(), 'oat-gate-runs');
|
|
106
|
+
}
|
|
95
107
|
async function writeGateRunMarker(path, marker, warn) {
|
|
96
108
|
try {
|
|
97
|
-
await mkdir(
|
|
109
|
+
await mkdir(dirname(path), { recursive: true });
|
|
98
110
|
await writeFile(path, `${JSON.stringify(marker, null, 2)}\n`, 'utf8');
|
|
99
111
|
return true;
|
|
100
112
|
}
|
|
@@ -156,6 +168,171 @@ function warnWhenReceiptIsTracked(path, warn) {
|
|
|
156
168
|
warn(`Gate project log receipt ${path} is not ignored by git. Add a gate-receipts ignore rule for this projects root, or the receipt will be committed by the next repository-wide add.`);
|
|
157
169
|
}
|
|
158
170
|
}
|
|
171
|
+
function isProcessAlive(pid) {
|
|
172
|
+
try {
|
|
173
|
+
process.kill(pid, 0);
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
// EPERM: the process exists but belongs to another user.
|
|
178
|
+
return isErrorCode(error, 'EPERM');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function isErrorCode(error, code) {
|
|
182
|
+
return (!!error &&
|
|
183
|
+
typeof error === 'object' &&
|
|
184
|
+
'code' in error &&
|
|
185
|
+
error.code === code);
|
|
186
|
+
}
|
|
187
|
+
function normalizeGateRunKey(value) {
|
|
188
|
+
return value?.trim().toLowerCase() ?? '';
|
|
189
|
+
}
|
|
190
|
+
function gateRunClaimPath(dir, identity) {
|
|
191
|
+
const key = createHash('sha256')
|
|
192
|
+
.update([
|
|
193
|
+
identity.projectRoot,
|
|
194
|
+
normalizeGateRunKey(identity.reviewType),
|
|
195
|
+
normalizeGateRunKey(identity.reviewScope),
|
|
196
|
+
].join('\0'))
|
|
197
|
+
.digest('hex')
|
|
198
|
+
.slice(0, 32);
|
|
199
|
+
return join(dir, `claim-${key}.lock`);
|
|
200
|
+
}
|
|
201
|
+
async function readGateRunClaim(path) {
|
|
202
|
+
let text;
|
|
203
|
+
try {
|
|
204
|
+
text = await readFile(path, 'utf8');
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (isErrorCode(error, 'ENOENT')) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
let record = null;
|
|
213
|
+
try {
|
|
214
|
+
record = rawRecord(JSON.parse(text));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
record = null;
|
|
218
|
+
}
|
|
219
|
+
const holder = record &&
|
|
220
|
+
typeof record.runId === 'string' &&
|
|
221
|
+
typeof record.pid === 'number' &&
|
|
222
|
+
Number.isInteger(record.pid) &&
|
|
223
|
+
record.pid > 0
|
|
224
|
+
? { runId: record.runId, pid: record.pid, path }
|
|
225
|
+
: null;
|
|
226
|
+
return { text, holder };
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Atomically claims the duplicate-run slot for one project root, review type,
|
|
230
|
+
* and scope. The claim content is written to a private file created with
|
|
231
|
+
* `wx`, then hard-linked to the shared claim path; `link` fails with EEXIST
|
|
232
|
+
* when another run holds the slot, so two simultaneous gates can never both
|
|
233
|
+
* acquire it and a reader never sees a half-written claim. A claim whose
|
|
234
|
+
* owner is dead, or which cannot be parsed, is replaced once. Destructive
|
|
235
|
+
* recovery and release share an exclusive mutation directory; recovery reads
|
|
236
|
+
* ownership again under that guard before removing anything. A crashed guard
|
|
237
|
+
* is deliberately not reclaimed automatically: competing cleanup cannot safely
|
|
238
|
+
* remove a replacement owner of the guard itself.
|
|
239
|
+
*/
|
|
240
|
+
async function acquireGateRunClaim(input) {
|
|
241
|
+
await mkdir(input.dir, { recursive: true });
|
|
242
|
+
const path = gateRunClaimPath(input.dir, input);
|
|
243
|
+
const content = `${JSON.stringify({
|
|
244
|
+
runId: input.runId,
|
|
245
|
+
pid: process.pid,
|
|
246
|
+
projectRoot: input.projectRoot,
|
|
247
|
+
reviewType: input.reviewType?.trim() || null,
|
|
248
|
+
reviewScope: input.reviewScope?.trim() || null,
|
|
249
|
+
claimedAt: new Date().toISOString(),
|
|
250
|
+
})}\n`;
|
|
251
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
252
|
+
const draft = join(input.dir, `.claim-${input.runId}.tmp`);
|
|
253
|
+
await writeFile(draft, content, { encoding: 'utf8', flag: 'wx' });
|
|
254
|
+
try {
|
|
255
|
+
await link(draft, path);
|
|
256
|
+
return { status: 'acquired', path };
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
if (!isErrorCode(error, 'EEXIST')) {
|
|
260
|
+
throw error;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
await rm(draft, { force: true });
|
|
265
|
+
}
|
|
266
|
+
const existing = await readGateRunClaim(path);
|
|
267
|
+
if (!existing) {
|
|
268
|
+
continue; // Released between the link and the read.
|
|
269
|
+
}
|
|
270
|
+
if (existing.holder && input.isProcessAlive(existing.holder.pid)) {
|
|
271
|
+
return { status: 'held', holder: existing.holder };
|
|
272
|
+
}
|
|
273
|
+
if (attempt > 0) {
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
const mutationPath = `${path}.mutation`;
|
|
277
|
+
try {
|
|
278
|
+
await mkdir(mutationPath);
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
if (isErrorCode(error, 'EEXIST')) {
|
|
282
|
+
throw new Error(`Gate claim mutation is in progress at ${mutationPath}. Retry after it finishes; remove this guard only after verifying no gate is still using it.`, { cause: error });
|
|
283
|
+
}
|
|
284
|
+
throw error;
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
// A faster recovery may have replaced the stale claim before we took
|
|
288
|
+
// the guard. Never move the shared path aside to discover its owner.
|
|
289
|
+
const current = await readGateRunClaim(path);
|
|
290
|
+
if (current?.holder && input.isProcessAlive(current.holder.pid)) {
|
|
291
|
+
return { status: 'held', holder: current.holder };
|
|
292
|
+
}
|
|
293
|
+
if (current) {
|
|
294
|
+
await rm(path);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
finally {
|
|
298
|
+
await rmdir(mutationPath);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const final = await readGateRunClaim(path);
|
|
302
|
+
return {
|
|
303
|
+
status: 'held',
|
|
304
|
+
holder: final?.holder ?? { runId: 'unknown', pid: 0, path },
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/** Removes a claim only while it still belongs to this run. */
|
|
308
|
+
async function releaseGateRunClaim(path, runId, warn) {
|
|
309
|
+
const mutationPath = `${path}.mutation`;
|
|
310
|
+
try {
|
|
311
|
+
await mkdir(mutationPath);
|
|
312
|
+
try {
|
|
313
|
+
const existing = await readGateRunClaim(path);
|
|
314
|
+
if (existing?.holder?.runId === runId) {
|
|
315
|
+
await rm(path);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
finally {
|
|
319
|
+
await rmdir(mutationPath);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
324
|
+
warn(`Unable to release gate run claim ${path}: ${detail}`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async function resolveGateProjectRoot(repoRoot, projectPath) {
|
|
328
|
+
const absolute = resolve(repoRoot, projectPath);
|
|
329
|
+
try {
|
|
330
|
+
return await realpath(absolute);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return absolute;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
159
336
|
async function removeGateRunMarker(path, warn) {
|
|
160
337
|
try {
|
|
161
338
|
await rm(path);
|
|
@@ -476,7 +653,8 @@ function resolveGateExecTimeout(input) {
|
|
|
476
653
|
}
|
|
477
654
|
const scope = input.reviewScope?.trim().toLowerCase() ?? '';
|
|
478
655
|
if (reviewType === 'artifact') {
|
|
479
|
-
|
|
656
|
+
// Artifact and plan reviews read the full surface; they default to 30 minutes.
|
|
657
|
+
return { timeoutMs: 1_800_000, source: 'scope-default' };
|
|
480
658
|
}
|
|
481
659
|
if (reviewType === 'code') {
|
|
482
660
|
if (/^p\d+-t\d+$/.test(scope)) {
|
|
@@ -1523,11 +1701,15 @@ function writeReviewGateResult(context, payload) {
|
|
|
1523
1701
|
context.logger.info(payload.handoff);
|
|
1524
1702
|
}
|
|
1525
1703
|
function writeReviewGateExecutionFailure(context, payload) {
|
|
1526
|
-
const message = payload.
|
|
1527
|
-
? `Review did not
|
|
1528
|
-
: payload.
|
|
1529
|
-
? `Review did not
|
|
1530
|
-
:
|
|
1704
|
+
const message = payload.claimFailure
|
|
1705
|
+
? `Review did not start: duplicate-run exclusion could not be established (${payload.claimFailure}).`
|
|
1706
|
+
: payload.duplicateRun
|
|
1707
|
+
? `Review did not start: gate run ${payload.duplicateRun.runId} (pid ${payload.duplicateRun.pid}) is already reviewing ${payload.project} (${payload.duplicateRun.reviewType} review, scope ${payload.duplicateRun.scope}). Wait for it to finish, or remove its claim ${payload.duplicateRun.path} if that process is not a gate.`
|
|
1708
|
+
: payload.refusal
|
|
1709
|
+
? `Review did not complete: reviewer refused the headless route (${payload.refusal}).`
|
|
1710
|
+
: payload.timedOut
|
|
1711
|
+
? `Review did not complete: target ${payload.target} timed out after ${payload.timeoutMs}ms.`
|
|
1712
|
+
: `Review did not complete: target ${payload.target} exited with code ${payload.exitCode}.`;
|
|
1531
1713
|
if (context.json) {
|
|
1532
1714
|
context.logger.json({
|
|
1533
1715
|
status: 'review_failed',
|
|
@@ -1556,6 +1738,7 @@ function writeReviewGateExecutionFailure(context, payload) {
|
|
|
1556
1738
|
...(payload.activityEvidence
|
|
1557
1739
|
? { activityEvidence: payload.activityEvidence }
|
|
1558
1740
|
: {}),
|
|
1741
|
+
...(payload.recursion ? { recursion: payload.recursion } : {}),
|
|
1559
1742
|
message,
|
|
1560
1743
|
});
|
|
1561
1744
|
return;
|
|
@@ -2482,6 +2665,8 @@ async function disposeValidatedReviewArtifact(snapshot, identity, dependencies,
|
|
|
2482
2665
|
}
|
|
2483
2666
|
async function runReviewGate(prompt, options, context, dependencies) {
|
|
2484
2667
|
const runId = randomUUID();
|
|
2668
|
+
let recursion;
|
|
2669
|
+
let runClaimPath;
|
|
2485
2670
|
let runMarkerPath;
|
|
2486
2671
|
let runMarkerWritten = false;
|
|
2487
2672
|
let branchLocalGateCli;
|
|
@@ -2525,6 +2710,71 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2525
2710
|
rawPersisted,
|
|
2526
2711
|
});
|
|
2527
2712
|
const dispatchReport = buildGateDispatchReport(gateInvocation, options.reviewScope?.trim() || 'gate-review');
|
|
2713
|
+
// Claim the project, review type, and scope atomically before anything is
|
|
2714
|
+
// launched or logged, so a second live gate (a reviewer that launches its
|
|
2715
|
+
// own gate, or two simultaneous launches) is rejected.
|
|
2716
|
+
const runMarkerDir = gateRunMarkerDir(dependencies.processEnv);
|
|
2717
|
+
const projectRoot = await resolveGateProjectRoot(repoRoot, projectPath);
|
|
2718
|
+
let duplicateRun = null;
|
|
2719
|
+
let claimFailure;
|
|
2720
|
+
try {
|
|
2721
|
+
const claim = await acquireGateRunClaim({
|
|
2722
|
+
dir: runMarkerDir,
|
|
2723
|
+
projectRoot,
|
|
2724
|
+
reviewType: options.reviewType,
|
|
2725
|
+
reviewScope: options.reviewScope,
|
|
2726
|
+
runId,
|
|
2727
|
+
isProcessAlive: dependencies.isProcessAlive,
|
|
2728
|
+
});
|
|
2729
|
+
if (claim.status === 'acquired') {
|
|
2730
|
+
runClaimPath = claim.path;
|
|
2731
|
+
recursion = { decision: 'none' };
|
|
2732
|
+
}
|
|
2733
|
+
else {
|
|
2734
|
+
duplicateRun = claim.holder;
|
|
2735
|
+
recursion = { decision: 'rejected', matchedRunId: claim.holder.runId };
|
|
2736
|
+
}
|
|
2737
|
+
}
|
|
2738
|
+
catch (error) {
|
|
2739
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
2740
|
+
context.logger.warn(`Unable to claim this gate run in ${runMarkerDir}: ${detail}; review will not start.`);
|
|
2741
|
+
recursion = { decision: 'unchecked' };
|
|
2742
|
+
claimFailure = detail;
|
|
2743
|
+
}
|
|
2744
|
+
if (context.json) {
|
|
2745
|
+
dependencies.writeDiagnostic(`${JSON.stringify({
|
|
2746
|
+
type: 'gate-recursion',
|
|
2747
|
+
runId,
|
|
2748
|
+
...recursion,
|
|
2749
|
+
...(duplicateRun
|
|
2750
|
+
? { matchedPid: duplicateRun.pid, claimPath: duplicateRun.path }
|
|
2751
|
+
: {}),
|
|
2752
|
+
})}\n`);
|
|
2753
|
+
}
|
|
2754
|
+
if (duplicateRun || claimFailure) {
|
|
2755
|
+
writeReviewGateExecutionFailure(context, {
|
|
2756
|
+
runId,
|
|
2757
|
+
target: selected.id,
|
|
2758
|
+
project: projectPath,
|
|
2759
|
+
projectResolutionSource: reviewProject.source,
|
|
2760
|
+
exitCode: 1,
|
|
2761
|
+
...(duplicateRun
|
|
2762
|
+
? {
|
|
2763
|
+
duplicateRun: {
|
|
2764
|
+
...duplicateRun,
|
|
2765
|
+
reviewType: options.reviewType?.trim() || 'untyped',
|
|
2766
|
+
scope: options.reviewScope?.trim() || 'none',
|
|
2767
|
+
},
|
|
2768
|
+
}
|
|
2769
|
+
: {}),
|
|
2770
|
+
claimFailure,
|
|
2771
|
+
gateInvocation,
|
|
2772
|
+
dispatchReport,
|
|
2773
|
+
recursion,
|
|
2774
|
+
});
|
|
2775
|
+
process.exitCode = 1;
|
|
2776
|
+
return;
|
|
2777
|
+
}
|
|
2528
2778
|
postSelectionContext = {
|
|
2529
2779
|
project: projectPath,
|
|
2530
2780
|
projectResolutionSource: reviewProject.source,
|
|
@@ -2575,7 +2825,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2575
2825
|
: []),
|
|
2576
2826
|
prompt.join(' '),
|
|
2577
2827
|
]);
|
|
2578
|
-
runMarkerPath = join(
|
|
2828
|
+
runMarkerPath = join(runMarkerDir, `${runId}.json`);
|
|
2579
2829
|
runMarkerWritten = await dependencies.writeGateRunMarker(runMarkerPath, {
|
|
2580
2830
|
runId,
|
|
2581
2831
|
targetId: selected.id,
|
|
@@ -2583,6 +2833,8 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2583
2833
|
reviewType: options.reviewType?.trim() || null,
|
|
2584
2834
|
reviewScope: options.reviewScope?.trim() || null,
|
|
2585
2835
|
project: projectPath,
|
|
2836
|
+
projectRoot,
|
|
2837
|
+
pid: process.pid,
|
|
2586
2838
|
startedAt: new Date().toISOString(),
|
|
2587
2839
|
budgetMs: timeout.timeoutMs,
|
|
2588
2840
|
budgetSource: timeout.source,
|
|
@@ -2615,6 +2867,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2615
2867
|
OAT_GATE_CLI_PATH: branchLocalGateCli.cliPath,
|
|
2616
2868
|
OAT_GATE_CLI_ROOT: branchLocalGateCli.cliRoot,
|
|
2617
2869
|
OAT_GATE_ROUTE_RECEIPT_PATH: branchLocalGateCli.routeReceiptPath,
|
|
2870
|
+
OAT_GATE_RUN_MARKER_DIR: runMarkerDir,
|
|
2618
2871
|
},
|
|
2619
2872
|
}, timeout);
|
|
2620
2873
|
const routeReceipt = await dependencies.readGateRouteReceipt(branchLocalGateCli.routeReceiptPath, branchLocalGateCli.cliRoot, selected.target.runtime);
|
|
@@ -2648,6 +2901,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2648
2901
|
: {}),
|
|
2649
2902
|
gateInvocation,
|
|
2650
2903
|
dispatchReport,
|
|
2904
|
+
recursion,
|
|
2651
2905
|
});
|
|
2652
2906
|
process.exitCode = 1;
|
|
2653
2907
|
return true;
|
|
@@ -2693,6 +2947,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2693
2947
|
: {}),
|
|
2694
2948
|
gateInvocation,
|
|
2695
2949
|
dispatchReport,
|
|
2950
|
+
recursion,
|
|
2696
2951
|
});
|
|
2697
2952
|
process.exitCode = childExitCode;
|
|
2698
2953
|
return;
|
|
@@ -2719,6 +2974,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2719
2974
|
: {}),
|
|
2720
2975
|
gateInvocation,
|
|
2721
2976
|
dispatchReport,
|
|
2977
|
+
recursion,
|
|
2722
2978
|
});
|
|
2723
2979
|
process.exitCode = childExitCode;
|
|
2724
2980
|
return;
|
|
@@ -2850,6 +3106,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2850
3106
|
dispatchReport,
|
|
2851
3107
|
corroboration,
|
|
2852
3108
|
...(childResult.timedOut ? { lateCompletion: true } : {}),
|
|
3109
|
+
recursion,
|
|
2853
3110
|
});
|
|
2854
3111
|
// Record the disposition only once the envelope is written, so a failed
|
|
2855
3112
|
// emission cannot leave the log claiming a result no caller received.
|
|
@@ -2939,6 +3196,7 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2939
3196
|
? { lateCompletion: true }
|
|
2940
3197
|
: {}),
|
|
2941
3198
|
postSelectionRecovery: true,
|
|
3199
|
+
recursion,
|
|
2942
3200
|
});
|
|
2943
3201
|
buffered.flush();
|
|
2944
3202
|
recoveryEmitted = true;
|
|
@@ -2994,6 +3252,9 @@ async function runReviewGate(prompt, options, context, dependencies) {
|
|
|
2994
3252
|
if (runMarkerPath) {
|
|
2995
3253
|
await dependencies.removeGateRunMarker(runMarkerPath, (message) => context.logger.warn(message));
|
|
2996
3254
|
}
|
|
3255
|
+
if (runClaimPath) {
|
|
3256
|
+
await releaseGateRunClaim(runClaimPath, runId, (message) => context.logger.warn(message));
|
|
3257
|
+
}
|
|
2997
3258
|
}
|
|
2998
3259
|
finally {
|
|
2999
3260
|
if (projectLogFinalization && !projectLogFinalized) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -270,6 +270,7 @@ const DOCS_TOOLING_CHOICES = [
|
|
|
270
270
|
{ label: 'Docusaurus', value: 'docusaurus' },
|
|
271
271
|
{ label: 'VitePress', value: 'vitepress' },
|
|
272
272
|
{ label: 'Nextra', value: 'nextra' },
|
|
273
|
+
{ label: 'Plain Markdown', value: 'markdown' },
|
|
273
274
|
];
|
|
274
275
|
function trimDocsRoot(pathValue) {
|
|
275
276
|
return pathValue.replace(/\/+$/, '').replace(/^\.\//, '').trim();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-paths.d.ts","sourceRoot":"","sources":["../../../src/commands/internal/commit-paths.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAgB,wBAAwB,IAAI,OAAO,CA2ClD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { buildCommandContext } from '../../app/command-context.js';
|
|
2
|
+
import { commitExactPaths } from '../shared/exact-path-commit.js';
|
|
3
|
+
import { readGlobalOptions } from '../shared/shared.utils.js';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
export function createCommitPathsCommand() {
|
|
6
|
+
return new Command('commit-paths')
|
|
7
|
+
.description('Commit only explicit owned file paths with hooks and resumable identity verification')
|
|
8
|
+
.requiredOption('-m, --message <message>', 'Commit message')
|
|
9
|
+
.requiredOption('--identity <identity>', 'Stable unique operation/artifact identity; reuse only to resume this operation')
|
|
10
|
+
.argument('<paths...>', 'Exact repository-relative file paths; include both sides of a rename')
|
|
11
|
+
.action(async (paths, options, command) => {
|
|
12
|
+
const context = buildCommandContext(readGlobalOptions(command));
|
|
13
|
+
const result = await commitExactPaths({
|
|
14
|
+
repoRoot: context.cwd,
|
|
15
|
+
paths,
|
|
16
|
+
...options,
|
|
17
|
+
});
|
|
18
|
+
if (context.json)
|
|
19
|
+
context.logger.json(result);
|
|
20
|
+
else if (result.outcome === 'blocked' || result.outcome === 'failed')
|
|
21
|
+
context.logger.error(`${result.error} ${result.receipt ? `Receipt: ${result.receipt}` : ''}`);
|
|
22
|
+
else
|
|
23
|
+
context.logger.info(`${result.outcome}${result.commit ? `: ${result.commit}` : ''}`);
|
|
24
|
+
process.exitCode =
|
|
25
|
+
result.outcome === 'blocked'
|
|
26
|
+
? 1
|
|
27
|
+
: result.outcome === 'failed'
|
|
28
|
+
? 2
|
|
29
|
+
: 0;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/internal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/internal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,IAAI,OAAO,CAO/C"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { createCommitPathsCommand } from './commit-paths.js';
|
|
2
3
|
import { createCursorCurrentTargetCommand } from './cursor-current-target.js';
|
|
3
4
|
import { createValidateOatSkillsCommand } from './validate-oat-skills.js';
|
|
4
5
|
import { createValidateSkillVersionBumpsCommand } from './validate-skill-version-bumps.js';
|
|
5
6
|
export function createInternalCommand() {
|
|
6
7
|
return new Command('internal')
|
|
7
8
|
.description('Internal OAT maintenance commands')
|
|
9
|
+
.addCommand(createCommitPathsCommand())
|
|
8
10
|
.addCommand(createCursorCurrentTargetCommand())
|
|
9
11
|
.addCommand(createValidateOatSkillsCommand())
|
|
10
12
|
.addCommand(createValidateSkillVersionBumpsCommand());
|