gsdd-cli 0.16.1 → 0.18.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.
- package/README.md +109 -60
- package/agents/README.md +1 -1
- package/bin/adapters/claude.mjs +8 -1
- package/bin/adapters/codex.mjs +5 -1
- package/bin/adapters/opencode.mjs +7 -1
- package/bin/gsdd.mjs +6 -4
- package/bin/lib/evidence-contract.mjs +112 -0
- package/bin/lib/health-truth.mjs +29 -31
- package/bin/lib/health.mjs +32 -80
- package/bin/lib/init-runtime.mjs +44 -24
- package/bin/lib/init.mjs +3 -7
- package/bin/lib/lifecycle-preflight.mjs +333 -0
- package/bin/lib/lifecycle-state.mjs +293 -0
- package/bin/lib/phase.mjs +81 -26
- package/bin/lib/provenance.mjs +20 -1
- package/bin/lib/rendering.mjs +8 -0
- package/bin/lib/runtime-freshness.mjs +239 -0
- package/bin/lib/session-fingerprint.mjs +106 -0
- package/distilled/DESIGN.md +398 -12
- package/distilled/EVIDENCE-INDEX.md +105 -0
- package/distilled/README.md +44 -28
- package/distilled/SKILL.md +4 -4
- package/distilled/templates/agents.block.md +1 -1
- package/distilled/workflows/audit-milestone.md +50 -0
- package/distilled/workflows/complete-milestone.md +38 -2
- package/distilled/workflows/execute.md +13 -0
- package/distilled/workflows/map-codebase.md +14 -3
- package/distilled/workflows/new-milestone.md +13 -0
- package/distilled/workflows/new-project.md +3 -1
- package/distilled/workflows/plan.md +3 -1
- package/distilled/workflows/progress.md +68 -13
- package/distilled/workflows/quick.md +15 -8
- package/distilled/workflows/resume.md +14 -1
- package/distilled/workflows/verify.md +52 -17
- package/docs/BROWNFIELD-PROOF.md +95 -0
- package/docs/RUNTIME-SUPPORT.md +77 -0
- package/docs/USER-GUIDE.md +439 -0
- package/docs/VERIFICATION-DISCIPLINE.md +59 -0
- package/docs/claude/context-monitor.md +98 -0
- package/docs/proof/consumer-node-cli/README.md +37 -0
- package/docs/proof/consumer-node-cli/ROADMAP.md +14 -0
- package/docs/proof/consumer-node-cli/SPEC.md +17 -0
- package/docs/proof/consumer-node-cli/brief.md +9 -0
- package/docs/proof/consumer-node-cli/phases/01-foundation/01-01-PLAN.md +34 -0
- package/docs/proof/consumer-node-cli/phases/01-foundation/01-01-SUMMARY.md +10 -0
- package/docs/proof/consumer-node-cli/phases/01-foundation/01-VERIFICATION.md +30 -0
- package/package.json +34 -27
package/README.md
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# Workspine
|
|
4
4
|
|
|
5
|
-
**
|
|
6
|
-
|
|
7
|
-
Northline gives long-horizon AI-assisted software work one repo-native planning, execution, verification, and handoff spine so progress survives runtime switching and session loss. The package and CLI remain `gsdd-cli` / `gsdd`.
|
|
5
|
+
**AI development that stays consistent across agents and sessions.** Plans are checked, work is verified, and progress is tracked in the repo.
|
|
8
6
|
|
|
9
7
|
[](https://www.npmjs.com/package/gsdd-cli)
|
|
10
8
|
[](LICENSE)
|
|
@@ -13,32 +11,74 @@ Northline gives long-horizon AI-assisted software work one repo-native planning,
|
|
|
13
11
|
npx gsdd-cli init
|
|
14
12
|
```
|
|
15
13
|
|
|
16
|
-
**Directly validated today:** Claude Code, Codex CLI, and OpenCode.
|
|
17
|
-
**Qualified support:** Cursor, Copilot, and Gemini CLI
|
|
14
|
+
**Directly validated today:** Claude Code, Codex CLI, and OpenCode.
|
|
15
|
+
**Qualified support:** Cursor, Copilot, and Gemini CLI support the same core workflow through the shared `.agents/skills/` surface; this release does not claim the same runtime proof or ergonomics.
|
|
18
16
|
|
|
19
17
|
</div>
|
|
20
18
|
|
|
19
|
+
One repo-native spine for planning, checking, execution, verification, and handoff — so AI-assisted work survives cold starts, runtime switches, and session loss.
|
|
20
|
+
|
|
21
21
|
---
|
|
22
22
|
|
|
23
23
|
## What This Is
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Workspine is a repo-native delivery spine for long-horizon AI-assisted software work. It keeps planning, execution, verification, handoff, and progress state in the repo so work survives cold starts, runtime switches, and session loss.
|
|
26
|
+
|
|
27
|
+
Workspine is the product name. The package, CLI commands, workflow prefixes, and workspace directory remain `gsdd-cli`, `gsdd`, `gsdd-*`, and `.planning/` — these are retained technical contracts, not rename residue.
|
|
28
|
+
|
|
29
|
+
### Lineage
|
|
30
|
+
|
|
31
|
+
Workspine began as a fork of [Get Shit Done](https://github.com/gsd-build/get-shit-done), whose long-horizon delivery spine proved the problem was real. Since the fork, upstream GSD has continued evolving into a broad multi-runtime framework — as of April 2026, GSD v1 documents 81 commands and 78 workflows across 33 agents. Workspine took a different path: 14 public workflow surfaces, generated runtime adapters from a portable core, evidence-gated closure, and provenance-aware continuity. The trade-off is deliberate: a narrower surface with stricter closure and fewer moving parts for the human operator.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## What's Different
|
|
36
|
+
|
|
37
|
+
### Context survives cold starts, tool switches, and session loss
|
|
38
|
+
|
|
39
|
+
Planning, phase artifacts, verification reports, and handoff checkpoints live in `.planning/`. When you switch runtimes or come back after a week, the repo still knows what was planned, what was executed, what was verified, and where you stopped.
|
|
40
|
+
|
|
41
|
+
<details>
|
|
42
|
+
<summary>How it works</summary>
|
|
43
|
+
|
|
44
|
+
Three-layer continuity model: durable project truth (SPEC, ROADMAP, design decisions), live workflow state (phase plans, summaries, checkpoints), and compressed judgment (active constraints, anti-regression rules). Pause/resume workflows write and read these layers explicitly. No session memory required.
|
|
45
|
+
|
|
46
|
+
</details>
|
|
47
|
+
|
|
48
|
+
### Done means verified, not merely generated
|
|
49
|
+
|
|
50
|
+
Verification is a separate workflow with a separate context window, not a checkbox at the end of execution. It checks three levels — do the files exist, is the code substantive (not stubs), and is it actually wired into the system — plus an anti-pattern scan.
|
|
51
|
+
|
|
52
|
+
<details>
|
|
53
|
+
<summary>How it works</summary>
|
|
54
|
+
|
|
55
|
+
`gsdd-verify` runs after execution and produces a typed verification report. `gsdd-audit-milestone` checks cross-phase integration, requirement coverage, and end-to-end flows. Evidence-gated closure prevents marking work done without the right evidence kinds (code, test, runtime, delivery, human).
|
|
26
56
|
|
|
27
|
-
|
|
57
|
+
</details>
|
|
28
58
|
|
|
29
|
-
|
|
59
|
+
### Rules that must be consistent are enforced by code, not by memory
|
|
30
60
|
|
|
31
|
-
-
|
|
32
|
-
- **Codebase mapping** — 4 parallel mappers produce STACK, ARCHITECTURE, CONVENTIONS, CONCERNS
|
|
33
|
-
- **Scoped planning** — research, backward planning, fresh-context adversarial plan checking
|
|
34
|
-
- **Execution** — wave-based parallel execution with fresh context per plan
|
|
35
|
-
- **Verification** — Exists/Substantive/Wired gate, anti-pattern scan
|
|
36
|
-
- **Milestone audit** — cross-phase integration, requirements coverage, E2E flows
|
|
37
|
-
- **Session management** — pause work with checkpoint, resume with context restoration and routing
|
|
61
|
+
1,381 tests across 13 test files guard properties that PRs repeatedly broke: delegate-role reference integrity, workflow vendor-API cleanliness, artifact schema consistency, plan-checker dimension coverage, and cross-document drift.
|
|
38
62
|
|
|
39
|
-
|
|
63
|
+
<details>
|
|
64
|
+
<summary>How it works</summary>
|
|
40
65
|
|
|
41
|
-
|
|
66
|
+
Invariant suites (I-series), guard suites (G-series), and scenario suites (S-series) run on every change. Each assertion includes a `FIX:` instruction so failures are actionable. 52 documented design decisions in `distilled/DESIGN.md` record the rationale with evidence trails.
|
|
67
|
+
|
|
68
|
+
</details>
|
|
69
|
+
|
|
70
|
+
### Smaller surface, stricter closure
|
|
71
|
+
|
|
72
|
+
14 workflows. 10 roles. One CLI. Lifecycle progression goes through deterministic preflight gates — not conversational inference. Plans are checked by a separate agent in a separate context before execution begins. Closure requires evidence, not just file existence.
|
|
73
|
+
|
|
74
|
+
<details>
|
|
75
|
+
<summary>How it works</summary>
|
|
76
|
+
|
|
77
|
+
`gsdd-plan` is terminal: it writes planning artifacts and stops. Execution requires an explicit `gsdd-execute` transition. `lifecycle-preflight` evaluates eligibility from repo artifacts before allowing state changes. `phase-status` is the only explicit ROADMAP mutator. `progress` is read-only.
|
|
78
|
+
|
|
79
|
+
</details>
|
|
80
|
+
|
|
81
|
+
**Target user:** Developer or small team that wants one durable delivery spine across coding runtimes, with explicit checks and repo-native proof instead of a dashboard or orchestration control plane.
|
|
42
82
|
|
|
43
83
|
---
|
|
44
84
|
|
|
@@ -63,27 +103,44 @@ In a terminal, `gsdd init` now opens a guided install wizard:
|
|
|
63
103
|
- Step 3: configure planning defaults in the same guided flow
|
|
64
104
|
|
|
65
105
|
Portable `.agents/skills/gsdd-*` skills are always generated. The wizard controls extra native adapters and optional governance, not the portable baseline.
|
|
106
|
+
When those generated surfaces exist locally, `gsdd health` checks them against current render output instead of asking you to trust manual review.
|
|
66
107
|
|
|
67
108
|
### Launch Proof Status
|
|
68
109
|
|
|
69
|
-
- **Directly validated
|
|
70
|
-
- **Qualified support:** Cursor, Copilot, and Gemini CLI
|
|
110
|
+
- **Directly validated:** Claude Code, Codex CLI, and OpenCode have recorded `plan -> execute -> verify` evidence for the core lifecycle.
|
|
111
|
+
- **Qualified support:** Cursor, Copilot, and Gemini CLI support the same core workflow through the shared `.agents/skills/` surface; this release does not claim the same runtime proof or ergonomics.
|
|
112
|
+
- **Runtime-surface freshness:** Installed generated skills and native adapters are renderer-checked locally; repair stays deterministic through `npx gsdd-cli update`.
|
|
71
113
|
|
|
72
|
-
|
|
114
|
+
Start with the public proof pack:
|
|
73
115
|
|
|
74
|
-
|
|
116
|
+
- [Brownfield proof](docs/BROWNFIELD-PROOF.md)
|
|
117
|
+
- [Exported consumer proof pack](docs/proof/consumer-node-cli/README.md)
|
|
118
|
+
- [Runtime support matrix](docs/RUNTIME-SUPPORT.md)
|
|
119
|
+
- [Verification discipline](docs/VERIFICATION-DISCIPLINE.md)
|
|
120
|
+
|
|
121
|
+
### Quickstart (after init)
|
|
122
|
+
|
|
123
|
+
Runtime floor: Node 20+.
|
|
124
|
+
|
|
125
|
+
Your tool determines how you invoke workflows:
|
|
75
126
|
|
|
76
127
|
- **Claude Code / OpenCode / Cursor / Copilot / Gemini:** Use slash commands directly — `/gsdd-new-project`, `/gsdd-plan`, etc.
|
|
77
|
-
- **Codex CLI:** Use skill references — `$gsdd-new-project`, `$gsdd-plan`, etc.
|
|
128
|
+
- **Codex CLI:** Use skill references — `$gsdd-new-project`, `$gsdd-plan`, etc. `$gsdd-plan` writes the plan and stops; start a separate `$gsdd-execute` run when you want implementation to begin.
|
|
78
129
|
- **Other AI tools:** Open `.agents/skills/gsdd-<workflow>/SKILL.md` and follow the instructions.
|
|
79
130
|
|
|
80
|
-
If you generate the root `AGENTS.md` block, it adds
|
|
131
|
+
If you generate the root `AGENTS.md` block, it adds the framework's behavioral governance. For Cursor, Copilot, and Gemini, that governance is optional discipline on top of native skill discovery — not the mechanism that makes workflows discoverable.
|
|
132
|
+
|
|
133
|
+
### Choose Your Starting Workflow
|
|
81
134
|
|
|
82
|
-
|
|
135
|
+
| Situation | Start here | Why |
|
|
136
|
+
|----------|------------|-----|
|
|
137
|
+
| Greenfield project, or brownfield work that is fuzzy / broad / milestone-shaped | `gsdd-new-project` | This is the full initializer. On brownfield repos it will run codebase mapping internally when it needs it. |
|
|
138
|
+
| Brownfield repo and the bounded change is already concrete | `gsdd-quick` | This is the bounded-change lane. It can use existing codebase maps when present and otherwise builds a just-enough inline brownfield baseline. |
|
|
139
|
+
| Brownfield repo is unfamiliar, risky, or you want a deeper baseline before choosing the lane | `gsdd-map-codebase` | This is the deeper orientation pass. Use it when the inline quick baseline would be too weak, then continue with `gsdd-quick` or `gsdd-new-project`. |
|
|
83
140
|
|
|
84
141
|
### Platform Adapters
|
|
85
142
|
|
|
86
|
-
|
|
143
|
+
Workspine generates adapters for whichever tools you use:
|
|
87
144
|
|
|
88
145
|
```bash
|
|
89
146
|
npx gsdd-cli init # Guided install wizard (detected runtimes preselected)
|
|
@@ -98,10 +155,10 @@ npx gsdd-cli init --tools all # All of the above
|
|
|
98
155
|
| Platform | Public claim | What's generated |
|
|
99
156
|
|----------|--------------|-----------------|
|
|
100
157
|
| **All** (default) | Shared portable surface | `.agents/skills/gsdd-*/SKILL.md` — portable workflow entrypoints (always generated) |
|
|
101
|
-
| **Claude Code** | Directly validated | `.claude/skills/`, `.claude/commands/`, `.claude/agents/` — native workflow surfaces |
|
|
102
|
-
| **OpenCode** | Directly validated | `.opencode/commands/`, `.opencode/agents/` — native workflow surfaces |
|
|
103
|
-
| **Codex CLI** | Directly validated | Portable skill entry plus `.codex/agents/gsdd-plan-checker.toml
|
|
104
|
-
| **Cursor / Copilot / Gemini** |
|
|
158
|
+
| **Claude Code** | Directly validated | `.claude/skills/`, `.claude/commands/`, `.claude/agents/` — native workflow surfaces, freshness-checked when generated locally |
|
|
159
|
+
| **OpenCode** | Directly validated | `.opencode/commands/`, `.opencode/agents/` — native workflow surfaces, freshness-checked when generated locally |
|
|
160
|
+
| **Codex CLI** | Directly validated | Portable skill entry plus `.codex/agents/gsdd-plan-checker.toml`; planning stays locked until explicit `$gsdd-execute`, and installed surfaces are freshness-checked locally |
|
|
161
|
+
| **Cursor / Copilot / Gemini** | Same core workflow | Skills-native discovery from `.agents/skills/`; optional root `AGENTS.md` block adds behavioral governance, and the generated skill surface is freshness-checked locally |
|
|
105
162
|
| **Other AI tools** | Fallback only | Open `.agents/skills/gsdd-*/SKILL.md` directly |
|
|
106
163
|
|
|
107
164
|
### Updating
|
|
@@ -112,7 +169,7 @@ npx gsdd-cli update --tools claude # Update specific platform only
|
|
|
112
169
|
npx gsdd-cli update --templates # Refresh .planning/templates/ and role contracts from framework source
|
|
113
170
|
```
|
|
114
171
|
|
|
115
|
-
###
|
|
172
|
+
### Non-Interactive Mode (CI / Automation)
|
|
116
173
|
|
|
117
174
|
For non-interactive environments:
|
|
118
175
|
|
|
@@ -121,7 +178,7 @@ npx gsdd-cli init --auto --tools claude
|
|
|
121
178
|
npx gsdd-cli init --auto --tools claude --brief path/to/PRD.md
|
|
122
179
|
```
|
|
123
180
|
|
|
124
|
-
`--auto` skips interactive
|
|
181
|
+
`--auto` skips the interactive install wizard and uses default configuration. It does **not** run downstream workflows (`new-project`, `plan`, `execute`, `verify`) — those are always explicit. `--brief` copies a project document to `.planning/PROJECT_BRIEF.md` for `new-project` to consume.
|
|
125
182
|
|
|
126
183
|
If you already know exactly what to generate, `--tools ...` remains the manual path. The wizard is the primary onboarding UX; flags remain the advanced/headless contract.
|
|
127
184
|
|
|
@@ -151,7 +208,7 @@ init → [plan → execute → verify] × N phases → audit-milestone → done
|
|
|
151
208
|
Run the `gsdd-new-project` workflow. The system:
|
|
152
209
|
|
|
153
210
|
1. **Questions** — asks until it understands your idea (goals, constraints, tech, edge cases)
|
|
154
|
-
2. **Codebase
|
|
211
|
+
2. **Codebase map** — if brownfield and a deeper baseline is needed, maps the codebase across stack, architecture, conventions, and concerns; users do not need to pre-run `map-codebase` before `new-project`
|
|
155
212
|
3. **Research** — spawns parallel researchers to investigate the domain (configurable depth: fast/balanced/deep)
|
|
156
213
|
4. **Spec + Roadmap** — produces `SPEC.md` (living specification) and `ROADMAP.md` (phased delivery plan)
|
|
157
214
|
|
|
@@ -167,7 +224,9 @@ Run `gsdd-plan` for the current phase. The system:
|
|
|
167
224
|
2. **Plans** — creates atomic task plans with XML structure
|
|
168
225
|
3. **Checks** — a separate agent in a fresh context window reviews the plan against 7 dimensions (requirement coverage, task completeness, dependency correctness, key-link completeness, scope sanity, must-have quality, context compliance). If the plan fails, it revises and re-checks — up to 3 cycles before escalating to the human. Output is typed JSON so orchestration is machine-parseable, not prompt-dependent.
|
|
169
226
|
|
|
170
|
-
Each plan is small enough to execute in a fresh context window. The checker runs in a separate context from the planner — this is the [ICLR-validated](https://arxiv.org/abs/2310.
|
|
227
|
+
Each plan is small enough to execute in a fresh context window. The checker runs in a separate context from the planner — this is the [ICLR-validated](https://arxiv.org/abs/2310.01798) pattern for catching blind spots the planner inherits from its own reasoning.
|
|
228
|
+
|
|
229
|
+
`gsdd-plan` is terminal for the current run: it writes planning artifacts only. Execution begins only after an explicit `gsdd-execute` / `/gsdd-execute` / `$gsdd-execute` transition, depending on the runtime.
|
|
171
230
|
|
|
172
231
|
**Creates:** Phase plans in `.planning/phases/`
|
|
173
232
|
|
|
@@ -234,12 +293,12 @@ Use for: bug fixes, small features, config changes, one-off tasks.
|
|
|
234
293
|
|
|
235
294
|
## Workflows
|
|
236
295
|
|
|
237
|
-
|
|
296
|
+
Workspine has 14 workflows, run via generated skills or adapters:
|
|
238
297
|
|
|
239
298
|
| Workflow | What it does |
|
|
240
299
|
|----------|--------------|
|
|
241
|
-
| `gsdd-new-project` | Full initialization: questioning,
|
|
242
|
-
| `gsdd-map-codebase` |
|
|
300
|
+
| `gsdd-new-project` | Full initialization: questioning, brownfield audit when needed, research, spec, roadmap |
|
|
301
|
+
| `gsdd-map-codebase` | Deeper brownfield orientation and refresh before `quick` or `new-project` |
|
|
243
302
|
| `gsdd-plan` | Research + plan + check for a phase |
|
|
244
303
|
| `gsdd-execute` | Execute phase plan: implement tasks, verify changes |
|
|
245
304
|
| `gsdd-verify` | Verify completed phase: 3-level checks, anti-pattern scan |
|
|
@@ -248,7 +307,7 @@ GSDD has 14 workflows, run via generated skills or adapters:
|
|
|
248
307
|
| `gsdd-complete-milestone` | Archive shipped milestone, evolve spec, collapse roadmap |
|
|
249
308
|
| `gsdd-new-milestone` | Start next milestone: gather goals, define requirements, create roadmap phases |
|
|
250
309
|
| `gsdd-plan-milestone-gaps` | Create gap-closure phases from audit results |
|
|
251
|
-
| `gsdd-quick` | Quick task:
|
|
310
|
+
| `gsdd-quick` | Quick task: bounded brownfield change lane with inline baseline when full mapping is unnecessary |
|
|
252
311
|
| `gsdd-pause` | Pause work: save session context to checkpoint for seamless resumption |
|
|
253
312
|
| `gsdd-resume` | Resume work: restore context from artifacts and route to next action |
|
|
254
313
|
| `gsdd-progress` | Show project status and route to next action |
|
|
@@ -284,7 +343,7 @@ Workflows are agent skills or commands, not plain shell utilities. How you invok
|
|
|
284
343
|
|
|
285
344
|
### Roles (10 canonical)
|
|
286
345
|
|
|
287
|
-
|
|
346
|
+
Workspine consolidates GSD's agent surface into 10 roles with durable contracts:
|
|
288
347
|
|
|
289
348
|
| Role | Responsibility |
|
|
290
349
|
|------|---------------|
|
|
@@ -296,6 +355,7 @@ GSDD consolidates GSD's agent surface into 10 roles with durable contracts:
|
|
|
296
355
|
| **Verifier** | Phase verification — Exists/Substantive/Wired gate |
|
|
297
356
|
| **Roadmapper** | Roadmap generation from spec |
|
|
298
357
|
| **Integration Checker** | Cross-phase wiring, API coverage, auth protection, E2E flows |
|
|
358
|
+
| **Approach Explorer** | Implementation approach alignment before planning begins |
|
|
299
359
|
| **Debugger** | Utility role for systematic debugging |
|
|
300
360
|
|
|
301
361
|
### Two-Layer Architecture
|
|
@@ -307,14 +367,14 @@ GSDD consolidates GSD's agent surface into 10 roles with durable contracts:
|
|
|
307
367
|
|
|
308
368
|
### Adapter Architecture
|
|
309
369
|
|
|
310
|
-
|
|
370
|
+
Workspine generates vendor-specific files from vendor-agnostic markdown — it does not convert from one vendor format to another. This means every adapter gets first-class output shaped to its platform's native capabilities.
|
|
311
371
|
|
|
312
372
|
| Adapter | Evidence posture | Strategy |
|
|
313
373
|
|---------|------------------|----------|
|
|
314
374
|
| **Claude Code** | Directly validated | Skill-primary plan surface, thin command alias, native `gsdd-plan-checker` agent |
|
|
315
375
|
| **OpenCode** | Directly validated | Specialized `/gsdd-plan` command (`subtask: false`), hidden `gsdd-plan-checker` subagent (`mode: subagent`) |
|
|
316
|
-
| **Codex CLI** | Directly validated | Portable skill as entry surface, `.codex/agents/gsdd-plan-checker.toml` (read-only, high reasoning effort) |
|
|
317
|
-
| **Cursor / Copilot / Gemini** |
|
|
376
|
+
| **Codex CLI** | Directly validated | Portable skill as entry surface, `.codex/agents/gsdd-plan-checker.toml` (read-only, high reasoning effort), explicit `$gsdd-execute` unlock |
|
|
377
|
+
| **Cursor / Copilot / Gemini** | Same core workflow | Runtime discovers `.agents/skills/` natively; optional root `AGENTS.md` block adds behavioral governance only |
|
|
318
378
|
| **agents** (`--tools agents`) | Governance-only helper | Root `AGENTS.md` block for tools that benefit from governance or need open-standard fallback guidance |
|
|
319
379
|
|
|
320
380
|
All adapters render the plan-checker from a single source (`distilled/templates/delegates/plan-checker.md`). Each adapter shapes the output to its platform's native mechanics, and the portable skill remains the shared workflow source.
|
|
@@ -338,7 +398,7 @@ Model IDs pass through a two-layer injection guard: a regex whitelist (`/^[a-zA-
|
|
|
338
398
|
|
|
339
399
|
### Advisory Git Protocol
|
|
340
400
|
|
|
341
|
-
|
|
401
|
+
Workspine does not impose commit formats, branch naming, or one-commit-per-task rules. Git guidance is advisory — repository and team conventions take precedence:
|
|
342
402
|
|
|
343
403
|
- **Branching** — follow existing repo conventions
|
|
344
404
|
- **Commits** — group changes logically, no framework-imposed format
|
|
@@ -390,8 +450,8 @@ Optional model-control keys:
|
|
|
390
450
|
|
|
391
451
|
Runtime behavior:
|
|
392
452
|
- Claude translates semantic tiers to native aliases for the checker agent.
|
|
393
|
-
- OpenCode inherits its runtime model by default;
|
|
394
|
-
- Codex inherits its session model by default;
|
|
453
|
+
- OpenCode inherits its runtime model by default; Workspine only injects an exact OpenCode `model:` when you set an explicit runtime override.
|
|
454
|
+
- Codex inherits its session model by default; Workspine only injects an explicit `model` in the TOML when you set an explicit runtime override.
|
|
395
455
|
|
|
396
456
|
CLI:
|
|
397
457
|
- `gsdd models show`
|
|
@@ -430,6 +490,7 @@ Advisory defaults, overridden by repo conventions:
|
|
|
430
490
|
| Problem | What to do |
|
|
431
491
|
|---------|------------|
|
|
432
492
|
| Workspace feels broken | `gsdd health` — checks errors, warnings, info |
|
|
493
|
+
| `gsdd health` reports generated runtime-surface drift | `npx gsdd-cli update` (or `npx gsdd-cli update --tools <runtime>`) — regenerates installed skills/adapters from current render output |
|
|
433
494
|
| Lost track of progress | Run `gsdd-progress` — reads artifacts, shows status |
|
|
434
495
|
| Need context from last session | Run `gsdd-resume` — restores state, routes to next action |
|
|
435
496
|
| Plans seem wrong | Check `workflow.research: true` in config |
|
|
@@ -443,7 +504,7 @@ For detailed troubleshooting and recovery procedures, see the [User Guide](docs/
|
|
|
443
504
|
|
|
444
505
|
## Design Decisions
|
|
445
506
|
|
|
446
|
-
|
|
507
|
+
This repo records 52 documented design decisions relative to GSD, each with evidence from source files and external research. See [`distilled/DESIGN.md`](distilled/DESIGN.md) for the full rationale.
|
|
447
508
|
|
|
448
509
|
Key choices:
|
|
449
510
|
- **4-file codebase standard** — drop state that rots (STRUCTURE, INTEGRATIONS, TESTING), keep rules that don't
|
|
@@ -461,7 +522,7 @@ Key choices:
|
|
|
461
522
|
|
|
462
523
|
## Testing
|
|
463
524
|
|
|
464
|
-
|
|
525
|
+
The framework has 1,381 tests across 13 test files — named suites that guard properties PRs repeatedly fixed manually. These are not unit tests for application code; they are invariant checks on the specification itself.
|
|
465
526
|
|
|
466
527
|
### Invariant Suites (I-series)
|
|
467
528
|
|
|
@@ -538,21 +599,9 @@ npm test
|
|
|
538
599
|
|
|
539
600
|
---
|
|
540
601
|
|
|
541
|
-
## Relationship to GSD
|
|
542
|
-
|
|
543
|
-
GSDD is a distilled fork of [Get Shit Done](https://github.com/gsd-build/get-shit-done). It is **not** a full replacement for current upstream GSD.
|
|
544
|
-
|
|
545
|
-
**What GSDD preserves** (~76% of core method): the long-horizon delivery spine — persistent artifacts, codebase mapping, scoped planning, execution, verification, and milestone auditing.
|
|
546
|
-
|
|
547
|
-
**What GSDD does not cover** (~44% of full upstream surface): GSD currently exposes 32 workflow files and 11 agent files including discovery modes, a settings flow, extra operator ergonomics, and broader session-management surface area. GSDD intentionally does not recreate this full surface.
|
|
548
|
-
|
|
549
|
-
**The trade-off:** Fewer moving parts for the human operator. Cleaner role contracts and a simpler artifact model. But reduced operator comfort and limited control-plane features (no telemetry, no artifact linting). Health diagnostics are available via `gsdd health`.
|
|
550
|
-
|
|
551
|
-
---
|
|
552
|
-
|
|
553
602
|
## Credits
|
|
554
603
|
|
|
555
|
-
|
|
604
|
+
Workspine is a fork of [Get Shit Done](https://github.com/gsd-build/get-shit-done) by [Lex Christopherson](https://github.com/glittercowboy), licensed under MIT. Original git history is retained for attribution.
|
|
556
605
|
|
|
557
606
|
---
|
|
558
607
|
|
package/agents/README.md
CHANGED
package/bin/adapters/claude.mjs
CHANGED
|
@@ -181,4 +181,11 @@ function createClaudeAdapter({ cwd, workflows, renderSkillContent, getDelegateCo
|
|
|
181
181
|
};
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
export {
|
|
184
|
+
export {
|
|
185
|
+
createClaudeAdapter,
|
|
186
|
+
CLAUDE_MODEL_PROFILES,
|
|
187
|
+
renderClaudeApproachExplorer,
|
|
188
|
+
renderClaudePlanChecker,
|
|
189
|
+
renderClaudePlanCommand,
|
|
190
|
+
renderClaudePlanSkill,
|
|
191
|
+
};
|
package/bin/adapters/codex.mjs
CHANGED
|
@@ -269,4 +269,10 @@ function createOpenCodeAdapter({
|
|
|
269
269
|
};
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
-
export {
|
|
272
|
+
export {
|
|
273
|
+
createOpenCodeAdapter,
|
|
274
|
+
detectOpenCodeConfiguredModel,
|
|
275
|
+
renderOpenCodeApproachExplorer,
|
|
276
|
+
renderOpenCodePlanChecker,
|
|
277
|
+
renderOpenCodePlanCommand,
|
|
278
|
+
};
|
package/bin/gsdd.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// gsdd -
|
|
3
|
+
// gsdd - Workspine CLI
|
|
4
4
|
|
|
5
5
|
import { realpathSync } from 'fs';
|
|
6
6
|
import { join, dirname } from 'path';
|
|
@@ -19,6 +19,7 @@ import { createCmdInit, createCmdUpdate, cmdHelp } from './lib/init.mjs';
|
|
|
19
19
|
import { cmdFindPhase, cmdVerify, cmdScaffold, cmdPhaseStatus } from './lib/phase.mjs';
|
|
20
20
|
import { cmdFileOp } from './lib/file-ops.mjs';
|
|
21
21
|
import { createCmdHealth } from './lib/health.mjs';
|
|
22
|
+
import { cmdLifecyclePreflight } from './lib/lifecycle-preflight.mjs';
|
|
22
23
|
|
|
23
24
|
const __filename = fileURLToPath(import.meta.url);
|
|
24
25
|
const __dirname = dirname(__filename);
|
|
@@ -57,7 +58,7 @@ const WORKFLOWS = [
|
|
|
57
58
|
defineWorkflow({ name: 'gsdd-progress', workflow: 'progress.md', description: 'Check progress - show project status and route to next action', mutatesArtifacts: false }),
|
|
58
59
|
];
|
|
59
60
|
|
|
60
|
-
const FRAMEWORK_VERSION = 'v1.
|
|
61
|
+
const FRAMEWORK_VERSION = 'v1.4';
|
|
61
62
|
|
|
62
63
|
function createCliContext(cwd = process.cwd()) {
|
|
63
64
|
return {
|
|
@@ -87,7 +88,7 @@ const INIT_CONTEXT = createCliContext(CWD);
|
|
|
87
88
|
|
|
88
89
|
const cmdInit = createCmdInit(INIT_CONTEXT);
|
|
89
90
|
const cmdUpdate = createCmdUpdate(INIT_CONTEXT);
|
|
90
|
-
const cmdHealth = createCmdHealth(
|
|
91
|
+
const cmdHealth = createCmdHealth(INIT_CONTEXT);
|
|
91
92
|
|
|
92
93
|
const COMMANDS = {
|
|
93
94
|
init: cmdInit,
|
|
@@ -95,6 +96,7 @@ const COMMANDS = {
|
|
|
95
96
|
models: cmdModels,
|
|
96
97
|
health: cmdHealth,
|
|
97
98
|
'file-op': cmdFileOp,
|
|
99
|
+
'lifecycle-preflight': cmdLifecyclePreflight,
|
|
98
100
|
'find-phase': cmdFindPhase,
|
|
99
101
|
'phase-status': cmdPhaseStatus,
|
|
100
102
|
verify: cmdVerify,
|
|
@@ -124,4 +126,4 @@ if (IS_MAIN) {
|
|
|
124
126
|
await runCli();
|
|
125
127
|
}
|
|
126
128
|
|
|
127
|
-
export { cmdHelp, cmdInit, cmdUpdate, cmdModels, cmdHealth, cmdFileOp, cmdFindPhase, cmdPhaseStatus, cmdVerify, cmdScaffold, runCli, FRAMEWORK_VERSION, createCliContext };
|
|
129
|
+
export { cmdHelp, cmdInit, cmdUpdate, cmdModels, cmdHealth, cmdFileOp, cmdLifecyclePreflight, cmdFindPhase, cmdPhaseStatus, cmdVerify, cmdScaffold, runCli, FRAMEWORK_VERSION, createCliContext };
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const EVIDENCE_KINDS = Object.freeze(['code', 'test', 'runtime', 'delivery', 'human']);
|
|
2
|
+
const DELIVERY_POSTURES = Object.freeze(['repo_only', 'delivery_sensitive']);
|
|
3
|
+
const CLOSURE_SURFACES = Object.freeze(['verify', 'audit-milestone', 'complete-milestone']);
|
|
4
|
+
|
|
5
|
+
const LEGACY_EVIDENCE_ALIASES = Object.freeze({
|
|
6
|
+
code: 'code',
|
|
7
|
+
test: 'test',
|
|
8
|
+
runtime: 'runtime',
|
|
9
|
+
delivery: 'delivery',
|
|
10
|
+
human: 'human',
|
|
11
|
+
'code-evidence': 'code',
|
|
12
|
+
'repo-test': 'test',
|
|
13
|
+
'runtime-check': 'runtime',
|
|
14
|
+
'user-confirmation': 'human',
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const EVIDENCE_MATRIX = Object.freeze({
|
|
18
|
+
verify: Object.freeze({
|
|
19
|
+
repo_only: Object.freeze({
|
|
20
|
+
requiredKinds: Object.freeze(['code']),
|
|
21
|
+
recommendedKinds: Object.freeze(['test']),
|
|
22
|
+
blockedSoloKinds: Object.freeze(['human', 'delivery']),
|
|
23
|
+
}),
|
|
24
|
+
delivery_sensitive: Object.freeze({
|
|
25
|
+
requiredKinds: Object.freeze(['code', 'runtime']),
|
|
26
|
+
recommendedKinds: Object.freeze(['test', 'delivery', 'human']),
|
|
27
|
+
blockedSoloKinds: Object.freeze(['code', 'human']),
|
|
28
|
+
}),
|
|
29
|
+
}),
|
|
30
|
+
'audit-milestone': Object.freeze({
|
|
31
|
+
repo_only: Object.freeze({
|
|
32
|
+
requiredKinds: Object.freeze(['code', 'test']),
|
|
33
|
+
recommendedKinds: Object.freeze(['runtime', 'human']),
|
|
34
|
+
blockedSoloKinds: Object.freeze(['human', 'delivery']),
|
|
35
|
+
}),
|
|
36
|
+
delivery_sensitive: Object.freeze({
|
|
37
|
+
requiredKinds: Object.freeze(['code', 'test', 'runtime', 'delivery']),
|
|
38
|
+
recommendedKinds: Object.freeze(['human']),
|
|
39
|
+
blockedSoloKinds: Object.freeze(['code', 'human']),
|
|
40
|
+
}),
|
|
41
|
+
}),
|
|
42
|
+
'complete-milestone': Object.freeze({
|
|
43
|
+
repo_only: Object.freeze({
|
|
44
|
+
requiredKinds: Object.freeze(['code', 'test']),
|
|
45
|
+
recommendedKinds: Object.freeze(['runtime']),
|
|
46
|
+
blockedSoloKinds: Object.freeze(['human', 'delivery']),
|
|
47
|
+
}),
|
|
48
|
+
delivery_sensitive: Object.freeze({
|
|
49
|
+
requiredKinds: Object.freeze(['code', 'test', 'runtime', 'delivery']),
|
|
50
|
+
recommendedKinds: Object.freeze(['human']),
|
|
51
|
+
blockedSoloKinds: Object.freeze(['code', 'human']),
|
|
52
|
+
}),
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export { CLOSURE_SURFACES, DELIVERY_POSTURES, EVIDENCE_KINDS };
|
|
57
|
+
|
|
58
|
+
export function normalizeEvidenceKind(kind) {
|
|
59
|
+
if (!kind) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return LEGACY_EVIDENCE_ALIASES[kind] ?? null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function normalizeEvidenceKinds(kinds = []) {
|
|
67
|
+
const normalized = [];
|
|
68
|
+
for (const kind of kinds) {
|
|
69
|
+
const resolved = normalizeEvidenceKind(kind);
|
|
70
|
+
if (resolved && !normalized.includes(resolved)) {
|
|
71
|
+
normalized.push(resolved);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return normalized;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function isClosureSurface(surface) {
|
|
78
|
+
return CLOSURE_SURFACES.includes(surface);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function getEvidenceContract(surface, deliveryPosture) {
|
|
82
|
+
const matrix = EVIDENCE_MATRIX[surface];
|
|
83
|
+
if (!matrix) {
|
|
84
|
+
throw new Error(`Unsupported closure evidence surface: ${surface}`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const posture = matrix[deliveryPosture];
|
|
88
|
+
if (!posture) {
|
|
89
|
+
throw new Error(`Unsupported delivery posture for ${surface}: ${deliveryPosture}`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
surface,
|
|
94
|
+
deliveryPosture,
|
|
95
|
+
supportedKinds: [...EVIDENCE_KINDS],
|
|
96
|
+
requiredKinds: [...posture.requiredKinds],
|
|
97
|
+
recommendedKinds: [...posture.recommendedKinds],
|
|
98
|
+
blockedSoloKinds: [...posture.blockedSoloKinds],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function describeEvidenceSurface(surface) {
|
|
103
|
+
if (!isClosureSurface(surface)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
surface,
|
|
109
|
+
supportedKinds: [...EVIDENCE_KINDS],
|
|
110
|
+
deliveryPostures: DELIVERY_POSTURES.map((deliveryPosture) => getEvidenceContract(surface, deliveryPosture)),
|
|
111
|
+
};
|
|
112
|
+
}
|
package/bin/lib/health-truth.mjs
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { existsSync, readFileSync, readdirSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
+
import { evaluateLifecycleState } from './lifecycle-state.mjs';
|
|
4
|
+
import {
|
|
5
|
+
getRuntimeFreshnessRepairGuidance,
|
|
6
|
+
summarizeRuntimeFreshnessIssues,
|
|
7
|
+
} from './runtime-freshness.mjs';
|
|
8
|
+
import { checkDrift } from './session-fingerprint.mjs';
|
|
3
9
|
|
|
4
|
-
export const TRUTH_CHECK_IDS = ['W7', 'W8', 'W9', 'W10'];
|
|
10
|
+
export const TRUTH_CHECK_IDS = ['W7', 'W8', 'W9', 'W10', 'W11', 'W12'];
|
|
5
11
|
|
|
6
|
-
export function runTruthChecks(planningDir, frameworkDir, actualCheckIds) {
|
|
12
|
+
export function runTruthChecks(planningDir, frameworkDir, actualCheckIds, options = {}) {
|
|
7
13
|
const warnings = [];
|
|
8
14
|
const designPath = join(frameworkDir, 'distilled', 'DESIGN.md');
|
|
9
15
|
const readmePath = join(frameworkDir, 'distilled', 'README.md');
|
|
@@ -11,6 +17,7 @@ export function runTruthChecks(planningDir, frameworkDir, actualCheckIds) {
|
|
|
11
17
|
const gapsPath = join(frameworkDir, '.internal-research', 'gaps.md');
|
|
12
18
|
const specPath = join(planningDir, 'SPEC.md');
|
|
13
19
|
const roadmapPath = join(planningDir, 'ROADMAP.md');
|
|
20
|
+
const lifecycle = evaluateLifecycleState({ planningDir });
|
|
14
21
|
|
|
15
22
|
if (existsSync(designPath)) {
|
|
16
23
|
const documentedIds = extractHealthTableIds(readFileSync(designPath, 'utf-8'));
|
|
@@ -69,16 +76,7 @@ export function runTruthChecks(planningDir, frameworkDir, actualCheckIds) {
|
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
if (existsSync(specPath) && existsSync(roadmapPath)) {
|
|
72
|
-
const
|
|
73
|
-
const roadmap = readFileSync(roadmapPath, 'utf-8');
|
|
74
|
-
const checkedRequirements = extractCheckedRequirements(spec);
|
|
75
|
-
const roadmapRequirements = extractRoadmapRequirements(roadmap);
|
|
76
|
-
const mismatches = [];
|
|
77
|
-
for (const [requirementId, roadmapStatus] of roadmapRequirements.entries()) {
|
|
78
|
-
const specChecked = checkedRequirements.has(requirementId);
|
|
79
|
-
if (roadmapStatus && !specChecked) mismatches.push(`${requirementId} phase complete but SPEC unchecked`);
|
|
80
|
-
if (!roadmapStatus && specChecked) mismatches.push(`${requirementId} SPEC checked but phase incomplete`);
|
|
81
|
-
}
|
|
79
|
+
const mismatches = lifecycle.requirementAlignment.mismatches;
|
|
82
80
|
if (mismatches.length > 0) {
|
|
83
81
|
warnings.push({
|
|
84
82
|
id: 'W10',
|
|
@@ -89,6 +87,25 @@ export function runTruthChecks(planningDir, frameworkDir, actualCheckIds) {
|
|
|
89
87
|
}
|
|
90
88
|
}
|
|
91
89
|
|
|
90
|
+
if (options.runtimeFreshnessReport?.issueCount > 0) {
|
|
91
|
+
warnings.push({
|
|
92
|
+
id: 'W11',
|
|
93
|
+
severity: 'WARN',
|
|
94
|
+
message: `Installed generated runtime surfaces drift from current render output (${summarizeRuntimeFreshnessIssues(options.runtimeFreshnessReport)})`,
|
|
95
|
+
fix: getRuntimeFreshnessRepairGuidance(options.runtimeFreshnessReport),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const drift = checkDrift(planningDir);
|
|
100
|
+
if (drift.drifted) {
|
|
101
|
+
warnings.push({
|
|
102
|
+
id: 'W12',
|
|
103
|
+
severity: 'WARN',
|
|
104
|
+
message: `Planning state drifted since last recorded session (${drift.details.join('; ')})`,
|
|
105
|
+
fix: 'Review the changes, then run a lifecycle workflow to update the fingerprint',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
92
109
|
return warnings;
|
|
93
110
|
}
|
|
94
111
|
|
|
@@ -167,22 +184,3 @@ function extractSection(content, startMarker, endMarker) {
|
|
|
167
184
|
function normalizeContent(content) {
|
|
168
185
|
return content.replace(/\r\n/g, '\n');
|
|
169
186
|
}
|
|
170
|
-
|
|
171
|
-
function extractCheckedRequirements(content) {
|
|
172
|
-
const checked = new Set();
|
|
173
|
-
for (const result of content.matchAll(/- \[x\] \*\*\[([A-Z0-9-]+)]\*\*/g)) {
|
|
174
|
-
checked.add(result[1]);
|
|
175
|
-
}
|
|
176
|
-
return checked;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
function extractRoadmapRequirements(content) {
|
|
180
|
-
const mapped = new Map();
|
|
181
|
-
for (const result of content.matchAll(/- \[([ x-])] \*\*Phase\s+\d+[a-z]?:.*?\*\*\s+—\s+\[([^\]]+)]/g)) {
|
|
182
|
-
const requirementIds = result[2].split(',').map((id) => id.trim());
|
|
183
|
-
for (const requirementId of requirementIds) {
|
|
184
|
-
mapped.set(requirementId, result[1].toLowerCase() === 'x');
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return mapped;
|
|
188
|
-
}
|