@sienklogic/plan-build-run 2.0.0 → 2.0.1
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/CHANGELOG.md +56 -56
- package/CLAUDE.md +149 -149
- package/LICENSE +21 -21
- package/README.md +247 -247
- package/dashboard/bin/cli.js +25 -25
- package/dashboard/package.json +34 -34
- package/dashboard/public/css/layout.css +406 -406
- package/dashboard/public/css/status-colors.css +98 -98
- package/dashboard/public/js/htmx-title.js +5 -5
- package/dashboard/public/js/sidebar-toggle.js +20 -20
- package/dashboard/src/app.js +78 -78
- package/dashboard/src/middleware/errorHandler.js +52 -52
- package/dashboard/src/middleware/notFoundHandler.js +9 -9
- package/dashboard/src/repositories/planning.repository.js +128 -128
- package/dashboard/src/routes/events.routes.js +40 -40
- package/dashboard/src/routes/index.routes.js +31 -31
- package/dashboard/src/routes/pages.routes.js +245 -195
- package/dashboard/src/server.js +42 -42
- package/dashboard/src/services/dashboard.service.js +222 -222
- package/dashboard/src/services/phase.service.js +220 -167
- package/dashboard/src/services/project.service.js +57 -57
- package/dashboard/src/services/roadmap.service.js +171 -171
- package/dashboard/src/services/sse.service.js +58 -58
- package/dashboard/src/services/todo.service.js +254 -254
- package/dashboard/src/services/watcher.service.js +48 -48
- package/dashboard/src/views/coming-soon.ejs +11 -11
- package/dashboard/src/views/error.ejs +13 -13
- package/dashboard/src/views/index.ejs +5 -5
- package/dashboard/src/views/layout.ejs +1 -1
- package/dashboard/src/views/partials/dashboard-content.ejs +77 -77
- package/dashboard/src/views/partials/footer.ejs +3 -3
- package/dashboard/src/views/partials/head.ejs +21 -21
- package/dashboard/src/views/partials/header.ejs +12 -12
- package/dashboard/src/views/partials/layout-bottom.ejs +15 -15
- package/dashboard/src/views/partials/layout-top.ejs +8 -8
- package/dashboard/src/views/partials/phase-content.ejs +188 -181
- package/dashboard/src/views/partials/phase-doc-content.ejs +38 -0
- package/dashboard/src/views/partials/phases-content.ejs +117 -117
- package/dashboard/src/views/partials/roadmap-content.ejs +142 -142
- package/dashboard/src/views/partials/sidebar.ejs +38 -38
- package/dashboard/src/views/partials/todo-create-content.ejs +53 -53
- package/dashboard/src/views/partials/todo-detail-content.ejs +38 -38
- package/dashboard/src/views/partials/todos-content.ejs +53 -53
- package/dashboard/src/views/phase-detail.ejs +5 -5
- package/dashboard/src/views/phase-doc.ejs +5 -0
- package/dashboard/src/views/phases.ejs +5 -5
- package/dashboard/src/views/roadmap.ejs +5 -5
- package/dashboard/src/views/todo-create.ejs +5 -5
- package/dashboard/src/views/todo-detail.ejs +5 -5
- package/dashboard/src/views/todos.ejs +5 -5
- package/package.json +57 -57
- package/plugins/pbr/.claude-plugin/plugin.json +13 -13
- package/plugins/pbr/UI-CONSISTENCY-GAPS.md +61 -61
- package/plugins/pbr/agents/codebase-mapper.md +279 -271
- package/plugins/pbr/agents/debugger.md +281 -281
- package/plugins/pbr/agents/executor.md +428 -407
- package/plugins/pbr/agents/general.md +164 -164
- package/plugins/pbr/agents/integration-checker.md +169 -141
- package/plugins/pbr/agents/plan-checker.md +296 -280
- package/plugins/pbr/agents/planner.md +358 -358
- package/plugins/pbr/agents/researcher.md +363 -363
- package/plugins/pbr/agents/synthesizer.md +230 -230
- package/plugins/pbr/agents/verifier.md +489 -454
- package/plugins/pbr/commands/begin.md +5 -5
- package/plugins/pbr/commands/build.md +5 -5
- package/plugins/pbr/commands/config.md +5 -5
- package/plugins/pbr/commands/continue.md +5 -5
- package/plugins/pbr/commands/debug.md +5 -5
- package/plugins/pbr/commands/discuss.md +5 -5
- package/plugins/pbr/commands/explore.md +5 -5
- package/plugins/pbr/commands/health.md +5 -5
- package/plugins/pbr/commands/help.md +5 -5
- package/plugins/pbr/commands/import.md +5 -5
- package/plugins/pbr/commands/milestone.md +5 -5
- package/plugins/pbr/commands/note.md +5 -5
- package/plugins/pbr/commands/pause.md +5 -5
- package/plugins/pbr/commands/plan.md +5 -5
- package/plugins/pbr/commands/quick.md +5 -5
- package/plugins/pbr/commands/resume.md +5 -5
- package/plugins/pbr/commands/review.md +5 -5
- package/plugins/pbr/commands/scan.md +5 -5
- package/plugins/pbr/commands/setup.md +5 -5
- package/plugins/pbr/commands/status.md +5 -5
- package/plugins/pbr/commands/todo.md +5 -5
- package/plugins/pbr/contexts/dev.md +27 -27
- package/plugins/pbr/contexts/research.md +28 -28
- package/plugins/pbr/contexts/review.md +36 -36
- package/plugins/pbr/hooks/hooks.json +183 -183
- package/plugins/pbr/references/agent-anti-patterns.md +24 -24
- package/plugins/pbr/references/agent-interactions.md +134 -134
- package/plugins/pbr/references/agent-teams.md +54 -54
- package/plugins/pbr/references/checkpoints.md +157 -157
- package/plugins/pbr/references/common-bug-patterns.md +13 -13
- package/plugins/pbr/references/config-reference.md +441 -0
- package/plugins/pbr/references/continuation-format.md +212 -212
- package/plugins/pbr/references/deviation-rules.md +112 -112
- package/plugins/pbr/references/git-integration.md +226 -226
- package/plugins/pbr/references/integration-patterns.md +117 -117
- package/plugins/pbr/references/model-profiles.md +99 -99
- package/plugins/pbr/references/model-selection.md +31 -31
- package/plugins/pbr/references/pbr-rules.md +193 -193
- package/plugins/pbr/references/plan-authoring.md +181 -181
- package/plugins/pbr/references/plan-format.md +287 -283
- package/plugins/pbr/references/planning-config.md +213 -213
- package/plugins/pbr/references/questioning.md +214 -214
- package/plugins/pbr/references/reading-verification.md +127 -127
- package/plugins/pbr/references/stub-patterns.md +160 -160
- package/plugins/pbr/references/subagent-coordination.md +119 -119
- package/plugins/pbr/references/ui-formatting.md +461 -399
- package/plugins/pbr/references/verification-patterns.md +198 -198
- package/plugins/pbr/references/wave-execution.md +95 -95
- package/plugins/pbr/scripts/auto-continue.js +80 -80
- package/plugins/pbr/scripts/check-dangerous-commands.js +136 -136
- package/plugins/pbr/scripts/check-doc-sprawl.js +102 -102
- package/plugins/pbr/scripts/check-phase-boundary.js +196 -196
- package/plugins/pbr/scripts/check-plan-format.js +270 -270
- package/plugins/pbr/scripts/check-roadmap-sync.js +322 -252
- package/plugins/pbr/scripts/check-skill-workflow.js +262 -262
- package/plugins/pbr/scripts/check-state-sync.js +476 -476
- package/plugins/pbr/scripts/check-subagent-output.js +144 -144
- package/plugins/pbr/scripts/config-schema.json +251 -251
- package/plugins/pbr/scripts/context-budget-check.js +287 -287
- package/plugins/pbr/scripts/event-handler.js +151 -151
- package/plugins/pbr/scripts/event-logger.js +92 -92
- package/plugins/pbr/scripts/hook-logger.js +80 -76
- package/plugins/pbr/scripts/hooks-schema.json +79 -79
- package/plugins/pbr/scripts/log-subagent.js +164 -152
- package/plugins/pbr/scripts/log-tool-failure.js +88 -88
- package/plugins/pbr/scripts/pbr-tools.js +1378 -1301
- package/plugins/pbr/scripts/post-write-dispatch.js +66 -66
- package/plugins/pbr/scripts/post-write-quality.js +207 -207
- package/plugins/pbr/scripts/pre-bash-dispatch.js +86 -56
- package/plugins/pbr/scripts/pre-write-dispatch.js +97 -62
- package/plugins/pbr/scripts/progress-tracker.js +281 -228
- package/plugins/pbr/scripts/run-hook.js +92 -0
- package/plugins/pbr/scripts/session-cleanup.js +254 -254
- package/plugins/pbr/scripts/status-line.js +288 -285
- package/plugins/pbr/scripts/suggest-compact.js +119 -119
- package/plugins/pbr/scripts/task-completed.js +45 -45
- package/plugins/pbr/scripts/track-context-budget.js +149 -119
- package/plugins/pbr/scripts/validate-commit.js +200 -200
- package/plugins/pbr/scripts/validate-plugin-structure.js +183 -172
- package/plugins/pbr/scripts/validate-task.js +106 -0
- package/plugins/pbr/skills/begin/SKILL.md +594 -545
- package/plugins/pbr/skills/begin/templates/PROJECT.md.tmpl +33 -33
- package/plugins/pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +18 -18
- package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +49 -49
- package/plugins/pbr/skills/begin/templates/config.json.tmpl +64 -63
- package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +19 -19
- package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +30 -30
- package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +16 -16
- package/plugins/pbr/skills/build/SKILL.md +943 -962
- package/plugins/pbr/skills/config/SKILL.md +256 -241
- package/plugins/pbr/skills/continue/SKILL.md +164 -127
- package/plugins/pbr/skills/debug/SKILL.md +515 -489
- package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +16 -16
- package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +27 -27
- package/plugins/pbr/skills/discuss/SKILL.md +347 -338
- package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +61 -61
- package/plugins/pbr/skills/discuss/templates/decision-categories.md +9 -9
- package/plugins/pbr/skills/explore/SKILL.md +378 -362
- package/plugins/pbr/skills/health/SKILL.md +221 -186
- package/plugins/pbr/skills/health/templates/check-pattern.md.tmpl +30 -30
- package/plugins/pbr/skills/health/templates/output-format.md.tmpl +63 -63
- package/plugins/pbr/skills/help/SKILL.md +155 -140
- package/plugins/pbr/skills/import/SKILL.md +504 -490
- package/plugins/pbr/skills/milestone/SKILL.md +704 -673
- package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +48 -48
- package/plugins/pbr/skills/milestone/templates/stats-file.md.tmpl +30 -30
- package/plugins/pbr/skills/note/SKILL.md +231 -212
- package/plugins/pbr/skills/pause/SKILL.md +249 -235
- package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +71 -71
- package/plugins/pbr/skills/plan/SKILL.md +685 -628
- package/plugins/pbr/skills/plan/decimal-phase-calc.md +98 -98
- package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +21 -21
- package/plugins/pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +32 -32
- package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +38 -38
- package/plugins/pbr/skills/plan/templates/researcher-prompt.md.tmpl +19 -19
- package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +23 -23
- package/plugins/pbr/skills/quick/SKILL.md +354 -335
- package/plugins/pbr/skills/resume/SKILL.md +402 -388
- package/plugins/pbr/skills/review/SKILL.md +686 -652
- package/plugins/pbr/skills/review/templates/debugger-prompt.md.tmpl +60 -60
- package/plugins/pbr/skills/review/templates/gap-planner-prompt.md.tmpl +40 -40
- package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +115 -115
- package/plugins/pbr/skills/scan/SKILL.md +304 -269
- package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +201 -201
- package/plugins/pbr/skills/setup/SKILL.md +253 -227
- package/plugins/pbr/skills/shared/commit-planning-docs.md +35 -35
- package/plugins/pbr/skills/shared/config-loading.md +102 -102
- package/plugins/pbr/skills/shared/context-budget.md +40 -40
- package/plugins/pbr/skills/shared/context-loader-task.md +86 -86
- package/plugins/pbr/skills/shared/digest-select.md +79 -79
- package/plugins/pbr/skills/shared/domain-probes.md +125 -125
- package/plugins/pbr/skills/shared/error-reporting.md +79 -79
- package/plugins/pbr/skills/shared/gate-prompts.md +388 -388
- package/plugins/pbr/skills/shared/phase-argument-parsing.md +45 -45
- package/plugins/pbr/skills/shared/progress-display.md +53 -53
- package/plugins/pbr/skills/shared/revision-loop.md +81 -81
- package/plugins/pbr/skills/shared/state-loading.md +62 -62
- package/plugins/pbr/skills/shared/state-update.md +161 -161
- package/plugins/pbr/skills/shared/universal-anti-patterns.md +33 -33
- package/plugins/pbr/skills/status/SKILL.md +367 -353
- package/plugins/pbr/skills/todo/SKILL.md +198 -181
- package/plugins/pbr/templates/CONTEXT.md.tmpl +52 -52
- package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +151 -151
- package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +97 -97
- package/plugins/pbr/templates/ROADMAP.md.tmpl +40 -40
- package/plugins/pbr/templates/SUMMARY.md.tmpl +81 -81
- package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +116 -116
- package/plugins/pbr/templates/codebase/ARCHITECTURE.md.tmpl +98 -98
- package/plugins/pbr/templates/codebase/CONCERNS.md.tmpl +93 -93
- package/plugins/pbr/templates/codebase/CONVENTIONS.md.tmpl +104 -104
- package/plugins/pbr/templates/codebase/INTEGRATIONS.md.tmpl +78 -78
- package/plugins/pbr/templates/codebase/STACK.md.tmpl +78 -78
- package/plugins/pbr/templates/codebase/STRUCTURE.md.tmpl +80 -80
- package/plugins/pbr/templates/codebase/TESTING.md.tmpl +107 -107
- package/plugins/pbr/templates/continue-here.md.tmpl +73 -73
- package/plugins/pbr/templates/prompt-partials/phase-project-context.md.tmpl +37 -37
- package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +124 -124
- package/plugins/pbr/templates/research/STACK.md.tmpl +71 -71
- package/plugins/pbr/templates/research/SUMMARY.md.tmpl +112 -112
- package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +81 -81
- package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +99 -99
- package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +36 -36
|
@@ -1,56 +1,86 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* PreToolUse dispatcher for Bash hooks.
|
|
5
|
-
*
|
|
6
|
-
* Consolidates check-dangerous-commands.js and validate-commit.js
|
|
7
|
-
* into a single process, reading stdin once and routing to both
|
|
8
|
-
* checks sequentially. This halves the process spawns per Bash call.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* PreToolUse dispatcher for Bash hooks.
|
|
5
|
+
*
|
|
6
|
+
* Consolidates check-dangerous-commands.js and validate-commit.js
|
|
7
|
+
* into a single process, reading stdin once and routing to both
|
|
8
|
+
* checks sequentially. This halves the process spawns per Bash call.
|
|
9
|
+
*
|
|
10
|
+
* ── Dispatch Order & Rationale ──────────────────────────────────
|
|
11
|
+
*
|
|
12
|
+
* 1. check-dangerous-commands — Blocks destructive shell operations
|
|
13
|
+
* (rm -rf, git push --force, etc.). Runs first because safety
|
|
14
|
+
* takes priority: if a command is dangerous, we must reject it
|
|
15
|
+
* before even considering whether its commit message is valid.
|
|
16
|
+
* Can block (exit 2).
|
|
17
|
+
*
|
|
18
|
+
* 2. validate-commit — Enforces conventional commit format
|
|
19
|
+
* ({type}({scope}): {desc}) on git commit commands. Runs second
|
|
20
|
+
* because commit format validation is only relevant for git
|
|
21
|
+
* commit operations, a narrow subset of all Bash calls. There's
|
|
22
|
+
* no benefit to checking format if the command was already
|
|
23
|
+
* blocked as dangerous. Can block (exit 2).
|
|
24
|
+
*
|
|
25
|
+
* ── Short-Circuit Behavior ──────────────────────────────────────
|
|
26
|
+
*
|
|
27
|
+
* If an earlier check returns a result (blocking with exit 2),
|
|
28
|
+
* later checks are skipped entirely. The first failure is the
|
|
29
|
+
* most relevant — a dangerous command should be blocked regardless
|
|
30
|
+
* of whether it also has a valid commit message.
|
|
31
|
+
*
|
|
32
|
+
* ── Adding New Checks ───────────────────────────────────────────
|
|
33
|
+
*
|
|
34
|
+
* 1. Create a new check module exporting a function that takes
|
|
35
|
+
* the parsed hook data and returns null (pass) or
|
|
36
|
+
* { output: {...}, exitCode: N }.
|
|
37
|
+
* 2. require() it at the top of this file.
|
|
38
|
+
* 3. Add the call in sequence below, following the pattern:
|
|
39
|
+
* const result = checkFoo(data);
|
|
40
|
+
* if (result) { log; write output; exit with code; }
|
|
41
|
+
* 4. Position the check based on severity: safety-critical checks
|
|
42
|
+
* should run earlier; format/style checks should run later.
|
|
43
|
+
*
|
|
44
|
+
* Exit codes:
|
|
45
|
+
* 0 = allowed or warning only
|
|
46
|
+
* 2 = blocked (dangerous command or invalid commit format)
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
const { logHook } = require('./hook-logger');
|
|
50
|
+
const { checkDangerous } = require('./check-dangerous-commands');
|
|
51
|
+
const { checkCommit } = require('./validate-commit');
|
|
52
|
+
|
|
53
|
+
function main() {
|
|
54
|
+
let input = '';
|
|
55
|
+
|
|
56
|
+
process.stdin.setEncoding('utf8');
|
|
57
|
+
process.stdin.on('data', (chunk) => { input += chunk; });
|
|
58
|
+
process.stdin.on('end', () => {
|
|
59
|
+
try {
|
|
60
|
+
const data = JSON.parse(input);
|
|
61
|
+
|
|
62
|
+
// Dangerous commands check first — can block
|
|
63
|
+
const dangerousResult = checkDangerous(data);
|
|
64
|
+
if (dangerousResult) {
|
|
65
|
+
logHook('pre-bash-dispatch', 'PreToolUse', 'dispatched', { handler: 'check-dangerous-commands' });
|
|
66
|
+
process.stdout.write(JSON.stringify(dangerousResult.output));
|
|
67
|
+
process.exit(dangerousResult.exitCode);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Commit validation check — can block
|
|
71
|
+
const commitResult = checkCommit(data);
|
|
72
|
+
if (commitResult) {
|
|
73
|
+
logHook('pre-bash-dispatch', 'PreToolUse', 'dispatched', { handler: 'validate-commit' });
|
|
74
|
+
process.stdout.write(JSON.stringify(commitResult.output));
|
|
75
|
+
process.exit(commitResult.exitCode);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
process.exit(0);
|
|
79
|
+
} catch (_e) {
|
|
80
|
+
// Don't block on errors
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (require.main === module) { main(); }
|
|
@@ -1,62 +1,97 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* PreToolUse dispatcher for Write|Edit hooks.
|
|
5
|
-
*
|
|
6
|
-
* Consolidates check-skill-workflow.js, check-phase-boundary.js,
|
|
7
|
-
* and check-doc-sprawl.js into a single process, reading stdin once
|
|
8
|
-
* and running all checks sequentially.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* PreToolUse dispatcher for Write|Edit hooks.
|
|
5
|
+
*
|
|
6
|
+
* Consolidates check-skill-workflow.js, check-phase-boundary.js,
|
|
7
|
+
* and check-doc-sprawl.js into a single process, reading stdin once
|
|
8
|
+
* and running all checks sequentially.
|
|
9
|
+
*
|
|
10
|
+
* ── Dispatch Order & Rationale ──────────────────────────────────
|
|
11
|
+
*
|
|
12
|
+
* 1. check-skill-workflow — Enforces planning-phase rules (e.g. no
|
|
13
|
+
* code writes during the plan phase). Runs first because workflow
|
|
14
|
+
* violations are the most fundamental: if the write shouldn't
|
|
15
|
+
* happen at all in the current workflow state, there's no point
|
|
16
|
+
* evaluating boundary or sprawl rules. Can block (exit 2).
|
|
17
|
+
*
|
|
18
|
+
* 2. check-phase-boundary — Guards against writes that target files
|
|
19
|
+
* outside the current phase directory. Runs second because once
|
|
20
|
+
* we know the write is allowed by workflow rules, we need to
|
|
21
|
+
* verify it's scoped to the correct phase. Can block (exit 2)
|
|
22
|
+
* or warn (exit 0 with message).
|
|
23
|
+
*
|
|
24
|
+
* 3. check-doc-sprawl — Prevents creation of new .md/.txt files
|
|
25
|
+
* outside a known allowlist (when enabled in config). Runs last
|
|
26
|
+
* because it's the most granular check — only relevant for new
|
|
27
|
+
* documentation files, not all writes. Can block (exit 2).
|
|
28
|
+
*
|
|
29
|
+
* ── Short-Circuit Behavior ──────────────────────────────────────
|
|
30
|
+
*
|
|
31
|
+
* If an earlier check returns a result (blocking or warning with
|
|
32
|
+
* output), later checks are skipped entirely. For blocking results
|
|
33
|
+
* (exit 2), this means the write is rejected without evaluating
|
|
34
|
+
* remaining checks. This is intentional: the first failure is the
|
|
35
|
+
* most relevant, and running further checks would be wasteful.
|
|
36
|
+
*
|
|
37
|
+
* ── Adding New Checks ───────────────────────────────────────────
|
|
38
|
+
*
|
|
39
|
+
* 1. Create a new check module exporting a function that takes
|
|
40
|
+
* the parsed hook data and returns null (pass) or
|
|
41
|
+
* { output: {...}, exitCode: N }.
|
|
42
|
+
* 2. require() it at the top of this file.
|
|
43
|
+
* 3. Add the call in sequence below, following the pattern:
|
|
44
|
+
* const result = checkFoo(data);
|
|
45
|
+
* if (result) { write output; exit with code; }
|
|
46
|
+
* 4. Position the check based on severity: more fundamental /
|
|
47
|
+
* broader checks should run earlier; narrow / granular checks
|
|
48
|
+
* should run later.
|
|
49
|
+
*
|
|
50
|
+
* Exit codes:
|
|
51
|
+
* 0 = allowed or warning only
|
|
52
|
+
* 2 = blocked (workflow violation or phase boundary enforcement)
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
const { checkWorkflow } = require('./check-skill-workflow');
|
|
56
|
+
const { checkBoundary } = require('./check-phase-boundary');
|
|
57
|
+
const { checkDocSprawl } = require('./check-doc-sprawl');
|
|
58
|
+
|
|
59
|
+
function main() {
|
|
60
|
+
let input = '';
|
|
61
|
+
|
|
62
|
+
process.stdin.setEncoding('utf8');
|
|
63
|
+
process.stdin.on('data', (chunk) => { input += chunk; });
|
|
64
|
+
process.stdin.on('end', () => {
|
|
65
|
+
try {
|
|
66
|
+
const data = JSON.parse(input);
|
|
67
|
+
|
|
68
|
+
// Skill workflow check first — can block
|
|
69
|
+
const workflowResult = checkWorkflow(data);
|
|
70
|
+
if (workflowResult) {
|
|
71
|
+
process.stdout.write(JSON.stringify(workflowResult.output));
|
|
72
|
+
process.exit(workflowResult.exitCode || 0);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Phase boundary check — can block or warn
|
|
76
|
+
const boundaryResult = checkBoundary(data);
|
|
77
|
+
if (boundaryResult) {
|
|
78
|
+
process.stdout.write(JSON.stringify(boundaryResult.output));
|
|
79
|
+
process.exit(boundaryResult.exitCode || 0);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Doc sprawl check — blocks new .md/.txt outside allowlist
|
|
83
|
+
const sprawlResult = checkDocSprawl(data);
|
|
84
|
+
if (sprawlResult) {
|
|
85
|
+
process.stdout.write(JSON.stringify(sprawlResult.output));
|
|
86
|
+
process.exit(sprawlResult.exitCode || 0);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
process.exit(0);
|
|
90
|
+
} catch (_e) {
|
|
91
|
+
// Don't block on errors
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (require.main === module) { main(); }
|