@opengsd/gsd-core 1.6.0-rc.3 → 1.6.0

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.
Files changed (52) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/agents/gsd-advisor-researcher.md +2 -0
  3. package/agents/gsd-ai-researcher.md +2 -0
  4. package/agents/gsd-assumptions-analyzer.md +2 -0
  5. package/agents/gsd-doc-classifier.md +2 -0
  6. package/agents/gsd-doc-synthesizer.md +2 -0
  7. package/agents/gsd-domain-researcher.md +2 -0
  8. package/agents/gsd-eval-auditor.md +6 -9
  9. package/agents/gsd-phase-researcher.md +2 -0
  10. package/agents/gsd-project-researcher.md +2 -0
  11. package/agents/gsd-research-synthesizer.md +2 -0
  12. package/agents/gsd-ui-researcher.md +2 -0
  13. package/bin/install.js +219 -5
  14. package/gemini-extension.json +1 -1
  15. package/gsd-core/bin/gsd-tools.cjs +11 -1
  16. package/gsd-core/bin/lib/capability-registry.cjs +48 -48
  17. package/gsd-core/bin/lib/command-aliases.cjs +10 -1
  18. package/gsd-core/bin/lib/decisions.cjs +27 -0
  19. package/gsd-core/bin/lib/eval-command-router.cjs +21 -0
  20. package/gsd-core/bin/lib/eval.cjs +60 -0
  21. package/gsd-core/bin/lib/frontmatter.cjs +132 -13
  22. package/gsd-core/bin/lib/init.cjs +131 -26
  23. package/gsd-core/bin/lib/io.cjs +1 -0
  24. package/gsd-core/bin/lib/phase.cjs +16 -2
  25. package/gsd-core/bin/lib/plan-scan.cjs +2 -2
  26. package/gsd-core/bin/lib/shell-command-projection.cjs +10 -0
  27. package/gsd-core/bin/lib/state.cjs +34 -8
  28. package/gsd-core/bin/lib/uat-predicate.cjs +13 -6
  29. package/gsd-core/bin/lib/verification.cjs +67 -6
  30. package/gsd-core/bin/lib/verify.cjs +8 -1
  31. package/gsd-core/bin/shared/config-defaults.manifest.json +3 -0
  32. package/gsd-core/bin/shared/config-schema.manifest.json +2 -1
  33. package/gsd-core/references/untrusted-input-boundary.md +13 -0
  34. package/gsd-core/workflows/autonomous.md +53 -46
  35. package/gsd-core/workflows/complete-milestone.md +27 -8
  36. package/gsd-core/workflows/execute-phase.md +1 -1
  37. package/gsd-core/workflows/manager.md +17 -7
  38. package/gsd-core/workflows/new-project.md +78 -12
  39. package/gsd-core/workflows/profile-user.md +6 -2
  40. package/gsd-core/workflows/progress.md +37 -4
  41. package/gsd-core/workflows/quick.md +3 -1
  42. package/gsd-core/workflows/ship.md +3 -1
  43. package/gsd-core/workflows/spec-phase.md +3 -1
  44. package/gsd-core/workflows/transition.md +14 -12
  45. package/gsd-core/workflows/ui-review.md +2 -6
  46. package/gsd-core/workflows/verify-work.md +44 -0
  47. package/hooks/dist/gsd-read-injection-scanner.js +49 -25
  48. package/hooks/gsd-read-injection-scanner.js +49 -25
  49. package/hooks/hooks.json +1 -1
  50. package/package.json +1 -1
  51. package/scripts/check-alias-drift.cjs +5 -0
  52. package/scripts/prompt-injection-scan.sh +5 -0
@@ -10,7 +10,7 @@ const capabilities = {
10
10
  "ai-integration": {
11
11
  "id": "ai-integration",
12
12
  "role": "feature",
13
- "version": "1.6.0-rc.3",
13
+ "version": "1.6.0",
14
14
  "title": "AI design contract",
15
15
  "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.",
16
16
  "tier": "full",
@@ -63,7 +63,7 @@ const capabilities = {
63
63
  "antigravity": {
64
64
  "id": "antigravity",
65
65
  "role": "runtime",
66
- "version": "1.6.0-rc.3",
66
+ "version": "1.6.0",
67
67
  "title": "Antigravity",
68
68
  "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.",
69
69
  "tier": "core",
@@ -123,7 +123,7 @@ const capabilities = {
123
123
  "audit": {
124
124
  "id": "audit",
125
125
  "role": "feature",
126
- "version": "1.6.0-rc.3",
126
+ "version": "1.6.0",
127
127
  "title": "Audit",
128
128
  "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).",
129
129
  "tier": "full",
@@ -160,7 +160,7 @@ const capabilities = {
160
160
  "augment": {
161
161
  "id": "augment",
162
162
  "role": "runtime",
163
- "version": "1.6.0-rc.3",
163
+ "version": "1.6.0",
164
164
  "title": "Augment Code",
165
165
  "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
166
166
  "tier": "core",
@@ -229,7 +229,7 @@ const capabilities = {
229
229
  "claude": {
230
230
  "id": "claude",
231
231
  "role": "runtime",
232
- "version": "1.6.0-rc.3",
232
+ "version": "1.6.0",
233
233
  "title": "Claude Code",
234
234
  "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
235
235
  "tier": "core",
@@ -295,7 +295,7 @@ const capabilities = {
295
295
  "cline": {
296
296
  "id": "cline",
297
297
  "role": "runtime",
298
- "version": "1.6.0-rc.3",
298
+ "version": "1.6.0",
299
299
  "title": "Cline",
300
300
  "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
301
301
  "tier": "core",
@@ -338,7 +338,7 @@ const capabilities = {
338
338
  "code-review": {
339
339
  "id": "code-review",
340
340
  "role": "feature",
341
- "version": "1.6.0-rc.3",
341
+ "version": "1.6.0",
342
342
  "title": "Code review",
343
343
  "description": "Source-file code review and review-fix workflow support for completed execution work.",
344
344
  "tier": "full",
@@ -399,7 +399,7 @@ const capabilities = {
399
399
  "codebuddy": {
400
400
  "id": "codebuddy",
401
401
  "role": "runtime",
402
- "version": "1.6.0-rc.3",
402
+ "version": "1.6.0",
403
403
  "title": "CodeBuddy",
404
404
  "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
405
405
  "tier": "core",
@@ -468,7 +468,7 @@ const capabilities = {
468
468
  "codex": {
469
469
  "id": "codex",
470
470
  "role": "runtime",
471
- "version": "1.6.0-rc.3",
471
+ "version": "1.6.0",
472
472
  "title": "OpenAI Codex CLI",
473
473
  "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
474
474
  "tier": "core",
@@ -521,7 +521,7 @@ const capabilities = {
521
521
  "copilot": {
522
522
  "id": "copilot",
523
523
  "role": "runtime",
524
- "version": "1.6.0-rc.3",
524
+ "version": "1.6.0",
525
525
  "title": "GitHub Copilot",
526
526
  "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.",
527
527
  "tier": "core",
@@ -574,7 +574,7 @@ const capabilities = {
574
574
  "cursor": {
575
575
  "id": "cursor",
576
576
  "role": "runtime",
577
- "version": "1.6.0-rc.3",
577
+ "version": "1.6.0",
578
578
  "title": "Cursor",
579
579
  "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
580
580
  "tier": "core",
@@ -643,7 +643,7 @@ const capabilities = {
643
643
  "drift": {
644
644
  "id": "drift",
645
645
  "role": "feature",
646
- "version": "1.6.0-rc.3",
646
+ "version": "1.6.0",
647
647
  "title": "Drift detection gates",
648
648
  "description": "Drift detection gates for the planning loop. 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). At plan:pre: a non-blocking, warn-only codebase drift gate (gated on workflow.plan_drift_precheck) that flags a stale codebase map before planning, so plans are authored against a fresh STRUCTURE.md instead of discovering drift mid-execution.",
649
649
  "tier": "full",
@@ -721,7 +721,7 @@ const capabilities = {
721
721
  "gap-analysis": {
722
722
  "id": "gap-analysis",
723
723
  "role": "feature",
724
- "version": "1.6.0-rc.3",
724
+ "version": "1.6.0",
725
725
  "title": "Post-planning gap analysis",
726
726
  "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.",
727
727
  "tier": "standard",
@@ -762,7 +762,7 @@ const capabilities = {
762
762
  "gemini": {
763
763
  "id": "gemini",
764
764
  "role": "runtime",
765
- "version": "1.6.0-rc.3",
765
+ "version": "1.6.0",
766
766
  "title": "Gemini CLI",
767
767
  "description": "Google Gemini CLI — commands-only artifact layout (TOML); Gemini hook event dialect; settings-json hook surface; tier-2 support.",
768
768
  "tier": "core",
@@ -819,7 +819,7 @@ const capabilities = {
819
819
  "graphify": {
820
820
  "id": "graphify",
821
821
  "role": "feature",
822
- "version": "1.6.0-rc.3",
822
+ "version": "1.6.0",
823
823
  "title": "Knowledge graph",
824
824
  "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.",
825
825
  "tier": "full",
@@ -860,7 +860,7 @@ const capabilities = {
860
860
  "hermes": {
861
861
  "id": "hermes",
862
862
  "role": "runtime",
863
- "version": "1.6.0-rc.3",
863
+ "version": "1.6.0",
864
864
  "title": "Hermes Agent",
865
865
  "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
866
866
  "tier": "core",
@@ -913,7 +913,7 @@ const capabilities = {
913
913
  "intel": {
914
914
  "id": "intel",
915
915
  "role": "feature",
916
- "version": "1.6.0-rc.3",
916
+ "version": "1.6.0",
917
917
  "title": "Codebase intelligence",
918
918
  "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`.",
919
919
  "tier": "full",
@@ -965,7 +965,7 @@ const capabilities = {
965
965
  "kilo": {
966
966
  "id": "kilo",
967
967
  "role": "runtime",
968
- "version": "1.6.0-rc.3",
968
+ "version": "1.6.0",
969
969
  "title": "Kilo Code",
970
970
  "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.",
971
971
  "tier": "core",
@@ -1040,7 +1040,7 @@ const capabilities = {
1040
1040
  "kimi": {
1041
1041
  "id": "kimi",
1042
1042
  "role": "runtime",
1043
- "version": "1.6.0-rc.3",
1043
+ "version": "1.6.0",
1044
1044
  "title": "Kimi CLI",
1045
1045
  "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.",
1046
1046
  "tier": "core",
@@ -1096,7 +1096,7 @@ const capabilities = {
1096
1096
  "mempalace": {
1097
1097
  "id": "mempalace",
1098
1098
  "role": "feature",
1099
- "version": "1.6.0-rc.3",
1099
+ "version": "1.6.0",
1100
1100
  "title": "MemPalace memory",
1101
1101
  "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.",
1102
1102
  "tier": "full",
@@ -1270,7 +1270,7 @@ const capabilities = {
1270
1270
  "nyquist": {
1271
1271
  "id": "nyquist",
1272
1272
  "role": "feature",
1273
- "version": "1.6.0-rc.3",
1273
+ "version": "1.6.0",
1274
1274
  "title": "Nyquist validation",
1275
1275
  "description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
1276
1276
  "tier": "full",
@@ -1320,7 +1320,7 @@ const capabilities = {
1320
1320
  "opencode": {
1321
1321
  "id": "opencode",
1322
1322
  "role": "runtime",
1323
- "version": "1.6.0-rc.3",
1323
+ "version": "1.6.0",
1324
1324
  "title": "OpenCode",
1325
1325
  "description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
1326
1326
  "tier": "core",
@@ -1390,7 +1390,7 @@ const capabilities = {
1390
1390
  "pattern-mapper": {
1391
1391
  "id": "pattern-mapper",
1392
1392
  "role": "feature",
1393
- "version": "1.6.0-rc.3",
1393
+ "version": "1.6.0",
1394
1394
  "title": "Pattern mapping",
1395
1395
  "description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
1396
1396
  "tier": "full",
@@ -1444,7 +1444,7 @@ const capabilities = {
1444
1444
  "profile-pipeline": {
1445
1445
  "id": "profile-pipeline",
1446
1446
  "role": "feature",
1447
- "version": "1.6.0-rc.3",
1447
+ "version": "1.6.0",
1448
1448
  "title": "Developer profiling pipeline",
1449
1449
  "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.",
1450
1450
  "tier": "full",
@@ -1521,7 +1521,7 @@ const capabilities = {
1521
1521
  "qwen": {
1522
1522
  "id": "qwen",
1523
1523
  "role": "runtime",
1524
- "version": "1.6.0-rc.3",
1524
+ "version": "1.6.0",
1525
1525
  "title": "Qwen Code",
1526
1526
  "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
1527
1527
  "tier": "core",
@@ -1578,7 +1578,7 @@ const capabilities = {
1578
1578
  "research": {
1579
1579
  "id": "research",
1580
1580
  "role": "feature",
1581
- "version": "1.6.0-rc.3",
1581
+ "version": "1.6.0",
1582
1582
  "title": "Phase research",
1583
1583
  "description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
1584
1584
  "tier": "standard",
@@ -1630,7 +1630,7 @@ const capabilities = {
1630
1630
  "schema-gate": {
1631
1631
  "id": "schema-gate",
1632
1632
  "role": "feature",
1633
- "version": "1.6.0-rc.3",
1633
+ "version": "1.6.0",
1634
1634
  "title": "Schema push detection gate",
1635
1635
  "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.",
1636
1636
  "tier": "full",
@@ -1676,7 +1676,7 @@ const capabilities = {
1676
1676
  "security": {
1677
1677
  "id": "security",
1678
1678
  "role": "feature",
1679
- "version": "1.6.0-rc.3",
1679
+ "version": "1.6.0",
1680
1680
  "title": "Security enforcement",
1681
1681
  "description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
1682
1682
  "tier": "full",
@@ -1775,7 +1775,7 @@ const capabilities = {
1775
1775
  "tdd": {
1776
1776
  "id": "tdd",
1777
1777
  "role": "feature",
1778
- "version": "1.6.0-rc.3",
1778
+ "version": "1.6.0",
1779
1779
  "title": "Test-driven development",
1780
1780
  "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.",
1781
1781
  "tier": "full",
@@ -1828,7 +1828,7 @@ const capabilities = {
1828
1828
  "trae": {
1829
1829
  "id": "trae",
1830
1830
  "role": "runtime",
1831
- "version": "1.6.0-rc.3",
1831
+ "version": "1.6.0",
1832
1832
  "title": "Trae IDE",
1833
1833
  "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
1834
1834
  "tier": "core",
@@ -1880,7 +1880,7 @@ const capabilities = {
1880
1880
  "ui": {
1881
1881
  "id": "ui",
1882
1882
  "role": "feature",
1883
- "version": "1.6.0-rc.3",
1883
+ "version": "1.6.0",
1884
1884
  "title": "UI design contracts",
1885
1885
  "description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
1886
1886
  "tier": "full",
@@ -1975,7 +1975,7 @@ const capabilities = {
1975
1975
  "windsurf": {
1976
1976
  "id": "windsurf",
1977
1977
  "role": "runtime",
1978
- "version": "1.6.0-rc.3",
1978
+ "version": "1.6.0",
1979
1979
  "title": "Windsurf",
1980
1980
  "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.",
1981
1981
  "tier": "core",
@@ -2743,7 +2743,7 @@ const runtimes = {
2743
2743
  "antigravity": {
2744
2744
  "id": "antigravity",
2745
2745
  "role": "runtime",
2746
- "version": "1.6.0-rc.3",
2746
+ "version": "1.6.0",
2747
2747
  "title": "Antigravity",
2748
2748
  "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.",
2749
2749
  "tier": "core",
@@ -2803,7 +2803,7 @@ const runtimes = {
2803
2803
  "augment": {
2804
2804
  "id": "augment",
2805
2805
  "role": "runtime",
2806
- "version": "1.6.0-rc.3",
2806
+ "version": "1.6.0",
2807
2807
  "title": "Augment Code",
2808
2808
  "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
2809
2809
  "tier": "core",
@@ -2872,7 +2872,7 @@ const runtimes = {
2872
2872
  "claude": {
2873
2873
  "id": "claude",
2874
2874
  "role": "runtime",
2875
- "version": "1.6.0-rc.3",
2875
+ "version": "1.6.0",
2876
2876
  "title": "Claude Code",
2877
2877
  "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
2878
2878
  "tier": "core",
@@ -2938,7 +2938,7 @@ const runtimes = {
2938
2938
  "cline": {
2939
2939
  "id": "cline",
2940
2940
  "role": "runtime",
2941
- "version": "1.6.0-rc.3",
2941
+ "version": "1.6.0",
2942
2942
  "title": "Cline",
2943
2943
  "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
2944
2944
  "tier": "core",
@@ -2981,7 +2981,7 @@ const runtimes = {
2981
2981
  "codebuddy": {
2982
2982
  "id": "codebuddy",
2983
2983
  "role": "runtime",
2984
- "version": "1.6.0-rc.3",
2984
+ "version": "1.6.0",
2985
2985
  "title": "CodeBuddy",
2986
2986
  "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
2987
2987
  "tier": "core",
@@ -3050,7 +3050,7 @@ const runtimes = {
3050
3050
  "codex": {
3051
3051
  "id": "codex",
3052
3052
  "role": "runtime",
3053
- "version": "1.6.0-rc.3",
3053
+ "version": "1.6.0",
3054
3054
  "title": "OpenAI Codex CLI",
3055
3055
  "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
3056
3056
  "tier": "core",
@@ -3103,7 +3103,7 @@ const runtimes = {
3103
3103
  "copilot": {
3104
3104
  "id": "copilot",
3105
3105
  "role": "runtime",
3106
- "version": "1.6.0-rc.3",
3106
+ "version": "1.6.0",
3107
3107
  "title": "GitHub Copilot",
3108
3108
  "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.",
3109
3109
  "tier": "core",
@@ -3156,7 +3156,7 @@ const runtimes = {
3156
3156
  "cursor": {
3157
3157
  "id": "cursor",
3158
3158
  "role": "runtime",
3159
- "version": "1.6.0-rc.3",
3159
+ "version": "1.6.0",
3160
3160
  "title": "Cursor",
3161
3161
  "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
3162
3162
  "tier": "core",
@@ -3225,7 +3225,7 @@ const runtimes = {
3225
3225
  "gemini": {
3226
3226
  "id": "gemini",
3227
3227
  "role": "runtime",
3228
- "version": "1.6.0-rc.3",
3228
+ "version": "1.6.0",
3229
3229
  "title": "Gemini CLI",
3230
3230
  "description": "Google Gemini CLI — commands-only artifact layout (TOML); Gemini hook event dialect; settings-json hook surface; tier-2 support.",
3231
3231
  "tier": "core",
@@ -3282,7 +3282,7 @@ const runtimes = {
3282
3282
  "hermes": {
3283
3283
  "id": "hermes",
3284
3284
  "role": "runtime",
3285
- "version": "1.6.0-rc.3",
3285
+ "version": "1.6.0",
3286
3286
  "title": "Hermes Agent",
3287
3287
  "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
3288
3288
  "tier": "core",
@@ -3335,7 +3335,7 @@ const runtimes = {
3335
3335
  "kilo": {
3336
3336
  "id": "kilo",
3337
3337
  "role": "runtime",
3338
- "version": "1.6.0-rc.3",
3338
+ "version": "1.6.0",
3339
3339
  "title": "Kilo Code",
3340
3340
  "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.",
3341
3341
  "tier": "core",
@@ -3410,7 +3410,7 @@ const runtimes = {
3410
3410
  "kimi": {
3411
3411
  "id": "kimi",
3412
3412
  "role": "runtime",
3413
- "version": "1.6.0-rc.3",
3413
+ "version": "1.6.0",
3414
3414
  "title": "Kimi CLI",
3415
3415
  "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.",
3416
3416
  "tier": "core",
@@ -3466,7 +3466,7 @@ const runtimes = {
3466
3466
  "opencode": {
3467
3467
  "id": "opencode",
3468
3468
  "role": "runtime",
3469
- "version": "1.6.0-rc.3",
3469
+ "version": "1.6.0",
3470
3470
  "title": "OpenCode",
3471
3471
  "description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
3472
3472
  "tier": "core",
@@ -3536,7 +3536,7 @@ const runtimes = {
3536
3536
  "qwen": {
3537
3537
  "id": "qwen",
3538
3538
  "role": "runtime",
3539
- "version": "1.6.0-rc.3",
3539
+ "version": "1.6.0",
3540
3540
  "title": "Qwen Code",
3541
3541
  "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
3542
3542
  "tier": "core",
@@ -3593,7 +3593,7 @@ const runtimes = {
3593
3593
  "trae": {
3594
3594
  "id": "trae",
3595
3595
  "role": "runtime",
3596
- "version": "1.6.0-rc.3",
3596
+ "version": "1.6.0",
3597
3597
  "title": "Trae IDE",
3598
3598
  "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
3599
3599
  "tier": "core",
@@ -3645,7 +3645,7 @@ const runtimes = {
3645
3645
  "windsurf": {
3646
3646
  "id": "windsurf",
3647
3647
  "role": "runtime",
3648
- "version": "1.6.0-rc.3",
3648
+ "version": "1.6.0",
3649
3649
  "title": "Windsurf",
3650
3650
  "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.",
3651
3651
  "tier": "core",
@@ -7,7 +7,7 @@
7
7
  * from the prior hand-written .cjs; only types are added.
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.ROADMAP_SUBCOMMANDS = exports.VALIDATE_SUBCOMMANDS = exports.PHASES_SUBCOMMANDS = exports.PHASE_SUBCOMMANDS = exports.INIT_SUBCOMMANDS = exports.VERIFY_SUBCOMMANDS = exports.STATE_SUBCOMMANDS = exports.NON_FAMILY_COMMAND_ALIASES = exports.ROADMAP_COMMAND_ALIASES = exports.VALIDATE_COMMAND_ALIASES = exports.PHASES_COMMAND_ALIASES = exports.PHASE_COMMAND_ALIASES = exports.INIT_COMMAND_ALIASES = exports.VERIFY_COMMAND_ALIASES = exports.STATE_COMMAND_ALIASES = void 0;
10
+ exports.EVAL_SUBCOMMANDS = exports.EVAL_COMMAND_ALIASES = exports.ROADMAP_SUBCOMMANDS = exports.VALIDATE_SUBCOMMANDS = exports.PHASES_SUBCOMMANDS = exports.PHASE_SUBCOMMANDS = exports.INIT_SUBCOMMANDS = exports.VERIFY_SUBCOMMANDS = exports.STATE_SUBCOMMANDS = exports.NON_FAMILY_COMMAND_ALIASES = exports.ROADMAP_COMMAND_ALIASES = exports.VALIDATE_COMMAND_ALIASES = exports.PHASES_COMMAND_ALIASES = exports.PHASE_COMMAND_ALIASES = exports.INIT_COMMAND_ALIASES = exports.VERIFY_COMMAND_ALIASES = exports.STATE_COMMAND_ALIASES = void 0;
11
11
  exports.STATE_COMMAND_ALIASES = [
12
12
  {
13
13
  "canonical": "state.load",
@@ -815,3 +815,12 @@ exports.PHASE_SUBCOMMANDS = exports.PHASE_COMMAND_ALIASES.map((entry) => entry.s
815
815
  exports.PHASES_SUBCOMMANDS = exports.PHASES_COMMAND_ALIASES.map((entry) => entry.subcommand);
816
816
  exports.VALIDATE_SUBCOMMANDS = exports.VALIDATE_COMMAND_ALIASES.map((entry) => entry.subcommand);
817
817
  exports.ROADMAP_SUBCOMMANDS = exports.ROADMAP_COMMAND_ALIASES.map((entry) => entry.subcommand);
818
+ exports.EVAL_COMMAND_ALIASES = [
819
+ {
820
+ "canonical": "eval.score",
821
+ "aliases": ["eval score"],
822
+ "subcommand": "score",
823
+ "mutation": false
824
+ }
825
+ ];
826
+ exports.EVAL_SUBCOMMANDS = exports.EVAL_COMMAND_ALIASES.map((entry) => entry.subcommand);
@@ -42,6 +42,18 @@ const bulletColonRe = /^\s*-\s+\*\*D-([A-Za-z0-9][A-Za-z0-9_-]*)(?:\s*\[([^\]]+)
42
42
  * Accepts both U+2014 em-dash (—) and U+2013 en-dash (–) for robustness.
43
43
  */
44
44
  const bulletEmDashRe = /^\s*-\s+\*\*D-([A-Za-z0-9][A-Za-z0-9_-]*)(?:\s*\[([^\]]+)\])?[^*]*[—–][^*]*\*\*\s*(.*)$/;
45
+ /**
46
+ * Titled-colon form: `- **D-NN[ [tags]]: Title.** body`
47
+ * A title sits between the colon and the closing `**` (so the `:**` anchor of
48
+ * bulletColonRe fails, and there is no em-dash for bulletEmDashRe). This is a strict
49
+ * superset of the colon-immediate form, so it MUST be checked AFTER bulletColonRe and
50
+ * bulletEmDashRe — it only catches bullets those two miss. The title run is `[^:*]*` (no
51
+ * colon, no `*`) so a genuinely-malformed bullet with a colon in the pre-separator run
52
+ * (e.g. `D-07 ratio 3:1:**`) still fails the anchor and falls through to the parse-miss
53
+ * guard — matching bulletColonRe's `[^:*]*` discipline that the separator colon is the
54
+ * only colon permitted before `**`. (#1639)
55
+ */
56
+ const bulletTitledColonRe = /^\s*-\s+\*\*D-([A-Za-z0-9][A-Za-z0-9_-]*)(?:\s*\[([^\]]+)\])?[^:*]*:[^:*]*\*\*\s*(.*)$/;
45
57
  /**
46
58
  * Parse decision lines from a block of text (the inner text of a <decisions>
47
59
  * or markdown-header section body). Returns the extracted decisions and a count
@@ -110,6 +122,21 @@ function parseDecisionLines(block) {
110
122
  current = { id, text: emDashMatch[3] || '', category, tags, trackable };
111
123
  continue;
112
124
  }
125
+ // Titled-colon form: `- **D-NN[ [tags]]: Title.** body` (#1639). Checked LAST — it is
126
+ // a strict superset of bulletColonRe, so it only catches bullets the colon-immediate
127
+ // and em-dash forms missed (minimal blast radius). id + [tags] trackability honored;
128
+ // the body after the closing bold run is reported as text.
129
+ const titledColonMatch = line.match(bulletTitledColonRe);
130
+ if (titledColonMatch) {
131
+ flush();
132
+ const id = `D-${titledColonMatch[1]}`;
133
+ const tags = titledColonMatch[2]
134
+ ? titledColonMatch[2].split(',').map((t) => t.trim().toLowerCase()).filter(Boolean)
135
+ : [];
136
+ const trackable = !inDiscretion && !tags.some((t) => NON_TRACKABLE_TAGS.has(t));
137
+ current = { id, text: titledColonMatch[3] || '', category, tags, trackable };
138
+ continue;
139
+ }
113
140
  // Parse-miss guard (FIX B + #1343): a line that looks like a `D-NN` decision
114
141
  // bullet but failed both patterns — flush, warn, and record the miss.
115
142
  // parseMisses > 0 forces could-not-parse even when other decisions parsed.
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Manifest-backed eval subcommand router (#10).
4
+ */
5
+ const command_aliases_cjs_1 = require("./command-aliases.cjs");
6
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
7
+ const cjsCommandRouterAdapter = require("./cjs-command-router-adapter.cjs");
8
+ const { routeCjsCommandFamily } = cjsCommandRouterAdapter;
9
+ function routeEvalCommand({ evalMod, args, cwd, raw, error }) {
10
+ routeCjsCommandFamily({
11
+ args,
12
+ subcommands: command_aliases_cjs_1.EVAL_SUBCOMMANDS,
13
+ unsupported: {},
14
+ error,
15
+ unknownMessage: (_s, available) => `Unknown eval subcommand. Available: ${available.join(', ')}`,
16
+ handlers: {
17
+ score: () => evalMod.cmdEvalScore(cwd, args, raw),
18
+ },
19
+ });
20
+ }
21
+ module.exports = { routeEvalCommand };
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ /**
3
+ * Deterministic eval scoring verb (#10).
4
+ * Moves coverage/infra/overall arithmetic out of the gsd-eval-auditor prompt
5
+ * into code, per the framework's code-delegation discipline.
6
+ */
7
+ function parseFlag(args, flag) {
8
+ const i = args.indexOf(flag);
9
+ return i >= 0 && i + 1 < args.length ? args[i + 1] : undefined;
10
+ }
11
+ const INFRA_VALUE = { ok: 1, partial: 0.5, missing: 0 };
12
+ const INFRA_TOKENS = new Set(Object.keys(INFRA_VALUE));
13
+ function computeEvalScore(covered, total, infra) {
14
+ const coverage = total > 0 ? (covered / total) * 100 : 0;
15
+ // unknown/typo tokens are treated as `missing` (score 0) by design — upstream agent only passes ok|partial|missing
16
+ const infraSum = infra.reduce((acc, s) => acc + (INFRA_VALUE[s.trim().toLowerCase()] ?? 0), 0);
17
+ const infraScore = (infraSum / 5) * 100;
18
+ const overall = coverage * 0.6 + infraScore * 0.4;
19
+ const round = (n) => Math.round(n * 100) / 100;
20
+ const o = round(overall);
21
+ const verdict = o >= 80 ? 'PRODUCTION READY' :
22
+ o >= 60 ? 'NEEDS WORK' :
23
+ o >= 40 ? 'SIGNIFICANT GAPS' : 'NOT IMPLEMENTED';
24
+ return { coverage_score: round(coverage), infra_score: round(infraScore), overall_score: o, verdict };
25
+ }
26
+ function cmdEvalScore(_cwd, args, raw) {
27
+ const coveredRaw = parseFlag(args, '--covered');
28
+ const totalRaw = parseFlag(args, '--total');
29
+ const infraRaw = parseFlag(args, '--infra') || '';
30
+ const infra = infraRaw ? infraRaw.split(',').map((s) => s.trim().toLowerCase()) : [];
31
+ const covered = Number(coveredRaw);
32
+ const total = Number(totalRaw);
33
+ if (coveredRaw === undefined || coveredRaw.trim() === '' ||
34
+ totalRaw === undefined || totalRaw.trim() === '' ||
35
+ !Number.isFinite(covered) || !Number.isFinite(total) ||
36
+ infra.length !== 5) {
37
+ process.stderr.write('Usage: gsd-tools query eval.score --covered N --total N --infra a,b,c,d,e (each ok|partial|missing)\n');
38
+ process.exitCode = 1;
39
+ return;
40
+ }
41
+ // Domain validation: this is a public CLI verb, so reject out-of-domain inputs
42
+ // rather than emit nonsense (covered>total -> coverage_score>100; negatives ->
43
+ // negative scores). Counts must be non-negative integers and covered cannot
44
+ // exceed total; infra tokens must match the documented ok|partial|missing set.
45
+ if (!Number.isInteger(covered) || !Number.isInteger(total) || covered < 0 || total < 0 || covered > total) {
46
+ process.stderr.write('Invalid eval.score domain: require integer counts with 0 <= covered <= total.\n');
47
+ process.exitCode = 1;
48
+ return;
49
+ }
50
+ const invalidInfra = infra.find((s) => !INFRA_TOKENS.has(s));
51
+ if (invalidInfra !== undefined) {
52
+ process.stderr.write(`Invalid eval.score infra token: ${invalidInfra || '<empty>'}. Expected ok|partial|missing.\n`);
53
+ process.exitCode = 1;
54
+ return;
55
+ }
56
+ const result = computeEvalScore(covered, total, infra);
57
+ process.stdout.write(raw ? JSON.stringify(result) : JSON.stringify(result, null, 2));
58
+ process.stdout.write('\n');
59
+ }
60
+ module.exports = { cmdEvalScore, computeEvalScore };