@opengsd/gsd-core 1.9.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/agents/gsd-code-fixer.md +106 -33
- package/bin/install.js +50 -52
- package/gsd-core/bin/gsd-tools.cjs +33 -2
- package/gsd-core/bin/lib/capability-registry.cjs +63 -63
- package/gsd-core/bin/lib/milestone.cjs +31 -4
- package/gsd-core/bin/lib/phase.cjs +4 -1
- package/gsd-core/bin/lib/project-root.cjs +48 -0
- package/gsd-core/bin/lib/verify.cjs +19 -3
- package/gsd-core/workflows/code-review.md +17 -2
- package/package.json +1 -1
- package/scripts/gen-registry.cjs +39 -15
- package/scripts/registry-schema.cjs +323 -94
- package/scripts/validate-registry.cjs +10 -6
- package/vscode/package.json +1 -1
|
@@ -10,7 +10,7 @@ const capabilities = {
|
|
|
10
10
|
"ai-integration": {
|
|
11
11
|
"id": "ai-integration",
|
|
12
12
|
"role": "feature",
|
|
13
|
-
"version": "1.9.
|
|
13
|
+
"version": "1.9.1",
|
|
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",
|
|
@@ -95,7 +95,7 @@ const capabilities = {
|
|
|
95
95
|
"antigravity": {
|
|
96
96
|
"id": "antigravity",
|
|
97
97
|
"role": "runtime",
|
|
98
|
-
"version": "1.9.
|
|
98
|
+
"version": "1.9.1",
|
|
99
99
|
"title": "Antigravity",
|
|
100
100
|
"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.",
|
|
101
101
|
"tier": "core",
|
|
@@ -239,7 +239,7 @@ const capabilities = {
|
|
|
239
239
|
"assumption-delta": {
|
|
240
240
|
"id": "assumption-delta",
|
|
241
241
|
"role": "feature",
|
|
242
|
-
"version": "1.9.
|
|
242
|
+
"version": "1.9.1",
|
|
243
243
|
"title": "Assumption-delta architecture checkpoint",
|
|
244
244
|
"description": "Rarely-firing advisory checkpoint that triggers when a phase makes something plural, optional, or chosen that used to be singular, required, or derived. Surfaces one identity-model question (promote the new general representation to primary, or add it alongside?) so a silent primary-key drift does not accumulate into a later user-facing bug. Non-blocking; fires only on a detected signal.",
|
|
245
245
|
"tier": "full",
|
|
@@ -285,7 +285,7 @@ const capabilities = {
|
|
|
285
285
|
"audit": {
|
|
286
286
|
"id": "audit",
|
|
287
287
|
"role": "feature",
|
|
288
|
-
"version": "1.9.
|
|
288
|
+
"version": "1.9.1",
|
|
289
289
|
"title": "Audit",
|
|
290
290
|
"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).",
|
|
291
291
|
"tier": "full",
|
|
@@ -322,7 +322,7 @@ const capabilities = {
|
|
|
322
322
|
"augment": {
|
|
323
323
|
"id": "augment",
|
|
324
324
|
"role": "runtime",
|
|
325
|
-
"version": "1.9.
|
|
325
|
+
"version": "1.9.1",
|
|
326
326
|
"title": "Augment Code",
|
|
327
327
|
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
328
328
|
"tier": "core",
|
|
@@ -431,7 +431,7 @@ const capabilities = {
|
|
|
431
431
|
"broken-windows": {
|
|
432
432
|
"id": "broken-windows",
|
|
433
433
|
"role": "feature",
|
|
434
|
-
"version": "1.9.
|
|
434
|
+
"version": "1.9.1",
|
|
435
435
|
"title": "Broken-windows ledger",
|
|
436
436
|
"description": "Cross-phase defect register accumulating stubs, TODOs, skipped tests, unrun verifies, and unmet truths into .planning/WINDOWS.md. Blocks /gsd-ship while any window is open unless explicitly waived with a recorded reason. Operationalizes GSD's no-defer discipline as a tracked, enforced artifact (issue #1950).",
|
|
437
437
|
"tier": "full",
|
|
@@ -477,7 +477,7 @@ const capabilities = {
|
|
|
477
477
|
"claude": {
|
|
478
478
|
"id": "claude",
|
|
479
479
|
"role": "runtime",
|
|
480
|
-
"version": "1.9.
|
|
480
|
+
"version": "1.9.1",
|
|
481
481
|
"title": "Claude Code",
|
|
482
482
|
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
|
483
483
|
"tier": "core",
|
|
@@ -624,7 +624,7 @@ const capabilities = {
|
|
|
624
624
|
"claude-orchestration": {
|
|
625
625
|
"id": "claude-orchestration",
|
|
626
626
|
"role": "feature",
|
|
627
|
-
"version": "1.9.
|
|
627
|
+
"version": "1.9.1",
|
|
628
628
|
"title": "Claude orchestration (Workflow backend)",
|
|
629
629
|
"description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the wave parallelism the #853 backgrounded-agent nesting limitation forces inline on Claude Code. (The plan-checker and verifier remain inline until separately wired — this capability delivers the parallel-execution backend, not those gates.) Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.",
|
|
630
630
|
"tier": "full",
|
|
@@ -712,7 +712,7 @@ const capabilities = {
|
|
|
712
712
|
"cline": {
|
|
713
713
|
"id": "cline",
|
|
714
714
|
"role": "runtime",
|
|
715
|
-
"version": "1.9.
|
|
715
|
+
"version": "1.9.1",
|
|
716
716
|
"title": "Cline",
|
|
717
717
|
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
|
718
718
|
"tier": "core",
|
|
@@ -783,7 +783,7 @@ const capabilities = {
|
|
|
783
783
|
"code-review": {
|
|
784
784
|
"id": "code-review",
|
|
785
785
|
"role": "feature",
|
|
786
|
-
"version": "1.9.
|
|
786
|
+
"version": "1.9.1",
|
|
787
787
|
"title": "Code review",
|
|
788
788
|
"description": "Source-file code review and review-fix workflow support for completed execution work.",
|
|
789
789
|
"tier": "full",
|
|
@@ -844,7 +844,7 @@ const capabilities = {
|
|
|
844
844
|
"codebuddy": {
|
|
845
845
|
"id": "codebuddy",
|
|
846
846
|
"role": "runtime",
|
|
847
|
-
"version": "1.9.
|
|
847
|
+
"version": "1.9.1",
|
|
848
848
|
"title": "CodeBuddy",
|
|
849
849
|
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
850
850
|
"tier": "core",
|
|
@@ -957,7 +957,7 @@ const capabilities = {
|
|
|
957
957
|
"coderabbit": {
|
|
958
958
|
"id": "coderabbit",
|
|
959
959
|
"role": "reviewer",
|
|
960
|
-
"version": "1.9.
|
|
960
|
+
"version": "1.9.1",
|
|
961
961
|
"title": "CodeRabbit",
|
|
962
962
|
"description": "CodeRabbit CLI — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). Reviews the working-tree diff (`coderabbit review --prompt-only`), not the source tree, and accepts neither a prompt nor a model flag; findings are down-weighted in consensus (evidenceClass: diff-only).",
|
|
963
963
|
"tier": "full",
|
|
@@ -999,7 +999,7 @@ const capabilities = {
|
|
|
999
999
|
"codex": {
|
|
1000
1000
|
"id": "codex",
|
|
1001
1001
|
"role": "runtime",
|
|
1002
|
-
"version": "1.9.
|
|
1002
|
+
"version": "1.9.1",
|
|
1003
1003
|
"title": "OpenAI Codex CLI",
|
|
1004
1004
|
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
|
1005
1005
|
"tier": "core",
|
|
@@ -1137,7 +1137,7 @@ const capabilities = {
|
|
|
1137
1137
|
"copilot": {
|
|
1138
1138
|
"id": "copilot",
|
|
1139
1139
|
"role": "runtime",
|
|
1140
|
-
"version": "1.9.
|
|
1140
|
+
"version": "1.9.1",
|
|
1141
1141
|
"title": "GitHub Copilot",
|
|
1142
1142
|
"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.",
|
|
1143
1143
|
"tier": "core",
|
|
@@ -1232,7 +1232,7 @@ const capabilities = {
|
|
|
1232
1232
|
"cursor": {
|
|
1233
1233
|
"id": "cursor",
|
|
1234
1234
|
"role": "runtime",
|
|
1235
|
-
"version": "1.9.
|
|
1235
|
+
"version": "1.9.1",
|
|
1236
1236
|
"title": "Cursor",
|
|
1237
1237
|
"description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
1238
1238
|
"tier": "core",
|
|
@@ -1391,7 +1391,7 @@ const capabilities = {
|
|
|
1391
1391
|
"drift": {
|
|
1392
1392
|
"id": "drift",
|
|
1393
1393
|
"role": "feature",
|
|
1394
|
-
"version": "1.9.
|
|
1394
|
+
"version": "1.9.1",
|
|
1395
1395
|
"title": "Drift detection gates",
|
|
1396
1396
|
"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.",
|
|
1397
1397
|
"tier": "full",
|
|
@@ -1469,7 +1469,7 @@ const capabilities = {
|
|
|
1469
1469
|
"external-job": {
|
|
1470
1470
|
"id": "external-job",
|
|
1471
1471
|
"role": "feature",
|
|
1472
|
-
"version": "1.9.
|
|
1472
|
+
"version": "1.9.1",
|
|
1473
1473
|
"title": "Async external-job scheduler adapter",
|
|
1474
1474
|
"description": "Default-off producer of the async external-job manifest (#1164). At execute:wave:post an executor can externalize long-running compute (SLURM first, scheduler-pluggable), commit a .planning/async-jobs/<job>.json manifest, defer SUMMARY.md, and return external_job_waiting. The core loop (#1165) consumes the manifest; this capability is the only thing that writes it. NOTE on contribution point: #1164 specifies execute:wave:pre, but execute-phase.md only dispatches execute:wave:post today (wave:pre is declared in the loop host contract but not rendered); wiring wave:pre dispatch is a core-loop change #1164 explicitly puts out of scope, so this capability registers at wave:post and the executor honors the runtime_budget classification guidance before running any tagged task. The adapter (scripts/slurm-adapter.cjs) reads external_job.submit_timeout_ms / poll_timeout_ms / artifact_dir through the canonical capability-config seam (env override > config > registry default).",
|
|
1475
1475
|
"tier": "full",
|
|
@@ -1552,7 +1552,7 @@ const capabilities = {
|
|
|
1552
1552
|
"gap-analysis": {
|
|
1553
1553
|
"id": "gap-analysis",
|
|
1554
1554
|
"role": "feature",
|
|
1555
|
-
"version": "1.9.
|
|
1555
|
+
"version": "1.9.1",
|
|
1556
1556
|
"title": "Post-planning gap analysis",
|
|
1557
1557
|
"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.",
|
|
1558
1558
|
"tier": "standard",
|
|
@@ -1593,7 +1593,7 @@ const capabilities = {
|
|
|
1593
1593
|
"gemini": {
|
|
1594
1594
|
"id": "gemini",
|
|
1595
1595
|
"role": "reviewer",
|
|
1596
|
-
"version": "1.9.
|
|
1596
|
+
"version": "1.9.1",
|
|
1597
1597
|
"title": "Gemini CLI",
|
|
1598
1598
|
"description": "Google Gemini CLI — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). Spawned as `gemini -p - -m <model>` with the plan piped on stdin.",
|
|
1599
1599
|
"tier": "full",
|
|
@@ -1643,7 +1643,7 @@ const capabilities = {
|
|
|
1643
1643
|
"graphify": {
|
|
1644
1644
|
"id": "graphify",
|
|
1645
1645
|
"role": "feature",
|
|
1646
|
-
"version": "1.9.
|
|
1646
|
+
"version": "1.9.1",
|
|
1647
1647
|
"title": "Knowledge graph",
|
|
1648
1648
|
"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.",
|
|
1649
1649
|
"tier": "full",
|
|
@@ -1684,7 +1684,7 @@ const capabilities = {
|
|
|
1684
1684
|
"hermes": {
|
|
1685
1685
|
"id": "hermes",
|
|
1686
1686
|
"role": "runtime",
|
|
1687
|
-
"version": "1.9.
|
|
1687
|
+
"version": "1.9.1",
|
|
1688
1688
|
"title": "Hermes Agent",
|
|
1689
1689
|
"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.",
|
|
1690
1690
|
"tier": "core",
|
|
@@ -1775,7 +1775,7 @@ const capabilities = {
|
|
|
1775
1775
|
"intel": {
|
|
1776
1776
|
"id": "intel",
|
|
1777
1777
|
"role": "feature",
|
|
1778
|
-
"version": "1.9.
|
|
1778
|
+
"version": "1.9.1",
|
|
1779
1779
|
"title": "Codebase intelligence",
|
|
1780
1780
|
"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`.",
|
|
1781
1781
|
"tier": "full",
|
|
@@ -1827,7 +1827,7 @@ const capabilities = {
|
|
|
1827
1827
|
"kilo": {
|
|
1828
1828
|
"id": "kilo",
|
|
1829
1829
|
"role": "runtime",
|
|
1830
|
-
"version": "1.9.
|
|
1830
|
+
"version": "1.9.1",
|
|
1831
1831
|
"title": "Kilo Code",
|
|
1832
1832
|
"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.",
|
|
1833
1833
|
"tier": "core",
|
|
@@ -1936,7 +1936,7 @@ const capabilities = {
|
|
|
1936
1936
|
"kimi": {
|
|
1937
1937
|
"id": "kimi",
|
|
1938
1938
|
"role": "runtime",
|
|
1939
|
-
"version": "1.9.
|
|
1939
|
+
"version": "1.9.1",
|
|
1940
1940
|
"title": "Kimi CLI",
|
|
1941
1941
|
"description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; native config.toml [[hooks]] bus at ~/.kimi/config.toml; background dispatch; tier-2 support.",
|
|
1942
1942
|
"tier": "core",
|
|
@@ -2034,7 +2034,7 @@ const capabilities = {
|
|
|
2034
2034
|
"kimi-code": {
|
|
2035
2035
|
"id": "kimi-code",
|
|
2036
2036
|
"role": "runtime",
|
|
2037
|
-
"version": "1.9.
|
|
2037
|
+
"version": "1.9.1",
|
|
2038
2038
|
"title": "Kimi Code CLI",
|
|
2039
2039
|
"description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
|
|
2040
2040
|
"tier": "core",
|
|
@@ -2166,7 +2166,7 @@ const capabilities = {
|
|
|
2166
2166
|
"llama-cpp": {
|
|
2167
2167
|
"id": "llama-cpp",
|
|
2168
2168
|
"role": "reviewer",
|
|
2169
|
-
"version": "1.9.
|
|
2169
|
+
"version": "1.9.1",
|
|
2170
2170
|
"title": "llama.cpp",
|
|
2171
2171
|
"description": "llama.cpp server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.llama_cpp_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq. Capability id/folder are kebab (`llama-cpp`, required by KEBAB_RE); `reviewer.slug` stays snake (`llama_cpp`) to match the shipped roster and the `review.llama_cpp_host` config key (ADR-2782's three-namespace trap).",
|
|
2172
2172
|
"tier": "full",
|
|
@@ -2224,7 +2224,7 @@ const capabilities = {
|
|
|
2224
2224
|
"lm-studio": {
|
|
2225
2225
|
"id": "lm-studio",
|
|
2226
2226
|
"role": "reviewer",
|
|
2227
|
-
"version": "1.9.
|
|
2227
|
+
"version": "1.9.1",
|
|
2228
2228
|
"title": "LM Studio",
|
|
2229
2229
|
"description": "LM Studio local model server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.lm_studio_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq. Capability id/folder are kebab (`lm-studio`, required by KEBAB_RE); `reviewer.slug` stays snake (`lm_studio`) to match the shipped roster and the `review.lm_studio_host` config key (ADR-2782's three-namespace trap).",
|
|
2230
2230
|
"tier": "full",
|
|
@@ -2282,7 +2282,7 @@ const capabilities = {
|
|
|
2282
2282
|
"mempalace": {
|
|
2283
2283
|
"id": "mempalace",
|
|
2284
2284
|
"role": "feature",
|
|
2285
|
-
"version": "1.9.
|
|
2285
|
+
"version": "1.9.1",
|
|
2286
2286
|
"title": "MemPalace memory",
|
|
2287
2287
|
"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.",
|
|
2288
2288
|
"tier": "full",
|
|
@@ -2456,7 +2456,7 @@ const capabilities = {
|
|
|
2456
2456
|
"nyquist": {
|
|
2457
2457
|
"id": "nyquist",
|
|
2458
2458
|
"role": "feature",
|
|
2459
|
-
"version": "1.9.
|
|
2459
|
+
"version": "1.9.1",
|
|
2460
2460
|
"title": "Nyquist validation",
|
|
2461
2461
|
"description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
|
|
2462
2462
|
"tier": "full",
|
|
@@ -2506,7 +2506,7 @@ const capabilities = {
|
|
|
2506
2506
|
"ollama": {
|
|
2507
2507
|
"id": "ollama",
|
|
2508
2508
|
"role": "reviewer",
|
|
2509
|
-
"version": "1.9.
|
|
2509
|
+
"version": "1.9.1",
|
|
2510
2510
|
"title": "Ollama",
|
|
2511
2511
|
"description": "Ollama local model server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.ollama_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq.",
|
|
2512
2512
|
"tier": "full",
|
|
@@ -2564,7 +2564,7 @@ const capabilities = {
|
|
|
2564
2564
|
"opencode": {
|
|
2565
2565
|
"id": "opencode",
|
|
2566
2566
|
"role": "runtime",
|
|
2567
|
-
"version": "1.9.
|
|
2567
|
+
"version": "1.9.1",
|
|
2568
2568
|
"title": "OpenCode",
|
|
2569
2569
|
"description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
2570
2570
|
"tier": "core",
|
|
@@ -2721,7 +2721,7 @@ const capabilities = {
|
|
|
2721
2721
|
"pattern-mapper": {
|
|
2722
2722
|
"id": "pattern-mapper",
|
|
2723
2723
|
"role": "feature",
|
|
2724
|
-
"version": "1.9.
|
|
2724
|
+
"version": "1.9.1",
|
|
2725
2725
|
"title": "Pattern mapping",
|
|
2726
2726
|
"description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
|
|
2727
2727
|
"tier": "full",
|
|
@@ -2775,7 +2775,7 @@ const capabilities = {
|
|
|
2775
2775
|
"pi": {
|
|
2776
2776
|
"id": "pi",
|
|
2777
2777
|
"role": "runtime",
|
|
2778
|
-
"version": "1.9.
|
|
2778
|
+
"version": "1.9.1",
|
|
2779
2779
|
"title": "pi",
|
|
2780
2780
|
"description": "pi (pi.dev) — bun-runtime programmatic-CLI; TS ExtensionAPI (registerCommand/registerTool/registerProvider/pi.on); single native-extension file at ~/.pi/agent/extensions/gsd.js (.js, not .cjs — pi's extension auto-discovery accepts only .ts/.js, #2470); no shared-settings hook surface; tier-2 support.",
|
|
2781
2781
|
"tier": "core",
|
|
@@ -2837,7 +2837,7 @@ const capabilities = {
|
|
|
2837
2837
|
"profile-pipeline": {
|
|
2838
2838
|
"id": "profile-pipeline",
|
|
2839
2839
|
"role": "feature",
|
|
2840
|
-
"version": "1.9.
|
|
2840
|
+
"version": "1.9.1",
|
|
2841
2841
|
"title": "Developer profiling pipeline",
|
|
2842
2842
|
"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.",
|
|
2843
2843
|
"tier": "full",
|
|
@@ -2914,7 +2914,7 @@ const capabilities = {
|
|
|
2914
2914
|
"qwen": {
|
|
2915
2915
|
"id": "qwen",
|
|
2916
2916
|
"role": "runtime",
|
|
2917
|
-
"version": "1.9.
|
|
2917
|
+
"version": "1.9.1",
|
|
2918
2918
|
"title": "Qwen Code",
|
|
2919
2919
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
2920
2920
|
"tier": "core",
|
|
@@ -3050,7 +3050,7 @@ const capabilities = {
|
|
|
3050
3050
|
"research": {
|
|
3051
3051
|
"id": "research",
|
|
3052
3052
|
"role": "feature",
|
|
3053
|
-
"version": "1.9.
|
|
3053
|
+
"version": "1.9.1",
|
|
3054
3054
|
"title": "Phase research",
|
|
3055
3055
|
"description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
|
|
3056
3056
|
"tier": "standard",
|
|
@@ -3102,7 +3102,7 @@ const capabilities = {
|
|
|
3102
3102
|
"schema-gate": {
|
|
3103
3103
|
"id": "schema-gate",
|
|
3104
3104
|
"role": "feature",
|
|
3105
|
-
"version": "1.9.
|
|
3105
|
+
"version": "1.9.1",
|
|
3106
3106
|
"title": "Schema push detection gate",
|
|
3107
3107
|
"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.",
|
|
3108
3108
|
"tier": "full",
|
|
@@ -3148,7 +3148,7 @@ const capabilities = {
|
|
|
3148
3148
|
"security": {
|
|
3149
3149
|
"id": "security",
|
|
3150
3150
|
"role": "feature",
|
|
3151
|
-
"version": "1.9.
|
|
3151
|
+
"version": "1.9.1",
|
|
3152
3152
|
"title": "Security enforcement",
|
|
3153
3153
|
"description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
|
|
3154
3154
|
"tier": "full",
|
|
@@ -3247,7 +3247,7 @@ const capabilities = {
|
|
|
3247
3247
|
"tdd": {
|
|
3248
3248
|
"id": "tdd",
|
|
3249
3249
|
"role": "feature",
|
|
3250
|
-
"version": "1.9.
|
|
3250
|
+
"version": "1.9.1",
|
|
3251
3251
|
"title": "Test-driven development",
|
|
3252
3252
|
"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.",
|
|
3253
3253
|
"tier": "full",
|
|
@@ -3300,7 +3300,7 @@ const capabilities = {
|
|
|
3300
3300
|
"trae": {
|
|
3301
3301
|
"id": "trae",
|
|
3302
3302
|
"role": "runtime",
|
|
3303
|
-
"version": "1.9.
|
|
3303
|
+
"version": "1.9.1",
|
|
3304
3304
|
"title": "Trae IDE",
|
|
3305
3305
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
3306
3306
|
"tier": "core",
|
|
@@ -3392,7 +3392,7 @@ const capabilities = {
|
|
|
3392
3392
|
"ui": {
|
|
3393
3393
|
"id": "ui",
|
|
3394
3394
|
"role": "feature",
|
|
3395
|
-
"version": "1.9.
|
|
3395
|
+
"version": "1.9.1",
|
|
3396
3396
|
"title": "UI design contracts",
|
|
3397
3397
|
"description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
|
|
3398
3398
|
"tier": "full",
|
|
@@ -3487,7 +3487,7 @@ const capabilities = {
|
|
|
3487
3487
|
"vscode": {
|
|
3488
3488
|
"id": "vscode",
|
|
3489
3489
|
"role": "runtime",
|
|
3490
|
-
"version": "1.9.
|
|
3490
|
+
"version": "1.9.1",
|
|
3491
3491
|
"title": "VS Code",
|
|
3492
3492
|
"description": "VS Code — Marketplace/VSIX extension; no file-projected config directory; IDE-profile reference host (active vscode.lm model, engine-owned hook bus, sandboxed globalState/workspaceState stateIO).",
|
|
3493
3493
|
"tier": "core",
|
|
@@ -3540,7 +3540,7 @@ const capabilities = {
|
|
|
3540
3540
|
"windsurf": {
|
|
3541
3541
|
"id": "windsurf",
|
|
3542
3542
|
"role": "runtime",
|
|
3543
|
-
"version": "1.9.
|
|
3543
|
+
"version": "1.9.1",
|
|
3544
3544
|
"title": "Windsurf",
|
|
3545
3545
|
"description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; Cascade native hooks.json blocking hook bus (pre_write_code, pre_run_command); tier-2 support.",
|
|
3546
3546
|
"tier": "core",
|
|
@@ -3627,7 +3627,7 @@ const capabilities = {
|
|
|
3627
3627
|
"zcode": {
|
|
3628
3628
|
"id": "zcode",
|
|
3629
3629
|
"role": "runtime",
|
|
3630
|
-
"version": "1.9.
|
|
3630
|
+
"version": "1.9.1",
|
|
3631
3631
|
"title": "ZCode",
|
|
3632
3632
|
"description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills/<name>/SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.",
|
|
3633
3633
|
"tier": "core",
|
|
@@ -4768,7 +4768,7 @@ const runtimes = {
|
|
|
4768
4768
|
"antigravity": {
|
|
4769
4769
|
"id": "antigravity",
|
|
4770
4770
|
"role": "runtime",
|
|
4771
|
-
"version": "1.9.
|
|
4771
|
+
"version": "1.9.1",
|
|
4772
4772
|
"title": "Antigravity",
|
|
4773
4773
|
"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.",
|
|
4774
4774
|
"tier": "core",
|
|
@@ -4912,7 +4912,7 @@ const runtimes = {
|
|
|
4912
4912
|
"augment": {
|
|
4913
4913
|
"id": "augment",
|
|
4914
4914
|
"role": "runtime",
|
|
4915
|
-
"version": "1.9.
|
|
4915
|
+
"version": "1.9.1",
|
|
4916
4916
|
"title": "Augment Code",
|
|
4917
4917
|
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
4918
4918
|
"tier": "core",
|
|
@@ -5021,7 +5021,7 @@ const runtimes = {
|
|
|
5021
5021
|
"claude": {
|
|
5022
5022
|
"id": "claude",
|
|
5023
5023
|
"role": "runtime",
|
|
5024
|
-
"version": "1.9.
|
|
5024
|
+
"version": "1.9.1",
|
|
5025
5025
|
"title": "Claude Code",
|
|
5026
5026
|
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
|
5027
5027
|
"tier": "core",
|
|
@@ -5168,7 +5168,7 @@ const runtimes = {
|
|
|
5168
5168
|
"cline": {
|
|
5169
5169
|
"id": "cline",
|
|
5170
5170
|
"role": "runtime",
|
|
5171
|
-
"version": "1.9.
|
|
5171
|
+
"version": "1.9.1",
|
|
5172
5172
|
"title": "Cline",
|
|
5173
5173
|
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
|
5174
5174
|
"tier": "core",
|
|
@@ -5239,7 +5239,7 @@ const runtimes = {
|
|
|
5239
5239
|
"codebuddy": {
|
|
5240
5240
|
"id": "codebuddy",
|
|
5241
5241
|
"role": "runtime",
|
|
5242
|
-
"version": "1.9.
|
|
5242
|
+
"version": "1.9.1",
|
|
5243
5243
|
"title": "CodeBuddy",
|
|
5244
5244
|
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
5245
5245
|
"tier": "core",
|
|
@@ -5352,7 +5352,7 @@ const runtimes = {
|
|
|
5352
5352
|
"codex": {
|
|
5353
5353
|
"id": "codex",
|
|
5354
5354
|
"role": "runtime",
|
|
5355
|
-
"version": "1.9.
|
|
5355
|
+
"version": "1.9.1",
|
|
5356
5356
|
"title": "OpenAI Codex CLI",
|
|
5357
5357
|
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
|
5358
5358
|
"tier": "core",
|
|
@@ -5490,7 +5490,7 @@ const runtimes = {
|
|
|
5490
5490
|
"copilot": {
|
|
5491
5491
|
"id": "copilot",
|
|
5492
5492
|
"role": "runtime",
|
|
5493
|
-
"version": "1.9.
|
|
5493
|
+
"version": "1.9.1",
|
|
5494
5494
|
"title": "GitHub Copilot",
|
|
5495
5495
|
"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.",
|
|
5496
5496
|
"tier": "core",
|
|
@@ -5585,7 +5585,7 @@ const runtimes = {
|
|
|
5585
5585
|
"cursor": {
|
|
5586
5586
|
"id": "cursor",
|
|
5587
5587
|
"role": "runtime",
|
|
5588
|
-
"version": "1.9.
|
|
5588
|
+
"version": "1.9.1",
|
|
5589
5589
|
"title": "Cursor",
|
|
5590
5590
|
"description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
5591
5591
|
"tier": "core",
|
|
@@ -5744,7 +5744,7 @@ const runtimes = {
|
|
|
5744
5744
|
"hermes": {
|
|
5745
5745
|
"id": "hermes",
|
|
5746
5746
|
"role": "runtime",
|
|
5747
|
-
"version": "1.9.
|
|
5747
|
+
"version": "1.9.1",
|
|
5748
5748
|
"title": "Hermes Agent",
|
|
5749
5749
|
"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.",
|
|
5750
5750
|
"tier": "core",
|
|
@@ -5835,7 +5835,7 @@ const runtimes = {
|
|
|
5835
5835
|
"kilo": {
|
|
5836
5836
|
"id": "kilo",
|
|
5837
5837
|
"role": "runtime",
|
|
5838
|
-
"version": "1.9.
|
|
5838
|
+
"version": "1.9.1",
|
|
5839
5839
|
"title": "Kilo Code",
|
|
5840
5840
|
"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.",
|
|
5841
5841
|
"tier": "core",
|
|
@@ -5944,7 +5944,7 @@ const runtimes = {
|
|
|
5944
5944
|
"kimi": {
|
|
5945
5945
|
"id": "kimi",
|
|
5946
5946
|
"role": "runtime",
|
|
5947
|
-
"version": "1.9.
|
|
5947
|
+
"version": "1.9.1",
|
|
5948
5948
|
"title": "Kimi CLI",
|
|
5949
5949
|
"description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; native config.toml [[hooks]] bus at ~/.kimi/config.toml; background dispatch; tier-2 support.",
|
|
5950
5950
|
"tier": "core",
|
|
@@ -6042,7 +6042,7 @@ const runtimes = {
|
|
|
6042
6042
|
"kimi-code": {
|
|
6043
6043
|
"id": "kimi-code",
|
|
6044
6044
|
"role": "runtime",
|
|
6045
|
-
"version": "1.9.
|
|
6045
|
+
"version": "1.9.1",
|
|
6046
6046
|
"title": "Kimi Code CLI",
|
|
6047
6047
|
"description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
|
|
6048
6048
|
"tier": "core",
|
|
@@ -6174,7 +6174,7 @@ const runtimes = {
|
|
|
6174
6174
|
"opencode": {
|
|
6175
6175
|
"id": "opencode",
|
|
6176
6176
|
"role": "runtime",
|
|
6177
|
-
"version": "1.9.
|
|
6177
|
+
"version": "1.9.1",
|
|
6178
6178
|
"title": "OpenCode",
|
|
6179
6179
|
"description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
6180
6180
|
"tier": "core",
|
|
@@ -6331,7 +6331,7 @@ const runtimes = {
|
|
|
6331
6331
|
"pi": {
|
|
6332
6332
|
"id": "pi",
|
|
6333
6333
|
"role": "runtime",
|
|
6334
|
-
"version": "1.9.
|
|
6334
|
+
"version": "1.9.1",
|
|
6335
6335
|
"title": "pi",
|
|
6336
6336
|
"description": "pi (pi.dev) — bun-runtime programmatic-CLI; TS ExtensionAPI (registerCommand/registerTool/registerProvider/pi.on); single native-extension file at ~/.pi/agent/extensions/gsd.js (.js, not .cjs — pi's extension auto-discovery accepts only .ts/.js, #2470); no shared-settings hook surface; tier-2 support.",
|
|
6337
6337
|
"tier": "core",
|
|
@@ -6393,7 +6393,7 @@ const runtimes = {
|
|
|
6393
6393
|
"qwen": {
|
|
6394
6394
|
"id": "qwen",
|
|
6395
6395
|
"role": "runtime",
|
|
6396
|
-
"version": "1.9.
|
|
6396
|
+
"version": "1.9.1",
|
|
6397
6397
|
"title": "Qwen Code",
|
|
6398
6398
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
6399
6399
|
"tier": "core",
|
|
@@ -6529,7 +6529,7 @@ const runtimes = {
|
|
|
6529
6529
|
"trae": {
|
|
6530
6530
|
"id": "trae",
|
|
6531
6531
|
"role": "runtime",
|
|
6532
|
-
"version": "1.9.
|
|
6532
|
+
"version": "1.9.1",
|
|
6533
6533
|
"title": "Trae IDE",
|
|
6534
6534
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
6535
6535
|
"tier": "core",
|
|
@@ -6621,7 +6621,7 @@ const runtimes = {
|
|
|
6621
6621
|
"vscode": {
|
|
6622
6622
|
"id": "vscode",
|
|
6623
6623
|
"role": "runtime",
|
|
6624
|
-
"version": "1.9.
|
|
6624
|
+
"version": "1.9.1",
|
|
6625
6625
|
"title": "VS Code",
|
|
6626
6626
|
"description": "VS Code — Marketplace/VSIX extension; no file-projected config directory; IDE-profile reference host (active vscode.lm model, engine-owned hook bus, sandboxed globalState/workspaceState stateIO).",
|
|
6627
6627
|
"tier": "core",
|
|
@@ -6674,7 +6674,7 @@ const runtimes = {
|
|
|
6674
6674
|
"windsurf": {
|
|
6675
6675
|
"id": "windsurf",
|
|
6676
6676
|
"role": "runtime",
|
|
6677
|
-
"version": "1.9.
|
|
6677
|
+
"version": "1.9.1",
|
|
6678
6678
|
"title": "Windsurf",
|
|
6679
6679
|
"description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; Cascade native hooks.json blocking hook bus (pre_write_code, pre_run_command); tier-2 support.",
|
|
6680
6680
|
"tier": "core",
|
|
@@ -6761,7 +6761,7 @@ const runtimes = {
|
|
|
6761
6761
|
"zcode": {
|
|
6762
6762
|
"id": "zcode",
|
|
6763
6763
|
"role": "runtime",
|
|
6764
|
-
"version": "1.9.
|
|
6764
|
+
"version": "1.9.1",
|
|
6765
6765
|
"title": "ZCode",
|
|
6766
6766
|
"description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills/<name>/SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.",
|
|
6767
6767
|
"tier": "core",
|
|
@@ -135,10 +135,15 @@ function cmdRequirementsMarkComplete(cwd, reqIdsRaw, raw) {
|
|
|
135
135
|
// Surface 1 — the checkbox: - [ ] **REQ-ID** → - [x] **REQ-ID**
|
|
136
136
|
// Use replace() + compare to avoid the test()+replace() global regex
|
|
137
137
|
// lastIndex bug where test() advances state and replace() misses matches.
|
|
138
|
+
// (#2788 defect 2: the flip is CONDITIONAL — when a traceability row EXISTS
|
|
139
|
+
// for this ID but its Status write is rejected, the checkbox must NOT flip,
|
|
140
|
+
// so the two surfaces cannot silently diverge. The row-write outcome below
|
|
141
|
+
// gates whether the flip is kept.)
|
|
138
142
|
const checkboxPattern = new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${reqEscaped}\\*\\*)`, 'gi');
|
|
143
|
+
const beforeCheckbox = reqContent;
|
|
139
144
|
const afterCheckbox = reqContent.replace(checkboxPattern, '$1x$2');
|
|
140
|
-
const
|
|
141
|
-
if (
|
|
145
|
+
const checkboxFlipped = afterCheckbox !== beforeCheckbox;
|
|
146
|
+
if (checkboxFlipped)
|
|
142
147
|
reqContent = afterCheckbox;
|
|
143
148
|
// Surface 2 — the traceability row: | <REQ-ID> | Phase N | Pending | → ... Complete |
|
|
144
149
|
// via the markdown-table seam (ADR-2143 §7) — supersedes the prior ordinal
|
|
@@ -156,7 +161,11 @@ function cmdRequirementsMarkComplete(cwd, reqIdsRaw, raw) {
|
|
|
156
161
|
// updateTableCell call both probes the current value and writes.
|
|
157
162
|
let tableHit = false;
|
|
158
163
|
const tableUpdate = updateTraceabilityCell(reqContent, rowMatch, 'Status', (current) => {
|
|
159
|
-
|
|
164
|
+
// #2788: accept `Gaps Found` as a forward input too — `revert-phase` (the
|
|
165
|
+
// documented gaps_found response) leaves a row stranded at Gaps Found with
|
|
166
|
+
// no inverse; a genuinely-satisfied requirement must be able to reach
|
|
167
|
+
// Complete again via mark-complete, or the milestone is blocked forever.
|
|
168
|
+
if (/^(pending|gaps found)$/i.test(current.trim())) {
|
|
160
169
|
tableHit = true;
|
|
161
170
|
return ' Complete ';
|
|
162
171
|
}
|
|
@@ -165,6 +174,17 @@ function cmdRequirementsMarkComplete(cwd, reqIdsRaw, raw) {
|
|
|
165
174
|
if (tableUpdate.ok) {
|
|
166
175
|
reqContent = tableUpdate.value;
|
|
167
176
|
}
|
|
177
|
+
// #2788 defect 2: if a row EXISTS for this ID but its Status write was
|
|
178
|
+
// rejected (e.g. the row reads `Blocked`, which mark-complete does not
|
|
179
|
+
// accept), roll the checkbox back so the checkbox and the row cannot
|
|
180
|
+
// silently diverge. The checkbox and the row are two representations of the
|
|
181
|
+
// same fact; flipping one while the other rejects the write is the lie.
|
|
182
|
+
let checkboxHit = checkboxFlipped;
|
|
183
|
+
const rowExistsProbe = tableUpdate; // ok === a row matched (probes existence)
|
|
184
|
+
if (checkboxFlipped && rowExistsProbe.ok && !tableHit) {
|
|
185
|
+
reqContent = beforeCheckbox;
|
|
186
|
+
checkboxHit = false;
|
|
187
|
+
}
|
|
168
188
|
// ADR-2143 §6 per-ID write-set entries: this ID's checkbox surface is
|
|
169
189
|
// always tracked; the traceability surface is tracked only when the file
|
|
170
190
|
// has a traceability table at all (same `hasTable` gate the existing
|
|
@@ -190,7 +210,14 @@ function cmdRequirementsMarkComplete(cwd, reqIdsRaw, raw) {
|
|
|
190
210
|
const hasRow = statusProbe.ok;
|
|
191
211
|
const doneCheckbox = new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${reqEscaped}\\*\\*`, 'i').test(reqContent);
|
|
192
212
|
const doneTable = Boolean(hasRow && /^complete$/i.test(currentStatusCell.trim()));
|
|
193
|
-
|
|
213
|
+
// #2788 defect 2: when a traceability table exists AND this ID has a row in
|
|
214
|
+
// it, `updated`/`marked_complete` must reflect the ROW moving, not a
|
|
215
|
+
// checkbox-only flip. Otherwise (`table_unmatched` — no row for this ID, or
|
|
216
|
+
// no table at all) the checkbox flip is a legitimate partial reconcile / the
|
|
217
|
+
// sole completion surface, so the #2140 OR semantics are preserved.
|
|
218
|
+
const rowExists = hasTable && hasRow;
|
|
219
|
+
const idUpdated = rowExists ? tableHit : (checkboxHit || tableHit);
|
|
220
|
+
if (idUpdated) {
|
|
194
221
|
updated.push(reqId);
|
|
195
222
|
}
|
|
196
223
|
else if (doneTable || (doneCheckbox && !hasTable)) {
|
|
@@ -1698,7 +1698,10 @@ function cmdPhaseComplete(cwd, phaseNum, raw) {
|
|
|
1698
1698
|
// requirement's write. The "only flip Pending/In Progress ->
|
|
1699
1699
|
// Complete" gate is folded into the newValue callback so one
|
|
1700
1700
|
// updateTableCell call both probes and writes.
|
|
1701
|
-
const reqUpdate = updateTraceabilityCell(reqContent, reqRowMatch, 'Status', (current) =>
|
|
1701
|
+
const reqUpdate = updateTraceabilityCell(reqContent, reqRowMatch, 'Status', (current) =>
|
|
1702
|
+
// #2788: accept `Gaps Found` too so a phase stranded by revert-phase (the
|
|
1703
|
+
// gaps_found response) can complete without hand-editing the table.
|
|
1704
|
+
/^(?:pending|in progress|gaps found)$/i.test(current.trim()) ? ' Complete ' : current);
|
|
1702
1705
|
if (reqUpdate.ok) {
|
|
1703
1706
|
reqContent = reqUpdate.value;
|
|
1704
1707
|
}
|