compound-workflow 1.6.6 → 1.6.7
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/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/scripts/check-workflow-contracts.mjs +22 -22
- package/scripts/install-cli.mjs +89 -0
- package/src/.agents/scripts/self-check.mjs +2 -2
- package/src/.agents/skills/standards/SKILL.md +5 -0
- package/src/AGENTS.md +5 -3
- package/src/generated/opencode.managed.json +7 -7
- /package/src/.agents/commands/{workflow/brainstorm.md → workflow-brainstorm.md} +0 -0
- /package/src/.agents/commands/{workflow/compound.md → workflow-compound.md} +0 -0
- /package/src/.agents/commands/{workflow/plan.md → workflow-plan.md} +0 -0
- /package/src/.agents/commands/{workflow/review.md → workflow-review.md} +0 -0
- /package/src/.agents/commands/{workflow/tech-review.md → workflow-tech-review.md} +0 -0
- /package/src/.agents/commands/{workflow/triage.md → workflow-triage.md} +0 -0
- /package/src/.agents/commands/{workflow/work.md → workflow-work.md} +0 -0
package/package.json
CHANGED
|
@@ -58,93 +58,93 @@ const requiredChecks = [
|
|
|
58
58
|
description: "README standards baseline guardrail",
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
|
-
file: "src/.agents/commands/workflow
|
|
61
|
+
file: "src/.agents/commands/workflow-plan.md",
|
|
62
62
|
pattern: "Contract precedence:",
|
|
63
63
|
description: "plan command precedence note",
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
file: "src/.agents/commands/workflow
|
|
66
|
+
file: "src/.agents/commands/workflow-triage.md",
|
|
67
67
|
pattern: "Contract precedence:",
|
|
68
68
|
description: "triage command precedence note",
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
|
-
file: "src/.agents/commands/workflow
|
|
71
|
+
file: "src/.agents/commands/workflow-triage.md",
|
|
72
72
|
pattern: "independently runnable",
|
|
73
73
|
description: "triage command explicitly standalone while work auto-runs triage",
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
|
-
file: "src/.agents/commands/workflow
|
|
76
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
77
77
|
pattern: "Contract precedence:",
|
|
78
78
|
description: "work command precedence note",
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
|
-
file: "src/.agents/commands/workflow
|
|
81
|
+
file: "src/.agents/commands/workflow-plan.md",
|
|
82
82
|
pattern: "Start `/workflow:work`",
|
|
83
83
|
description: "plan command default next-step routes to work",
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
|
-
file: "src/.agents/commands/workflow
|
|
86
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
87
87
|
pattern: "HARD GATE - WORKTREE FIRST",
|
|
88
88
|
description: "worktree hard-gate wording in work command",
|
|
89
89
|
},
|
|
90
90
|
{
|
|
91
|
-
file: "src/.agents/commands/workflow
|
|
91
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
92
92
|
pattern: "required prompt/create gate",
|
|
93
93
|
description: "mandatory worktree decision prompt/create gate in work command",
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
|
-
file: "src/.agents/commands/workflow
|
|
96
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
97
97
|
pattern: "Do not infer or assume an answer when the user has not answered.",
|
|
98
98
|
description: "worktree decision cannot be silently assumed",
|
|
99
99
|
},
|
|
100
100
|
{
|
|
101
|
-
file: "src/.agents/commands/workflow
|
|
101
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
102
102
|
pattern:
|
|
103
103
|
"No file writes, implementation commands, test/lint/typecheck commands, or dependency-install commands may run before this gate passes.",
|
|
104
104
|
description: "pre-gate write/command prohibition in work command",
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
|
-
file: "src/.agents/commands/workflow
|
|
107
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
108
108
|
pattern: "workflow_complete: false (pending /workflow:review current)",
|
|
109
109
|
description: "implementation-complete pending-review status in work command",
|
|
110
110
|
},
|
|
111
111
|
{
|
|
112
|
-
file: "src/.agents/commands/workflow
|
|
112
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
113
113
|
pattern: "Standards Compliance Gate (REQUIRED for code/config changes)",
|
|
114
114
|
description: "required standards gate in work command",
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
|
-
file: "src/.agents/commands/workflow
|
|
117
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
118
118
|
pattern: "This gate cannot run until the isolation/worktree gate is passed and recorded (`gate_status: passed`).",
|
|
119
119
|
description: "standards gate ordering with worktree gate",
|
|
120
120
|
},
|
|
121
121
|
{
|
|
122
|
-
file: "src/.agents/commands/workflow
|
|
122
|
+
file: "src/.agents/commands/workflow-review.md",
|
|
123
123
|
pattern: "Contract precedence:",
|
|
124
124
|
description: "review command precedence note",
|
|
125
125
|
},
|
|
126
126
|
{
|
|
127
|
-
file: "src/.agents/commands/workflow
|
|
127
|
+
file: "src/.agents/commands/workflow-review.md",
|
|
128
128
|
pattern: "Independent Reviewer Pass (REQUIRED)",
|
|
129
129
|
description: "required independent reviewer pass in review command",
|
|
130
130
|
},
|
|
131
131
|
{
|
|
132
|
-
file: "src/.agents/commands/workflow
|
|
132
|
+
file: "src/.agents/commands/workflow-review.md",
|
|
133
133
|
pattern: "review_independence_mode: independent|degraded",
|
|
134
134
|
description: "explicit review independence mode in review command",
|
|
135
135
|
},
|
|
136
136
|
{
|
|
137
|
-
file: "src/.agents/commands/workflow
|
|
137
|
+
file: "src/.agents/commands/workflow-review.md",
|
|
138
138
|
pattern: "what was skipped and why",
|
|
139
139
|
description: "review skipped-pass disclosure requirement",
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
|
-
file: "src/.agents/commands/workflow
|
|
142
|
+
file: "src/.agents/commands/workflow-review.md",
|
|
143
143
|
pattern: "standards_compliance: pass|pass-with-notes|fail",
|
|
144
144
|
description: "review standards compliance output field",
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
|
-
file: "src/.agents/commands/workflow
|
|
147
|
+
file: "src/.agents/commands/workflow-review.md",
|
|
148
148
|
pattern: "standards `MUST` violations => blocking finding and review recommendation `fail`",
|
|
149
149
|
description: "review must-violation fail criteria",
|
|
150
150
|
},
|
|
@@ -162,22 +162,22 @@ const requiredChecks = [
|
|
|
162
162
|
|
|
163
163
|
const forbiddenChecks = [
|
|
164
164
|
{
|
|
165
|
-
file: "src/.agents/commands/workflow
|
|
165
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
166
166
|
pattern: "## When to Use Reviewer Agents",
|
|
167
167
|
description: "legacy optional reviewer section in work command",
|
|
168
168
|
},
|
|
169
169
|
{
|
|
170
|
-
file: "src/.agents/commands/workflow
|
|
170
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
171
171
|
pattern: "**Don't use by default.**",
|
|
172
172
|
description: "legacy skip-by-default reviewer wording in work command",
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
|
-
file: "src/.agents/commands/workflow
|
|
175
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
176
176
|
pattern: "skip specialist reviewers by default",
|
|
177
177
|
description: "legacy skip-by-default specialist reviewer wording",
|
|
178
178
|
},
|
|
179
179
|
{
|
|
180
|
-
file: "src/.agents/commands/workflow
|
|
180
|
+
file: "src/.agents/commands/workflow-work.md",
|
|
181
181
|
pattern: "Follow project coding standards (see AGENTS.md)",
|
|
182
182
|
description: "legacy advisory-only coding standards wording in work command",
|
|
183
183
|
},
|
package/scripts/install-cli.mjs
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* compound-workflow install
|
|
4
|
+
*
|
|
4
5
|
* Native-only install: writes opencode.json from package metadata,
|
|
5
6
|
* merges AGENTS.md, and ensures standard docs/todo directories.
|
|
7
|
+
*
|
|
8
|
+
* DECLARATIVE SOURCE OF TRUTH (no manual wiring):
|
|
9
|
+
* - Commands: add/remove .md under src/.agents/commands/ (frontmatter: invocation, name, description).
|
|
10
|
+
* Registry (src/.agents/registry.json) + generate-platform-artifacts → opencode.managed.json → install.
|
|
11
|
+
* - Agents: add/remove .md under src/.agents/agents/ (frontmatter: name, description). Same pipeline.
|
|
12
|
+
* - Skills: add/remove dir src/.agents/skills/<name>/SKILL.md. OpenCode uses skills path; install syncs
|
|
13
|
+
* each skill into .cursor/skills/ (symlinks) so Cursor discovers them. Prune removes stale symlinks.
|
|
14
|
+
* Run install (or npm install compound-workflow) after any change; no other registration needed.
|
|
6
15
|
*/
|
|
7
16
|
import fs from "node:fs";
|
|
8
17
|
import path from "node:path";
|
|
@@ -356,6 +365,85 @@ function writePluginManifests(targetRoot, dryRun, isSelfInstall) {
|
|
|
356
365
|
console.log("Wrote: .cursor-plugin/plugin.json, .claude-plugin/plugin.json, .cursor-plugin/registration.json");
|
|
357
366
|
}
|
|
358
367
|
|
|
368
|
+
/**
|
|
369
|
+
* Cursor discovers skills only from .agents/skills, .cursor/skills, ~/.cursor/skills.
|
|
370
|
+
* Populate .cursor/skills/ with symlinks to the package skills so Cursor finds them.
|
|
371
|
+
*/
|
|
372
|
+
function syncCursorSkills(targetRoot, dryRun, isSelfInstall) {
|
|
373
|
+
const packageSkillsAbs = isSelfInstall
|
|
374
|
+
? path.join(PACKAGE_ROOT, "src", ".agents", "skills")
|
|
375
|
+
: path.join(targetRoot, "node_modules", "compound-workflow", "src", ".agents", "skills");
|
|
376
|
+
if (!fs.existsSync(packageSkillsAbs)) return;
|
|
377
|
+
|
|
378
|
+
const cursorSkillsDir = path.join(targetRoot, ".cursor", "skills");
|
|
379
|
+
let entries;
|
|
380
|
+
try {
|
|
381
|
+
entries = fs.readdirSync(packageSkillsAbs, { withFileTypes: true });
|
|
382
|
+
} catch {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const skillDirs = entries.filter((e) => e.isDirectory() && fs.existsSync(path.join(packageSkillsAbs, e.name, "SKILL.md"))).map((e) => e.name);
|
|
387
|
+
if (skillDirs.length === 0) return;
|
|
388
|
+
|
|
389
|
+
if (dryRun) {
|
|
390
|
+
console.log("[dry-run] Would symlink", skillDirs.length, "skills into .cursor/skills/");
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
fs.mkdirSync(cursorSkillsDir, { recursive: true });
|
|
395
|
+
const packageSkillsReal = realpathSafe(packageSkillsAbs);
|
|
396
|
+
const skillSet = new Set(skillDirs);
|
|
397
|
+
|
|
398
|
+
// Prune: remove symlinks that point at our package but are no longer in the package
|
|
399
|
+
try {
|
|
400
|
+
for (const entry of fs.readdirSync(cursorSkillsDir, { withFileTypes: true })) {
|
|
401
|
+
if (!entry.isSymbolicLink()) continue;
|
|
402
|
+
const linkPath = path.join(cursorSkillsDir, entry.name);
|
|
403
|
+
try {
|
|
404
|
+
const resolved = realpathSafe(linkPath);
|
|
405
|
+
if (!resolved.startsWith(packageSkillsReal + path.sep) && resolved !== packageSkillsReal) continue;
|
|
406
|
+
const base = path.basename(resolved);
|
|
407
|
+
if (skillSet.has(base)) continue;
|
|
408
|
+
fs.rmSync(linkPath);
|
|
409
|
+
} catch {
|
|
410
|
+
/* ignore broken symlinks or permission errors */
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
} catch {
|
|
414
|
+
/* .cursor/skills not readable */
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
for (const name of skillDirs) {
|
|
418
|
+
const linkPath = path.join(cursorSkillsDir, name);
|
|
419
|
+
const targetPath = path.join(packageSkillsAbs, name);
|
|
420
|
+
try {
|
|
421
|
+
if (fs.existsSync(linkPath)) {
|
|
422
|
+
const stat = fs.lstatSync(linkPath);
|
|
423
|
+
if (!stat.isSymbolicLink()) continue;
|
|
424
|
+
try {
|
|
425
|
+
if (realpathSafe(linkPath) !== realpathSafe(targetPath)) continue;
|
|
426
|
+
} catch {
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
fs.rmSync(linkPath);
|
|
430
|
+
}
|
|
431
|
+
fs.symlinkSync(targetPath, linkPath, "dir");
|
|
432
|
+
} catch (err) {
|
|
433
|
+
if (err.code === "EPERM" && process.platform === "win32") {
|
|
434
|
+
try {
|
|
435
|
+
fs.symlinkSync(targetPath, linkPath, "junction");
|
|
436
|
+
} catch {
|
|
437
|
+
console.warn("[cursor] Could not symlink skill", name, err.message);
|
|
438
|
+
}
|
|
439
|
+
} else {
|
|
440
|
+
console.warn("[cursor] Could not symlink skill", name, err.message);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
console.log("Synced", skillDirs.length, "skills to .cursor/skills/");
|
|
445
|
+
}
|
|
446
|
+
|
|
359
447
|
function cursorDetected() {
|
|
360
448
|
return fs.existsSync(path.join(os.homedir(), ".cursor"));
|
|
361
449
|
}
|
|
@@ -477,6 +565,7 @@ function main() {
|
|
|
477
565
|
|
|
478
566
|
writeOpenCodeJson(targetRoot, args.dryRun, isSelfInstall);
|
|
479
567
|
writePluginManifests(targetRoot, args.dryRun, isSelfInstall);
|
|
568
|
+
syncCursorSkills(targetRoot, args.dryRun, isSelfInstall);
|
|
480
569
|
applyCursorRegistration(targetRoot, args.dryRun, args.noRegisterCursor, args.registerCursor);
|
|
481
570
|
reportOpenCodeIntegration(targetRoot, args.dryRun);
|
|
482
571
|
writeAgentsMd(targetRoot, args.dryRun);
|
|
@@ -12,7 +12,7 @@ Checks:
|
|
|
12
12
|
- Managed entries in opencode.json point to existing source files
|
|
13
13
|
- Flags missing required frontmatter fields:
|
|
14
14
|
- commands: description (all)
|
|
15
|
-
- commands/workflow
|
|
15
|
+
- commands/workflow-*.md: invocation (recommended/expected)
|
|
16
16
|
- agents: description (all)
|
|
17
17
|
`;
|
|
18
18
|
(exitCode === 0 ? console.log : console.error)(msg.trimStart());
|
|
@@ -178,7 +178,7 @@ function main() {
|
|
|
178
178
|
for (const c of cmds) {
|
|
179
179
|
if (!c.id) errors.push(`Command missing id (name/invocation): ${c.rel}`);
|
|
180
180
|
if (!c.fm.description) errors.push(`Command missing frontmatter description: ${c.rel} (${c.id || "?"})`);
|
|
181
|
-
if (c.rel.
|
|
181
|
+
if (c.rel.includes("commands/workflow-") && !c.fm.invocation) {
|
|
182
182
|
errors.push(`Workflow command missing frontmatter invocation: ${c.rel} (${c.id || "?"})`);
|
|
183
183
|
}
|
|
184
184
|
if (c.id && !commandsReg[c.id]) errors.push(`Command not registered in opencode.json: ${c.id} (source: ${c.rel})`);
|
|
@@ -9,8 +9,11 @@ description: General coding practices, implementation styles, and patterns for t
|
|
|
9
9
|
|
|
10
10
|
These rules are mandatory for code/config implementation work. They are pass/fail gates, not advisory guidance.
|
|
11
11
|
|
|
12
|
+
**Declarative over imperative:** Prefer declarative solutions by requirement. Describe *what* should hold (state, transitions, invariants) and let the runtime or framework determine *how*; avoid imperative step-by-step control that mutates shared state in place.
|
|
13
|
+
|
|
12
14
|
### MUST
|
|
13
15
|
|
|
16
|
+
- **MUST prefer declarative over imperative:** Orchestration and data flow MUST be expressed declaratively (state/events/transitions, pure transforms) rather than imperative sequences (mutating variables, step-by-step handlers). When both are feasible, choose the declarative option.
|
|
14
17
|
- **MUST keep orchestration declarative** in containers/controllers: describe state transitions and event flow explicitly instead of imperative step-by-step control logic.
|
|
15
18
|
- **MUST use immutable transforms** for domain and controller data operations (`input -> output`), returning new values instead of mutating existing objects/arrays.
|
|
16
19
|
- **MUST keep domain logic in pure entity functions** (no side effects, no hidden mutable module state, no IO in entity transforms/predicates).
|
|
@@ -22,6 +25,7 @@ These rules are mandatory for code/config implementation work. They are pass/fai
|
|
|
22
25
|
|
|
23
26
|
### MUST NOT
|
|
24
27
|
|
|
28
|
+
- **MUST NOT choose imperative over declarative** when a declarative solution is feasible (e.g. state machine + events over manual flags and step counters; pure transforms over in-place mutation).
|
|
25
29
|
- **MUST NOT implement mutation-heavy imperative handlers** that modify shared state in-place across multiple steps.
|
|
26
30
|
- **MUST NOT use hidden mutable accumulators** (`let` variables mutated through control flow) when a pure transform is feasible.
|
|
27
31
|
- **MUST NOT mix business decision logic into containers/presentation** when it belongs in domain entities/controllers.
|
|
@@ -34,6 +38,7 @@ Use this format when reporting standards compliance in execution or review evide
|
|
|
34
38
|
|
|
35
39
|
```markdown
|
|
36
40
|
standards_compliance:
|
|
41
|
+
- declarative_over_imperative: pass|fail (evidence: file:line) # Declarative solutions required; no imperative choice when declarative feasible
|
|
37
42
|
- declarative_flow: pass|fail (evidence: file:line)
|
|
38
43
|
- immutable_transforms: pass|fail (evidence: file:line)
|
|
39
44
|
- maintainability_boundaries: pass|fail (evidence: file:line)
|
package/src/AGENTS.md
CHANGED
|
@@ -54,7 +54,7 @@ If workflow documents conflict, resolve them in this order:
|
|
|
54
54
|
|
|
55
55
|
1. `docs/principles/workflow-baseline-principles.md`
|
|
56
56
|
2. This file (`src/AGENTS.md`) non-negotiables and repo config
|
|
57
|
-
3. Workflow command specs (`src/.agents/commands/workflow
|
|
57
|
+
3. Workflow command specs (`src/.agents/commands/workflow-*.md`)
|
|
58
58
|
4. Skill docs (`src/.agents/skills/*/SKILL.md`)
|
|
59
59
|
|
|
60
60
|
## Non-negotiables (Structure Integrity)
|
|
@@ -161,15 +161,17 @@ worktree_bootstrap_notes:
|
|
|
161
161
|
|
|
162
162
|
## Directory Layout
|
|
163
163
|
|
|
164
|
-
- Commands: `.agents/commands/*.md` and `.agents/commands/workflow
|
|
164
|
+
- Commands: `.agents/commands/*.md` and `.agents/commands/workflow-*.md` (workflow namespace)
|
|
165
165
|
- Skills: `.agents/skills/*/SKILL.md`
|
|
166
166
|
- Skills may optionally include tool-specific agent metadata under `.agents/skills/*/agents/` (for example `openai.yaml`) when required by that skill's validator/runtime.
|
|
167
167
|
- References: `.agents/references/**`
|
|
168
168
|
- Agents: `.agents/agents/**/*.md`
|
|
169
169
|
|
|
170
|
+
**Single source of truth (declarative):** Commands and agents are discovered from the registry and `generate-platform-artifacts`; skills are discovered by scanning `skills/` for `*/SKILL.md`. Add or remove files/dirs, then run install—no other registration. See install-cli header comment for the full pipeline.
|
|
171
|
+
|
|
170
172
|
## Implemented Components (Current Scope)
|
|
171
173
|
|
|
172
|
-
- Commands: `workflow:brainstorm`, `workflow:plan`, `workflow:triage`, `workflow:work`, `workflow:review`, `workflow:tech-review`, `workflow:compound` (under `.agents/commands
|
|
174
|
+
- Commands: `workflow:brainstorm`, `workflow:plan`, `workflow:triage`, `workflow:work`, `workflow:review`, `workflow:tech-review`, `workflow:compound` (under `.agents/commands/` as `workflow-*.md`), plus `test-browser`, `metrics`, `assess`, `install` (root commands)
|
|
173
175
|
- Skills: `brainstorming`, `document-review`, `technical-review`, `compound-docs` (alias: `compound_doc`), `capture-skill`, `file-todos`, `agent-browser`, `git-worktree`, `process-metrics`, `react-ddd-mvc-frontend`, `xstate-actor-orchestration`, `standards`, `pii-protection-prisma`, `financial-workflow-integrity`, `audit-traceability`, `data-foundations`
|
|
174
176
|
- Agents:
|
|
175
177
|
- `repo-research-analyst`
|
|
@@ -27,37 +27,37 @@
|
|
|
27
27
|
{
|
|
28
28
|
"id": "workflow:brainstorm",
|
|
29
29
|
"description": "Explore requirements and approaches through collaborative dialogue before planning implementation",
|
|
30
|
-
"rel": "workflow
|
|
30
|
+
"rel": "workflow-brainstorm.md"
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"id": "workflow:compound",
|
|
34
34
|
"description": "Document a durable learning (solved problem or implementation insight) into docs/solutions/ to compound institutional knowledge",
|
|
35
|
-
"rel": "workflow
|
|
35
|
+
"rel": "workflow-compound.md"
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
"id": "workflow:plan",
|
|
39
39
|
"description": "Transform feature descriptions into well-structured project plans using an explicit fidelity and confidence model",
|
|
40
|
-
"rel": "workflow
|
|
40
|
+
"rel": "workflow-plan.md"
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
"id": "workflow:review",
|
|
44
44
|
"description": "Review a PR/branch/diff with structured findings. Does not implement fixes unless explicitly requested.",
|
|
45
|
-
"rel": "workflow
|
|
45
|
+
"rel": "workflow-review.md"
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
"id": "workflow:tech-review",
|
|
49
49
|
"description": "Run technical review on a plan (technical correctness before build). Optional plan path or latest in docs/plans/.",
|
|
50
|
-
"rel": "workflow
|
|
50
|
+
"rel": "workflow-tech-review.md"
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
"id": "workflow:triage",
|
|
54
54
|
"description": "Manual triage command to prioritize todo files into an executable ready queue (priority, dependencies, recommended action)",
|
|
55
|
-
"rel": "workflow
|
|
55
|
+
"rel": "workflow-triage.md"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"id": "workflow:work",
|
|
59
59
|
"description": "Execute a plan file systematically (implementation + verification) without auto-shipping",
|
|
60
|
-
"rel": "workflow
|
|
60
|
+
"rel": "workflow-work.md"
|
|
61
61
|
}
|
|
62
62
|
],
|
|
63
63
|
"agents": [
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|