compound-workflow 1.4.1 → 1.4.2
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/README.md +4 -1
- package/package.json +31 -1
- package/scripts/check-workflow-contracts.mjs +45 -0
- package/scripts/install-cli.mjs +57 -9
- package/src/.agents/commands/install.md +6 -2
- package/src/.agents/commands/workflow/review.md +13 -0
- package/src/.agents/commands/workflow/work.md +24 -5
- package/src/.agents/skills/standards/SKILL.md +37 -0
- package/src/AGENTS.md +1 -0
package/README.md
CHANGED
|
@@ -19,6 +19,7 @@ Runtime assets live in `src/.agents/` and `src/AGENTS.md`. Supports **Cursor**,
|
|
|
19
19
|
```bash
|
|
20
20
|
npm install compound-workflow
|
|
21
21
|
npx compound-workflow install
|
|
22
|
+
npx compound-workflow install all
|
|
22
23
|
```
|
|
23
24
|
|
|
24
25
|
**2. Choose how you use it:**
|
|
@@ -29,7 +30,7 @@ npx compound-workflow install
|
|
|
29
30
|
|
|
30
31
|
**What Install does:** Merges `AGENTS.md` (preserves your Repo Config Block), creates standard dirs (`docs/`, `todos/`), writes `opencode.json` (for OpenCode), and—if the project has a `.cursor` directory—creates `.cursor/skills/<skill>`, `.cursor/agents`, `.cursor/commands`, and `.cursor/references` (symlinks into the package). All paths reference `node_modules/compound-workflow`; no file copying.
|
|
31
32
|
|
|
32
|
-
**CLI options:** `--dry-run` (preview), `--root /path/to/project`, `--no-config` (skip Repo Config Block reminder), `--cursor` (create `.cursor` and wire Cursor symlinks even if `.cursor` does not already exist).
|
|
33
|
+
**CLI options:** `all` / `--all` (full install shortcut; same as `--cursor`), `--dry-run` (preview), `--root /path/to/project`, `--no-config` (skip Repo Config Block reminder), `--cursor` (create `.cursor` and wire Cursor symlinks even if `.cursor` does not already exist).
|
|
33
34
|
|
|
34
35
|
**Legacy (clone inside repo):** If you cloned this repo inside a host repo and need to copy files without npm, use `./scripts/sync-into-repo.sh` (copy only; does not update opencode.json). Prefer the npm + Install flow above.
|
|
35
36
|
|
|
@@ -159,6 +160,8 @@ Full “when to use what” and reference standards: [src/AGENTS.md](src/AGENTS.
|
|
|
159
160
|
|
|
160
161
|
- **Independent review policy:** code/config changes require `/workflow:review` before workflow completion; docs-only changes are exempt.
|
|
161
162
|
|
|
163
|
+
- **Standards baseline policy:** code/config changes must pass `skill: standards` as a hard gate (declarative flow, immutable transforms, maintainability boundaries) in both `/workflow:work` and `/workflow:review`; docs-only changes are exempt.
|
|
164
|
+
|
|
162
165
|
- **Quality gate fallback:** if `lint_command` or `typecheck_command` is missing from repo config, workflow asks once for run-provided commands and continues only if they pass.
|
|
163
166
|
|
|
164
167
|
- **Artifact policy:** do not create ad-hoc artifacts outside canonical outputs (`docs/plans`, `todos`, `docs/solutions`, `docs/metrics`) unless explicitly requested.
|
package/package.json
CHANGED
|
@@ -1 +1,31 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"name": "compound-workflow",
|
|
3
|
+
"version": "1.4.2",
|
|
4
|
+
"description": "Clarify → plan → execute → verify → capture. One Install action for Cursor, Claude, and OpenCode.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/cjerochim/compound-workflow.git"
|
|
9
|
+
},
|
|
10
|
+
"bin": {
|
|
11
|
+
"compound-workflow": "scripts/install-cli.mjs"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"src",
|
|
15
|
+
"scripts",
|
|
16
|
+
".cursor-plugin",
|
|
17
|
+
".claude-plugin",
|
|
18
|
+
"skills"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"check:pack-readme": "node scripts/check-pack-readme.mjs"
|
|
22
|
+
},
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=18"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@semantic-release/git": "^10.0.1",
|
|
28
|
+
"@semantic-release/npm": "^13.1.4",
|
|
29
|
+
"semantic-release": "^25.0.3"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -21,6 +21,11 @@ const requiredChecks = [
|
|
|
21
21
|
pattern: "No ad-hoc artifacts outside canonical outputs",
|
|
22
22
|
description: "canonical artifact policy in AGENTS",
|
|
23
23
|
},
|
|
24
|
+
{
|
|
25
|
+
file: "src/AGENTS.md",
|
|
26
|
+
pattern: "Standards baseline is mandatory for code/config changes.",
|
|
27
|
+
description: "standards hard-gate policy in AGENTS",
|
|
28
|
+
},
|
|
24
29
|
{
|
|
25
30
|
file: "README.md",
|
|
26
31
|
pattern: "If docs conflict:",
|
|
@@ -31,6 +36,11 @@ const requiredChecks = [
|
|
|
31
36
|
pattern: "code/config changes require `/workflow:review`",
|
|
32
37
|
description: "README review gate policy",
|
|
33
38
|
},
|
|
39
|
+
{
|
|
40
|
+
file: "README.md",
|
|
41
|
+
pattern: "Standards baseline policy:",
|
|
42
|
+
description: "README standards baseline guardrail",
|
|
43
|
+
},
|
|
34
44
|
{
|
|
35
45
|
file: "src/.agents/commands/workflow/plan.md",
|
|
36
46
|
pattern: "Contract precedence:",
|
|
@@ -62,6 +72,16 @@ const requiredChecks = [
|
|
|
62
72
|
pattern: "workflow_complete: false (pending /workflow:review current)",
|
|
63
73
|
description: "implementation-complete pending-review status in work command",
|
|
64
74
|
},
|
|
75
|
+
{
|
|
76
|
+
file: "src/.agents/commands/workflow/work.md",
|
|
77
|
+
pattern: "Standards Compliance Gate (REQUIRED for code/config changes)",
|
|
78
|
+
description: "required standards gate in work command",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
file: "src/.agents/commands/workflow/work.md",
|
|
82
|
+
pattern: "This gate cannot run until the isolation/worktree gate is passed and recorded (`gate_status: passed`).",
|
|
83
|
+
description: "standards gate ordering with worktree gate",
|
|
84
|
+
},
|
|
65
85
|
{
|
|
66
86
|
file: "src/.agents/commands/workflow/review.md",
|
|
67
87
|
pattern: "Contract precedence:",
|
|
@@ -82,6 +102,26 @@ const requiredChecks = [
|
|
|
82
102
|
pattern: "what was skipped and why",
|
|
83
103
|
description: "review skipped-pass disclosure requirement",
|
|
84
104
|
},
|
|
105
|
+
{
|
|
106
|
+
file: "src/.agents/commands/workflow/review.md",
|
|
107
|
+
pattern: "standards_compliance: pass|pass-with-notes|fail",
|
|
108
|
+
description: "review standards compliance output field",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
file: "src/.agents/commands/workflow/review.md",
|
|
112
|
+
pattern: "standards `MUST` violations => blocking finding and review recommendation `fail`",
|
|
113
|
+
description: "review must-violation fail criteria",
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
file: "src/.agents/skills/standards/SKILL.md",
|
|
117
|
+
pattern: "## Mandatory Baseline (Declarative, Immutable, Maintainable)",
|
|
118
|
+
description: "standards mandatory baseline section",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
file: "src/.agents/skills/standards/SKILL.md",
|
|
122
|
+
pattern: "### MUST NOT",
|
|
123
|
+
description: "standards must-not checklist",
|
|
124
|
+
},
|
|
85
125
|
];
|
|
86
126
|
|
|
87
127
|
const forbiddenChecks = [
|
|
@@ -100,6 +140,11 @@ const forbiddenChecks = [
|
|
|
100
140
|
pattern: "skip specialist reviewers by default",
|
|
101
141
|
description: "legacy skip-by-default specialist reviewer wording",
|
|
102
142
|
},
|
|
143
|
+
{
|
|
144
|
+
file: "src/.agents/commands/workflow/work.md",
|
|
145
|
+
pattern: "Follow project coding standards (see AGENTS.md)",
|
|
146
|
+
description: "legacy advisory-only coding standards wording in work command",
|
|
147
|
+
},
|
|
103
148
|
];
|
|
104
149
|
|
|
105
150
|
const failures = [];
|
package/scripts/install-cli.mjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* compound-workflow install
|
|
4
4
|
* One action: opencode.json (load from package) + AGENTS.md merge + dirs + Repo Config Block.
|
|
5
|
-
* Run from project: npx compound-workflow install [--root <dir>] [--dry-run] [--no-config]
|
|
5
|
+
* Run from project: npx compound-workflow install [all|--all] [--root <dir>] [--dry-run] [--no-config]
|
|
6
6
|
*/
|
|
7
7
|
import fs from "node:fs";
|
|
8
8
|
import path from "node:path";
|
|
@@ -14,11 +14,12 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
14
14
|
function usage(exitCode = 0) {
|
|
15
15
|
const msg = `
|
|
16
16
|
Usage:
|
|
17
|
-
npx compound-workflow install [--root <projectDir>] [--dry-run] [--no-config] [--cursor]
|
|
17
|
+
npx compound-workflow install [all|--all] [--root <projectDir>] [--dry-run] [--no-config] [--cursor]
|
|
18
18
|
|
|
19
19
|
One action: writes opencode.json (loads from package), merges AGENTS.md, creates dirs,
|
|
20
20
|
and prompts for Repo Config Block (unless --no-config).
|
|
21
21
|
|
|
22
|
+
all, --all Full install shortcut (enables Cursor integration; creates .cursor if needed)
|
|
22
23
|
--root <dir> Project directory (default: cwd)
|
|
23
24
|
--dry-run Print planned changes only
|
|
24
25
|
--no-config Skip Repo Config Block prompt (only write opencode.json + AGENTS.md + dirs)
|
|
@@ -35,6 +36,7 @@ function parseArgs(argv) {
|
|
|
35
36
|
if (a === "--dry-run") out.dryRun = true;
|
|
36
37
|
else if (a === "--no-config") out.noConfig = true;
|
|
37
38
|
else if (a === "--cursor") out.cursor = true;
|
|
39
|
+
else if (a === "--all" || a === "all") out.cursor = true;
|
|
38
40
|
else if (a === "--root") {
|
|
39
41
|
const v = argv[i + 1];
|
|
40
42
|
if (!v) usage(1);
|
|
@@ -309,7 +311,7 @@ function ensureCursorSkills(targetRoot, dryRun, cursorReady) {
|
|
|
309
311
|
const blocked = [];
|
|
310
312
|
for (const name of skillNames) {
|
|
311
313
|
const linkPath = path.join(skillsDir, name);
|
|
312
|
-
const targetRel = path.join("..", "..", "
|
|
314
|
+
const targetRel = path.join("..", "..", "node_modules", "compound-workflow", "src", ".agents", "skills", name);
|
|
313
315
|
const targetAbs = path.resolve(path.dirname(linkPath), targetRel);
|
|
314
316
|
let needCreate = true;
|
|
315
317
|
try {
|
|
@@ -345,12 +347,53 @@ function verifyCursorIntegration(targetRoot) {
|
|
|
345
347
|
for (const check of checks) {
|
|
346
348
|
const linkPath = path.join(cursorDir, check.rel);
|
|
347
349
|
const expectedAbs = path.join(targetRoot, "node_modules", "compound-workflow", "src", ".agents", check.rel);
|
|
348
|
-
if (!
|
|
350
|
+
if (!fs.existsSync(linkPath)) issues.push(`${check.name} is missing`);
|
|
351
|
+
else {
|
|
352
|
+
const stat = fs.lstatSync(linkPath);
|
|
353
|
+
if (stat.isSymbolicLink() && !symlinkPointsTo(linkPath, expectedAbs)) {
|
|
354
|
+
issues.push(`${check.name} symlink points to unexpected target`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const packageSkillsDir = path.join(packageRoot, "src", ".agents", "skills");
|
|
360
|
+
if (fs.existsSync(packageSkillsDir)) {
|
|
361
|
+
const missingSkills = [];
|
|
362
|
+
for (const name of fs.readdirSync(packageSkillsDir)) {
|
|
363
|
+
const skillPath = path.join(packageSkillsDir, name);
|
|
364
|
+
if (!fs.statSync(skillPath).isDirectory()) continue;
|
|
365
|
+
if (!fs.existsSync(path.join(skillPath, "SKILL.md"))) continue;
|
|
366
|
+
const cursorSkill = path.join(cursorDir, "skills", name, "SKILL.md");
|
|
367
|
+
if (!fs.existsSync(cursorSkill)) missingSkills.push(name);
|
|
368
|
+
}
|
|
369
|
+
if (missingSkills.length) {
|
|
370
|
+
issues.push(
|
|
371
|
+
`.cursor/skills is missing ${missingSkills.length} package skill(s), e.g. ${missingSkills[0]}`
|
|
372
|
+
);
|
|
373
|
+
}
|
|
349
374
|
}
|
|
350
375
|
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
|
|
376
|
+
const packageRoots = [
|
|
377
|
+
{ label: "commands", pkgDir: path.join(packageRoot, "src", ".agents", "commands"), cursorSubdir: "commands" },
|
|
378
|
+
{ label: "agents", pkgDir: path.join(packageRoot, "src", ".agents", "agents"), cursorSubdir: "agents" },
|
|
379
|
+
{ label: "references", pkgDir: path.join(packageRoot, "src", ".agents", "references"), cursorSubdir: "references" },
|
|
380
|
+
];
|
|
381
|
+
for (const item of packageRoots) {
|
|
382
|
+
if (!fs.existsSync(item.pkgDir)) continue;
|
|
383
|
+
const pkgFiles = walkFiles(item.pkgDir, () => true);
|
|
384
|
+
let missingCount = 0;
|
|
385
|
+
let firstMissing = null;
|
|
386
|
+
for (const abs of pkgFiles) {
|
|
387
|
+
const rel = path.relative(item.pkgDir, abs);
|
|
388
|
+
const targetFile = path.join(cursorDir, item.cursorSubdir, rel);
|
|
389
|
+
if (!fs.existsSync(targetFile)) {
|
|
390
|
+
missingCount++;
|
|
391
|
+
if (!firstMissing) firstMissing = rel;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (missingCount) {
|
|
395
|
+
issues.push(`.cursor/${item.label} is missing ${missingCount} package file(s), e.g. ${firstMissing}`);
|
|
396
|
+
}
|
|
354
397
|
}
|
|
355
398
|
return issues;
|
|
356
399
|
}
|
|
@@ -359,7 +402,7 @@ function ensureCursorIntegration(targetRoot, dryRun, forceCursor) {
|
|
|
359
402
|
const cursorDir = path.join(targetRoot, ".cursor");
|
|
360
403
|
let cursorReady = fs.existsSync(cursorDir);
|
|
361
404
|
if (!fs.existsSync(cursorDir)) {
|
|
362
|
-
if (!forceCursor) return { issues: [] };
|
|
405
|
+
if (!forceCursor) return { issues: [], status: "skipped-no-cursor" };
|
|
363
406
|
if (dryRun) console.log("[dry-run] Would create .cursor directory (Cursor)");
|
|
364
407
|
else {
|
|
365
408
|
fs.mkdirSync(cursorDir, { recursive: true });
|
|
@@ -388,7 +431,7 @@ function ensureCursorIntegration(targetRoot, dryRun, forceCursor) {
|
|
|
388
431
|
if (!dryRun) {
|
|
389
432
|
for (const issue of verifyCursorIntegration(targetRoot)) issues.push(issue);
|
|
390
433
|
}
|
|
391
|
-
return { issues };
|
|
434
|
+
return { issues, status: "configured" };
|
|
392
435
|
}
|
|
393
436
|
|
|
394
437
|
function writeOpenCodeJson(targetRoot, dryRun) {
|
|
@@ -540,6 +583,11 @@ function main() {
|
|
|
540
583
|
ensureSkillsSymlink(targetRoot, args.dryRun);
|
|
541
584
|
reportOpenCodeIntegration(targetRoot, args.dryRun);
|
|
542
585
|
const cursorReport = ensureCursorIntegration(targetRoot, args.dryRun, args.cursor);
|
|
586
|
+
if (cursorReport.status === "skipped-no-cursor") {
|
|
587
|
+
console.log("Cursor integration: skipped (.cursor missing). Run install with `all` or `--cursor` to create it.");
|
|
588
|
+
} else {
|
|
589
|
+
console.log("Cursor integration: verified skills, agents, commands, and references.");
|
|
590
|
+
}
|
|
543
591
|
writeAgentsMd(targetRoot, args.dryRun);
|
|
544
592
|
ensureDirs(targetRoot, args.dryRun);
|
|
545
593
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: install
|
|
3
3
|
invocation: install
|
|
4
|
-
description: Install compound-workflow in this project (one action)—opencode.json, AGENTS.md, dirs,
|
|
5
|
-
argument-hint: "[--dry-run] [--root <path>] [--no-config]"
|
|
4
|
+
description: Install compound-workflow in this project (one action)—opencode.json, AGENTS.md, dirs, Repo Config Block, and optional Cursor wiring.
|
|
5
|
+
argument-hint: "[all|--all] [--dry-run] [--root <path>] [--no-config] [--cursor]"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# /install
|
|
@@ -24,6 +24,7 @@ Run in the **workspace root** (or the directory the user specifies):
|
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
26
|
npx compound-workflow@latest install
|
|
27
|
+
npx compound-workflow@latest install all
|
|
27
28
|
```
|
|
28
29
|
|
|
29
30
|
Or with a specific root and flags:
|
|
@@ -32,11 +33,14 @@ Or with a specific root and flags:
|
|
|
32
33
|
npx compound-workflow install --root /path/to/project
|
|
33
34
|
npx compound-workflow install --dry-run
|
|
34
35
|
npx compound-workflow install --no-config
|
|
36
|
+
npx compound-workflow install --cursor
|
|
35
37
|
```
|
|
36
38
|
|
|
39
|
+
- **all / --all**: Full install shortcut; same as `--cursor` (creates `.cursor` if missing, then wires skills/agents/commands/references).
|
|
37
40
|
- **--dry-run**: Print planned changes only; no writes.
|
|
38
41
|
- **--root <path>**: Target project directory (default: current directory).
|
|
39
42
|
- **--no-config**: Skip Repo Config Block reminder; only write opencode.json, AGENTS.md merge, and dirs.
|
|
43
|
+
- **--cursor**: Force Cursor integration (create `.cursor` if missing, then wire skills/agents/commands/references).
|
|
40
44
|
|
|
41
45
|
Do not copy files from a compound-workflow clone; the Install CLI uses the package from `node_modules/compound-workflow`.
|
|
42
46
|
|
|
@@ -103,6 +103,11 @@ Protected artifacts:
|
|
|
103
103
|
|
|
104
104
|
- `Task learnings-researcher(<target context>)` (related prior solutions)
|
|
105
105
|
- `Task lint(<changed files context>)` only if `lint_command` is configured in the Repo Config Block
|
|
106
|
+
- Run the standards compliance pass using `skill: standards` as mandatory baseline for code/config changes:
|
|
107
|
+
- evaluate declarative flow
|
|
108
|
+
- evaluate immutable transforms
|
|
109
|
+
- evaluate maintainability boundaries
|
|
110
|
+
- evaluate hidden mutable state
|
|
106
111
|
- Verify agentic executability from plan/todo artifacts when available:
|
|
107
112
|
- access prerequisites are explicit
|
|
108
113
|
- validation commands are explicit and reproducible
|
|
@@ -139,6 +144,7 @@ Then perform the main review synthesis across:
|
|
|
139
144
|
- risk and failure modes
|
|
140
145
|
- operational considerations (monitoring, rollback)
|
|
141
146
|
- readability/maintainability
|
|
147
|
+
- standards compliance using `skill: standards` (MUST/MUST NOT baseline)
|
|
142
148
|
|
|
143
149
|
### Phase 4: Synthesis + Verdict
|
|
144
150
|
|
|
@@ -147,11 +153,18 @@ Provide:
|
|
|
147
153
|
- Review recommendation: `pass | pass-with-notes | fail`
|
|
148
154
|
- `review_independence_mode: independent|degraded`
|
|
149
155
|
- `verdict_confidence: normal|degraded` (use `degraded` only when `review_independence_mode=degraded`)
|
|
156
|
+
- `standards_compliance: pass|pass-with-notes|fail`
|
|
157
|
+
- `fail`: one or more standards MUST violations (blocking)
|
|
158
|
+
- `pass-with-notes`: no MUST violations, but SHOULD-level maintainability concerns
|
|
159
|
+
- `pass`: no material standards violations
|
|
150
160
|
- Top risks (1–5 bullets)
|
|
151
161
|
- Findings list:
|
|
152
162
|
- severity (`critical | high | medium | low`)
|
|
153
163
|
- evidence (file references or commands/output)
|
|
154
164
|
- recommended action (concise)
|
|
165
|
+
- standards classification:
|
|
166
|
+
- standards `MUST` violations => blocking finding and review recommendation `fail`
|
|
167
|
+
- standards `SHOULD` violations => non-blocking finding and review recommendation `pass-with-notes`
|
|
155
168
|
- Independence evidence summary:
|
|
156
169
|
- what independent pass ran
|
|
157
170
|
- what was skipped and why
|
|
@@ -394,7 +394,7 @@ The input must be a plan file path.
|
|
|
394
394
|
- The plan should reference similar code - read those files first
|
|
395
395
|
- Match naming conventions exactly
|
|
396
396
|
- Reuse existing components where possible
|
|
397
|
-
-
|
|
397
|
+
- Load and follow `skill: standards` as the mandatory baseline for declarative, immutable, maintainable implementation quality
|
|
398
398
|
- When in doubt, grep for similar implementations
|
|
399
399
|
|
|
400
400
|
3. **Test Continuously**
|
|
@@ -453,11 +453,30 @@ The input must be a plan file path.
|
|
|
453
453
|
|
|
454
454
|
Docs-only runs may skip this handoff using the docs-only review exemption.
|
|
455
455
|
|
|
456
|
-
3. **
|
|
456
|
+
3. **Standards Compliance Gate (REQUIRED for code/config changes)**
|
|
457
|
+
|
|
458
|
+
For code/config changes, standards compliance is a hard gate before todo completion:
|
|
459
|
+
|
|
460
|
+
- Use `skill: standards` as the source of truth.
|
|
461
|
+
- This gate cannot run until the isolation/worktree gate is passed and recorded (`gate_status: passed`).
|
|
462
|
+
- Record standards evidence in todo Work Log using the standards evidence format:
|
|
463
|
+
- declarative flow
|
|
464
|
+
- immutable transforms
|
|
465
|
+
- maintainability boundaries
|
|
466
|
+
- hidden mutable state check
|
|
467
|
+
- If any mandatory standards line fails:
|
|
468
|
+
- do not rename todo to `*-complete-*.md`
|
|
469
|
+
- move todo back to `pending`
|
|
470
|
+
- add `tags: [blocker]`
|
|
471
|
+
- record blocking rationale + remediation steps in Work Log
|
|
472
|
+
|
|
473
|
+
Docs-only runs: mark this gate `not_applicable` and continue.
|
|
474
|
+
|
|
475
|
+
4. **Final Validation**
|
|
457
476
|
- All todo files created for this plan are marked complete
|
|
458
477
|
- All tests pass
|
|
459
478
|
- Linting/typechecking/formatting checks pass (configured or run-provided via ask-once fallback)
|
|
460
|
-
- Code follows existing patterns
|
|
479
|
+
- Code follows existing patterns and passes the standards compliance gate
|
|
461
480
|
- UI validation completed (if applicable)
|
|
462
481
|
- No console errors or warnings
|
|
463
482
|
- Scope contract satisfied:
|
|
@@ -465,14 +484,14 @@ The input must be a plan file path.
|
|
|
465
484
|
- `migration`: migration verification and rollback checks are documented as passing
|
|
466
485
|
- `full_remediation`: scoped remediation goals are complete per `completion_expectation`
|
|
467
486
|
|
|
468
|
-
|
|
487
|
+
5. **Update Plan Status**
|
|
469
488
|
|
|
470
489
|
If the input document has YAML frontmatter with a `status` field, update it to `completed`:
|
|
471
490
|
```
|
|
472
491
|
status: active → status: completed
|
|
473
492
|
```
|
|
474
493
|
|
|
475
|
-
|
|
494
|
+
6. **Notify User**
|
|
476
495
|
- Summarize what was completed
|
|
477
496
|
- Note any follow-up work needed
|
|
478
497
|
- Suggest next steps if applicable
|
|
@@ -5,6 +5,43 @@ description: General coding practices, implementation styles, and patterns for t
|
|
|
5
5
|
|
|
6
6
|
# Altai Code Standards
|
|
7
7
|
|
|
8
|
+
## Mandatory Baseline (Declarative, Immutable, Maintainable)
|
|
9
|
+
|
|
10
|
+
These rules are mandatory for code/config implementation work. They are pass/fail gates, not advisory guidance.
|
|
11
|
+
|
|
12
|
+
### MUST
|
|
13
|
+
|
|
14
|
+
- **MUST keep orchestration declarative** in containers/controllers: describe state transitions and event flow explicitly instead of imperative step-by-step control logic.
|
|
15
|
+
- **MUST use immutable transforms** for domain and controller data operations (`input -> output`), returning new values instead of mutating existing objects/arrays.
|
|
16
|
+
- **MUST keep domain logic in pure entity functions** (no side effects, no hidden mutable module state, no IO in entity transforms/predicates).
|
|
17
|
+
- **MUST keep maintainability boundaries clear**:
|
|
18
|
+
- containers wire/select/send and avoid business rules
|
|
19
|
+
- controllers manage state transitions and delegate reusable logic to entities
|
|
20
|
+
- presentation components remain UI-focused
|
|
21
|
+
- **MUST keep branching complexity controlled** with early exits and extracted helpers when conditional logic grows.
|
|
22
|
+
|
|
23
|
+
### MUST NOT
|
|
24
|
+
|
|
25
|
+
- **MUST NOT implement mutation-heavy imperative handlers** that modify shared state in-place across multiple steps.
|
|
26
|
+
- **MUST NOT use hidden mutable accumulators** (`let` variables mutated through control flow) when a pure transform is feasible.
|
|
27
|
+
- **MUST NOT mix business decision logic into containers/presentation** when it belongs in domain entities/controllers.
|
|
28
|
+
- **MUST NOT allow branching sprawl** in controllers/containers (deep nesting, chained `else-if`, or nested ternaries for workflow logic).
|
|
29
|
+
- **MUST NOT complete code/config work without standards evidence** recorded in work/review outputs.
|
|
30
|
+
|
|
31
|
+
### Required Evidence Format (Work and Review)
|
|
32
|
+
|
|
33
|
+
Use this format when reporting standards compliance in execution or review evidence:
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
standards_compliance:
|
|
37
|
+
- declarative_flow: pass|fail (evidence: file:line)
|
|
38
|
+
- immutable_transforms: pass|fail (evidence: file:line)
|
|
39
|
+
- maintainability_boundaries: pass|fail (evidence: file:line)
|
|
40
|
+
- hidden_mutable_state: pass|fail (evidence: file:line)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If any mandatory line is `fail`, code/config work is not complete.
|
|
44
|
+
|
|
8
45
|
## Core Principles
|
|
9
46
|
|
|
10
47
|
1. **Simplicity over cleverness** - Prefer straightforward solutions
|
package/src/AGENTS.md
CHANGED
|
@@ -66,6 +66,7 @@ If workflow documents conflict, resolve them in this order:
|
|
|
66
66
|
- **Spike governance is explicit and ordered.** Risky plans must evaluate spike need, spike candidates must declare initial priority/dependencies/unblocks/timebox/deliverable, triage confirms those assumptions, and `/workflow:work` executes blocking spikes before dependent build todos.
|
|
67
67
|
- **Agentic access/testability is mandatory in planning.** Every plan must include an executable access + validation contract so work/review can run deterministically.
|
|
68
68
|
- **Independent review is required for code/config changes.** `/workflow:review` must emit `review_independence_mode: independent|degraded`, plus independence evidence and skipped-pass disclosure.
|
|
69
|
+
- **Standards baseline is mandatory for code/config changes.** `/workflow:work` and `/workflow:review` must apply `skill: standards` as a hard gate for declarative flow, immutable transforms, and maintainability boundaries.
|
|
69
70
|
- **Todo completion requires evidence.** A todo may move to `complete` only after success criteria evidence and quality gate evidence are recorded in Work Log.
|
|
70
71
|
- **Blockers change todo state immediately.** Blocked work must move from `ready` back to `pending` with `tags: [blocker]` and an options+recommendation decision record.
|
|
71
72
|
- **Quality gates are enforced with ask-once fallback.** If `lint_command` or `typecheck_command` is missing, ask once per run and continue only when commands are provided and pass.
|