@opengsd/gsd-core 1.5.0-rc.2 → 1.5.0-rc.4
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/agents/gsd-advisor-researcher.md +1 -1
- package/agents/gsd-assumptions-analyzer.md +1 -1
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-code-reviewer.md +1 -1
- package/agents/gsd-codebase-mapper.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-doc-writer.md +1 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +1 -1
- package/agents/gsd-integration-checker.md +1 -1
- package/agents/gsd-mempalace-curator.md +47 -0
- package/agents/gsd-nyquist-auditor.md +1 -0
- package/agents/gsd-phase-researcher.md +1 -1
- package/agents/gsd-plan-checker.md +1 -1
- package/agents/gsd-planner.md +1 -1
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +1 -1
- package/agents/gsd-roadmapper.md +55 -2
- package/agents/gsd-security-auditor.md +1 -0
- package/agents/gsd-ui-auditor.md +1 -1
- package/agents/gsd-ui-checker.md +1 -1
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-verifier.md +13 -2
- package/bin/install.js +61 -64
- package/commands/gsd/mempalace-capture.md +71 -0
- package/commands/gsd/mempalace-recall.md +102 -0
- package/commands/gsd/ns-context.md +4 -2
- package/commands/gsd/progress.md +2 -1
- package/gemini-extension.json +1 -1
- package/gsd-core/bin/gsd-tools.cjs +277 -95
- package/gsd-core/bin/lib/active-workstream-store.cjs +6 -0
- package/gsd-core/bin/lib/capability-activation.cjs +86 -0
- package/gsd-core/bin/lib/capability-registry.cjs +1468 -11
- package/gsd-core/bin/lib/capability-state.cjs +128 -21
- package/gsd-core/bin/lib/capability-writer.cjs +354 -0
- package/gsd-core/bin/lib/check-command-router.cjs +328 -1
- package/gsd-core/bin/lib/clusters.cjs +2 -0
- package/gsd-core/bin/lib/command-roster.cjs +19 -0
- package/gsd-core/bin/lib/commands.cjs +33 -10
- package/gsd-core/bin/lib/config-loader.cjs +7 -8
- package/gsd-core/bin/lib/config-schema.cjs +32 -3
- package/gsd-core/bin/lib/config.cjs +81 -26
- package/gsd-core/bin/lib/core.cjs +5 -2
- package/gsd-core/bin/lib/edge-probe.cjs +25 -2
- package/gsd-core/bin/lib/frontmatter.cjs +53 -1
- package/gsd-core/bin/lib/git-base-branch.cjs +194 -0
- package/gsd-core/bin/lib/init.cjs +36 -11
- package/gsd-core/bin/lib/install-profiles.cjs +57 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
- package/gsd-core/bin/lib/loop-resolver.cjs +157 -16
- package/gsd-core/bin/lib/model-resolver.cjs +47 -5
- package/gsd-core/bin/lib/phase.cjs +99 -23
- package/gsd-core/bin/lib/plan-drift-guard.cjs +117 -0
- package/gsd-core/bin/lib/probe-core.cjs +117 -1
- package/gsd-core/bin/lib/profile-output.cjs +45 -4
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +138 -0
- package/gsd-core/bin/lib/roadmap-parser.cjs +13 -3
- package/gsd-core/bin/lib/roadmap.cjs +97 -7
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +1946 -0
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +54 -30
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +27 -19
- package/gsd-core/bin/lib/runtime-homes.cjs +26 -20
- package/gsd-core/bin/lib/state-command-router.cjs +15 -3
- package/gsd-core/bin/lib/state-document.cjs +46 -1
- package/gsd-core/bin/lib/state.cjs +461 -94
- package/gsd-core/bin/lib/verify.cjs +92 -8
- package/gsd-core/bin/lib/worktree-safety.cjs +2 -1
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -2
- package/gsd-core/bin/shared/config-schema.manifest.json +0 -18
- package/gsd-core/bin/shared/model-catalog.json +1 -0
- package/gsd-core/references/edge-probe.md +11 -0
- package/gsd-core/references/loop-hook-dispatch.md +61 -0
- package/gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json +14 -0
- package/gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json +4 -0
- package/gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json +32 -0
- package/gsd-core/references/prohibition-probe.md +248 -0
- package/gsd-core/templates/config.json +1 -1
- package/gsd-core/templates/spec.md +14 -0
- package/gsd-core/workflows/audit-milestone.md +5 -3
- package/gsd-core/workflows/autonomous.md +10 -5
- package/gsd-core/workflows/code-review-fix.md +9 -7
- package/gsd-core/workflows/code-review.md +8 -6
- package/gsd-core/workflows/complete-milestone.md +1 -5
- package/gsd-core/workflows/discuss-phase.md +14 -0
- package/gsd-core/workflows/execute-phase.md +86 -146
- package/gsd-core/workflows/execute-plan.md +21 -6
- package/gsd-core/workflows/help/modes/full.md +7 -1
- package/gsd-core/workflows/new-project.md +3 -3
- package/gsd-core/workflows/next.md +50 -2
- package/gsd-core/workflows/pause-work.md +7 -1
- package/gsd-core/workflows/plan-phase.md +91 -221
- package/gsd-core/workflows/plan-review-convergence.md +14 -4
- package/gsd-core/workflows/pr-branch.md +4 -2
- package/gsd-core/workflows/profile-user.md +3 -1
- package/gsd-core/workflows/progress.md +58 -1
- package/gsd-core/workflows/quick.md +12 -8
- package/gsd-core/workflows/resume-project.md +17 -1
- package/gsd-core/workflows/review.md +19 -2
- package/gsd-core/workflows/secure-phase.md +4 -2
- package/gsd-core/workflows/settings-advanced.md +2 -0
- package/gsd-core/workflows/settings.md +27 -1
- package/gsd-core/workflows/ship.md +58 -5
- package/gsd-core/workflows/spec-phase.md +75 -0
- package/gsd-core/workflows/validate-phase.md +4 -2
- package/gsd-core/workflows/verify-phase.md +14 -4
- package/gsd-core/workflows/verify-work.md +27 -11
- package/hooks/dist/gsd-ensure-canonical-path.js +305 -0
- package/hooks/dist/gsd-statusline.js +1 -1
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-ensure-canonical-path.js +305 -0
- package/hooks/gsd-statusline.js +1 -1
- package/hooks/hooks.json +1 -0
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +5 -4
- package/scripts/affected-tests-lib.cjs +16 -4
- package/scripts/build-hooks.js +7 -0
- package/scripts/changeset/new.cjs +17 -3
- package/scripts/fix-slash-commands.cjs +15 -3
- package/scripts/gen-capability-registry.cjs +373 -49
- package/scripts/gen-inventory-manifest.cjs +1 -4
- package/scripts/gen-loop-host-contract.cjs +55 -0
- package/scripts/issue-version-gate.cjs +140 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +327 -0
- package/scripts/lint-allow-test-rule-refs.cjs +162 -0
- package/scripts/lint-test-file-count.allowlist.json +14 -0
- package/scripts/mutation-matrix.cjs +108 -7
- package/scripts/pr-target-policy.cjs +63 -0
- package/scripts/release-tarball-smoke.cjs +7 -1
- package/scripts/research-profiles.cjs +5 -5
- package/scripts/run-tests.cjs +178 -17
|
@@ -7,6 +7,55 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
const capabilities = {
|
|
10
|
+
"ai-integration": {
|
|
11
|
+
"id": "ai-integration",
|
|
12
|
+
"role": "feature",
|
|
13
|
+
"title": "AI design contract",
|
|
14
|
+
"description": "AI-SPEC design contract workflow for phases that build AI systems; owns the AI integration command, agents, and workflow.ai_integration_phase activation key.",
|
|
15
|
+
"tier": "full",
|
|
16
|
+
"requires": [],
|
|
17
|
+
"runtimeCompat": {
|
|
18
|
+
"supported": [
|
|
19
|
+
"*"
|
|
20
|
+
],
|
|
21
|
+
"unsupported": []
|
|
22
|
+
},
|
|
23
|
+
"skills": [
|
|
24
|
+
"ai-integration-phase"
|
|
25
|
+
],
|
|
26
|
+
"agents": [
|
|
27
|
+
"gsd-framework-selector",
|
|
28
|
+
"gsd-ai-researcher",
|
|
29
|
+
"gsd-domain-researcher",
|
|
30
|
+
"gsd-eval-planner"
|
|
31
|
+
],
|
|
32
|
+
"hooks": [],
|
|
33
|
+
"config": {
|
|
34
|
+
"workflow.ai_integration_phase": {
|
|
35
|
+
"type": "boolean",
|
|
36
|
+
"default": true,
|
|
37
|
+
"description": "Prompt for an AI-SPEC design contract before planning phases that involve AI systems."
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"steps": [
|
|
41
|
+
{
|
|
42
|
+
"point": "plan:pre",
|
|
43
|
+
"ref": {
|
|
44
|
+
"skill": "ai-integration-phase"
|
|
45
|
+
},
|
|
46
|
+
"produces": [
|
|
47
|
+
"AI-SPEC.md"
|
|
48
|
+
],
|
|
49
|
+
"consumes": [
|
|
50
|
+
"CONTEXT.md"
|
|
51
|
+
],
|
|
52
|
+
"when": "workflow.ai_integration_phase",
|
|
53
|
+
"onError": "skip"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"contributions": [],
|
|
57
|
+
"gates": []
|
|
58
|
+
},
|
|
10
59
|
"antigravity": {
|
|
11
60
|
"id": "antigravity",
|
|
12
61
|
"role": "runtime",
|
|
@@ -69,6 +118,12 @@ const capabilities = {
|
|
|
69
118
|
"description": "Open-artifact audit and UAT-gap audit for milestone close gates; exposes `gsd-tools audit-uat` (cross-phase UAT outstanding items) and `gsd-tools audit-open` (structured open-artifact scan across debug, tasks, threads, todos, seeds, UAT, verification, context-questions).",
|
|
70
119
|
"tier": "full",
|
|
71
120
|
"requires": [],
|
|
121
|
+
"runtimeCompat": {
|
|
122
|
+
"supported": [
|
|
123
|
+
"*"
|
|
124
|
+
],
|
|
125
|
+
"unsupported": []
|
|
126
|
+
},
|
|
72
127
|
"skills": [],
|
|
73
128
|
"agents": [],
|
|
74
129
|
"config": {},
|
|
@@ -255,6 +310,63 @@ const capabilities = {
|
|
|
255
310
|
"extendedHookEvents": []
|
|
256
311
|
}
|
|
257
312
|
},
|
|
313
|
+
"code-review": {
|
|
314
|
+
"id": "code-review",
|
|
315
|
+
"role": "feature",
|
|
316
|
+
"title": "Code review",
|
|
317
|
+
"description": "Source-file code review and review-fix workflow support for completed execution work.",
|
|
318
|
+
"tier": "full",
|
|
319
|
+
"requires": [],
|
|
320
|
+
"runtimeCompat": {
|
|
321
|
+
"supported": [
|
|
322
|
+
"*"
|
|
323
|
+
],
|
|
324
|
+
"unsupported": []
|
|
325
|
+
},
|
|
326
|
+
"skills": [
|
|
327
|
+
"code-review"
|
|
328
|
+
],
|
|
329
|
+
"agents": [
|
|
330
|
+
"gsd-code-reviewer",
|
|
331
|
+
"gsd-code-fixer"
|
|
332
|
+
],
|
|
333
|
+
"hooks": [],
|
|
334
|
+
"config": {
|
|
335
|
+
"workflow.code_review": {
|
|
336
|
+
"type": "boolean",
|
|
337
|
+
"default": true,
|
|
338
|
+
"description": "Enable code-review participation in post-execution review flows."
|
|
339
|
+
},
|
|
340
|
+
"workflow.code_review_depth": {
|
|
341
|
+
"type": "enum",
|
|
342
|
+
"values": [
|
|
343
|
+
"quick",
|
|
344
|
+
"standard",
|
|
345
|
+
"deep"
|
|
346
|
+
],
|
|
347
|
+
"default": "standard",
|
|
348
|
+
"description": "Default depth for code review when no --depth override is supplied."
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
"steps": [
|
|
352
|
+
{
|
|
353
|
+
"point": "execute:post",
|
|
354
|
+
"ref": {
|
|
355
|
+
"skill": "code-review"
|
|
356
|
+
},
|
|
357
|
+
"produces": [
|
|
358
|
+
"REVIEW.md"
|
|
359
|
+
],
|
|
360
|
+
"consumes": [
|
|
361
|
+
"SUMMARY.md"
|
|
362
|
+
],
|
|
363
|
+
"when": "workflow.code_review",
|
|
364
|
+
"onError": "skip"
|
|
365
|
+
}
|
|
366
|
+
],
|
|
367
|
+
"contributions": [],
|
|
368
|
+
"gates": []
|
|
369
|
+
},
|
|
258
370
|
"codebuddy": {
|
|
259
371
|
"id": "codebuddy",
|
|
260
372
|
"role": "runtime",
|
|
@@ -483,6 +595,103 @@ const capabilities = {
|
|
|
483
595
|
"extendedHookEvents": []
|
|
484
596
|
}
|
|
485
597
|
},
|
|
598
|
+
"drift": {
|
|
599
|
+
"id": "drift",
|
|
600
|
+
"role": "feature",
|
|
601
|
+
"title": "Drift detection gates",
|
|
602
|
+
"description": "Post-execution drift detection gates that run after each wave completes. Provides two gates at execute:wave:post: a blocking schema drift gate (detects schema files changed without a database push) and a non-blocking codebase drift gate (detects structural additions not reflected in STRUCTURE.md).",
|
|
603
|
+
"tier": "full",
|
|
604
|
+
"requires": [],
|
|
605
|
+
"runtimeCompat": {
|
|
606
|
+
"supported": [
|
|
607
|
+
"*"
|
|
608
|
+
],
|
|
609
|
+
"unsupported": []
|
|
610
|
+
},
|
|
611
|
+
"skills": [],
|
|
612
|
+
"agents": [],
|
|
613
|
+
"hooks": [],
|
|
614
|
+
"config": {
|
|
615
|
+
"workflow.drift_threshold": {
|
|
616
|
+
"type": "number",
|
|
617
|
+
"default": 3,
|
|
618
|
+
"description": "Minimum number of new structural elements (directories, barrel exports, migrations, routes) before the codebase drift gate triggers a warn or auto-remap action."
|
|
619
|
+
},
|
|
620
|
+
"workflow.drift_action": {
|
|
621
|
+
"type": "enum",
|
|
622
|
+
"values": [
|
|
623
|
+
"warn",
|
|
624
|
+
"auto-remap"
|
|
625
|
+
],
|
|
626
|
+
"default": "warn",
|
|
627
|
+
"description": "Action taken by the codebase drift gate when the threshold is exceeded: warn (advisory message) or auto-remap (spawn gsd-codebase-mapper agent to refresh STRUCTURE.md)."
|
|
628
|
+
},
|
|
629
|
+
"workflow.schema_drift_gate": {
|
|
630
|
+
"type": "boolean",
|
|
631
|
+
"default": true,
|
|
632
|
+
"description": "Enable the drift gates at execute:wave:post. When enabled, the schema drift gate blocks verification if schema-relevant files changed during execution but no database push command was executed; the codebase drift gate (non-blocking) warns when structural additions exceed the drift_threshold."
|
|
633
|
+
}
|
|
634
|
+
},
|
|
635
|
+
"steps": [],
|
|
636
|
+
"contributions": [],
|
|
637
|
+
"gates": [
|
|
638
|
+
{
|
|
639
|
+
"point": "execute:wave:post",
|
|
640
|
+
"check": {
|
|
641
|
+
"query": "verify.schema-drift"
|
|
642
|
+
},
|
|
643
|
+
"when": "workflow.schema_drift_gate",
|
|
644
|
+
"blocking": true,
|
|
645
|
+
"onError": "skip"
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
"point": "execute:wave:post",
|
|
649
|
+
"check": {
|
|
650
|
+
"query": "verify.codebase-drift"
|
|
651
|
+
},
|
|
652
|
+
"when": "workflow.schema_drift_gate",
|
|
653
|
+
"blocking": false,
|
|
654
|
+
"onError": "skip"
|
|
655
|
+
}
|
|
656
|
+
]
|
|
657
|
+
},
|
|
658
|
+
"gap-analysis": {
|
|
659
|
+
"id": "gap-analysis",
|
|
660
|
+
"role": "feature",
|
|
661
|
+
"title": "Post-planning gap analysis",
|
|
662
|
+
"description": "Proactive, non-blocking post-planning coverage report. After all PLAN.md files are generated, cross-references every REQ-ID and D-ID from REQUIREMENTS.md and CONTEXT.md against plan bodies. Emits a Source | Item | Status table. Does not block phase advancement.",
|
|
663
|
+
"tier": "standard",
|
|
664
|
+
"requires": [],
|
|
665
|
+
"runtimeCompat": {
|
|
666
|
+
"supported": [
|
|
667
|
+
"*"
|
|
668
|
+
],
|
|
669
|
+
"unsupported": []
|
|
670
|
+
},
|
|
671
|
+
"skills": [],
|
|
672
|
+
"agents": [],
|
|
673
|
+
"hooks": [],
|
|
674
|
+
"config": {
|
|
675
|
+
"workflow.post_planning_gaps": {
|
|
676
|
+
"type": "boolean",
|
|
677
|
+
"default": true,
|
|
678
|
+
"description": "Run the post-planning gap analysis report after plans are generated."
|
|
679
|
+
}
|
|
680
|
+
},
|
|
681
|
+
"steps": [],
|
|
682
|
+
"contributions": [],
|
|
683
|
+
"gates": [
|
|
684
|
+
{
|
|
685
|
+
"point": "plan:post",
|
|
686
|
+
"check": {
|
|
687
|
+
"query": "gap-analysis.plan-post"
|
|
688
|
+
},
|
|
689
|
+
"when": "workflow.post_planning_gaps",
|
|
690
|
+
"blocking": false,
|
|
691
|
+
"onError": "skip"
|
|
692
|
+
}
|
|
693
|
+
]
|
|
694
|
+
},
|
|
486
695
|
"gemini": {
|
|
487
696
|
"id": "gemini",
|
|
488
697
|
"role": "runtime",
|
|
@@ -543,6 +752,12 @@ const capabilities = {
|
|
|
543
752
|
"description": "Build, query, and inspect the project knowledge graph in `.planning/graphs/`; exposes graphify CLI subcommands (build, query, status, diff) and the /gsd-graphify skill.",
|
|
544
753
|
"tier": "full",
|
|
545
754
|
"requires": [],
|
|
755
|
+
"runtimeCompat": {
|
|
756
|
+
"supported": [
|
|
757
|
+
"*"
|
|
758
|
+
],
|
|
759
|
+
"unsupported": []
|
|
760
|
+
},
|
|
546
761
|
"skills": [
|
|
547
762
|
"graphify"
|
|
548
763
|
],
|
|
@@ -622,6 +837,12 @@ const capabilities = {
|
|
|
622
837
|
"description": "Code-intelligence store for codebase querying, diff, snapshot, and API-surface extraction; exposes `gsd-tools intel` subcommands (query, status, update, diff, snapshot, patch-meta, validate, extract-exports, api-surface) and backs `/gsd-map-codebase` and `gsd-intel-updater`.",
|
|
623
838
|
"tier": "full",
|
|
624
839
|
"requires": [],
|
|
840
|
+
"runtimeCompat": {
|
|
841
|
+
"supported": [
|
|
842
|
+
"*"
|
|
843
|
+
],
|
|
844
|
+
"unsupported": []
|
|
845
|
+
},
|
|
625
846
|
"skills": [],
|
|
626
847
|
"agents": [],
|
|
627
848
|
"config": {
|
|
@@ -639,7 +860,20 @@ const capabilities = {
|
|
|
639
860
|
}
|
|
640
861
|
],
|
|
641
862
|
"hooks": [],
|
|
642
|
-
"steps": [
|
|
863
|
+
"steps": [
|
|
864
|
+
{
|
|
865
|
+
"point": "plan:pre",
|
|
866
|
+
"ref": {
|
|
867
|
+
"command": "intel api-surface"
|
|
868
|
+
},
|
|
869
|
+
"produces": [
|
|
870
|
+
".planning/intel/API-SURFACE.md"
|
|
871
|
+
],
|
|
872
|
+
"consumes": [],
|
|
873
|
+
"when": "intel.enabled",
|
|
874
|
+
"onError": "skip"
|
|
875
|
+
}
|
|
876
|
+
],
|
|
643
877
|
"contributions": [],
|
|
644
878
|
"gates": []
|
|
645
879
|
},
|
|
@@ -766,6 +1000,222 @@ const capabilities = {
|
|
|
766
1000
|
"extendedHookEvents": []
|
|
767
1001
|
}
|
|
768
1002
|
},
|
|
1003
|
+
"mempalace": {
|
|
1004
|
+
"id": "mempalace",
|
|
1005
|
+
"role": "feature",
|
|
1006
|
+
"title": "MemPalace memory",
|
|
1007
|
+
"description": "Cross-session, cross-project memory: deliberate recall before discuss/plan and verbatim capture + temporal-KG sync at phase boundaries, via the MemPalace MCP server and CLI.",
|
|
1008
|
+
"tier": "full",
|
|
1009
|
+
"requires": [],
|
|
1010
|
+
"runtimeCompat": {
|
|
1011
|
+
"supported": [
|
|
1012
|
+
"*"
|
|
1013
|
+
],
|
|
1014
|
+
"unsupported": []
|
|
1015
|
+
},
|
|
1016
|
+
"skills": [
|
|
1017
|
+
"mempalace-recall",
|
|
1018
|
+
"mempalace-capture"
|
|
1019
|
+
],
|
|
1020
|
+
"agents": [
|
|
1021
|
+
"gsd-mempalace-curator"
|
|
1022
|
+
],
|
|
1023
|
+
"hooks": [],
|
|
1024
|
+
"config": {
|
|
1025
|
+
"mempalace.enabled": {
|
|
1026
|
+
"type": "boolean",
|
|
1027
|
+
"default": false,
|
|
1028
|
+
"description": "Master toggle for the MemPalace memory capability."
|
|
1029
|
+
},
|
|
1030
|
+
"mempalace.memory_mode": {
|
|
1031
|
+
"type": "enum",
|
|
1032
|
+
"values": [
|
|
1033
|
+
"augment",
|
|
1034
|
+
"kg_backend",
|
|
1035
|
+
"replace"
|
|
1036
|
+
],
|
|
1037
|
+
"default": "augment",
|
|
1038
|
+
"description": "How MemPalace relates to GSD native memory. Only 'augment' (additive) is implemented today; 'kg_backend' and 'replace' are forward-declared (routing seam not yet built) and currently behave as 'augment'."
|
|
1039
|
+
},
|
|
1040
|
+
"mempalace.wing": {
|
|
1041
|
+
"type": "string",
|
|
1042
|
+
"default": "",
|
|
1043
|
+
"description": "Palace wing name; empty derives from project_code / project dir."
|
|
1044
|
+
},
|
|
1045
|
+
"mempalace.recall_on_discuss": {
|
|
1046
|
+
"type": "boolean",
|
|
1047
|
+
"default": true,
|
|
1048
|
+
"description": "Inject wake-up + search recall at discuss:pre."
|
|
1049
|
+
},
|
|
1050
|
+
"mempalace.recall_on_plan": {
|
|
1051
|
+
"type": "boolean",
|
|
1052
|
+
"default": true,
|
|
1053
|
+
"description": "Produce MEMORY-RECALL.md at plan:pre."
|
|
1054
|
+
},
|
|
1055
|
+
"mempalace.capture_artifacts": {
|
|
1056
|
+
"type": "boolean",
|
|
1057
|
+
"default": true,
|
|
1058
|
+
"description": "File CONTEXT/PLAN/SUMMARY and learnings into the palace at phase boundaries."
|
|
1059
|
+
},
|
|
1060
|
+
"mempalace.mirror_kg": {
|
|
1061
|
+
"type": "boolean",
|
|
1062
|
+
"default": true,
|
|
1063
|
+
"description": "Mirror decisions/learnings into MemPalace's temporal knowledge graph."
|
|
1064
|
+
},
|
|
1065
|
+
"mempalace.cross_project_tunnels": {
|
|
1066
|
+
"type": "boolean",
|
|
1067
|
+
"default": false,
|
|
1068
|
+
"description": "Propose/create cross-wing tunnels at ship:post."
|
|
1069
|
+
},
|
|
1070
|
+
"mempalace.diary_journal": {
|
|
1071
|
+
"type": "boolean",
|
|
1072
|
+
"default": true,
|
|
1073
|
+
"description": "Write a per-agent diary entry at ship:post."
|
|
1074
|
+
},
|
|
1075
|
+
"mempalace.auto_capture_hooks": {
|
|
1076
|
+
"type": "boolean",
|
|
1077
|
+
"default": false,
|
|
1078
|
+
"description": "Reserved / not yet implemented: will install MemPalace's native stop/precompact Claude Code hooks for passive mid-session capture (the capability's hooks array is currently empty)."
|
|
1079
|
+
}
|
|
1080
|
+
},
|
|
1081
|
+
"steps": [
|
|
1082
|
+
{
|
|
1083
|
+
"point": "discuss:post",
|
|
1084
|
+
"ref": {
|
|
1085
|
+
"skill": "mempalace-capture"
|
|
1086
|
+
},
|
|
1087
|
+
"produces": [],
|
|
1088
|
+
"consumes": [
|
|
1089
|
+
"CONTEXT.md"
|
|
1090
|
+
],
|
|
1091
|
+
"when": "mempalace.enabled",
|
|
1092
|
+
"onError": "skip"
|
|
1093
|
+
},
|
|
1094
|
+
{
|
|
1095
|
+
"point": "plan:pre",
|
|
1096
|
+
"ref": {
|
|
1097
|
+
"skill": "mempalace-recall"
|
|
1098
|
+
},
|
|
1099
|
+
"produces": [
|
|
1100
|
+
"MEMORY-RECALL.md"
|
|
1101
|
+
],
|
|
1102
|
+
"consumes": [
|
|
1103
|
+
"CONTEXT.md"
|
|
1104
|
+
],
|
|
1105
|
+
"when": "mempalace.enabled",
|
|
1106
|
+
"onError": "skip"
|
|
1107
|
+
},
|
|
1108
|
+
{
|
|
1109
|
+
"point": "plan:post",
|
|
1110
|
+
"ref": {
|
|
1111
|
+
"skill": "mempalace-capture"
|
|
1112
|
+
},
|
|
1113
|
+
"produces": [],
|
|
1114
|
+
"consumes": [
|
|
1115
|
+
"PLAN.md"
|
|
1116
|
+
],
|
|
1117
|
+
"when": "mempalace.enabled",
|
|
1118
|
+
"onError": "skip"
|
|
1119
|
+
},
|
|
1120
|
+
{
|
|
1121
|
+
"point": "verify:post",
|
|
1122
|
+
"ref": {
|
|
1123
|
+
"skill": "mempalace-capture"
|
|
1124
|
+
},
|
|
1125
|
+
"produces": [],
|
|
1126
|
+
"consumes": [
|
|
1127
|
+
"SUMMARY.md"
|
|
1128
|
+
],
|
|
1129
|
+
"when": "mempalace.enabled",
|
|
1130
|
+
"onError": "skip"
|
|
1131
|
+
},
|
|
1132
|
+
{
|
|
1133
|
+
"point": "ship:post",
|
|
1134
|
+
"ref": {
|
|
1135
|
+
"agent": "gsd-mempalace-curator"
|
|
1136
|
+
},
|
|
1137
|
+
"produces": [],
|
|
1138
|
+
"consumes": [
|
|
1139
|
+
"UAT.md"
|
|
1140
|
+
],
|
|
1141
|
+
"when": "mempalace.enabled",
|
|
1142
|
+
"onError": "skip"
|
|
1143
|
+
}
|
|
1144
|
+
],
|
|
1145
|
+
"contributions": [
|
|
1146
|
+
{
|
|
1147
|
+
"point": "discuss:pre",
|
|
1148
|
+
"into": "orchestrator",
|
|
1149
|
+
"fragment": {
|
|
1150
|
+
"path": "fragments/recall-discuss.md",
|
|
1151
|
+
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the discuss:pre orchestrator prompt when `mempalace.recall_on_discuss` is true.\n Contributes DATA (recall instructions), not control flow. onError: skip — never blocks discussion.\n-->\n### Memory recall (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.recall_on_discuss` is `false`, **skip this entire section** and continue the discussion unchanged. (This contribution is only injected when the capability is enabled; the `recall_on_discuss` check lets you turn discuss-time recall off without disabling the rest of the capability.)\n\nOtherwise — before gathering new context, surface what you already know. This is read-only and side-effect-free; if MemPalace is unreachable, note \"memory unavailable\" and continue — recall never blocks discussion.\n\n1. **Resolve the wing.** Use `mempalace.wing` if set; otherwise derive it from `project_code` (fall back to the project directory name).\n2. **Wake up (cheap, ~600–900 tokens).**\n - Interactive run → call `mempalace_search` after a wake-up read of the wing.\n - Headless/cron run (no MCP server) → run `mempalace wake-up --wing <wing>` via the CLI.\n3. **Targeted recall.** Search the palace for prior work on this phase's topic:\n - Interactive → `mempalace_search(query=<phase topic>, wing=<wing>)` and, when `mempalace.mirror_kg` is on, `mempalace_kg_query` / `mempalace_kg_timeline` for decision facts and their validity windows.\n - Headless → `mempalace search \"<phase topic>\" --wing <wing>`.\n4. **Mode awareness.** Only `augment` is currently wired: always treat the palace as an *additional* recall layer on top of GSD's native memory — never skip `.planning/graphs/` or STATE. `kg_backend`/`replace` are forward-declared and behave as `augment` today.\n5. **Surface, don't dump.** Fold the top relevant drawers, decisions, patterns, and *surprises* into the discussion as prior context — cite drawer/fact provenance. Do not paste raw search output.\n\nIf any MemPalace call errors or times out, skip the rest of recall and proceed with discussion as normal.\n"
|
|
1152
|
+
},
|
|
1153
|
+
"produces": [],
|
|
1154
|
+
"consumes": [],
|
|
1155
|
+
"when": "mempalace.enabled",
|
|
1156
|
+
"onError": "skip"
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
"point": "execute:wave:post",
|
|
1160
|
+
"into": "verifier",
|
|
1161
|
+
"fragment": {
|
|
1162
|
+
"path": "fragments/capture-problems.md",
|
|
1163
|
+
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: `mempalace mine` / `mempalace hook run`. Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness.** Only `augment` is currently wired: the fact is an *additive* mirror alongside `.planning/graphs/` (never a replacement). `kg_backend`/`replace` are forward-declared and behave as `augment` today.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
|
|
1164
|
+
},
|
|
1165
|
+
"produces": [],
|
|
1166
|
+
"consumes": [],
|
|
1167
|
+
"when": "mempalace.enabled",
|
|
1168
|
+
"onError": "skip"
|
|
1169
|
+
}
|
|
1170
|
+
],
|
|
1171
|
+
"gates": []
|
|
1172
|
+
},
|
|
1173
|
+
"nyquist": {
|
|
1174
|
+
"id": "nyquist",
|
|
1175
|
+
"role": "feature",
|
|
1176
|
+
"title": "Nyquist validation",
|
|
1177
|
+
"description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
|
|
1178
|
+
"tier": "full",
|
|
1179
|
+
"requires": [],
|
|
1180
|
+
"runtimeCompat": {
|
|
1181
|
+
"supported": [
|
|
1182
|
+
"*"
|
|
1183
|
+
],
|
|
1184
|
+
"unsupported": []
|
|
1185
|
+
},
|
|
1186
|
+
"skills": [
|
|
1187
|
+
"validate-phase"
|
|
1188
|
+
],
|
|
1189
|
+
"agents": [
|
|
1190
|
+
"gsd-nyquist-auditor"
|
|
1191
|
+
],
|
|
1192
|
+
"hooks": [],
|
|
1193
|
+
"config": {
|
|
1194
|
+
"workflow.nyquist_validation": {
|
|
1195
|
+
"type": "boolean",
|
|
1196
|
+
"default": true,
|
|
1197
|
+
"description": "Enable Nyquist validation coverage auditing."
|
|
1198
|
+
}
|
|
1199
|
+
},
|
|
1200
|
+
"steps": [
|
|
1201
|
+
{
|
|
1202
|
+
"point": "verify:post",
|
|
1203
|
+
"ref": {
|
|
1204
|
+
"skill": "validate-phase"
|
|
1205
|
+
},
|
|
1206
|
+
"produces": [
|
|
1207
|
+
"VALIDATION.md"
|
|
1208
|
+
],
|
|
1209
|
+
"consumes": [
|
|
1210
|
+
"SUMMARY.md"
|
|
1211
|
+
],
|
|
1212
|
+
"when": "workflow.nyquist_validation",
|
|
1213
|
+
"onError": "halt"
|
|
1214
|
+
}
|
|
1215
|
+
],
|
|
1216
|
+
"contributions": [],
|
|
1217
|
+
"gates": []
|
|
1218
|
+
},
|
|
769
1219
|
"opencode": {
|
|
770
1220
|
"id": "opencode",
|
|
771
1221
|
"role": "runtime",
|
|
@@ -832,6 +1282,129 @@ const capabilities = {
|
|
|
832
1282
|
"extendedHookEvents": []
|
|
833
1283
|
}
|
|
834
1284
|
},
|
|
1285
|
+
"pattern-mapper": {
|
|
1286
|
+
"id": "pattern-mapper",
|
|
1287
|
+
"role": "feature",
|
|
1288
|
+
"title": "Pattern mapping",
|
|
1289
|
+
"description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
|
|
1290
|
+
"tier": "full",
|
|
1291
|
+
"requires": [
|
|
1292
|
+
"research"
|
|
1293
|
+
],
|
|
1294
|
+
"runtimeCompat": {
|
|
1295
|
+
"supported": [
|
|
1296
|
+
"*"
|
|
1297
|
+
],
|
|
1298
|
+
"unsupported": []
|
|
1299
|
+
},
|
|
1300
|
+
"skills": [],
|
|
1301
|
+
"agents": [
|
|
1302
|
+
"gsd-pattern-mapper"
|
|
1303
|
+
],
|
|
1304
|
+
"hooks": [],
|
|
1305
|
+
"config": {
|
|
1306
|
+
"workflow.pattern_mapper": {
|
|
1307
|
+
"type": "boolean",
|
|
1308
|
+
"default": true,
|
|
1309
|
+
"description": "Run the pattern mapper before planning when context or research is available."
|
|
1310
|
+
}
|
|
1311
|
+
},
|
|
1312
|
+
"steps": [
|
|
1313
|
+
{
|
|
1314
|
+
"point": "plan:pre",
|
|
1315
|
+
"ref": {
|
|
1316
|
+
"agent": "gsd-pattern-mapper"
|
|
1317
|
+
},
|
|
1318
|
+
"fragment": {
|
|
1319
|
+
"path": "fragments/plan-pre.md",
|
|
1320
|
+
"inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {research_path} (Technical Research)\n</files_to_read>\n\n**Output file:** {phase_dir}/{padded_phase}-PATTERNS.md\n\nExtract the list of files to be created/modified from CONTEXT.md and RESEARCH.md. For each file, classify by role and data flow, find the closest existing analog in the codebase, extract concrete code excerpts, and produce PATTERNS.md.\n</pattern_mapping_context>\n"
|
|
1321
|
+
},
|
|
1322
|
+
"produces": [
|
|
1323
|
+
"PATTERNS.md"
|
|
1324
|
+
],
|
|
1325
|
+
"consumes": [
|
|
1326
|
+
"RESEARCH.md"
|
|
1327
|
+
],
|
|
1328
|
+
"when": "workflow.pattern_mapper",
|
|
1329
|
+
"onError": "skip"
|
|
1330
|
+
}
|
|
1331
|
+
],
|
|
1332
|
+
"contributions": [],
|
|
1333
|
+
"gates": []
|
|
1334
|
+
},
|
|
1335
|
+
"profile-pipeline": {
|
|
1336
|
+
"id": "profile-pipeline",
|
|
1337
|
+
"role": "feature",
|
|
1338
|
+
"title": "Developer profiling pipeline",
|
|
1339
|
+
"description": "Developer behavioral profiling from Claude Code session history; scans session JSONL files, extracts and samples user messages, and generates profile artifacts (USER-PROFILE.md, dev-preferences.md, CLAUDE.md sections). Exposes eight `gsd-tools` commands: scan-sessions, extract-messages, profile-sample (pipeline phase) and write-profile, profile-questionnaire, generate-dev-preferences, generate-claude-profile, generate-claude-md (output phase). Backs the /gsd-profile-user skill and gsd-user-profiler agent.",
|
|
1340
|
+
"tier": "full",
|
|
1341
|
+
"requires": [],
|
|
1342
|
+
"runtimeCompat": {
|
|
1343
|
+
"supported": [
|
|
1344
|
+
"*"
|
|
1345
|
+
],
|
|
1346
|
+
"unsupported": []
|
|
1347
|
+
},
|
|
1348
|
+
"skills": [
|
|
1349
|
+
"profile-user"
|
|
1350
|
+
],
|
|
1351
|
+
"agents": [
|
|
1352
|
+
"gsd-user-profiler"
|
|
1353
|
+
],
|
|
1354
|
+
"config": {
|
|
1355
|
+
"profile-pipeline.enabled": {
|
|
1356
|
+
"type": "boolean",
|
|
1357
|
+
"default": false,
|
|
1358
|
+
"description": "Enable the developer profiling pipeline commands (scan-sessions, extract-messages, profile-sample, write-profile, etc.)."
|
|
1359
|
+
}
|
|
1360
|
+
},
|
|
1361
|
+
"commands": [
|
|
1362
|
+
{
|
|
1363
|
+
"family": "scan-sessions",
|
|
1364
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
1365
|
+
"router": "routeScanSessions"
|
|
1366
|
+
},
|
|
1367
|
+
{
|
|
1368
|
+
"family": "extract-messages",
|
|
1369
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
1370
|
+
"router": "routeExtractMessages"
|
|
1371
|
+
},
|
|
1372
|
+
{
|
|
1373
|
+
"family": "profile-sample",
|
|
1374
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
1375
|
+
"router": "routeProfileSample"
|
|
1376
|
+
},
|
|
1377
|
+
{
|
|
1378
|
+
"family": "write-profile",
|
|
1379
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
1380
|
+
"router": "routeWriteProfile"
|
|
1381
|
+
},
|
|
1382
|
+
{
|
|
1383
|
+
"family": "profile-questionnaire",
|
|
1384
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
1385
|
+
"router": "routeProfileQuestionnaire"
|
|
1386
|
+
},
|
|
1387
|
+
{
|
|
1388
|
+
"family": "generate-dev-preferences",
|
|
1389
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
1390
|
+
"router": "routeGenerateDevPreferences"
|
|
1391
|
+
},
|
|
1392
|
+
{
|
|
1393
|
+
"family": "generate-claude-profile",
|
|
1394
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
1395
|
+
"router": "routeGenerateClaudeProfile"
|
|
1396
|
+
},
|
|
1397
|
+
{
|
|
1398
|
+
"family": "generate-claude-md",
|
|
1399
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
1400
|
+
"router": "routeGenerateClaudeMd"
|
|
1401
|
+
}
|
|
1402
|
+
],
|
|
1403
|
+
"hooks": [],
|
|
1404
|
+
"steps": [],
|
|
1405
|
+
"contributions": [],
|
|
1406
|
+
"gates": []
|
|
1407
|
+
},
|
|
835
1408
|
"qwen": {
|
|
836
1409
|
"id": "qwen",
|
|
837
1410
|
"role": "runtime",
|
|
@@ -885,6 +1458,240 @@ const capabilities = {
|
|
|
885
1458
|
]
|
|
886
1459
|
}
|
|
887
1460
|
},
|
|
1461
|
+
"research": {
|
|
1462
|
+
"id": "research",
|
|
1463
|
+
"role": "feature",
|
|
1464
|
+
"title": "Phase research",
|
|
1465
|
+
"description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
|
|
1466
|
+
"tier": "standard",
|
|
1467
|
+
"requires": [],
|
|
1468
|
+
"runtimeCompat": {
|
|
1469
|
+
"supported": [
|
|
1470
|
+
"*"
|
|
1471
|
+
],
|
|
1472
|
+
"unsupported": []
|
|
1473
|
+
},
|
|
1474
|
+
"skills": [],
|
|
1475
|
+
"agents": [
|
|
1476
|
+
"gsd-phase-researcher"
|
|
1477
|
+
],
|
|
1478
|
+
"hooks": [],
|
|
1479
|
+
"config": {
|
|
1480
|
+
"workflow.research": {
|
|
1481
|
+
"type": "boolean",
|
|
1482
|
+
"default": true,
|
|
1483
|
+
"description": "Run phase research before planning when research artifacts are missing or explicitly refreshed."
|
|
1484
|
+
}
|
|
1485
|
+
},
|
|
1486
|
+
"steps": [
|
|
1487
|
+
{
|
|
1488
|
+
"point": "plan:pre",
|
|
1489
|
+
"ref": {
|
|
1490
|
+
"agent": "gsd-phase-researcher"
|
|
1491
|
+
},
|
|
1492
|
+
"fragment": {
|
|
1493
|
+
"path": "fragments/plan-pre.md",
|
|
1494
|
+
"inline": "<objective>\nResearch how to implement Phase {phase_number}: {phase_name}\nAnswer: \"What do I need to know to PLAN this phase well?\"\n</objective>\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {requirements_path} (Project requirements)\n- {state_path} (Project decisions and history)\n</files_to_read>\n\n${AGENT_SKILLS_RESEARCHER}\n\n<additional_context>\n**Phase description:** {phase_description}\n**Phase requirement IDs (MUST address):** {phase_req_ids}\n\n**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists; follow project-specific guidelines.\n**Project skills:** Check .claude/skills/ or .agents/skills/ directory if either exists. Read SKILL.md files and account for project skill patterns.\n</additional_context>\n\n<output>\nWrite to: {phase_dir}/{phase_num}-RESEARCH.md\n</output>\n"
|
|
1495
|
+
},
|
|
1496
|
+
"produces": [
|
|
1497
|
+
"RESEARCH.md"
|
|
1498
|
+
],
|
|
1499
|
+
"consumes": [
|
|
1500
|
+
"CONTEXT.md"
|
|
1501
|
+
],
|
|
1502
|
+
"when": "workflow.research",
|
|
1503
|
+
"onError": "skip"
|
|
1504
|
+
}
|
|
1505
|
+
],
|
|
1506
|
+
"contributions": [],
|
|
1507
|
+
"gates": []
|
|
1508
|
+
},
|
|
1509
|
+
"schema-gate": {
|
|
1510
|
+
"id": "schema-gate",
|
|
1511
|
+
"role": "feature",
|
|
1512
|
+
"title": "Schema push detection gate",
|
|
1513
|
+
"description": "Detects ORM schema-relevant files in the phase scope during planning and injects a mandatory [BLOCKING] schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.",
|
|
1514
|
+
"tier": "full",
|
|
1515
|
+
"requires": [],
|
|
1516
|
+
"runtimeCompat": {
|
|
1517
|
+
"supported": [
|
|
1518
|
+
"*"
|
|
1519
|
+
],
|
|
1520
|
+
"unsupported": []
|
|
1521
|
+
},
|
|
1522
|
+
"skills": [],
|
|
1523
|
+
"agents": [],
|
|
1524
|
+
"hooks": [],
|
|
1525
|
+
"config": {
|
|
1526
|
+
"workflow.schema_push_detection": {
|
|
1527
|
+
"type": "boolean",
|
|
1528
|
+
"default": true,
|
|
1529
|
+
"description": "Enable ORM schema push detection during planning. When schema-relevant files are detected in the phase scope, a [BLOCKING] push task is injected into the plan."
|
|
1530
|
+
}
|
|
1531
|
+
},
|
|
1532
|
+
"steps": [],
|
|
1533
|
+
"contributions": [
|
|
1534
|
+
{
|
|
1535
|
+
"point": "plan:pre",
|
|
1536
|
+
"into": "planner",
|
|
1537
|
+
"fragment": {
|
|
1538
|
+
"path": "fragments/plan-pre.md",
|
|
1539
|
+
"inline": "# Schema Push Detection Gate\n\n> Detects schema-relevant files in the phase scope and injects a mandatory `[BLOCKING]` schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.\n\nCheck if any files in the phase scope match schema patterns:\n\n```bash\nPHASE_SECTION=$(gsd_run query roadmap.get-phase \"${PHASE}\" --pick section 2>/dev/null)\n```\n\nScan `PHASE_SECTION`, `CONTEXT.md` (if loaded), and `RESEARCH.md` (if exists) for file paths matching these ORM patterns:\n\n| ORM | File Patterns |\n|-----|--------------|\n| Payload CMS | `src/collections/**/*.ts`, `src/globals/**/*.ts` |\n| Prisma | `prisma/schema.prisma`, `prisma/schema/*.prisma` |\n| Drizzle | `drizzle/schema.ts`, `src/db/schema.ts`, `drizzle/*.ts` |\n| Supabase | `supabase/migrations/*.sql` |\n| TypeORM | `src/entities/**/*.ts`, `src/migrations/**/*.ts` |\n\nAlso check if any existing PLAN.md files for this phase already reference these file patterns in `files_modified`.\n\n**If schema-relevant files detected:**\n\nSet `SCHEMA_PUSH_REQUIRED=true` and `SCHEMA_ORM={detected_orm}`.\n\nDetermine the push command for the detected ORM:\n\n| ORM | Push Command | Non-TTY Workaround |\n|-----|-------------|-------------------|\n| Payload CMS | `npx payload migrate` | `CI=true PAYLOAD_MIGRATING=true npx payload migrate` |\n| Prisma | `npx prisma db push` | `npx prisma db push --accept-data-loss` (if destructive) |\n| Drizzle | `npx drizzle-kit push` | `npx drizzle-kit push` |\n| Supabase | `supabase db push` | Set `SUPABASE_ACCESS_TOKEN` env var |\n| TypeORM | `npx typeorm migration:run` | `npx typeorm migration:run -d src/data-source.ts` |\n\nInject the following into the planner prompt (step 8) as an additional constraint:\n\n```markdown\n<schema_push_requirement>\n**[BLOCKING] Schema Push Required**\n\nThis phase modifies schema-relevant files ({detected_files}). The planner MUST include\na `[BLOCKING]` task that runs the database schema push command AFTER all schema file\nmodifications are complete but BEFORE verification.\n\n- ORM detected: {SCHEMA_ORM}\n- Push command: {push_command}\n- Non-TTY workaround: {env_hint}\n- If push requires interactive prompts that cannot be suppressed, flag the task for\n manual intervention with `autonomous: false`\n\nThis task is mandatory — the phase CANNOT pass verification without it. Build and\ntype checks will pass without the push (types come from config, not the live database),\ncreating a false-positive verification state.\n</schema_push_requirement>\n```\n\nDisplay: `Schema files detected ({SCHEMA_ORM}) — [BLOCKING] push task will be injected into plans`\n\n**If no schema-relevant files detected:** Skip silently.\n"
|
|
1540
|
+
},
|
|
1541
|
+
"produces": [],
|
|
1542
|
+
"consumes": [
|
|
1543
|
+
"CONTEXT.md"
|
|
1544
|
+
],
|
|
1545
|
+
"when": "workflow.schema_push_detection",
|
|
1546
|
+
"onError": "skip"
|
|
1547
|
+
}
|
|
1548
|
+
],
|
|
1549
|
+
"gates": []
|
|
1550
|
+
},
|
|
1551
|
+
"security": {
|
|
1552
|
+
"id": "security",
|
|
1553
|
+
"role": "feature",
|
|
1554
|
+
"title": "Security enforcement",
|
|
1555
|
+
"description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
|
|
1556
|
+
"tier": "full",
|
|
1557
|
+
"requires": [],
|
|
1558
|
+
"runtimeCompat": {
|
|
1559
|
+
"supported": [
|
|
1560
|
+
"*"
|
|
1561
|
+
],
|
|
1562
|
+
"unsupported": []
|
|
1563
|
+
},
|
|
1564
|
+
"skills": [
|
|
1565
|
+
"secure-phase"
|
|
1566
|
+
],
|
|
1567
|
+
"agents": [
|
|
1568
|
+
"gsd-security-auditor"
|
|
1569
|
+
],
|
|
1570
|
+
"hooks": [],
|
|
1571
|
+
"config": {
|
|
1572
|
+
"workflow.security_enforcement": {
|
|
1573
|
+
"type": "boolean",
|
|
1574
|
+
"default": true,
|
|
1575
|
+
"description": "Enable security threat-mitigation verification before phase advancement."
|
|
1576
|
+
},
|
|
1577
|
+
"workflow.security_asvs_level": {
|
|
1578
|
+
"type": "number",
|
|
1579
|
+
"default": 1,
|
|
1580
|
+
"description": "OWASP ASVS level used by security review guidance."
|
|
1581
|
+
},
|
|
1582
|
+
"workflow.security_block_on": {
|
|
1583
|
+
"type": "enum",
|
|
1584
|
+
"values": [
|
|
1585
|
+
"critical",
|
|
1586
|
+
"high",
|
|
1587
|
+
"medium",
|
|
1588
|
+
"low",
|
|
1589
|
+
"none"
|
|
1590
|
+
],
|
|
1591
|
+
"default": "high",
|
|
1592
|
+
"description": "Minimum open threat severity that blocks advancement."
|
|
1593
|
+
}
|
|
1594
|
+
},
|
|
1595
|
+
"steps": [
|
|
1596
|
+
{
|
|
1597
|
+
"point": "verify:post",
|
|
1598
|
+
"ref": {
|
|
1599
|
+
"skill": "secure-phase"
|
|
1600
|
+
},
|
|
1601
|
+
"produces": [
|
|
1602
|
+
"SECURITY.md"
|
|
1603
|
+
],
|
|
1604
|
+
"consumes": [
|
|
1605
|
+
"SUMMARY.md"
|
|
1606
|
+
],
|
|
1607
|
+
"when": "workflow.security_enforcement",
|
|
1608
|
+
"onError": "halt"
|
|
1609
|
+
}
|
|
1610
|
+
],
|
|
1611
|
+
"contributions": [
|
|
1612
|
+
{
|
|
1613
|
+
"point": "plan:pre",
|
|
1614
|
+
"into": "planner",
|
|
1615
|
+
"fragment": {
|
|
1616
|
+
"inline": "Each PLAN.md must include a <threat_model> block when security enforcement is active. Use the configured ASVS level and blocking threshold from workflow.security_asvs_level and workflow.security_block_on."
|
|
1617
|
+
},
|
|
1618
|
+
"configValues": {
|
|
1619
|
+
"security_asvs_level": "workflow.security_asvs_level",
|
|
1620
|
+
"security_block_on": "workflow.security_block_on"
|
|
1621
|
+
},
|
|
1622
|
+
"produces": [],
|
|
1623
|
+
"consumes": [
|
|
1624
|
+
"CONTEXT.md"
|
|
1625
|
+
],
|
|
1626
|
+
"when": "workflow.security_enforcement"
|
|
1627
|
+
}
|
|
1628
|
+
],
|
|
1629
|
+
"gates": [
|
|
1630
|
+
{
|
|
1631
|
+
"point": "ship:pre",
|
|
1632
|
+
"check": {
|
|
1633
|
+
"predicate": {
|
|
1634
|
+
"kind": "artifact-frontmatter-equals",
|
|
1635
|
+
"artifact": "SECURITY.md",
|
|
1636
|
+
"field": "threats_open",
|
|
1637
|
+
"equals": 0
|
|
1638
|
+
}
|
|
1639
|
+
},
|
|
1640
|
+
"when": "workflow.security_enforcement",
|
|
1641
|
+
"blocking": true,
|
|
1642
|
+
"onError": "halt"
|
|
1643
|
+
}
|
|
1644
|
+
]
|
|
1645
|
+
},
|
|
1646
|
+
"tdd": {
|
|
1647
|
+
"id": "tdd",
|
|
1648
|
+
"role": "feature",
|
|
1649
|
+
"title": "Test-driven development",
|
|
1650
|
+
"description": "Injects TDD heuristics into the planner and enforces RED/GREEN gate compliance on type:tdd plans after execution. Owns workflow.tdd_mode; the --tdd CLI flag is the ephemeral override.",
|
|
1651
|
+
"tier": "full",
|
|
1652
|
+
"requires": [],
|
|
1653
|
+
"runtimeCompat": {
|
|
1654
|
+
"supported": [
|
|
1655
|
+
"*"
|
|
1656
|
+
],
|
|
1657
|
+
"unsupported": []
|
|
1658
|
+
},
|
|
1659
|
+
"skills": [],
|
|
1660
|
+
"agents": [],
|
|
1661
|
+
"hooks": [],
|
|
1662
|
+
"config": {
|
|
1663
|
+
"workflow.tdd_mode": {
|
|
1664
|
+
"type": "boolean",
|
|
1665
|
+
"default": false,
|
|
1666
|
+
"description": "Enable TDD mode: planner annotates eligible tasks type:tdd and executor enforces RED/GREEN/REFACTOR gate sequence."
|
|
1667
|
+
}
|
|
1668
|
+
},
|
|
1669
|
+
"steps": [],
|
|
1670
|
+
"contributions": [
|
|
1671
|
+
{
|
|
1672
|
+
"point": "plan:pre",
|
|
1673
|
+
"into": "planner",
|
|
1674
|
+
"fragment": {
|
|
1675
|
+
"inline": "<tdd_mode_active>\n**TDD Mode is ENABLED.** Apply TDD heuristics to all eligible tasks:\n- Business logic with defined I/O → type: tdd\n- API endpoints with request/response contracts → type: tdd\n- Data transformations, validation, algorithms → type: tdd\n- UI, config, glue code, CRUD → standard plan (type: execute)\nEach TDD plan gets one feature with RED/GREEN/REFACTOR gate sequence.\n</tdd_mode_active>"
|
|
1676
|
+
},
|
|
1677
|
+
"produces": [],
|
|
1678
|
+
"consumes": [],
|
|
1679
|
+
"when": "workflow.tdd_mode",
|
|
1680
|
+
"onError": "skip"
|
|
1681
|
+
}
|
|
1682
|
+
],
|
|
1683
|
+
"gates": [
|
|
1684
|
+
{
|
|
1685
|
+
"point": "execute:post",
|
|
1686
|
+
"check": {
|
|
1687
|
+
"query": "tdd.review-checkpoint"
|
|
1688
|
+
},
|
|
1689
|
+
"when": "workflow.tdd_mode",
|
|
1690
|
+
"blocking": false,
|
|
1691
|
+
"onError": "skip"
|
|
1692
|
+
}
|
|
1693
|
+
]
|
|
1694
|
+
},
|
|
888
1695
|
"trae": {
|
|
889
1696
|
"id": "trae",
|
|
890
1697
|
"role": "runtime",
|
|
@@ -940,6 +1747,12 @@ const capabilities = {
|
|
|
940
1747
|
"description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
|
|
941
1748
|
"tier": "full",
|
|
942
1749
|
"requires": [],
|
|
1750
|
+
"runtimeCompat": {
|
|
1751
|
+
"supported": [
|
|
1752
|
+
"*"
|
|
1753
|
+
],
|
|
1754
|
+
"unsupported": []
|
|
1755
|
+
},
|
|
943
1756
|
"skills": [
|
|
944
1757
|
"ui-phase",
|
|
945
1758
|
"ui-review"
|
|
@@ -1070,12 +1883,31 @@ const capabilities = {
|
|
|
1070
1883
|
};
|
|
1071
1884
|
|
|
1072
1885
|
const bySkill = {
|
|
1886
|
+
"ai-integration-phase": "ai-integration",
|
|
1887
|
+
"code-review": "code-review",
|
|
1073
1888
|
"graphify": "graphify",
|
|
1889
|
+
"mempalace-recall": "mempalace",
|
|
1890
|
+
"mempalace-capture": "mempalace",
|
|
1891
|
+
"validate-phase": "nyquist",
|
|
1892
|
+
"profile-user": "profile-pipeline",
|
|
1893
|
+
"secure-phase": "security",
|
|
1074
1894
|
"ui-phase": "ui",
|
|
1075
1895
|
"ui-review": "ui"
|
|
1076
1896
|
};
|
|
1077
1897
|
|
|
1078
1898
|
const byAgent = {
|
|
1899
|
+
"gsd-framework-selector": "ai-integration",
|
|
1900
|
+
"gsd-ai-researcher": "ai-integration",
|
|
1901
|
+
"gsd-domain-researcher": "ai-integration",
|
|
1902
|
+
"gsd-eval-planner": "ai-integration",
|
|
1903
|
+
"gsd-code-reviewer": "code-review",
|
|
1904
|
+
"gsd-code-fixer": "code-review",
|
|
1905
|
+
"gsd-mempalace-curator": "mempalace",
|
|
1906
|
+
"gsd-nyquist-auditor": "nyquist",
|
|
1907
|
+
"gsd-pattern-mapper": "pattern-mapper",
|
|
1908
|
+
"gsd-user-profiler": "profile-pipeline",
|
|
1909
|
+
"gsd-phase-researcher": "research",
|
|
1910
|
+
"gsd-security-auditor": "security",
|
|
1079
1911
|
"gsd-ui-checker": "ui",
|
|
1080
1912
|
"gsd-ui-auditor": "ui"
|
|
1081
1913
|
};
|
|
@@ -1083,16 +1915,106 @@ const byAgent = {
|
|
|
1083
1915
|
const byLoopPoint = {
|
|
1084
1916
|
"discuss:pre": {
|
|
1085
1917
|
"steps": [],
|
|
1086
|
-
"contributions": [
|
|
1918
|
+
"contributions": [
|
|
1919
|
+
{
|
|
1920
|
+
"capId": "mempalace",
|
|
1921
|
+
"point": "discuss:pre",
|
|
1922
|
+
"into": "orchestrator",
|
|
1923
|
+
"fragment": {
|
|
1924
|
+
"path": "fragments/recall-discuss.md",
|
|
1925
|
+
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the discuss:pre orchestrator prompt when `mempalace.recall_on_discuss` is true.\n Contributes DATA (recall instructions), not control flow. onError: skip — never blocks discussion.\n-->\n### Memory recall (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.recall_on_discuss` is `false`, **skip this entire section** and continue the discussion unchanged. (This contribution is only injected when the capability is enabled; the `recall_on_discuss` check lets you turn discuss-time recall off without disabling the rest of the capability.)\n\nOtherwise — before gathering new context, surface what you already know. This is read-only and side-effect-free; if MemPalace is unreachable, note \"memory unavailable\" and continue — recall never blocks discussion.\n\n1. **Resolve the wing.** Use `mempalace.wing` if set; otherwise derive it from `project_code` (fall back to the project directory name).\n2. **Wake up (cheap, ~600–900 tokens).**\n - Interactive run → call `mempalace_search` after a wake-up read of the wing.\n - Headless/cron run (no MCP server) → run `mempalace wake-up --wing <wing>` via the CLI.\n3. **Targeted recall.** Search the palace for prior work on this phase's topic:\n - Interactive → `mempalace_search(query=<phase topic>, wing=<wing>)` and, when `mempalace.mirror_kg` is on, `mempalace_kg_query` / `mempalace_kg_timeline` for decision facts and their validity windows.\n - Headless → `mempalace search \"<phase topic>\" --wing <wing>`.\n4. **Mode awareness.** Only `augment` is currently wired: always treat the palace as an *additional* recall layer on top of GSD's native memory — never skip `.planning/graphs/` or STATE. `kg_backend`/`replace` are forward-declared and behave as `augment` today.\n5. **Surface, don't dump.** Fold the top relevant drawers, decisions, patterns, and *surprises* into the discussion as prior context — cite drawer/fact provenance. Do not paste raw search output.\n\nIf any MemPalace call errors or times out, skip the rest of recall and proceed with discussion as normal.\n"
|
|
1926
|
+
},
|
|
1927
|
+
"produces": [],
|
|
1928
|
+
"consumes": [],
|
|
1929
|
+
"when": "mempalace.enabled",
|
|
1930
|
+
"onError": "skip"
|
|
1931
|
+
}
|
|
1932
|
+
],
|
|
1087
1933
|
"gates": []
|
|
1088
1934
|
},
|
|
1089
1935
|
"discuss:post": {
|
|
1090
|
-
"steps": [
|
|
1936
|
+
"steps": [
|
|
1937
|
+
{
|
|
1938
|
+
"capId": "mempalace",
|
|
1939
|
+
"point": "discuss:post",
|
|
1940
|
+
"ref": {
|
|
1941
|
+
"skill": "mempalace-capture"
|
|
1942
|
+
},
|
|
1943
|
+
"produces": [],
|
|
1944
|
+
"consumes": [
|
|
1945
|
+
"CONTEXT.md"
|
|
1946
|
+
],
|
|
1947
|
+
"when": "mempalace.enabled",
|
|
1948
|
+
"onError": "skip"
|
|
1949
|
+
}
|
|
1950
|
+
],
|
|
1091
1951
|
"contributions": [],
|
|
1092
1952
|
"gates": []
|
|
1093
1953
|
},
|
|
1094
1954
|
"plan:pre": {
|
|
1095
1955
|
"steps": [
|
|
1956
|
+
{
|
|
1957
|
+
"capId": "ai-integration",
|
|
1958
|
+
"point": "plan:pre",
|
|
1959
|
+
"ref": {
|
|
1960
|
+
"skill": "ai-integration-phase"
|
|
1961
|
+
},
|
|
1962
|
+
"produces": [
|
|
1963
|
+
"AI-SPEC.md"
|
|
1964
|
+
],
|
|
1965
|
+
"consumes": [
|
|
1966
|
+
"CONTEXT.md"
|
|
1967
|
+
],
|
|
1968
|
+
"when": "workflow.ai_integration_phase",
|
|
1969
|
+
"onError": "skip"
|
|
1970
|
+
},
|
|
1971
|
+
{
|
|
1972
|
+
"capId": "intel",
|
|
1973
|
+
"point": "plan:pre",
|
|
1974
|
+
"ref": {
|
|
1975
|
+
"command": "intel api-surface"
|
|
1976
|
+
},
|
|
1977
|
+
"produces": [
|
|
1978
|
+
".planning/intel/API-SURFACE.md"
|
|
1979
|
+
],
|
|
1980
|
+
"consumes": [],
|
|
1981
|
+
"when": "intel.enabled",
|
|
1982
|
+
"onError": "skip"
|
|
1983
|
+
},
|
|
1984
|
+
{
|
|
1985
|
+
"capId": "mempalace",
|
|
1986
|
+
"point": "plan:pre",
|
|
1987
|
+
"ref": {
|
|
1988
|
+
"skill": "mempalace-recall"
|
|
1989
|
+
},
|
|
1990
|
+
"produces": [
|
|
1991
|
+
"MEMORY-RECALL.md"
|
|
1992
|
+
],
|
|
1993
|
+
"consumes": [
|
|
1994
|
+
"CONTEXT.md"
|
|
1995
|
+
],
|
|
1996
|
+
"when": "mempalace.enabled",
|
|
1997
|
+
"onError": "skip"
|
|
1998
|
+
},
|
|
1999
|
+
{
|
|
2000
|
+
"capId": "research",
|
|
2001
|
+
"point": "plan:pre",
|
|
2002
|
+
"ref": {
|
|
2003
|
+
"agent": "gsd-phase-researcher"
|
|
2004
|
+
},
|
|
2005
|
+
"fragment": {
|
|
2006
|
+
"path": "fragments/plan-pre.md",
|
|
2007
|
+
"inline": "<objective>\nResearch how to implement Phase {phase_number}: {phase_name}\nAnswer: \"What do I need to know to PLAN this phase well?\"\n</objective>\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {requirements_path} (Project requirements)\n- {state_path} (Project decisions and history)\n</files_to_read>\n\n${AGENT_SKILLS_RESEARCHER}\n\n<additional_context>\n**Phase description:** {phase_description}\n**Phase requirement IDs (MUST address):** {phase_req_ids}\n\n**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists; follow project-specific guidelines.\n**Project skills:** Check .claude/skills/ or .agents/skills/ directory if either exists. Read SKILL.md files and account for project skill patterns.\n</additional_context>\n\n<output>\nWrite to: {phase_dir}/{phase_num}-RESEARCH.md\n</output>\n"
|
|
2008
|
+
},
|
|
2009
|
+
"produces": [
|
|
2010
|
+
"RESEARCH.md"
|
|
2011
|
+
],
|
|
2012
|
+
"consumes": [
|
|
2013
|
+
"CONTEXT.md"
|
|
2014
|
+
],
|
|
2015
|
+
"when": "workflow.research",
|
|
2016
|
+
"onError": "skip"
|
|
2017
|
+
},
|
|
1096
2018
|
{
|
|
1097
2019
|
"capId": "ui",
|
|
1098
2020
|
"point": "plan:pre",
|
|
@@ -1107,9 +2029,73 @@ const byLoopPoint = {
|
|
|
1107
2029
|
],
|
|
1108
2030
|
"when": "workflow.ui_phase",
|
|
1109
2031
|
"onError": "skip"
|
|
2032
|
+
},
|
|
2033
|
+
{
|
|
2034
|
+
"capId": "pattern-mapper",
|
|
2035
|
+
"point": "plan:pre",
|
|
2036
|
+
"ref": {
|
|
2037
|
+
"agent": "gsd-pattern-mapper"
|
|
2038
|
+
},
|
|
2039
|
+
"fragment": {
|
|
2040
|
+
"path": "fragments/plan-pre.md",
|
|
2041
|
+
"inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {research_path} (Technical Research)\n</files_to_read>\n\n**Output file:** {phase_dir}/{padded_phase}-PATTERNS.md\n\nExtract the list of files to be created/modified from CONTEXT.md and RESEARCH.md. For each file, classify by role and data flow, find the closest existing analog in the codebase, extract concrete code excerpts, and produce PATTERNS.md.\n</pattern_mapping_context>\n"
|
|
2042
|
+
},
|
|
2043
|
+
"produces": [
|
|
2044
|
+
"PATTERNS.md"
|
|
2045
|
+
],
|
|
2046
|
+
"consumes": [
|
|
2047
|
+
"RESEARCH.md"
|
|
2048
|
+
],
|
|
2049
|
+
"when": "workflow.pattern_mapper",
|
|
2050
|
+
"onError": "skip"
|
|
2051
|
+
}
|
|
2052
|
+
],
|
|
2053
|
+
"contributions": [
|
|
2054
|
+
{
|
|
2055
|
+
"capId": "schema-gate",
|
|
2056
|
+
"point": "plan:pre",
|
|
2057
|
+
"into": "planner",
|
|
2058
|
+
"fragment": {
|
|
2059
|
+
"path": "fragments/plan-pre.md",
|
|
2060
|
+
"inline": "# Schema Push Detection Gate\n\n> Detects schema-relevant files in the phase scope and injects a mandatory `[BLOCKING]` schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.\n\nCheck if any files in the phase scope match schema patterns:\n\n```bash\nPHASE_SECTION=$(gsd_run query roadmap.get-phase \"${PHASE}\" --pick section 2>/dev/null)\n```\n\nScan `PHASE_SECTION`, `CONTEXT.md` (if loaded), and `RESEARCH.md` (if exists) for file paths matching these ORM patterns:\n\n| ORM | File Patterns |\n|-----|--------------|\n| Payload CMS | `src/collections/**/*.ts`, `src/globals/**/*.ts` |\n| Prisma | `prisma/schema.prisma`, `prisma/schema/*.prisma` |\n| Drizzle | `drizzle/schema.ts`, `src/db/schema.ts`, `drizzle/*.ts` |\n| Supabase | `supabase/migrations/*.sql` |\n| TypeORM | `src/entities/**/*.ts`, `src/migrations/**/*.ts` |\n\nAlso check if any existing PLAN.md files for this phase already reference these file patterns in `files_modified`.\n\n**If schema-relevant files detected:**\n\nSet `SCHEMA_PUSH_REQUIRED=true` and `SCHEMA_ORM={detected_orm}`.\n\nDetermine the push command for the detected ORM:\n\n| ORM | Push Command | Non-TTY Workaround |\n|-----|-------------|-------------------|\n| Payload CMS | `npx payload migrate` | `CI=true PAYLOAD_MIGRATING=true npx payload migrate` |\n| Prisma | `npx prisma db push` | `npx prisma db push --accept-data-loss` (if destructive) |\n| Drizzle | `npx drizzle-kit push` | `npx drizzle-kit push` |\n| Supabase | `supabase db push` | Set `SUPABASE_ACCESS_TOKEN` env var |\n| TypeORM | `npx typeorm migration:run` | `npx typeorm migration:run -d src/data-source.ts` |\n\nInject the following into the planner prompt (step 8) as an additional constraint:\n\n```markdown\n<schema_push_requirement>\n**[BLOCKING] Schema Push Required**\n\nThis phase modifies schema-relevant files ({detected_files}). The planner MUST include\na `[BLOCKING]` task that runs the database schema push command AFTER all schema file\nmodifications are complete but BEFORE verification.\n\n- ORM detected: {SCHEMA_ORM}\n- Push command: {push_command}\n- Non-TTY workaround: {env_hint}\n- If push requires interactive prompts that cannot be suppressed, flag the task for\n manual intervention with `autonomous: false`\n\nThis task is mandatory — the phase CANNOT pass verification without it. Build and\ntype checks will pass without the push (types come from config, not the live database),\ncreating a false-positive verification state.\n</schema_push_requirement>\n```\n\nDisplay: `Schema files detected ({SCHEMA_ORM}) — [BLOCKING] push task will be injected into plans`\n\n**If no schema-relevant files detected:** Skip silently.\n"
|
|
2061
|
+
},
|
|
2062
|
+
"produces": [],
|
|
2063
|
+
"consumes": [
|
|
2064
|
+
"CONTEXT.md"
|
|
2065
|
+
],
|
|
2066
|
+
"when": "workflow.schema_push_detection",
|
|
2067
|
+
"onError": "skip"
|
|
2068
|
+
},
|
|
2069
|
+
{
|
|
2070
|
+
"capId": "security",
|
|
2071
|
+
"point": "plan:pre",
|
|
2072
|
+
"into": "planner",
|
|
2073
|
+
"fragment": {
|
|
2074
|
+
"inline": "Each PLAN.md must include a <threat_model> block when security enforcement is active. Use the configured ASVS level and blocking threshold from workflow.security_asvs_level and workflow.security_block_on."
|
|
2075
|
+
},
|
|
2076
|
+
"configValues": {
|
|
2077
|
+
"security_asvs_level": "workflow.security_asvs_level",
|
|
2078
|
+
"security_block_on": "workflow.security_block_on"
|
|
2079
|
+
},
|
|
2080
|
+
"produces": [],
|
|
2081
|
+
"consumes": [
|
|
2082
|
+
"CONTEXT.md"
|
|
2083
|
+
],
|
|
2084
|
+
"when": "workflow.security_enforcement"
|
|
2085
|
+
},
|
|
2086
|
+
{
|
|
2087
|
+
"capId": "tdd",
|
|
2088
|
+
"point": "plan:pre",
|
|
2089
|
+
"into": "planner",
|
|
2090
|
+
"fragment": {
|
|
2091
|
+
"inline": "<tdd_mode_active>\n**TDD Mode is ENABLED.** Apply TDD heuristics to all eligible tasks:\n- Business logic with defined I/O → type: tdd\n- API endpoints with request/response contracts → type: tdd\n- Data transformations, validation, algorithms → type: tdd\n- UI, config, glue code, CRUD → standard plan (type: execute)\nEach TDD plan gets one feature with RED/GREEN/REFACTOR gate sequence.\n</tdd_mode_active>"
|
|
2092
|
+
},
|
|
2093
|
+
"produces": [],
|
|
2094
|
+
"consumes": [],
|
|
2095
|
+
"when": "workflow.tdd_mode",
|
|
2096
|
+
"onError": "skip"
|
|
1110
2097
|
}
|
|
1111
2098
|
],
|
|
1112
|
-
"contributions": [],
|
|
1113
2099
|
"gates": [
|
|
1114
2100
|
{
|
|
1115
2101
|
"capId": "ui",
|
|
@@ -1124,9 +2110,34 @@ const byLoopPoint = {
|
|
|
1124
2110
|
]
|
|
1125
2111
|
},
|
|
1126
2112
|
"plan:post": {
|
|
1127
|
-
"steps": [
|
|
2113
|
+
"steps": [
|
|
2114
|
+
{
|
|
2115
|
+
"capId": "mempalace",
|
|
2116
|
+
"point": "plan:post",
|
|
2117
|
+
"ref": {
|
|
2118
|
+
"skill": "mempalace-capture"
|
|
2119
|
+
},
|
|
2120
|
+
"produces": [],
|
|
2121
|
+
"consumes": [
|
|
2122
|
+
"PLAN.md"
|
|
2123
|
+
],
|
|
2124
|
+
"when": "mempalace.enabled",
|
|
2125
|
+
"onError": "skip"
|
|
2126
|
+
}
|
|
2127
|
+
],
|
|
1128
2128
|
"contributions": [],
|
|
1129
|
-
"gates": [
|
|
2129
|
+
"gates": [
|
|
2130
|
+
{
|
|
2131
|
+
"capId": "gap-analysis",
|
|
2132
|
+
"point": "plan:post",
|
|
2133
|
+
"check": {
|
|
2134
|
+
"query": "gap-analysis.plan-post"
|
|
2135
|
+
},
|
|
2136
|
+
"when": "workflow.post_planning_gaps",
|
|
2137
|
+
"blocking": false,
|
|
2138
|
+
"onError": "skip"
|
|
2139
|
+
}
|
|
2140
|
+
]
|
|
1130
2141
|
},
|
|
1131
2142
|
"execute:pre": {
|
|
1132
2143
|
"steps": [],
|
|
@@ -1140,8 +2151,42 @@ const byLoopPoint = {
|
|
|
1140
2151
|
},
|
|
1141
2152
|
"execute:wave:post": {
|
|
1142
2153
|
"steps": [],
|
|
1143
|
-
"contributions": [
|
|
2154
|
+
"contributions": [
|
|
2155
|
+
{
|
|
2156
|
+
"capId": "mempalace",
|
|
2157
|
+
"point": "execute:wave:post",
|
|
2158
|
+
"into": "verifier",
|
|
2159
|
+
"fragment": {
|
|
2160
|
+
"path": "fragments/capture-problems.md",
|
|
2161
|
+
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: `mempalace mine` / `mempalace hook run`. Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness.** Only `augment` is currently wired: the fact is an *additive* mirror alongside `.planning/graphs/` (never a replacement). `kg_backend`/`replace` are forward-declared and behave as `augment` today.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
|
|
2162
|
+
},
|
|
2163
|
+
"produces": [],
|
|
2164
|
+
"consumes": [],
|
|
2165
|
+
"when": "mempalace.enabled",
|
|
2166
|
+
"onError": "skip"
|
|
2167
|
+
}
|
|
2168
|
+
],
|
|
1144
2169
|
"gates": [
|
|
2170
|
+
{
|
|
2171
|
+
"capId": "drift",
|
|
2172
|
+
"point": "execute:wave:post",
|
|
2173
|
+
"check": {
|
|
2174
|
+
"query": "verify.schema-drift"
|
|
2175
|
+
},
|
|
2176
|
+
"when": "workflow.schema_drift_gate",
|
|
2177
|
+
"blocking": true,
|
|
2178
|
+
"onError": "skip"
|
|
2179
|
+
},
|
|
2180
|
+
{
|
|
2181
|
+
"capId": "drift",
|
|
2182
|
+
"point": "execute:wave:post",
|
|
2183
|
+
"check": {
|
|
2184
|
+
"query": "verify.codebase-drift"
|
|
2185
|
+
},
|
|
2186
|
+
"when": "workflow.schema_drift_gate",
|
|
2187
|
+
"blocking": false,
|
|
2188
|
+
"onError": "skip"
|
|
2189
|
+
},
|
|
1145
2190
|
{
|
|
1146
2191
|
"capId": "ui",
|
|
1147
2192
|
"point": "execute:wave:post",
|
|
@@ -1155,9 +2200,36 @@ const byLoopPoint = {
|
|
|
1155
2200
|
]
|
|
1156
2201
|
},
|
|
1157
2202
|
"execute:post": {
|
|
1158
|
-
"steps": [
|
|
2203
|
+
"steps": [
|
|
2204
|
+
{
|
|
2205
|
+
"capId": "code-review",
|
|
2206
|
+
"point": "execute:post",
|
|
2207
|
+
"ref": {
|
|
2208
|
+
"skill": "code-review"
|
|
2209
|
+
},
|
|
2210
|
+
"produces": [
|
|
2211
|
+
"REVIEW.md"
|
|
2212
|
+
],
|
|
2213
|
+
"consumes": [
|
|
2214
|
+
"SUMMARY.md"
|
|
2215
|
+
],
|
|
2216
|
+
"when": "workflow.code_review",
|
|
2217
|
+
"onError": "skip"
|
|
2218
|
+
}
|
|
2219
|
+
],
|
|
1159
2220
|
"contributions": [],
|
|
1160
|
-
"gates": [
|
|
2221
|
+
"gates": [
|
|
2222
|
+
{
|
|
2223
|
+
"capId": "tdd",
|
|
2224
|
+
"point": "execute:post",
|
|
2225
|
+
"check": {
|
|
2226
|
+
"query": "tdd.review-checkpoint"
|
|
2227
|
+
},
|
|
2228
|
+
"when": "workflow.tdd_mode",
|
|
2229
|
+
"blocking": false,
|
|
2230
|
+
"onError": "skip"
|
|
2231
|
+
}
|
|
2232
|
+
]
|
|
1161
2233
|
},
|
|
1162
2234
|
"verify:pre": {
|
|
1163
2235
|
"steps": [],
|
|
@@ -1166,6 +2238,49 @@ const byLoopPoint = {
|
|
|
1166
2238
|
},
|
|
1167
2239
|
"verify:post": {
|
|
1168
2240
|
"steps": [
|
|
2241
|
+
{
|
|
2242
|
+
"capId": "mempalace",
|
|
2243
|
+
"point": "verify:post",
|
|
2244
|
+
"ref": {
|
|
2245
|
+
"skill": "mempalace-capture"
|
|
2246
|
+
},
|
|
2247
|
+
"produces": [],
|
|
2248
|
+
"consumes": [
|
|
2249
|
+
"SUMMARY.md"
|
|
2250
|
+
],
|
|
2251
|
+
"when": "mempalace.enabled",
|
|
2252
|
+
"onError": "skip"
|
|
2253
|
+
},
|
|
2254
|
+
{
|
|
2255
|
+
"capId": "nyquist",
|
|
2256
|
+
"point": "verify:post",
|
|
2257
|
+
"ref": {
|
|
2258
|
+
"skill": "validate-phase"
|
|
2259
|
+
},
|
|
2260
|
+
"produces": [
|
|
2261
|
+
"VALIDATION.md"
|
|
2262
|
+
],
|
|
2263
|
+
"consumes": [
|
|
2264
|
+
"SUMMARY.md"
|
|
2265
|
+
],
|
|
2266
|
+
"when": "workflow.nyquist_validation",
|
|
2267
|
+
"onError": "halt"
|
|
2268
|
+
},
|
|
2269
|
+
{
|
|
2270
|
+
"capId": "security",
|
|
2271
|
+
"point": "verify:post",
|
|
2272
|
+
"ref": {
|
|
2273
|
+
"skill": "secure-phase"
|
|
2274
|
+
},
|
|
2275
|
+
"produces": [
|
|
2276
|
+
"SECURITY.md"
|
|
2277
|
+
],
|
|
2278
|
+
"consumes": [
|
|
2279
|
+
"SUMMARY.md"
|
|
2280
|
+
],
|
|
2281
|
+
"when": "workflow.security_enforcement",
|
|
2282
|
+
"onError": "halt"
|
|
2283
|
+
},
|
|
1169
2284
|
{
|
|
1170
2285
|
"capId": "ui",
|
|
1171
2286
|
"point": "verify:post",
|
|
@@ -1188,24 +2303,131 @@ const byLoopPoint = {
|
|
|
1188
2303
|
"ship:pre": {
|
|
1189
2304
|
"steps": [],
|
|
1190
2305
|
"contributions": [],
|
|
1191
|
-
"gates": [
|
|
2306
|
+
"gates": [
|
|
2307
|
+
{
|
|
2308
|
+
"capId": "security",
|
|
2309
|
+
"point": "ship:pre",
|
|
2310
|
+
"check": {
|
|
2311
|
+
"predicate": {
|
|
2312
|
+
"kind": "artifact-frontmatter-equals",
|
|
2313
|
+
"artifact": "SECURITY.md",
|
|
2314
|
+
"field": "threats_open",
|
|
2315
|
+
"equals": 0
|
|
2316
|
+
}
|
|
2317
|
+
},
|
|
2318
|
+
"when": "workflow.security_enforcement",
|
|
2319
|
+
"blocking": true,
|
|
2320
|
+
"onError": "halt"
|
|
2321
|
+
}
|
|
2322
|
+
]
|
|
1192
2323
|
},
|
|
1193
2324
|
"ship:post": {
|
|
1194
|
-
"steps": [
|
|
2325
|
+
"steps": [
|
|
2326
|
+
{
|
|
2327
|
+
"capId": "mempalace",
|
|
2328
|
+
"point": "ship:post",
|
|
2329
|
+
"ref": {
|
|
2330
|
+
"agent": "gsd-mempalace-curator"
|
|
2331
|
+
},
|
|
2332
|
+
"produces": [],
|
|
2333
|
+
"consumes": [
|
|
2334
|
+
"UAT.md"
|
|
2335
|
+
],
|
|
2336
|
+
"when": "mempalace.enabled",
|
|
2337
|
+
"onError": "skip"
|
|
2338
|
+
}
|
|
2339
|
+
],
|
|
1195
2340
|
"contributions": [],
|
|
1196
2341
|
"gates": []
|
|
1197
2342
|
}
|
|
1198
2343
|
};
|
|
1199
2344
|
|
|
1200
2345
|
const configKeys = {
|
|
2346
|
+
"workflow.ai_integration_phase": "ai-integration",
|
|
2347
|
+
"workflow.code_review": "code-review",
|
|
2348
|
+
"workflow.code_review_depth": "code-review",
|
|
2349
|
+
"workflow.drift_threshold": "drift",
|
|
2350
|
+
"workflow.drift_action": "drift",
|
|
2351
|
+
"workflow.schema_drift_gate": "drift",
|
|
2352
|
+
"workflow.post_planning_gaps": "gap-analysis",
|
|
1201
2353
|
"graphify.enabled": "graphify",
|
|
1202
2354
|
"intel.enabled": "intel",
|
|
2355
|
+
"mempalace.enabled": "mempalace",
|
|
2356
|
+
"mempalace.memory_mode": "mempalace",
|
|
2357
|
+
"mempalace.wing": "mempalace",
|
|
2358
|
+
"mempalace.recall_on_discuss": "mempalace",
|
|
2359
|
+
"mempalace.recall_on_plan": "mempalace",
|
|
2360
|
+
"mempalace.capture_artifacts": "mempalace",
|
|
2361
|
+
"mempalace.mirror_kg": "mempalace",
|
|
2362
|
+
"mempalace.cross_project_tunnels": "mempalace",
|
|
2363
|
+
"mempalace.diary_journal": "mempalace",
|
|
2364
|
+
"mempalace.auto_capture_hooks": "mempalace",
|
|
2365
|
+
"workflow.nyquist_validation": "nyquist",
|
|
2366
|
+
"workflow.pattern_mapper": "pattern-mapper",
|
|
2367
|
+
"profile-pipeline.enabled": "profile-pipeline",
|
|
2368
|
+
"workflow.research": "research",
|
|
2369
|
+
"workflow.schema_push_detection": "schema-gate",
|
|
2370
|
+
"workflow.security_enforcement": "security",
|
|
2371
|
+
"workflow.security_asvs_level": "security",
|
|
2372
|
+
"workflow.security_block_on": "security",
|
|
2373
|
+
"workflow.tdd_mode": "tdd",
|
|
1203
2374
|
"workflow.ui_phase": "ui",
|
|
1204
2375
|
"workflow.ui_review": "ui",
|
|
1205
2376
|
"workflow.ui_safety_gate": "ui"
|
|
1206
2377
|
};
|
|
1207
2378
|
|
|
1208
2379
|
const configSchema = {
|
|
2380
|
+
"workflow.ai_integration_phase": {
|
|
2381
|
+
"owner": "ai-integration",
|
|
2382
|
+
"type": "boolean",
|
|
2383
|
+
"default": true,
|
|
2384
|
+
"description": "Prompt for an AI-SPEC design contract before planning phases that involve AI systems."
|
|
2385
|
+
},
|
|
2386
|
+
"workflow.code_review": {
|
|
2387
|
+
"owner": "code-review",
|
|
2388
|
+
"type": "boolean",
|
|
2389
|
+
"default": true,
|
|
2390
|
+
"description": "Enable code-review participation in post-execution review flows."
|
|
2391
|
+
},
|
|
2392
|
+
"workflow.code_review_depth": {
|
|
2393
|
+
"owner": "code-review",
|
|
2394
|
+
"type": "enum",
|
|
2395
|
+
"default": "standard",
|
|
2396
|
+
"description": "Default depth for code review when no --depth override is supplied.",
|
|
2397
|
+
"values": [
|
|
2398
|
+
"quick",
|
|
2399
|
+
"standard",
|
|
2400
|
+
"deep"
|
|
2401
|
+
]
|
|
2402
|
+
},
|
|
2403
|
+
"workflow.drift_threshold": {
|
|
2404
|
+
"owner": "drift",
|
|
2405
|
+
"type": "number",
|
|
2406
|
+
"default": 3,
|
|
2407
|
+
"description": "Minimum number of new structural elements (directories, barrel exports, migrations, routes) before the codebase drift gate triggers a warn or auto-remap action."
|
|
2408
|
+
},
|
|
2409
|
+
"workflow.drift_action": {
|
|
2410
|
+
"owner": "drift",
|
|
2411
|
+
"type": "enum",
|
|
2412
|
+
"default": "warn",
|
|
2413
|
+
"description": "Action taken by the codebase drift gate when the threshold is exceeded: warn (advisory message) or auto-remap (spawn gsd-codebase-mapper agent to refresh STRUCTURE.md).",
|
|
2414
|
+
"values": [
|
|
2415
|
+
"warn",
|
|
2416
|
+
"auto-remap"
|
|
2417
|
+
]
|
|
2418
|
+
},
|
|
2419
|
+
"workflow.schema_drift_gate": {
|
|
2420
|
+
"owner": "drift",
|
|
2421
|
+
"type": "boolean",
|
|
2422
|
+
"default": true,
|
|
2423
|
+
"description": "Enable the drift gates at execute:wave:post. When enabled, the schema drift gate blocks verification if schema-relevant files changed during execution but no database push command was executed; the codebase drift gate (non-blocking) warns when structural additions exceed the drift_threshold."
|
|
2424
|
+
},
|
|
2425
|
+
"workflow.post_planning_gaps": {
|
|
2426
|
+
"owner": "gap-analysis",
|
|
2427
|
+
"type": "boolean",
|
|
2428
|
+
"default": true,
|
|
2429
|
+
"description": "Run the post-planning gap analysis report after plans are generated."
|
|
2430
|
+
},
|
|
1209
2431
|
"graphify.enabled": {
|
|
1210
2432
|
"owner": "graphify",
|
|
1211
2433
|
"type": "boolean",
|
|
@@ -1218,6 +2440,132 @@ const configSchema = {
|
|
|
1218
2440
|
"default": false,
|
|
1219
2441
|
"description": "Enable the intel code-intelligence command."
|
|
1220
2442
|
},
|
|
2443
|
+
"mempalace.enabled": {
|
|
2444
|
+
"owner": "mempalace",
|
|
2445
|
+
"type": "boolean",
|
|
2446
|
+
"default": false,
|
|
2447
|
+
"description": "Master toggle for the MemPalace memory capability."
|
|
2448
|
+
},
|
|
2449
|
+
"mempalace.memory_mode": {
|
|
2450
|
+
"owner": "mempalace",
|
|
2451
|
+
"type": "enum",
|
|
2452
|
+
"default": "augment",
|
|
2453
|
+
"description": "How MemPalace relates to GSD native memory. Only 'augment' (additive) is implemented today; 'kg_backend' and 'replace' are forward-declared (routing seam not yet built) and currently behave as 'augment'.",
|
|
2454
|
+
"values": [
|
|
2455
|
+
"augment",
|
|
2456
|
+
"kg_backend",
|
|
2457
|
+
"replace"
|
|
2458
|
+
]
|
|
2459
|
+
},
|
|
2460
|
+
"mempalace.wing": {
|
|
2461
|
+
"owner": "mempalace",
|
|
2462
|
+
"type": "string",
|
|
2463
|
+
"default": "",
|
|
2464
|
+
"description": "Palace wing name; empty derives from project_code / project dir."
|
|
2465
|
+
},
|
|
2466
|
+
"mempalace.recall_on_discuss": {
|
|
2467
|
+
"owner": "mempalace",
|
|
2468
|
+
"type": "boolean",
|
|
2469
|
+
"default": true,
|
|
2470
|
+
"description": "Inject wake-up + search recall at discuss:pre."
|
|
2471
|
+
},
|
|
2472
|
+
"mempalace.recall_on_plan": {
|
|
2473
|
+
"owner": "mempalace",
|
|
2474
|
+
"type": "boolean",
|
|
2475
|
+
"default": true,
|
|
2476
|
+
"description": "Produce MEMORY-RECALL.md at plan:pre."
|
|
2477
|
+
},
|
|
2478
|
+
"mempalace.capture_artifacts": {
|
|
2479
|
+
"owner": "mempalace",
|
|
2480
|
+
"type": "boolean",
|
|
2481
|
+
"default": true,
|
|
2482
|
+
"description": "File CONTEXT/PLAN/SUMMARY and learnings into the palace at phase boundaries."
|
|
2483
|
+
},
|
|
2484
|
+
"mempalace.mirror_kg": {
|
|
2485
|
+
"owner": "mempalace",
|
|
2486
|
+
"type": "boolean",
|
|
2487
|
+
"default": true,
|
|
2488
|
+
"description": "Mirror decisions/learnings into MemPalace's temporal knowledge graph."
|
|
2489
|
+
},
|
|
2490
|
+
"mempalace.cross_project_tunnels": {
|
|
2491
|
+
"owner": "mempalace",
|
|
2492
|
+
"type": "boolean",
|
|
2493
|
+
"default": false,
|
|
2494
|
+
"description": "Propose/create cross-wing tunnels at ship:post."
|
|
2495
|
+
},
|
|
2496
|
+
"mempalace.diary_journal": {
|
|
2497
|
+
"owner": "mempalace",
|
|
2498
|
+
"type": "boolean",
|
|
2499
|
+
"default": true,
|
|
2500
|
+
"description": "Write a per-agent diary entry at ship:post."
|
|
2501
|
+
},
|
|
2502
|
+
"mempalace.auto_capture_hooks": {
|
|
2503
|
+
"owner": "mempalace",
|
|
2504
|
+
"type": "boolean",
|
|
2505
|
+
"default": false,
|
|
2506
|
+
"description": "Reserved / not yet implemented: will install MemPalace's native stop/precompact Claude Code hooks for passive mid-session capture (the capability's hooks array is currently empty)."
|
|
2507
|
+
},
|
|
2508
|
+
"workflow.nyquist_validation": {
|
|
2509
|
+
"owner": "nyquist",
|
|
2510
|
+
"type": "boolean",
|
|
2511
|
+
"default": true,
|
|
2512
|
+
"description": "Enable Nyquist validation coverage auditing."
|
|
2513
|
+
},
|
|
2514
|
+
"workflow.pattern_mapper": {
|
|
2515
|
+
"owner": "pattern-mapper",
|
|
2516
|
+
"type": "boolean",
|
|
2517
|
+
"default": true,
|
|
2518
|
+
"description": "Run the pattern mapper before planning when context or research is available."
|
|
2519
|
+
},
|
|
2520
|
+
"profile-pipeline.enabled": {
|
|
2521
|
+
"owner": "profile-pipeline",
|
|
2522
|
+
"type": "boolean",
|
|
2523
|
+
"default": false,
|
|
2524
|
+
"description": "Enable the developer profiling pipeline commands (scan-sessions, extract-messages, profile-sample, write-profile, etc.)."
|
|
2525
|
+
},
|
|
2526
|
+
"workflow.research": {
|
|
2527
|
+
"owner": "research",
|
|
2528
|
+
"type": "boolean",
|
|
2529
|
+
"default": true,
|
|
2530
|
+
"description": "Run phase research before planning when research artifacts are missing or explicitly refreshed."
|
|
2531
|
+
},
|
|
2532
|
+
"workflow.schema_push_detection": {
|
|
2533
|
+
"owner": "schema-gate",
|
|
2534
|
+
"type": "boolean",
|
|
2535
|
+
"default": true,
|
|
2536
|
+
"description": "Enable ORM schema push detection during planning. When schema-relevant files are detected in the phase scope, a [BLOCKING] push task is injected into the plan."
|
|
2537
|
+
},
|
|
2538
|
+
"workflow.security_enforcement": {
|
|
2539
|
+
"owner": "security",
|
|
2540
|
+
"type": "boolean",
|
|
2541
|
+
"default": true,
|
|
2542
|
+
"description": "Enable security threat-mitigation verification before phase advancement."
|
|
2543
|
+
},
|
|
2544
|
+
"workflow.security_asvs_level": {
|
|
2545
|
+
"owner": "security",
|
|
2546
|
+
"type": "number",
|
|
2547
|
+
"default": 1,
|
|
2548
|
+
"description": "OWASP ASVS level used by security review guidance."
|
|
2549
|
+
},
|
|
2550
|
+
"workflow.security_block_on": {
|
|
2551
|
+
"owner": "security",
|
|
2552
|
+
"type": "enum",
|
|
2553
|
+
"default": "high",
|
|
2554
|
+
"description": "Minimum open threat severity that blocks advancement.",
|
|
2555
|
+
"values": [
|
|
2556
|
+
"critical",
|
|
2557
|
+
"high",
|
|
2558
|
+
"medium",
|
|
2559
|
+
"low",
|
|
2560
|
+
"none"
|
|
2561
|
+
]
|
|
2562
|
+
},
|
|
2563
|
+
"workflow.tdd_mode": {
|
|
2564
|
+
"owner": "tdd",
|
|
2565
|
+
"type": "boolean",
|
|
2566
|
+
"default": false,
|
|
2567
|
+
"description": "Enable TDD mode: planner annotates eligible tasks type:tdd and executor enforces RED/GREEN/REFACTOR gate sequence."
|
|
2568
|
+
},
|
|
1221
2569
|
"workflow.ui_phase": {
|
|
1222
2570
|
"owner": "ui",
|
|
1223
2571
|
"type": "boolean",
|
|
@@ -2142,6 +3490,26 @@ const commandFamilies = {
|
|
|
2142
3490
|
"module": "audit-command-router.cjs",
|
|
2143
3491
|
"router": "routeAuditUat"
|
|
2144
3492
|
},
|
|
3493
|
+
"extract-messages": {
|
|
3494
|
+
"capId": "profile-pipeline",
|
|
3495
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
3496
|
+
"router": "routeExtractMessages"
|
|
3497
|
+
},
|
|
3498
|
+
"generate-claude-md": {
|
|
3499
|
+
"capId": "profile-pipeline",
|
|
3500
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
3501
|
+
"router": "routeGenerateClaudeMd"
|
|
3502
|
+
},
|
|
3503
|
+
"generate-claude-profile": {
|
|
3504
|
+
"capId": "profile-pipeline",
|
|
3505
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
3506
|
+
"router": "routeGenerateClaudeProfile"
|
|
3507
|
+
},
|
|
3508
|
+
"generate-dev-preferences": {
|
|
3509
|
+
"capId": "profile-pipeline",
|
|
3510
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
3511
|
+
"router": "routeGenerateDevPreferences"
|
|
3512
|
+
},
|
|
2145
3513
|
"graphify": {
|
|
2146
3514
|
"capId": "graphify",
|
|
2147
3515
|
"module": "graphify-command-router.cjs",
|
|
@@ -2151,13 +3519,52 @@ const commandFamilies = {
|
|
|
2151
3519
|
"capId": "intel",
|
|
2152
3520
|
"module": "intel-command-router.cjs",
|
|
2153
3521
|
"router": "routeIntelCommand"
|
|
3522
|
+
},
|
|
3523
|
+
"profile-questionnaire": {
|
|
3524
|
+
"capId": "profile-pipeline",
|
|
3525
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
3526
|
+
"router": "routeProfileQuestionnaire"
|
|
3527
|
+
},
|
|
3528
|
+
"profile-sample": {
|
|
3529
|
+
"capId": "profile-pipeline",
|
|
3530
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
3531
|
+
"router": "routeProfileSample"
|
|
3532
|
+
},
|
|
3533
|
+
"scan-sessions": {
|
|
3534
|
+
"capId": "profile-pipeline",
|
|
3535
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
3536
|
+
"router": "routeScanSessions"
|
|
3537
|
+
},
|
|
3538
|
+
"write-profile": {
|
|
3539
|
+
"capId": "profile-pipeline",
|
|
3540
|
+
"module": "profile-pipeline-command-router.cjs",
|
|
3541
|
+
"router": "routeWriteProfile"
|
|
2154
3542
|
}
|
|
2155
3543
|
};
|
|
2156
3544
|
|
|
2157
3545
|
const capabilityClusters = {
|
|
3546
|
+
"ai-integration": [
|
|
3547
|
+
"ai-integration-phase"
|
|
3548
|
+
],
|
|
3549
|
+
"code-review": [
|
|
3550
|
+
"code-review"
|
|
3551
|
+
],
|
|
2158
3552
|
"graphify": [
|
|
2159
3553
|
"graphify"
|
|
2160
3554
|
],
|
|
3555
|
+
"mempalace": [
|
|
3556
|
+
"mempalace-capture",
|
|
3557
|
+
"mempalace-recall"
|
|
3558
|
+
],
|
|
3559
|
+
"nyquist": [
|
|
3560
|
+
"validate-phase"
|
|
3561
|
+
],
|
|
3562
|
+
"profile-pipeline": [
|
|
3563
|
+
"profile-user"
|
|
3564
|
+
],
|
|
3565
|
+
"security": [
|
|
3566
|
+
"secure-phase"
|
|
3567
|
+
],
|
|
2161
3568
|
"ui": [
|
|
2162
3569
|
"ui-phase",
|
|
2163
3570
|
"ui-review"
|
|
@@ -2165,12 +3572,48 @@ const capabilityClusters = {
|
|
|
2165
3572
|
};
|
|
2166
3573
|
|
|
2167
3574
|
const profileMembership = {
|
|
3575
|
+
"ai-integration": {
|
|
3576
|
+
"tier": "full",
|
|
3577
|
+
"profiles": [
|
|
3578
|
+
"full"
|
|
3579
|
+
]
|
|
3580
|
+
},
|
|
3581
|
+
"code-review": {
|
|
3582
|
+
"tier": "full",
|
|
3583
|
+
"profiles": [
|
|
3584
|
+
"full"
|
|
3585
|
+
]
|
|
3586
|
+
},
|
|
2168
3587
|
"graphify": {
|
|
2169
3588
|
"tier": "full",
|
|
2170
3589
|
"profiles": [
|
|
2171
3590
|
"full"
|
|
2172
3591
|
]
|
|
2173
3592
|
},
|
|
3593
|
+
"mempalace": {
|
|
3594
|
+
"tier": "full",
|
|
3595
|
+
"profiles": [
|
|
3596
|
+
"full"
|
|
3597
|
+
]
|
|
3598
|
+
},
|
|
3599
|
+
"nyquist": {
|
|
3600
|
+
"tier": "full",
|
|
3601
|
+
"profiles": [
|
|
3602
|
+
"full"
|
|
3603
|
+
]
|
|
3604
|
+
},
|
|
3605
|
+
"profile-pipeline": {
|
|
3606
|
+
"tier": "full",
|
|
3607
|
+
"profiles": [
|
|
3608
|
+
"full"
|
|
3609
|
+
]
|
|
3610
|
+
},
|
|
3611
|
+
"security": {
|
|
3612
|
+
"tier": "full",
|
|
3613
|
+
"profiles": [
|
|
3614
|
+
"full"
|
|
3615
|
+
]
|
|
3616
|
+
},
|
|
2174
3617
|
"ui": {
|
|
2175
3618
|
"tier": "full",
|
|
2176
3619
|
"profiles": [
|
|
@@ -2180,23 +3623,37 @@ const profileMembership = {
|
|
|
2180
3623
|
};
|
|
2181
3624
|
|
|
2182
3625
|
const _requiresGraph = {
|
|
3626
|
+
"ai-integration": [],
|
|
2183
3627
|
"antigravity": [],
|
|
2184
3628
|
"audit": [],
|
|
2185
3629
|
"augment": [],
|
|
2186
3630
|
"claude": [],
|
|
2187
3631
|
"cline": [],
|
|
3632
|
+
"code-review": [],
|
|
2188
3633
|
"codebuddy": [],
|
|
2189
3634
|
"codex": [],
|
|
2190
3635
|
"copilot": [],
|
|
2191
3636
|
"cursor": [],
|
|
3637
|
+
"drift": [],
|
|
3638
|
+
"gap-analysis": [],
|
|
2192
3639
|
"gemini": [],
|
|
2193
3640
|
"graphify": [],
|
|
2194
3641
|
"hermes": [],
|
|
2195
3642
|
"intel": [],
|
|
2196
3643
|
"kilo": [],
|
|
2197
3644
|
"kimi": [],
|
|
3645
|
+
"mempalace": [],
|
|
3646
|
+
"nyquist": [],
|
|
2198
3647
|
"opencode": [],
|
|
3648
|
+
"pattern-mapper": [
|
|
3649
|
+
"research"
|
|
3650
|
+
],
|
|
3651
|
+
"profile-pipeline": [],
|
|
2199
3652
|
"qwen": [],
|
|
3653
|
+
"research": [],
|
|
3654
|
+
"schema-gate": [],
|
|
3655
|
+
"security": [],
|
|
3656
|
+
"tdd": [],
|
|
2200
3657
|
"trae": [],
|
|
2201
3658
|
"ui": [],
|
|
2202
3659
|
"windsurf": []
|