@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-core",
|
|
3
3
|
"displayName": "GSD Core",
|
|
4
|
-
"version": "1.5.0-rc.
|
|
4
|
+
"version": "1.5.0-rc.4",
|
|
5
5
|
"description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "open-gsd",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-advisor-researcher
|
|
3
3
|
description: Researches a single gray area decision and returns a structured comparison table with rationale. Spawned by discuss-phase advisor mode.
|
|
4
|
-
tools: Read, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*
|
|
4
|
+
tools: Read, Bash, Grep, Glob, Skill, WebSearch, WebFetch, mcp__context7__*
|
|
5
5
|
color: cyan
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-assumptions-analyzer
|
|
3
3
|
description: Deeply analyzes codebase for a phase and returns structured assumptions with evidence. Spawned by discuss-phase assumptions mode.
|
|
4
|
-
tools: Read, Bash, Grep, Glob
|
|
4
|
+
tools: Read, Bash, Grep, Glob, Skill
|
|
5
5
|
color: cyan
|
|
6
6
|
---
|
|
7
7
|
|
package/agents/gsd-code-fixer.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-code-fixer
|
|
3
3
|
description: Applies fixes to code review findings from REVIEW.md. Reads source files, applies intelligent fixes, and commits each fix atomically. Spawned by /gsd:code-review --fix.
|
|
4
|
-
tools: Read, Edit, Write, Bash, Grep, Glob
|
|
4
|
+
tools: Read, Edit, Write, Bash, Grep, Glob, Skill
|
|
5
5
|
color: green
|
|
6
6
|
# hooks:
|
|
7
7
|
# - before_write
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-code-reviewer
|
|
3
3
|
description: Reviews source files for bugs, security issues, and code quality problems. Produces structured REVIEW.md with severity-classified findings. Spawned by /gsd:code-review.
|
|
4
|
-
tools: Read, Write, Bash, Grep, Glob
|
|
4
|
+
tools: Read, Write, Bash, Grep, Glob, Skill
|
|
5
5
|
color: orange
|
|
6
6
|
# hooks:
|
|
7
7
|
# - before_write
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-codebase-mapper
|
|
3
3
|
description: Explores codebase and writes structured analysis documents. Spawned by map-codebase with a focus area (tech, arch, quality, concerns). Writes documents directly to reduce orchestrator context load.
|
|
4
|
-
tools: Read, Bash, Grep, Glob, Write
|
|
4
|
+
tools: Read, Bash, Grep, Glob, Write, Skill
|
|
5
5
|
color: cyan
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
package/agents/gsd-debugger.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-debugger
|
|
3
3
|
description: Investigates bugs using scientific method, manages debug sessions, handles checkpoints. Spawned by /gsd:debug orchestrator.
|
|
4
|
-
tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Skill, WebSearch
|
|
5
5
|
color: orange
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
package/agents/gsd-doc-writer.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-doc-writer
|
|
3
3
|
description: Writes and updates project documentation. Spawned with a doc_assignment block specifying doc type, mode (create/update/supplement), and project context.
|
|
4
|
-
tools: Read, Bash, Grep, Glob, Write, Edit
|
|
4
|
+
tools: Read, Bash, Grep, Glob, Write, Edit, Skill
|
|
5
5
|
color: purple
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-eval-auditor
|
|
3
3
|
description: Retroactive audit of an implemented AI phase's evaluation coverage. Checks implementation against the AI-SPEC.md evaluation plan. Scores each eval dimension as COVERED/PARTIAL/MISSING. Produces a scored EVAL-REVIEW.md with findings, gaps, and remediation guidance. Spawned by /gsd:eval-review orchestrator.
|
|
4
|
-
tools: Read, Write, Bash, Grep, Glob
|
|
4
|
+
tools: Read, Write, Bash, Grep, Glob, Skill
|
|
5
5
|
color: red
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
package/agents/gsd-executor.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-executor
|
|
3
3
|
description: Executes GSD plans with atomic commits, deviation handling, checkpoint protocols, and state management. Spawned by execute-phase orchestrator or execute-plan command.
|
|
4
|
-
tools: Read, Write, Edit, Bash, Grep, Glob, mcp__context7__*
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Skill, mcp__context7__*
|
|
5
5
|
color: yellow
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-integration-checker
|
|
3
3
|
description: Verifies cross-phase integration and E2E flows. Checks that phases connect properly and user workflows complete end-to-end.
|
|
4
|
-
tools: Read, Bash, Grep, Glob
|
|
4
|
+
tools: Read, Bash, Grep, Glob, Skill
|
|
5
5
|
color: blue
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd-mempalace-curator
|
|
3
|
+
description: Ship-time MemPalace curation — writes the session diary, proposes/creates cross-project tunnels, mirrors extract-learnings into the temporal KG, and runs wing-scoped drawer pruning. Spawned at ship:post by the mempalace capability.
|
|
4
|
+
tools: Read, Bash, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
color: cyan
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<role>
|
|
10
|
+
You are the MemPalace curator. You run once per phase at `ship:post`, after verification has passed, to consolidate the phase's memory into the palace. Everything you do is best-effort and wing-scoped: a MemPalace failure must never fail the ship step (`onError: skip`), and you must never touch drawers outside this project's wing.
|
|
11
|
+
</role>
|
|
12
|
+
|
|
13
|
+
<inputs>
|
|
14
|
+
- `.planning/config.json` — read `mempalace.enabled`, `mempalace.memory_mode`, `mempalace.wing`, `mempalace.diary_journal`, `mempalace.cross_project_tunnels`, `mempalace.mirror_kg`, `project_code`.
|
|
15
|
+
- The completed phase artifacts: `UAT.md`, `SUMMARY.md`, and any `extract-learnings` output.
|
|
16
|
+
</inputs>
|
|
17
|
+
|
|
18
|
+
## Gate
|
|
19
|
+
|
|
20
|
+
If `mempalace.enabled !== true`, do nothing and report `MemPalace disabled — curation skipped`. This is the hard gate; respect it before any other work.
|
|
21
|
+
|
|
22
|
+
## Wing / mode / transport
|
|
23
|
+
|
|
24
|
+
- **Wing:** `mempalace.wing` if non-empty, else `project_code`, else the repo directory name. Every call you make is scoped to this one wing.
|
|
25
|
+
- **Mode:** only `augment` is currently wired — KG writes are an additive mirror of `.planning/graphs/`. `kg_backend`/`replace` are forward-declared and behave as `augment` today.
|
|
26
|
+
- **Transport:** prefer the `mempalace_*` MCP tools interactively; fall back to the `mempalace` CLI in headless/cron runs. If neither is reachable, report unavailability and stop — do not error.
|
|
27
|
+
|
|
28
|
+
## Tasks (each independently best-effort)
|
|
29
|
+
|
|
30
|
+
1. **Diary entry** (when `mempalace.diary_journal` is true). Write one concise per-agent diary entry summarising the phase outcome: `mempalace_diary_write(agent_name=<project>/<role>, entry=<summary>, topic="phase-ship", wing=<wing>)` (CLI: `mempalace hook run` / the diary CLI). Namespace `agent_name` by repo+role so diaries don't collide across projects. **Idempotency:** before writing, `mempalace_diary_read` (or list) for an existing entry keyed by `(wing, agent_name, topic, phase-id)`; if one exists for this phase, update it in place rather than appending a second.
|
|
31
|
+
|
|
32
|
+
2. **extract-learnings → KG mirror** (when `mempalace.mirror_kg` is true). For each decision/lesson/pattern/surprise from the phase's learnings, add a typed KG triple with provenance (`source_file`, `source_drawer_id`) and `valid_from` = the phase date. **Idempotency:** the triple `(subject, predicate, object)` is the natural key — `mempalace_kg_query` for it first and skip `mempalace_kg_add` if it already exists with the same `valid_from`, so reruns don't fork duplicate facts. When a prior decision was superseded this phase, call `mempalace_kg_invalidate` to set its `valid_to` rather than deleting it.
|
|
33
|
+
|
|
34
|
+
3. **Cross-project tunnels** (when `mempalace.cross_project_tunnels` is true). Use `mempalace_find_tunnels` to surface related wings, then `mempalace_create_tunnel(label=…)` only for connections you (or the user) can justify. **Idempotency:** check the `find_tunnels` result first and skip creation if a tunnel with that `(source-wing, target-wing, label)` already exists. Do not mass-create tunnels.
|
|
35
|
+
|
|
36
|
+
4. **Wing-scoped prune** (optional). Run `mempalace sync --wing <wing> --apply` to prune drawers whose source artifacts were archived/deleted. **Never** run a global sync/prune; always pass `--wing`.
|
|
37
|
+
|
|
38
|
+
## Hard rules
|
|
39
|
+
|
|
40
|
+
- Best-effort only: catch and report every MemPalace failure; never propagate an error that would fail `ship:post`.
|
|
41
|
+
- Wing-scoped only: never read, write, or prune outside this project's wing.
|
|
42
|
+
- Verbatim preservation: invalidate superseded facts (set `valid_to`); do not destroy history.
|
|
43
|
+
- Idempotent: re-running a shipped phase must not duplicate diary entries, facts, or tunnels.
|
|
44
|
+
|
|
45
|
+
## Report
|
|
46
|
+
|
|
47
|
+
Emit a short summary of what was curated: diary (yes/no), KG facts mirrored (count), tunnels proposed/created (count), drawers pruned (count) — or `MemPalace unavailable — curation skipped`.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-phase-researcher
|
|
3
3
|
description: Researches how to implement a phase before planning. Produces RESEARCH.md consumed by gsd-planner. Spawned by /gsd:plan-phase orchestrator.
|
|
4
|
-
tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Skill, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*
|
|
5
5
|
color: cyan
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-plan-checker
|
|
3
3
|
description: Verifies plans will achieve phase goal before execution. Goal-backward analysis of plan quality. Spawned by /gsd:plan-phase orchestrator.
|
|
4
|
-
tools: Read, Bash, Glob, Grep
|
|
4
|
+
tools: Read, Bash, Glob, Grep, Skill
|
|
5
5
|
color: green
|
|
6
6
|
---
|
|
7
7
|
|
package/agents/gsd-planner.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-planner
|
|
3
3
|
description: Creates executable phase plans with task breakdown, dependency analysis, and goal-backward verification. Spawned by /gsd:plan-phase orchestrator.
|
|
4
|
-
tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, mcp__context7__*
|
|
4
|
+
tools: Read, Write, Edit, Bash, Glob, Grep, Skill, WebFetch, mcp__context7__*
|
|
5
5
|
color: green
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-project-researcher
|
|
3
3
|
description: Researches domain ecosystem before roadmap creation. Produces files in .planning/research/ consumed during roadmap creation. Spawned by /gsd:new-project or /gsd:new-milestone orchestrators.
|
|
4
|
-
tools: Read, Write, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*
|
|
4
|
+
tools: Read, Write, Bash, Grep, Glob, Skill, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*
|
|
5
5
|
color: cyan
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-research-synthesizer
|
|
3
3
|
description: Synthesizes research outputs from parallel researcher agents into SUMMARY.md. Spawned by /gsd:new-project after 4 researcher agents complete.
|
|
4
|
-
tools: Read, Write, Bash
|
|
4
|
+
tools: Read, Write, Bash, Skill
|
|
5
5
|
color: purple
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
package/agents/gsd-roadmapper.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-roadmapper
|
|
3
3
|
description: Creates project roadmaps with phase breakdown, requirement mapping, success criteria derivation, and coverage validation. Spawned by /gsd:new-project orchestrator.
|
|
4
|
-
tools: Read, Write, Bash, Glob, Grep
|
|
4
|
+
tools: Read, Write, Bash, Glob, Grep, Skill
|
|
5
5
|
color: purple
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
|
@@ -209,6 +209,23 @@ Track coverage as you go.
|
|
|
209
209
|
- New milestone: Start at 1
|
|
210
210
|
- Continuing milestone: Check existing phases, start at last + 1
|
|
211
211
|
|
|
212
|
+
## Phase ID Convention
|
|
213
|
+
|
|
214
|
+
Read `phase_id_convention` from config.json. This setting controls how phase headers and
|
|
215
|
+
checklist entries are formatted throughout the generated ROADMAP.md.
|
|
216
|
+
|
|
217
|
+
| Convention | Summary checklist form | Detail header form |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| `sequential` (default) | `- [ ] **Phase 1: Name**` | `### Phase 1: Name` |
|
|
220
|
+
| `milestone-prefixed` | `- [ ] **Phase 1-01: Name**` | `### Phase 1-01: Name` |
|
|
221
|
+
|
|
222
|
+
When `phase_id_convention` is absent or set to `"sequential"`, use plain sequential phase IDs
|
|
223
|
+
(e.g. `Phase 1`, `Phase 2`). When set to `"milestone-prefixed"`, prefix each phase ID with the
|
|
224
|
+
current milestone number and a two-digit phase index within that milestone
|
|
225
|
+
(e.g. `Phase 1-01`, `Phase 1-02`, `Phase 2-01`). The milestone number comes from the project's
|
|
226
|
+
active milestone context (default: `1` for new projects). This ensures downstream tools that
|
|
227
|
+
parse `### Phase N-NN:` headers for milestone-scoped workflows receive correctly prefixed IDs.
|
|
228
|
+
|
|
212
229
|
## Granularity Calibration
|
|
213
230
|
|
|
214
231
|
Read granularity from config.json. Granularity controls compression tolerance.
|
|
@@ -310,14 +327,30 @@ After roadmap creation, REQUIREMENTS.md gets updated with phase mappings:
|
|
|
310
327
|
|
|
311
328
|
### 1. Summary Checklist (under `## Phases`)
|
|
312
329
|
|
|
330
|
+
Use the form matching `phase_id_convention` from config.
|
|
331
|
+
|
|
332
|
+
**Sequential (default — when absent or `"sequential"`):**
|
|
333
|
+
|
|
313
334
|
```markdown
|
|
314
335
|
- [ ] **Phase 1: Name** - One-line description
|
|
315
336
|
- [ ] **Phase 2: Name** - One-line description
|
|
316
337
|
- [ ] **Phase 3: Name** - One-line description
|
|
317
338
|
```
|
|
318
339
|
|
|
340
|
+
**Milestone-prefixed (when `phase_id_convention: "milestone-prefixed"`):**
|
|
341
|
+
|
|
342
|
+
```markdown
|
|
343
|
+
- [ ] **Phase 1-01: Name** - One-line description
|
|
344
|
+
- [ ] **Phase 1-02: Name** - One-line description
|
|
345
|
+
- [ ] **Phase 1-03: Name** - One-line description
|
|
346
|
+
```
|
|
347
|
+
|
|
319
348
|
### 2. Detail Sections (under `## Phase Details`)
|
|
320
349
|
|
|
350
|
+
Use the header form matching `phase_id_convention` from config.
|
|
351
|
+
|
|
352
|
+
**Sequential (default):**
|
|
353
|
+
|
|
321
354
|
```markdown
|
|
322
355
|
### Phase 1: Name
|
|
323
356
|
**Goal**: What this phase delivers
|
|
@@ -334,7 +367,25 @@ After roadmap creation, REQUIREMENTS.md gets updated with phase mappings:
|
|
|
334
367
|
...
|
|
335
368
|
```
|
|
336
369
|
|
|
337
|
-
**
|
|
370
|
+
**Milestone-prefixed (when `phase_id_convention: "milestone-prefixed"`):**
|
|
371
|
+
|
|
372
|
+
```markdown
|
|
373
|
+
### Phase 1-01: Name
|
|
374
|
+
**Goal**: What this phase delivers
|
|
375
|
+
**Depends on**: Nothing (first phase)
|
|
376
|
+
**Requirements**: REQ-01, REQ-02
|
|
377
|
+
**Success Criteria** (what must be TRUE):
|
|
378
|
+
1. Observable behavior from user perspective
|
|
379
|
+
2. Observable behavior from user perspective
|
|
380
|
+
**Plans**: TBD
|
|
381
|
+
|
|
382
|
+
### Phase 1-02: Name
|
|
383
|
+
**Goal**: What this phase delivers
|
|
384
|
+
**Depends on**: Phase 1-01
|
|
385
|
+
...
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**The `### Phase X:` headers are parsed by downstream tools.** If you only write the summary checklist, phase lookups will fail. Use the correct form for the configured convention so downstream parsing succeeds.
|
|
338
389
|
|
|
339
390
|
### UI Phase Detection
|
|
340
391
|
|
|
@@ -476,6 +527,8 @@ Apply phase identification methodology:
|
|
|
476
527
|
2. Identify dependencies between groups
|
|
477
528
|
3. Create phases that complete coherent capabilities
|
|
478
529
|
4. Check granularity setting for compression guidance
|
|
530
|
+
5. Read `phase_id_convention` from config (`sequential` or `milestone-prefixed`); apply the
|
|
531
|
+
matching header and checklist form throughout all output sections
|
|
479
532
|
|
|
480
533
|
## Step 5: Derive Success Criteria
|
|
481
534
|
|
package/agents/gsd-ui-auditor.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-ui-auditor
|
|
3
3
|
description: Retroactive 6-pillar visual audit of implemented frontend code. Produces scored UI-REVIEW.md. Spawned by /gsd:ui-review orchestrator.
|
|
4
|
-
tools: Read, Write, Bash, Grep, Glob
|
|
4
|
+
tools: Read, Write, Bash, Grep, Glob, Skill
|
|
5
5
|
color: pink
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
package/agents/gsd-ui-checker.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-ui-checker
|
|
3
3
|
description: Validates UI-SPEC.md design contracts against 6 quality dimensions. Produces BLOCK/FLAG/PASS verdicts. Spawned by /gsd:ui-phase orchestrator.
|
|
4
|
-
tools: Read, Bash, Glob, Grep
|
|
4
|
+
tools: Read, Bash, Glob, Grep, Skill
|
|
5
5
|
color: cyan
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-ui-researcher
|
|
3
3
|
description: Produces UI-SPEC.md design contract for frontend phases. Reads upstream artifacts, detects design system state, asks only unanswered questions. Spawned by /gsd:ui-phase orchestrator.
|
|
4
|
-
tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Skill, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*
|
|
5
5
|
color: purple
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
package/agents/gsd-verifier.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd-verifier
|
|
3
3
|
description: Verifies phase goal achievement through goal-backward analysis. Checks codebase delivers what phase promised, not just that tasks completed. Creates VERIFICATION.md report.
|
|
4
|
-
tools: Read, Write, Bash, Grep, Glob
|
|
4
|
+
tools: Read, Write, Bash, Grep, Glob, Skill
|
|
5
5
|
color: green
|
|
6
6
|
# hooks:
|
|
7
7
|
# PostToolUse:
|
|
@@ -85,7 +85,7 @@ cat "$PHASE_DIR"/*-VERIFICATION.md 2>/dev/null
|
|
|
85
85
|
**If previous verification exists with `gaps:` section → RE-VERIFICATION MODE:**
|
|
86
86
|
|
|
87
87
|
1. Parse previous VERIFICATION.md frontmatter
|
|
88
|
-
2. Extract `must_haves` (truths, artifacts, key_links)
|
|
88
|
+
2. Extract `must_haves` (truths, artifacts, key_links, prohibitions)
|
|
89
89
|
3. Extract `gaps` (items that failed)
|
|
90
90
|
4. Set `is_re_verification = true`
|
|
91
91
|
5. **Skip to Step 3** with optimization:
|
|
@@ -140,8 +140,19 @@ must_haves:
|
|
|
140
140
|
- from: "src/components/Chat.tsx"
|
|
141
141
|
to: "src/app/api/chat/route.ts"
|
|
142
142
|
via: "fetch in useEffect — calls /api/chat endpoint"
|
|
143
|
+
prohibitions:
|
|
144
|
+
- statement: "MUST NOT store raw SSN in plaintext"
|
|
145
|
+
status: "resolved"
|
|
146
|
+
verification: "judgment"
|
|
143
147
|
```
|
|
144
148
|
|
|
149
|
+
**Also extract `must_haves.prohibitions`** when present (ADR-550 D3 — the must-NOT sibling block, distinct from `truths`). Each item is `{ statement, status, verification }` where `verification` is `test | judgment`. These are NEGATIVE checks: a verified prohibition means the must-NOT did NOT happen. Route them by verification tier in the verdict assembly (ADR-550 D4, the "B-with-guard" 2026-06-12 maintainer decision):
|
|
150
|
+
|
|
151
|
+
- **judgment-tier prohibitions → mode-dependent soft-gate.** Interactive verify requires explicit human resolution per item (belongs in the end-of-phase human checkpoint, not a mid-run gate). Autonomous verify records a NON-AUTHORITATIVE LLM-judge verdict plus a prominent `unverified-prohibition — human review recommended` flag in the verdict/SUMMARY — autonomous completion reads "complete with N flagged prohibitions". NEVER a silent pass; NEVER a hard halt of an AFK run.
|
|
152
|
+
- **test-tier prohibitions → FAIL CLOSED (accept-and-flag, not reject-at-parse).** Accept the `verification: test` value (the SPEC↔must_haves.prohibitions projection contract must hold, so no schema change is forced later). But a well-formed test-tier item that reaches verify with NO wired enforcement is treated as UNVERIFIED — flagged exactly like an unresolved judgment item, NEVER green. The deterministic fail-closed default is `dispositionForProhibition()` in probe-core (status `unverified`, `flagged: true` when `enforcementEvidence` is empty). Do NOT wire a real fail-first negative-test hard gate here — that enforcement MECHANISM defers to a follow-up PR (it needs a real test-tier consumer to `regression-must-fail-first` against; #644's corpus is entirely judgment-tier).
|
|
153
|
+
|
|
154
|
+
A flagged prohibition counts as a human-verification item (status `human_needed`) or a gap (status `gaps_found`) per the existing decision tree — it must never be silently absorbed into a `passed` verdict.
|
|
155
|
+
|
|
145
156
|
**Step 2c: Merge must-haves**
|
|
146
157
|
|
|
147
158
|
Combine all sources into a single must-haves list:
|
package/bin/install.js
CHANGED
|
@@ -26,8 +26,8 @@ const {
|
|
|
26
26
|
// fs.readdirSync + RegExp work for every skill.
|
|
27
27
|
const {
|
|
28
28
|
transformContentToHyphen,
|
|
29
|
-
|
|
30
|
-
} = require(
|
|
29
|
+
readGsdCommandNames,
|
|
30
|
+
} = require('../gsd-core/bin/lib/command-roster.cjs');
|
|
31
31
|
const {
|
|
32
32
|
resolveAntigravityGlobalDir,
|
|
33
33
|
getGlobalConfigDir,
|
|
@@ -38,6 +38,7 @@ const {
|
|
|
38
38
|
readBaseRefFromSettings,
|
|
39
39
|
} = require('../gsd-core/bin/lib/worktree-base-ref.cjs');
|
|
40
40
|
const { resolveInstallPlan } = require('../gsd-core/bin/lib/runtime-config-adapter-registry.cjs');
|
|
41
|
+
const runtimeArtifactConversion = require('../gsd-core/bin/lib/runtime-artifact-conversion.cjs');
|
|
41
42
|
// Canonical set of hook files shipped to users. Imported here so writeManifest()
|
|
42
43
|
// records exactly the same set that build-hooks.js copies to hooks/dist/, making
|
|
43
44
|
// the manifest and the installed hooks/ dir structurally identical. Avoids the
|
|
@@ -929,13 +930,11 @@ function readSettings(settingsPath) {
|
|
|
929
930
|
if (fs.existsSync(settingsPath)) {
|
|
930
931
|
try {
|
|
931
932
|
const raw = fs.readFileSync(settingsPath, 'utf8');
|
|
933
|
+
let parsed;
|
|
932
934
|
// Try standard JSON first (fast path)
|
|
933
|
-
try {
|
|
934
|
-
|
|
935
|
-
}
|
|
936
|
-
// Fall back to JSONC stripping
|
|
937
|
-
return JSON.parse(stripJsonComments(raw));
|
|
938
|
-
}
|
|
935
|
+
try { parsed = JSON.parse(raw); }
|
|
936
|
+
catch { parsed = JSON.parse(stripJsonComments(raw)); }
|
|
937
|
+
return parsed === null ? {} : parsed; // valid JSON null = empty settings, not malformed
|
|
939
938
|
} catch (e) {
|
|
940
939
|
// If even JSONC stripping fails, warn instead of silently returning {}
|
|
941
940
|
console.warn(' ' + yellow + '⚠' + reset + ' Warning: Could not parse ' + settingsPath + ' — file may be malformed. Existing settings preserved.');
|
|
@@ -2334,22 +2333,6 @@ const claudeToCursorTools = {
|
|
|
2334
2333
|
SlashCommand: null, // No equivalent — skills are auto-discovered
|
|
2335
2334
|
};
|
|
2336
2335
|
|
|
2337
|
-
/**
|
|
2338
|
-
* Convert a Claude Code tool name to Cursor CLI format
|
|
2339
|
-
* @returns {string|null} Cursor tool name, or null if tool should be excluded
|
|
2340
|
-
*/
|
|
2341
|
-
function convertCursorToolName(claudeTool) {
|
|
2342
|
-
if (claudeTool in claudeToCursorTools) {
|
|
2343
|
-
return claudeToCursorTools[claudeTool];
|
|
2344
|
-
}
|
|
2345
|
-
// MCP tools keep their format (Cursor supports MCP)
|
|
2346
|
-
if (claudeTool.startsWith('mcp__')) {
|
|
2347
|
-
return claudeTool;
|
|
2348
|
-
}
|
|
2349
|
-
// Most tools share the same name (Read, Write, Glob, Grep, Task, WebSearch, WebFetch, TodoWrite)
|
|
2350
|
-
return claudeTool;
|
|
2351
|
-
}
|
|
2352
|
-
|
|
2353
2336
|
function convertSlashCommandsToCursorSkillMentions(content) {
|
|
2354
2337
|
// Keep leading "/" for slash commands; only normalize gsd: -> gsd-.
|
|
2355
2338
|
// This preserves rendered "next step" commands like "/gsd-execute-phase 17".
|
|
@@ -2476,22 +2459,6 @@ const claudeToWindsurfTools = {
|
|
|
2476
2459
|
SlashCommand: null, // No equivalent — skills are auto-discovered
|
|
2477
2460
|
};
|
|
2478
2461
|
|
|
2479
|
-
/**
|
|
2480
|
-
* Convert a Claude Code tool name to Windsurf Cascade format
|
|
2481
|
-
* @returns {string|null} Windsurf tool name, or null if tool should be excluded
|
|
2482
|
-
*/
|
|
2483
|
-
function convertWindsurfToolName(claudeTool) {
|
|
2484
|
-
if (claudeTool in claudeToWindsurfTools) {
|
|
2485
|
-
return claudeToWindsurfTools[claudeTool];
|
|
2486
|
-
}
|
|
2487
|
-
// MCP tools keep their format (Windsurf supports MCP)
|
|
2488
|
-
if (claudeTool.startsWith('mcp__')) {
|
|
2489
|
-
return claudeTool;
|
|
2490
|
-
}
|
|
2491
|
-
// Most tools share the same name (Read, Write, Glob, Grep, Task, WebSearch, WebFetch, TodoWrite)
|
|
2492
|
-
return claudeTool;
|
|
2493
|
-
}
|
|
2494
|
-
|
|
2495
2462
|
function convertSlashCommandsToWindsurfSkillMentions(content) {
|
|
2496
2463
|
// Keep leading "/" for slash commands; only normalize gsd: -> gsd-.
|
|
2497
2464
|
return content.replace(/gsd:/gi, 'gsd-');
|
|
@@ -2604,25 +2571,6 @@ const claudeToAugmentTools = {
|
|
|
2604
2571
|
TodoWrite: 'add_tasks',
|
|
2605
2572
|
};
|
|
2606
2573
|
|
|
2607
|
-
function convertAugmentToolName(claudeTool) {
|
|
2608
|
-
if (claudeTool in claudeToAugmentTools) {
|
|
2609
|
-
return claudeToAugmentTools[claudeTool];
|
|
2610
|
-
}
|
|
2611
|
-
if (claudeTool.startsWith('mcp__')) {
|
|
2612
|
-
return claudeTool;
|
|
2613
|
-
}
|
|
2614
|
-
const toolMapping = {
|
|
2615
|
-
Read: 'view',
|
|
2616
|
-
Write: 'save-file',
|
|
2617
|
-
Glob: 'view',
|
|
2618
|
-
Grep: 'grep',
|
|
2619
|
-
Task: null,
|
|
2620
|
-
WebSearch: 'web-search',
|
|
2621
|
-
WebFetch: 'web-fetch',
|
|
2622
|
-
};
|
|
2623
|
-
return toolMapping[claudeTool] || claudeTool;
|
|
2624
|
-
}
|
|
2625
|
-
|
|
2626
2574
|
function convertSlashCommandsToAugmentSkillMentions(content) {
|
|
2627
2575
|
return content.replace(/gsd:/gi, 'gsd-');
|
|
2628
2576
|
}
|
|
@@ -3166,7 +3114,7 @@ purpose: ${toSingleLine(description)}
|
|
|
3166
3114
|
* @param {object|null} runtimeResolver — runtime-aware tier resolver from readGsdRuntimeProfileResolver
|
|
3167
3115
|
* @param {object|null} effortCfg — #443: merged effort config from readGsdEffectiveEffortConfig
|
|
3168
3116
|
*/
|
|
3169
|
-
function generateCodexAgentToml(agentName, agentContent, modelOverrides = null, runtimeResolver = null, effortCfg = null) {
|
|
3117
|
+
function generateCodexAgentToml(agentName, agentContent, modelOverrides = null, runtimeResolver = null, effortCfg = null, sandboxTier = 'codex-agent-sandbox') {
|
|
3170
3118
|
const sandboxMode = CODEX_AGENT_SANDBOX[agentName] || 'read-only';
|
|
3171
3119
|
const { frontmatter, body } = extractFrontmatterAndBody(agentContent);
|
|
3172
3120
|
const frontmatterText = frontmatter || '';
|
|
@@ -3179,8 +3127,10 @@ function generateCodexAgentToml(agentName, agentContent, modelOverrides = null,
|
|
|
3179
3127
|
const lines = [
|
|
3180
3128
|
`name = ${JSON.stringify(resolvedName)}`,
|
|
3181
3129
|
`description = ${JSON.stringify(resolvedDescription)}`,
|
|
3182
|
-
`sandbox_mode = "${sandboxMode}"`,
|
|
3183
3130
|
];
|
|
3131
|
+
if (sandboxTier != null && sandboxTier !== 'none') {
|
|
3132
|
+
lines.push(`sandbox_mode = "${sandboxMode}"`);
|
|
3133
|
+
}
|
|
3184
3134
|
|
|
3185
3135
|
// Embed model override when configured in ~/.gsd/defaults.json so that
|
|
3186
3136
|
// model_overrides is respected on Codex (which uses static TOML, not inline
|
|
@@ -5745,7 +5695,7 @@ function writeCopilotHookConfig(targetDir) {
|
|
|
5745
5695
|
* Generate config.toml and per-agent .toml files for Codex.
|
|
5746
5696
|
* Reads agent .md files from source, extracts metadata, writes .toml configs.
|
|
5747
5697
|
*/
|
|
5748
|
-
function installCodexConfig(targetDir, agentsSrc) {
|
|
5698
|
+
function installCodexConfig(targetDir, agentsSrc, sandboxTier = 'codex-agent-sandbox') {
|
|
5749
5699
|
const configPath = path.join(targetDir, 'config.toml');
|
|
5750
5700
|
const agentsTomlDir = path.join(targetDir, 'agents');
|
|
5751
5701
|
fs.mkdirSync(agentsTomlDir, { recursive: true });
|
|
@@ -5791,7 +5741,7 @@ function installCodexConfig(targetDir, agentsSrc) {
|
|
|
5791
5741
|
// #443 — pass unified effort config so model_reasoning_effort in the .toml
|
|
5792
5742
|
// follows the same config-driven precedence as the Claude .md effort key.
|
|
5793
5743
|
const effortCfg = readGsdEffectiveEffortConfig(targetDir);
|
|
5794
|
-
const tomlContent = generateCodexAgentToml(name, content, modelOverrides, runtimeResolver, effortCfg);
|
|
5744
|
+
const tomlContent = generateCodexAgentToml(name, content, modelOverrides, runtimeResolver, effortCfg, sandboxTier);
|
|
5795
5745
|
fs.writeFileSync(path.join(agentsTomlDir, `${name}.toml`), tomlContent);
|
|
5796
5746
|
}
|
|
5797
5747
|
|
|
@@ -6924,7 +6874,13 @@ function _applyRuntimeRewrites(content, runtime, pathPrefix, isGlobal = false) {
|
|
|
6924
6874
|
content = content.replace(/~\/\.claude\//g, pathPrefix);
|
|
6925
6875
|
content = content.replace(/\$HOME\/\.claude\//g, pathPrefix);
|
|
6926
6876
|
content = content.replace(/\.\/\.claude\//g, `./${dirName}/`);
|
|
6877
|
+
content = content.replace(/~\/\.claude(?![\w-])/g, normalizedPathPrefix);
|
|
6878
|
+
content = content.replace(/\$HOME\/\.claude(?![\w-])/g, normalizedPathPrefix);
|
|
6879
|
+
content = content.replace(/\.\/\.claude(?![\w-])/g, `./${dirName}`);
|
|
6927
6880
|
content = content.replace(/~\/\.augment\//g, pathPrefix);
|
|
6881
|
+
content = content.replace(/\$HOME\/\.augment\//g, pathPrefix);
|
|
6882
|
+
content = content.replace(/~\/\.augment(?![\w-])/g, normalizedPathPrefix);
|
|
6883
|
+
content = content.replace(/\$HOME\/\.augment(?![\w-])/g, normalizedPathPrefix);
|
|
6928
6884
|
content = processAttribution(content, getCommitAttribution(runtime));
|
|
6929
6885
|
break;
|
|
6930
6886
|
|
|
@@ -6984,6 +6940,10 @@ function _applyRuntimeRewrites(content, runtime, pathPrefix, isGlobal = false) {
|
|
|
6984
6940
|
content = content.replace(/\$HOME\/\.claude\//g, pathPrefix);
|
|
6985
6941
|
content = content.replace(/~\/\.qwen\//g, pathPrefix);
|
|
6986
6942
|
content = content.replace(/\$HOME\/\.qwen\//g, pathPrefix);
|
|
6943
|
+
content = content.replace(/~\/\.claude(?![\w-])/g, normalizedPathPrefix);
|
|
6944
|
+
content = content.replace(/\$HOME\/\.claude(?![\w-])/g, normalizedPathPrefix);
|
|
6945
|
+
content = content.replace(/~\/\.qwen(?![\w-])/g, normalizedPathPrefix);
|
|
6946
|
+
content = content.replace(/\$HOME\/\.qwen(?![\w-])/g, normalizedPathPrefix);
|
|
6987
6947
|
// Bare relative .claude/ → .qwen/ (residual refs not matched above)
|
|
6988
6948
|
content = content.replace(/\.claude\//g, '.qwen/');
|
|
6989
6949
|
content = content.replace(/\.\/\.claude\//g, `./${dirName}/`);
|
|
@@ -7000,6 +6960,10 @@ function _applyRuntimeRewrites(content, runtime, pathPrefix, isGlobal = false) {
|
|
|
7000
6960
|
content = content.replace(/\$HOME\/\.claude\//g, pathPrefix);
|
|
7001
6961
|
content = content.replace(/~\/\.hermes\//g, pathPrefix);
|
|
7002
6962
|
content = content.replace(/\$HOME\/\.hermes\//g, pathPrefix);
|
|
6963
|
+
content = content.replace(/~\/\.claude(?![\w-])/g, normalizedPathPrefix);
|
|
6964
|
+
content = content.replace(/\$HOME\/\.claude(?![\w-])/g, normalizedPathPrefix);
|
|
6965
|
+
content = content.replace(/~\/\.hermes(?![\w-])/g, normalizedPathPrefix);
|
|
6966
|
+
content = content.replace(/\$HOME\/\.hermes(?![\w-])/g, normalizedPathPrefix);
|
|
7003
6967
|
// Bare relative .claude/ → .hermes/ (residual refs)
|
|
7004
6968
|
content = content.replace(/\.claude\//g, '.hermes/');
|
|
7005
6969
|
content = content.replace(/\.\/\.claude\//g, `./${dirName}/`);
|
|
@@ -8348,6 +8312,10 @@ function uninstall(isGlobal, runtime = 'claude') {
|
|
|
8348
8312
|
console.log(` ${green}✓${reset} Removed scripts/lib/ GSD files`);
|
|
8349
8313
|
}
|
|
8350
8314
|
}
|
|
8315
|
+
// Remove scripts/fix-slash-commands.cjs (#1223) — must come before the scripts/ rmdir
|
|
8316
|
+
const fixSlashUninstallPath = path.join(targetDir, 'scripts', 'fix-slash-commands.cjs');
|
|
8317
|
+
try { fs.unlinkSync(fixSlashUninstallPath); } catch (_) { /* best-effort */ }
|
|
8318
|
+
|
|
8351
8319
|
// If scripts/ dir is now empty, remove it too
|
|
8352
8320
|
const scriptsUninstallDir = path.join(targetDir, 'scripts');
|
|
8353
8321
|
if (fs.existsSync(scriptsUninstallDir)) {
|
|
@@ -9063,6 +9031,12 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
|
|
|
9063
9031
|
}
|
|
9064
9032
|
}
|
|
9065
9033
|
|
|
9034
|
+
// Track scripts/fix-slash-commands.cjs (top-level scripts/ file, not covered by changeset/lib loops)
|
|
9035
|
+
const fixSlashInstallPath = path.join(configDir, 'scripts', 'fix-slash-commands.cjs');
|
|
9036
|
+
if (fs.existsSync(fixSlashInstallPath)) {
|
|
9037
|
+
manifest.files['scripts/fix-slash-commands.cjs'] = fileHash(fixSlashInstallPath);
|
|
9038
|
+
}
|
|
9039
|
+
|
|
9066
9040
|
fs.writeFileSync(path.join(configDir, MANIFEST_NAME), JSON.stringify(manifest, null, 2));
|
|
9067
9041
|
return manifest;
|
|
9068
9042
|
}
|
|
@@ -10455,6 +10429,25 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
10455
10429
|
}
|
|
10456
10430
|
}
|
|
10457
10431
|
|
|
10432
|
+
// Copy scripts/fix-slash-commands.cjs — required by gsd-core/bin/lib/command-roster.cjs
|
|
10433
|
+
// at load time via require('../../../scripts/fix-slash-commands.cjs'). Without this file
|
|
10434
|
+
// every gsd-tools command crashes with MODULE_NOT_FOUND (#1223).
|
|
10435
|
+
// This copy is independent of scripts/changeset/ — it must land even when the
|
|
10436
|
+
// changeset CLI source is absent.
|
|
10437
|
+
{
|
|
10438
|
+
const fixSlashSrc = path.join(src, 'scripts', 'fix-slash-commands.cjs');
|
|
10439
|
+
const fixSlashDest = path.join(targetDir, 'scripts', 'fix-slash-commands.cjs');
|
|
10440
|
+
fs.mkdirSync(path.join(targetDir, 'scripts'), { recursive: true });
|
|
10441
|
+
if (!fs.existsSync(fixSlashSrc)) {
|
|
10442
|
+
failures.push('scripts/fix-slash-commands.cjs (source missing from package — reinstall from npm)');
|
|
10443
|
+
} else {
|
|
10444
|
+
fs.copyFileSync(fixSlashSrc, fixSlashDest);
|
|
10445
|
+
if (!verifyFileInstalled(fixSlashDest, 'scripts/fix-slash-commands.cjs')) {
|
|
10446
|
+
failures.push('scripts/fix-slash-commands.cjs');
|
|
10447
|
+
}
|
|
10448
|
+
}
|
|
10449
|
+
}
|
|
10450
|
+
|
|
10458
10451
|
// Remove legacy get-shit-done-cc artifacts and stale update caches (#607).
|
|
10459
10452
|
// cleanupLegacyGsdCc handles both the legacy shared cache and the per-package
|
|
10460
10453
|
// cache (formerly an inline unlinkSync here). A cleanup failure must never
|
|
@@ -10717,7 +10710,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
10717
10710
|
if (!isMinimalMode(_effectiveInstallMode)) {
|
|
10718
10711
|
try {
|
|
10719
10712
|
// Generate Codex config.toml and per-agent .toml files.
|
|
10720
|
-
agentCount = installCodexConfig(targetDir, agentsSrc);
|
|
10713
|
+
agentCount = installCodexConfig(targetDir, agentsSrc, plan.sandboxTier);
|
|
10721
10714
|
} catch (e) {
|
|
10722
10715
|
restoreCodexSnapshot();
|
|
10723
10716
|
throw e;
|
|
@@ -12265,6 +12258,10 @@ module.exports = {
|
|
|
12265
12258
|
parseConfigDirFromArgs,
|
|
12266
12259
|
cleanupLegacyGsdCc,
|
|
12267
12260
|
_applyRuntimeRewrites,
|
|
12261
|
+
// #1191 — exported so tests exercise the REAL readSettings, not a replica
|
|
12262
|
+
readSettings,
|
|
12263
|
+
stripJsonComments,
|
|
12264
|
+
...runtimeArtifactConversion,
|
|
12268
12265
|
};
|
|
12269
12266
|
|
|
12270
12267
|
// Main logic — only run when not loaded as a module for testing
|