@open-agent-toolkit/cli 0.3.17 → 0.3.19
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/agents/oat-phase-implementer.md +81 -3
- package/assets/agents/oat-reviewer.md +15 -5
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/reference/cli-reference.md +8 -5
- package/assets/docs/reference/oat-directory-structure.md +1 -0
- package/assets/docs/reference/project-artifacts.md +17 -1
- package/assets/docs/reference/project-state-machine.md +19 -4
- package/assets/docs/skills/brainstorm.md +2 -1
- package/assets/docs/skills/index.md +1 -0
- package/assets/docs/workflows/advanced/autonomy.md +9 -1
- package/assets/docs/workflows/advanced/workflow-gates.md +11 -6
- package/assets/docs/workflows/approvals-and-automation.md +13 -8
- package/assets/docs/workflows/choose-workflow.md +16 -8
- package/assets/docs/workflows/projects/closeout/closeout-skills.md +8 -3
- package/assets/docs/workflows/projects/closeout/pr-flow.md +2 -0
- package/assets/docs/workflows/projects/execution/execution-skills.md +14 -2
- package/assets/docs/workflows/projects/execution/implementation-execution.md +15 -0
- package/assets/docs/workflows/projects/execution/picking-up-projects.md +10 -1
- package/assets/docs/workflows/projects/execution/project-log.md +22 -0
- package/assets/docs/workflows/projects/lifecycle.md +73 -9
- package/assets/docs/workflows/projects/planning/hill-checkpoints.md +18 -1
- package/assets/docs/workflows/projects/planning/planning-skills.md +11 -10
- package/assets/docs/workflows/projects/planning/starting-projects.md +92 -20
- package/assets/docs/workflows/projects/reviews/index.md +15 -2
- package/assets/docs/workflows/projects/reviews/review-flavors.md +5 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-brainstorm/SKILL.md +33 -9
- package/assets/skills/oat-brainstorm/references/destinations.md +9 -4
- package/assets/skills/oat-docs/SKILL.md +9 -4
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-project-autonomous/SKILL.md +14 -8
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +17 -2
- package/assets/skills/oat-project-brief/SKILL.md +592 -0
- package/assets/skills/oat-project-brief/references/brief-contract.md +294 -0
- package/assets/skills/oat-project-brief/references/docs/autonomy-contract.md +393 -0
- package/assets/skills/oat-project-brief/references/docs/gate-approval-record.md +84 -0
- package/assets/skills/oat-project-capture/SKILL.md +2 -2
- package/assets/skills/oat-project-complete/SKILL.md +7 -2
- package/assets/skills/oat-project-discover/SKILL.md +3 -2
- package/assets/skills/oat-project-dispatch-subagents/SKILL.md +9 -1
- package/assets/skills/oat-project-document/SKILL.md +11 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +40 -0
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +4 -0
- package/assets/skills/oat-project-implement/references/phase-execution.md +166 -1
- package/assets/skills/oat-project-implement/references/plan-and-resume.md +97 -3
- package/assets/skills/oat-project-import-plan/SKILL.md +5 -1
- package/assets/skills/oat-project-lite/SKILL.md +4 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-new/SKILL.md +5 -1
- package/assets/skills/oat-project-next/SKILL.md +31 -4
- package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +4 -0
- package/assets/skills/oat-project-plan/SKILL.md +12 -2
- package/assets/skills/oat-project-plan-writing/SKILL.md +6 -4
- package/assets/skills/oat-project-pr-final/SKILL.md +15 -3
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-pr-progress/SKILL.md +31 -4
- package/assets/skills/oat-project-progress/SKILL.md +30 -8
- package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +4 -0
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +2 -2
- package/assets/skills/oat-project-quick-start/SKILL.md +60 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +4 -0
- package/assets/skills/oat-project-reconcile/SKILL.md +65 -3
- package/assets/skills/oat-project-review-provide/SKILL.md +331 -12
- package/assets/skills/oat-project-review-receive/SKILL.md +86 -1
- package/assets/skills/oat-project-revise/SKILL.md +27 -4
- package/assets/skills/oat-project-summary/SKILL.md +95 -2
- package/assets/skills/oat-wave-execute/SKILL.md +3 -2
- package/assets/templates/implementation-brief.md +165 -0
- package/assets/templates/plan-brief.md +140 -0
- package/assets/templates/plan.md +1 -1
- package/assets/templates/state.md +8 -2
- package/dist/commands/init/tools/shared/skill-script-references.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-script-references.js +8 -1
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +70 -10
- package/dist/commands/project/new/scaffold.d.ts +1 -1
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +35 -7
- package/dist/commands/project/promote/promote.d.ts +32 -1
- package/dist/commands/project/promote/promote.d.ts.map +1 -1
- package/dist/commands/project/promote/promote.js +562 -5
- package/dist/commands/project/validate-plan/frontmatter.d.ts +12 -0
- package/dist/commands/project/validate-plan/frontmatter.d.ts.map +1 -0
- package/dist/commands/project/validate-plan/frontmatter.js +27 -0
- package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/index.js +52 -18
- package/dist/commands/project/validate-plan/profiles.d.ts +54 -0
- package/dist/commands/project/validate-plan/profiles.d.ts.map +1 -0
- package/dist/commands/project/validate-plan/profiles.js +269 -0
- package/dist/commands/project/validate-plan/validate-plan.d.ts +3 -19
- package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/validate-plan.js +5 -82
- package/dist/commands/shared/agents-md-lock.d.ts +3 -0
- package/dist/commands/shared/agents-md-lock.d.ts.map +1 -0
- package/dist/commands/shared/agents-md-lock.js +130 -0
- package/dist/commands/shared/agents-md.d.ts.map +1 -1
- package/dist/commands/shared/agents-md.js +26 -8
- 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.map +1 -1
- package/dist/commands/state/generate.js +51 -2
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +3 -0
- package/package.json +2 -2
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { lstat, open, unlink } from 'node:fs/promises';
|
|
4
|
+
import { hostname } from 'node:os';
|
|
5
|
+
import { relative } from 'node:path';
|
|
6
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
7
|
+
/** Specific advisory serialization for cooperating AGENTS.md appenders. */
|
|
8
|
+
export async function acquireAgentsMdAppendLock(repoRoot, targetPath) {
|
|
9
|
+
const lockPath = `${targetPath}.oat-guidance.lock`;
|
|
10
|
+
const location = relative(repoRoot, lockPath);
|
|
11
|
+
const recovery = `Check the recorded host/PID and remove ${location} manually only after verifying its owner is gone, then rerun.`;
|
|
12
|
+
const token = randomUUID();
|
|
13
|
+
for (let attempt = 0; attempt < 40; attempt += 1) {
|
|
14
|
+
let handle;
|
|
15
|
+
try {
|
|
16
|
+
handle = await open(lockPath, constants.O_RDWR |
|
|
17
|
+
constants.O_CREAT |
|
|
18
|
+
constants.O_EXCL |
|
|
19
|
+
constants.O_NOFOLLOW |
|
|
20
|
+
constants.O_NONBLOCK, 0o600);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (!(error instanceof Error) ||
|
|
24
|
+
!('code' in error) ||
|
|
25
|
+
error.code !== 'EEXIST') {
|
|
26
|
+
throw new Error(`AGENTS.md append lock could not be acquired. ${recovery}`, { cause: error });
|
|
27
|
+
}
|
|
28
|
+
// Never steal, truncate, or follow a contender's lock, including stale locks.
|
|
29
|
+
let reader;
|
|
30
|
+
try {
|
|
31
|
+
reader = await open(lockPath, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
32
|
+
const stat = await reader.stat();
|
|
33
|
+
if (!stat.isFile() || stat.nlink !== 1 || stat.size > 4096)
|
|
34
|
+
throw new Error('Unsafe lock', { cause: error });
|
|
35
|
+
const content = await reader.readFile('utf8');
|
|
36
|
+
if (content === '' && attempt < 39) {
|
|
37
|
+
await delay(25);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const owner = JSON.parse(content);
|
|
41
|
+
if (typeof owner.token !== 'string' ||
|
|
42
|
+
typeof owner.host !== 'string' ||
|
|
43
|
+
!Number.isSafeInteger(owner.pid) ||
|
|
44
|
+
owner.pid <= 0)
|
|
45
|
+
throw new Error('Malformed lock', { cause: error });
|
|
46
|
+
}
|
|
47
|
+
catch (inspectionError) {
|
|
48
|
+
if (inspectionError instanceof Error &&
|
|
49
|
+
'code' in inspectionError &&
|
|
50
|
+
inspectionError.code === 'ENOENT')
|
|
51
|
+
continue;
|
|
52
|
+
throw new Error(`AGENTS.md append lock is unsafe or malformed. ${recovery}`, { cause: inspectionError });
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await reader?.close();
|
|
56
|
+
}
|
|
57
|
+
if (attempt < 39)
|
|
58
|
+
await delay(25);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const identity = await handle.stat();
|
|
62
|
+
const bytes = JSON.stringify({ token, host: hostname(), pid: process.pid });
|
|
63
|
+
let releasing;
|
|
64
|
+
let interrupted;
|
|
65
|
+
const onInt = () => {
|
|
66
|
+
interrupted = 'SIGINT';
|
|
67
|
+
};
|
|
68
|
+
const onTerm = () => {
|
|
69
|
+
interrupted = 'SIGTERM';
|
|
70
|
+
};
|
|
71
|
+
const release = () => {
|
|
72
|
+
releasing ??= (async () => {
|
|
73
|
+
process.removeListener('SIGINT', onInt);
|
|
74
|
+
process.removeListener('SIGTERM', onTerm);
|
|
75
|
+
try {
|
|
76
|
+
const current = await lstat(lockPath);
|
|
77
|
+
if (current.isFile() &&
|
|
78
|
+
current.nlink === 1 &&
|
|
79
|
+
current.dev === identity.dev &&
|
|
80
|
+
current.ino === identity.ino &&
|
|
81
|
+
current.size === Buffer.byteLength(bytes) &&
|
|
82
|
+
(await readOwnedBytes()) === bytes) {
|
|
83
|
+
const verified = await lstat(lockPath);
|
|
84
|
+
if (verified.dev === identity.dev && verified.ino === identity.ino)
|
|
85
|
+
await unlink(lockPath);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (!(error instanceof Error) ||
|
|
90
|
+
!('code' in error) ||
|
|
91
|
+
error.code !== 'ENOENT')
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
await handle.close();
|
|
96
|
+
if (interrupted)
|
|
97
|
+
process.kill(process.pid, interrupted);
|
|
98
|
+
}
|
|
99
|
+
})().catch((error) => {
|
|
100
|
+
throw new Error(`AGENTS.md append lock cleanup failed; guidance may already have been written. ${recovery}`, { cause: error });
|
|
101
|
+
});
|
|
102
|
+
return releasing;
|
|
103
|
+
};
|
|
104
|
+
const readOwnedBytes = async () => {
|
|
105
|
+
const buffer = Buffer.alloc(Buffer.byteLength(bytes));
|
|
106
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
|
|
107
|
+
return buffer.subarray(0, bytesRead).toString('utf8');
|
|
108
|
+
};
|
|
109
|
+
try {
|
|
110
|
+
await handle.writeFile(bytes);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
// Initialization failed before returning ownership; remove only this inode.
|
|
114
|
+
try {
|
|
115
|
+
const current = await lstat(lockPath);
|
|
116
|
+
if (current.dev === identity.dev && current.ino === identity.ino)
|
|
117
|
+
await unlink(lockPath);
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
await handle.close();
|
|
121
|
+
}
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
// Cleanup runs after the critical section and on catchable termination.
|
|
125
|
+
process.once('SIGINT', onInt);
|
|
126
|
+
process.once('SIGTERM', onTerm);
|
|
127
|
+
return release;
|
|
128
|
+
}
|
|
129
|
+
throw new Error(`AGENTS.md append lock is held by another writer. ${recovery}`);
|
|
130
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-md.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/agents-md.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACV,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"agents-md.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/agents-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { constants } from 'node:fs';
|
|
2
2
|
import { lstat, open, readFile, readlink, realpath, writeFile, } from 'node:fs/promises';
|
|
3
3
|
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { acquireAgentsMdAppendLock } from './agents-md-lock.js';
|
|
4
5
|
const defaultFileSystem = {
|
|
5
6
|
lstat,
|
|
6
7
|
open,
|
|
@@ -496,7 +497,7 @@ function classifySections(plan, desired, content, removeSectionKeys, appendRefus
|
|
|
496
497
|
};
|
|
497
498
|
}
|
|
498
499
|
/** Inspect current bytes and identity without opening a write handle. */
|
|
499
|
-
async function inspectSections(plan, sections, removeSectionKeys, fileSystem) {
|
|
500
|
+
async function inspectSections(plan, sections, removeSectionKeys, fileSystem, validateContent = true) {
|
|
500
501
|
const desired = sections.map(({ key, body }) => ({
|
|
501
502
|
key,
|
|
502
503
|
block: buildSection(key, body),
|
|
@@ -505,7 +506,7 @@ async function inspectSections(plan, sections, removeSectionKeys, fileSystem) {
|
|
|
505
506
|
? ''
|
|
506
507
|
: await fileSystem.readFile(plan.targetPath, 'utf8');
|
|
507
508
|
const classification = classifySections(plan, desired, content, removeSectionKeys);
|
|
508
|
-
await assertPlanUnchanged(plan, fileSystem, plan.kind === 'missing' ? undefined : content);
|
|
509
|
+
await assertPlanUnchanged(plan, fileSystem, plan.kind === 'missing' || !validateContent ? undefined : content);
|
|
509
510
|
return { content, desired, classification };
|
|
510
511
|
}
|
|
511
512
|
async function upsertSectionsInternal(repoRoot, sections, removeSectionKeys, fileSystem, allowReplan) {
|
|
@@ -518,7 +519,7 @@ async function upsertSectionsInternal(repoRoot, sections, removeSectionKeys, fil
|
|
|
518
519
|
return Object.fromEntries(sections.map(({ key }) => [key, blocked]));
|
|
519
520
|
}
|
|
520
521
|
try {
|
|
521
|
-
|
|
522
|
+
let { desired, content, classification } = await inspectSections(plan, sections, removeSectionKeys, fileSystem, false);
|
|
522
523
|
if (plan.kind === 'missing') {
|
|
523
524
|
const creation = await createMissingFile(plan, `${desired.map(({ block }) => block).join('\n\n')}\n`, fileSystem);
|
|
524
525
|
if (creation === 'created')
|
|
@@ -528,12 +529,29 @@ async function upsertSectionsInternal(repoRoot, sections, removeSectionKeys, fil
|
|
|
528
529
|
}
|
|
529
530
|
throw new Error(IDENTITY_CHANGED);
|
|
530
531
|
}
|
|
532
|
+
if (classification.absentBlocks.length === 0) {
|
|
533
|
+
// Non-appending outcomes retain their original content-stability check
|
|
534
|
+
// without creating a lock; only append candidates use the locked re-read.
|
|
535
|
+
await assertPlanUnchanged(plan, fileSystem, content);
|
|
536
|
+
return classification.results;
|
|
537
|
+
}
|
|
531
538
|
if (classification.absentBlocks.length > 0) {
|
|
532
|
-
const
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
539
|
+
const release = await acquireAgentsMdAppendLock(plan.repoRoot, plan.targetPath);
|
|
540
|
+
try {
|
|
541
|
+
// Revalidate the original identity and classify fresh bytes under the lock.
|
|
542
|
+
({ desired, content, classification } = await inspectSections(plan, sections, removeSectionKeys, fileSystem));
|
|
543
|
+
if (classification.absentBlocks.length > 0) {
|
|
544
|
+
const appended = await appendAbsentSections(plan, classification.absentBlocks, fileSystem);
|
|
545
|
+
if (appended.kind === 'blocked')
|
|
546
|
+
throw new Error(appended.reason);
|
|
547
|
+
if (appended.kind === 'refused') {
|
|
548
|
+
return classifySections(plan, desired, content, removeSectionKeys, appended.cause).results;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
return classification.results;
|
|
552
|
+
}
|
|
553
|
+
finally {
|
|
554
|
+
await release();
|
|
537
555
|
}
|
|
538
556
|
}
|
|
539
557
|
return classification.results;
|
|
@@ -24,7 +24,7 @@ export declare const SKILL_GATE_OVERRIDE_SOURCE = "state.md:oat_skill_gate_overr
|
|
|
24
24
|
* `skills.test.ts` pins this constant against the live `oat_gateable: true`
|
|
25
25
|
* declarations so the two cannot drift apart.
|
|
26
26
|
*/
|
|
27
|
-
export declare const GATE_AWARE_SKILLS: readonly ['oat-project-implement', 'oat-project-import-plan', 'oat-project-lite', 'oat-project-plan', 'oat-project-quick-start'];
|
|
27
|
+
export declare const GATE_AWARE_SKILLS: readonly ['oat-project-brief', 'oat-project-implement', 'oat-project-import-plan', 'oat-project-lite', 'oat-project-plan', 'oat-project-quick-start'];
|
|
28
28
|
export type SkillGateOverrideValue = typeof SKILL_GATE_OVERRIDE_DISABLED;
|
|
29
29
|
export interface ProjectSkillGateOverrides {
|
|
30
30
|
/** False when the key is absent entirely: absence means follow configuration. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,6 +69,7 @@ export const SKILL_GATE_OVERRIDE_SOURCE = `state.md:${SKILL_GATE_OVERRIDE_FIELD}
|
|
|
69
69
|
* declarations so the two cannot drift apart.
|
|
70
70
|
*/
|
|
71
71
|
export const GATE_AWARE_SKILLS = [
|
|
72
|
+
'oat-project-brief',
|
|
72
73
|
'oat-project-implement',
|
|
73
74
|
'oat-project-import-plan',
|
|
74
75
|
'oat-project-lite',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/commands/state/generate.ts"],"names":[],"mappings":"AAQA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/commands/state/generate.ts"],"names":[],"mappings":"AAQA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAoB9E,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAClD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AA0ID,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAC/B,OAAO,CAET;AA0pBD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAkF9B"}
|
|
@@ -11,7 +11,7 @@ import { resolveProjectsRoot } from '../shared/oat-paths.js';
|
|
|
11
11
|
import { resolveScopeRoot } from '../shared/project-scope.js';
|
|
12
12
|
import { readOatLocalConfig } from '../../config/oat-config.js';
|
|
13
13
|
import { ensureDir, fileExists } from '../../fs/io.js';
|
|
14
|
-
import { evaluateQuickPlanReadiness, quickPlanNotReadyReason, } from '@open-agent-toolkit/control-plane';
|
|
14
|
+
import { BRIEF_MODES, evaluateQuickPlanReadiness, quickPlanNotReadyReason, } from '@open-agent-toolkit/control-plane';
|
|
15
15
|
import YAML from 'yaml';
|
|
16
16
|
const defaultGit = {
|
|
17
17
|
isGitRepo(root) {
|
|
@@ -238,6 +238,24 @@ function calculateStaleness(knowledge, git, repoRoot, today) {
|
|
|
238
238
|
}
|
|
239
239
|
return result;
|
|
240
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* True when the frontmatter workflow mode belongs to the brief mode family.
|
|
243
|
+
* The dashboard keeps the raw frontmatter string, so it checks membership
|
|
244
|
+
* against the control plane's registry rather than a local list.
|
|
245
|
+
*/
|
|
246
|
+
function isBriefWorkflow(workflowMode) {
|
|
247
|
+
return BRIEF_MODES.includes(workflowMode);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Printed for brief projects in the implement phase, where the router's
|
|
251
|
+
* brief-unit guard applies. The dashboard reads `state.md` frontmatter only
|
|
252
|
+
* and never phase-unit progress, so it cannot apply that guard at
|
|
253
|
+
* `implement:complete`/`pr_open`.
|
|
254
|
+
*/
|
|
255
|
+
const BRIEF_ROUTER_AUTHORITY_NOTE = '> Brief projects count progress in phase-units, which this dashboard does not read. ' +
|
|
256
|
+
'`oat project status` and `oat-project-next` use the control-plane router, which is the ' +
|
|
257
|
+
'authority for the brief-unit guard: an unaccepted phase-unit sends the project back to ' +
|
|
258
|
+
'`oat-project-implement` before any finalization step.';
|
|
241
259
|
function computeNextStep(project, hasProjects, state) {
|
|
242
260
|
if (project.status === 'not set') {
|
|
243
261
|
if (project.lastPausedProject) {
|
|
@@ -283,11 +301,15 @@ function computeNextStep(project, hasProjects, state) {
|
|
|
283
301
|
// projects whose state.md still lists `spec` in oat_hill_checkpoints route
|
|
284
302
|
// to oat-project-design here so they finish through the consolidated flow
|
|
285
303
|
// rather than being pushed back at the deprecated standalone skill.
|
|
304
|
+
// Brief modes own their plan phase through the brief entry skill, as the
|
|
305
|
+
// router's mode-aware current-phase lookup does.
|
|
286
306
|
const phaseSkillMap = {
|
|
287
307
|
discovery: 'oat-project-discover',
|
|
288
308
|
spec: 'oat-project-design',
|
|
289
309
|
design: 'oat-project-design',
|
|
290
|
-
plan:
|
|
310
|
+
plan: isBriefWorkflow(state.workflowMode)
|
|
311
|
+
? 'oat-project-brief'
|
|
312
|
+
: 'oat-project-plan',
|
|
291
313
|
implement: 'oat-project-implement',
|
|
292
314
|
};
|
|
293
315
|
return {
|
|
@@ -366,6 +388,25 @@ function computeNextStep(project, hasProjects, state) {
|
|
|
366
388
|
step: 'oat-project-lite',
|
|
367
389
|
reason: 'Continue lite planning',
|
|
368
390
|
},
|
|
391
|
+
// Brief routes mirror the router's BRIEF_ROUTES. Parity with
|
|
392
|
+
// `recommendSkill` is bounded to these plan-phase states and
|
|
393
|
+
// `implement:in_progress` (generate.test.ts pins it): this dashboard has no
|
|
394
|
+
// phase-unit progress, so at `implement:complete`/`pr_open` a brief follows
|
|
395
|
+
// the shared post-implementation map below and the router, reached through
|
|
396
|
+
// `oat project status` and `oat-project-next`, is the authority for the
|
|
397
|
+
// brief-unit guard. The dashboard prints a note saying so.
|
|
398
|
+
'brief:plan:in_progress': {
|
|
399
|
+
step: 'oat-project-brief',
|
|
400
|
+
reason: 'Continue the project brief',
|
|
401
|
+
},
|
|
402
|
+
'brief:plan:complete': {
|
|
403
|
+
step: 'oat-project-implement',
|
|
404
|
+
reason: 'Start implementation from the approved brief',
|
|
405
|
+
},
|
|
406
|
+
'brief:implement:in_progress': {
|
|
407
|
+
step: 'oat-project-implement',
|
|
408
|
+
reason: 'Continue implementation',
|
|
409
|
+
},
|
|
369
410
|
};
|
|
370
411
|
if (routeMap[key])
|
|
371
412
|
return routeMap[key];
|
|
@@ -563,6 +604,13 @@ function buildDashboardMarkdown(project, state, knowledge, staleness, nextStep,
|
|
|
563
604
|
lines.push('');
|
|
564
605
|
lines.push(`**${nextStep.step}** - ${nextStep.reason}`);
|
|
565
606
|
lines.push('');
|
|
607
|
+
if (project.status === 'active' &&
|
|
608
|
+
state &&
|
|
609
|
+
state.phase === 'implement' &&
|
|
610
|
+
isBriefWorkflow(state.workflowMode)) {
|
|
611
|
+
lines.push(BRIEF_ROUTER_AUTHORITY_NOTE);
|
|
612
|
+
lines.push('');
|
|
613
|
+
}
|
|
566
614
|
lines.push('## Quick Commands');
|
|
567
615
|
lines.push('');
|
|
568
616
|
lines.push('- `oat-project-progress` - Check current status');
|
|
@@ -571,6 +619,7 @@ function buildDashboardMarkdown(project, state, knowledge, staleness, nextStep,
|
|
|
571
619
|
lines.push('- `oat-project-quick-start` - Create a quick workflow project');
|
|
572
620
|
lines.push('- `oat-project-import-plan` - Import an external provider plan');
|
|
573
621
|
lines.push('- `oat-project-lite` - Create a lite workflow project');
|
|
622
|
+
lines.push('- `oat-project-brief` - Create a brief workflow project');
|
|
574
623
|
lines.push('- `oat project open <name>` - Open or resume a project');
|
|
575
624
|
lines.push('- `oat project pause [name]` - Pause active or named project');
|
|
576
625
|
lines.push('- `oat-project-complete` - Mark project complete');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack-manifest.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/pack-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,GACf,CAAC;AAEF,eAAO,MAAM,UAAU,4GASiB,CAAC;AAEzC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;
|
|
1
|
+
{"version":3,"file":"pack-manifest.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/pack-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,GACf,CAAC;AAEF,eAAO,MAAM,UAAU,4GASiB,CAAC;AAEzC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAqID,eAAO,MAAM,aAAa,EAAE,SAAS,cAAc,EA6LlD,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,cAAc,CAMhE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,EACd,IAAI,CAAC,EAAE,aAAa,GACnB,SAAS,mBAAmB,EAAE,CAGhC;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAC9C,MAAM,EAAE,CAQV;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAIlE;AAoJD,wBAAgB,oBAAoB,CAClC,QAAQ,GAAE,SAAS,cAAc,EAAkB,GAClD,IAAI,CAiEN"}
|
|
@@ -77,6 +77,7 @@ const WORKFLOW_SKILL_NAMES = [
|
|
|
77
77
|
'oat-cursor-cloud-projects',
|
|
78
78
|
'oat-explainer-kit',
|
|
79
79
|
'oat-project-autonomous',
|
|
80
|
+
'oat-project-brief',
|
|
80
81
|
'oat-project-capture',
|
|
81
82
|
'oat-project-clear-active',
|
|
82
83
|
'oat-project-complete',
|
|
@@ -193,7 +194,9 @@ export const PACK_MANIFEST = [
|
|
|
193
194
|
'design.md',
|
|
194
195
|
'plan.md',
|
|
195
196
|
'plan-lite.md',
|
|
197
|
+
'plan-brief.md',
|
|
196
198
|
'implementation.md',
|
|
199
|
+
'implementation-brief.md',
|
|
197
200
|
'summary.md',
|
|
198
201
|
'project-log.md',
|
|
199
202
|
'project-retro.md',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-agent-toolkit/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.19",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Open Agent Toolkit CLI",
|
|
6
6
|
"homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"ora": "^9.0.0",
|
|
36
36
|
"yaml": "2.8.2",
|
|
37
37
|
"zod": "^3.25.76",
|
|
38
|
-
"@open-agent-toolkit/control-plane": "0.3.
|
|
38
|
+
"@open-agent-toolkit/control-plane": "0.3.19"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/node": "^22.10.0",
|