gsdd-cli 0.16.1 → 0.18.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/README.md +111 -61
- 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 +25 -20
- package/bin/lib/evidence-contract.mjs +112 -0
- package/bin/lib/health-truth.mjs +29 -31
- package/bin/lib/health.mjs +61 -106
- package/bin/lib/init-flow.mjs +91 -34
- package/bin/lib/init-runtime.mjs +46 -25
- package/bin/lib/init.mjs +3 -7
- package/bin/lib/lifecycle-preflight.mjs +333 -0
- package/bin/lib/lifecycle-state.mjs +476 -0
- package/bin/lib/manifest.mjs +24 -20
- package/bin/lib/phase.mjs +81 -26
- package/bin/lib/provenance.mjs +295 -54
- package/bin/lib/rendering.mjs +70 -12
- package/bin/lib/runtime-freshness.mjs +264 -0
- package/bin/lib/session-fingerprint.mjs +106 -0
- package/distilled/DESIGN.md +707 -13
- package/distilled/EVIDENCE-INDEX.md +166 -1
- 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 +16 -3
- package/distilled/workflows/map-codebase.md +15 -4
- package/distilled/workflows/new-milestone.md +53 -24
- package/distilled/workflows/new-project.md +44 -25
- package/distilled/workflows/pause.md +1 -1
- package/distilled/workflows/plan.md +187 -74
- package/distilled/workflows/progress.md +135 -31
- package/distilled/workflows/quick.md +20 -12
- package/distilled/workflows/resume.md +152 -65
- package/distilled/workflows/verify.md +55 -20
- package/docs/BROWNFIELD-PROOF.md +95 -0
- package/docs/RUNTIME-SUPPORT.md +77 -0
- package/docs/USER-GUIDE.md +443 -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 +26 -20
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; they do not carry 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. 58 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
|
|
|
@@ -62,28 +102,46 @@ In a terminal, `gsdd init` now opens a guided install wizard:
|
|
|
62
102
|
- Step 2: decide separately whether repo-wide `AGENTS.md` governance is worth installing
|
|
63
103
|
- Step 3: configure planning defaults in the same guided flow
|
|
64
104
|
|
|
65
|
-
Portable `.agents/skills/gsdd-*` skills are always generated. The wizard controls extra native adapters and optional governance, not the portable baseline.
|
|
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.
|
|
107
|
+
Workflow-embedded helper commands use `node .planning/bin/gsdd.mjs ...`, so execution-time lifecycle helpers do not depend on a global `gsdd` binary after init.
|
|
66
108
|
|
|
67
109
|
### Launch Proof Status
|
|
68
110
|
|
|
69
|
-
- **Directly validated
|
|
70
|
-
- **Qualified support:** Cursor, Copilot, and Gemini CLI
|
|
111
|
+
- **Directly validated:** Claude Code, Codex CLI, and OpenCode have recorded `plan -> execute -> verify` evidence for the core lifecycle.
|
|
112
|
+
- **Qualified support:** Cursor, Copilot, and Gemini CLI support the same core workflow through the shared `.agents/skills/` surface; they do not carry the same runtime proof or ergonomics.
|
|
113
|
+
- **Runtime-surface freshness:** Installed generated skills and native adapters are renderer-checked locally; repair stays deterministic through `npx gsdd-cli update`.
|
|
71
114
|
|
|
72
|
-
|
|
115
|
+
Start with the public proof pack:
|
|
73
116
|
|
|
74
|
-
|
|
117
|
+
- [Brownfield proof](docs/BROWNFIELD-PROOF.md)
|
|
118
|
+
- [Exported consumer proof pack](docs/proof/consumer-node-cli/README.md)
|
|
119
|
+
- [Runtime support matrix](docs/RUNTIME-SUPPORT.md)
|
|
120
|
+
- [Verification discipline](docs/VERIFICATION-DISCIPLINE.md)
|
|
121
|
+
|
|
122
|
+
### Quickstart (after init)
|
|
123
|
+
|
|
124
|
+
Runtime floor: Node 20+.
|
|
125
|
+
|
|
126
|
+
Your tool determines how you invoke workflows:
|
|
75
127
|
|
|
76
128
|
- **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.
|
|
129
|
+
- **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
130
|
- **Other AI tools:** Open `.agents/skills/gsdd-<workflow>/SKILL.md` and follow the instructions.
|
|
79
131
|
|
|
80
|
-
If you generate the root `AGENTS.md` block, it adds
|
|
132
|
+
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.
|
|
133
|
+
|
|
134
|
+
### Choose Your Starting Workflow
|
|
81
135
|
|
|
82
|
-
|
|
136
|
+
| Situation | Start here | Why |
|
|
137
|
+
|----------|------------|-----|
|
|
138
|
+
| 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. |
|
|
139
|
+
| 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. |
|
|
140
|
+
| 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
141
|
|
|
84
142
|
### Platform Adapters
|
|
85
143
|
|
|
86
|
-
|
|
144
|
+
Workspine generates adapters for whichever tools you use:
|
|
87
145
|
|
|
88
146
|
```bash
|
|
89
147
|
npx gsdd-cli init # Guided install wizard (detected runtimes preselected)
|
|
@@ -98,10 +156,10 @@ npx gsdd-cli init --tools all # All of the above
|
|
|
98
156
|
| Platform | Public claim | What's generated |
|
|
99
157
|
|----------|--------------|-----------------|
|
|
100
158
|
| **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** |
|
|
159
|
+
| **Claude Code** | Directly validated | `.claude/skills/`, `.claude/commands/`, `.claude/agents/` — native workflow surfaces, freshness-checked when generated locally |
|
|
160
|
+
| **OpenCode** | Directly validated | `.opencode/commands/`, `.opencode/agents/` — native workflow surfaces, freshness-checked when generated locally |
|
|
161
|
+
| **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 |
|
|
162
|
+
| **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
163
|
| **Other AI tools** | Fallback only | Open `.agents/skills/gsdd-*/SKILL.md` directly |
|
|
106
164
|
|
|
107
165
|
### Updating
|
|
@@ -112,7 +170,7 @@ npx gsdd-cli update --tools claude # Update specific platform only
|
|
|
112
170
|
npx gsdd-cli update --templates # Refresh .planning/templates/ and role contracts from framework source
|
|
113
171
|
```
|
|
114
172
|
|
|
115
|
-
###
|
|
173
|
+
### Non-Interactive Mode (CI / Automation)
|
|
116
174
|
|
|
117
175
|
For non-interactive environments:
|
|
118
176
|
|
|
@@ -121,7 +179,7 @@ npx gsdd-cli init --auto --tools claude
|
|
|
121
179
|
npx gsdd-cli init --auto --tools claude --brief path/to/PRD.md
|
|
122
180
|
```
|
|
123
181
|
|
|
124
|
-
`--auto` skips interactive
|
|
182
|
+
`--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
183
|
|
|
126
184
|
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
185
|
|
|
@@ -151,7 +209,7 @@ init → [plan → execute → verify] × N phases → audit-milestone → done
|
|
|
151
209
|
Run the `gsdd-new-project` workflow. The system:
|
|
152
210
|
|
|
153
211
|
1. **Questions** — asks until it understands your idea (goals, constraints, tech, edge cases)
|
|
154
|
-
2. **Codebase
|
|
212
|
+
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
213
|
3. **Research** — spawns parallel researchers to investigate the domain (configurable depth: fast/balanced/deep)
|
|
156
214
|
4. **Spec + Roadmap** — produces `SPEC.md` (living specification) and `ROADMAP.md` (phased delivery plan)
|
|
157
215
|
|
|
@@ -167,7 +225,9 @@ Run `gsdd-plan` for the current phase. The system:
|
|
|
167
225
|
2. **Plans** — creates atomic task plans with XML structure
|
|
168
226
|
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
227
|
|
|
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.
|
|
228
|
+
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.
|
|
229
|
+
|
|
230
|
+
`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
231
|
|
|
172
232
|
**Creates:** Phase plans in `.planning/phases/`
|
|
173
233
|
|
|
@@ -234,12 +294,12 @@ Use for: bug fixes, small features, config changes, one-off tasks.
|
|
|
234
294
|
|
|
235
295
|
## Workflows
|
|
236
296
|
|
|
237
|
-
|
|
297
|
+
Workspine has 14 workflows, run via generated skills or adapters:
|
|
238
298
|
|
|
239
299
|
| Workflow | What it does |
|
|
240
300
|
|----------|--------------|
|
|
241
|
-
| `gsdd-new-project` | Full initialization: questioning,
|
|
242
|
-
| `gsdd-map-codebase` |
|
|
301
|
+
| `gsdd-new-project` | Full initialization: questioning, brownfield audit when needed, research, spec, roadmap |
|
|
302
|
+
| `gsdd-map-codebase` | Deeper brownfield orientation and refresh before `quick` or `new-project` |
|
|
243
303
|
| `gsdd-plan` | Research + plan + check for a phase |
|
|
244
304
|
| `gsdd-execute` | Execute phase plan: implement tasks, verify changes |
|
|
245
305
|
| `gsdd-verify` | Verify completed phase: 3-level checks, anti-pattern scan |
|
|
@@ -248,7 +308,7 @@ GSDD has 14 workflows, run via generated skills or adapters:
|
|
|
248
308
|
| `gsdd-complete-milestone` | Archive shipped milestone, evolve spec, collapse roadmap |
|
|
249
309
|
| `gsdd-new-milestone` | Start next milestone: gather goals, define requirements, create roadmap phases |
|
|
250
310
|
| `gsdd-plan-milestone-gaps` | Create gap-closure phases from audit results |
|
|
251
|
-
| `gsdd-quick` | Quick task:
|
|
311
|
+
| `gsdd-quick` | Quick task: bounded brownfield change lane with inline baseline when full mapping is unnecessary |
|
|
252
312
|
| `gsdd-pause` | Pause work: save session context to checkpoint for seamless resumption |
|
|
253
313
|
| `gsdd-resume` | Resume work: restore context from artifacts and route to next action |
|
|
254
314
|
| `gsdd-progress` | Show project status and route to next action |
|
|
@@ -284,7 +344,7 @@ Workflows are agent skills or commands, not plain shell utilities. How you invok
|
|
|
284
344
|
|
|
285
345
|
### Roles (10 canonical)
|
|
286
346
|
|
|
287
|
-
|
|
347
|
+
Workspine consolidates GSD's agent surface into 10 roles with durable contracts:
|
|
288
348
|
|
|
289
349
|
| Role | Responsibility |
|
|
290
350
|
|------|---------------|
|
|
@@ -296,6 +356,7 @@ GSDD consolidates GSD's agent surface into 10 roles with durable contracts:
|
|
|
296
356
|
| **Verifier** | Phase verification — Exists/Substantive/Wired gate |
|
|
297
357
|
| **Roadmapper** | Roadmap generation from spec |
|
|
298
358
|
| **Integration Checker** | Cross-phase wiring, API coverage, auth protection, E2E flows |
|
|
359
|
+
| **Approach Explorer** | Implementation approach alignment before planning begins |
|
|
299
360
|
| **Debugger** | Utility role for systematic debugging |
|
|
300
361
|
|
|
301
362
|
### Two-Layer Architecture
|
|
@@ -307,14 +368,14 @@ GSDD consolidates GSD's agent surface into 10 roles with durable contracts:
|
|
|
307
368
|
|
|
308
369
|
### Adapter Architecture
|
|
309
370
|
|
|
310
|
-
|
|
371
|
+
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
372
|
|
|
312
373
|
| Adapter | Evidence posture | Strategy |
|
|
313
374
|
|---------|------------------|----------|
|
|
314
375
|
| **Claude Code** | Directly validated | Skill-primary plan surface, thin command alias, native `gsdd-plan-checker` agent |
|
|
315
376
|
| **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** |
|
|
377
|
+
| **Codex CLI** | Directly validated | Portable skill as entry surface, `.codex/agents/gsdd-plan-checker.toml` (read-only, high reasoning effort), explicit `$gsdd-execute` unlock |
|
|
378
|
+
| **Cursor / Copilot / Gemini** | Same core workflow | Runtime discovers `.agents/skills/` natively; optional root `AGENTS.md` block adds behavioral governance only |
|
|
318
379
|
| **agents** (`--tools agents`) | Governance-only helper | Root `AGENTS.md` block for tools that benefit from governance or need open-standard fallback guidance |
|
|
319
380
|
|
|
320
381
|
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 +399,7 @@ Model IDs pass through a two-layer injection guard: a regex whitelist (`/^[a-zA-
|
|
|
338
399
|
|
|
339
400
|
### Advisory Git Protocol
|
|
340
401
|
|
|
341
|
-
|
|
402
|
+
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
403
|
|
|
343
404
|
- **Branching** — follow existing repo conventions
|
|
344
405
|
- **Commits** — group changes logically, no framework-imposed format
|
|
@@ -390,8 +451,8 @@ Optional model-control keys:
|
|
|
390
451
|
|
|
391
452
|
Runtime behavior:
|
|
392
453
|
- 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;
|
|
454
|
+
- OpenCode inherits its runtime model by default; Workspine only injects an exact OpenCode `model:` when you set an explicit runtime override.
|
|
455
|
+
- Codex inherits its session model by default; Workspine only injects an explicit `model` in the TOML when you set an explicit runtime override.
|
|
395
456
|
|
|
396
457
|
CLI:
|
|
397
458
|
- `gsdd models show`
|
|
@@ -430,6 +491,7 @@ Advisory defaults, overridden by repo conventions:
|
|
|
430
491
|
| Problem | What to do |
|
|
431
492
|
|---------|------------|
|
|
432
493
|
| Workspace feels broken | `gsdd health` — checks errors, warnings, info |
|
|
494
|
+
| `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
495
|
| Lost track of progress | Run `gsdd-progress` — reads artifacts, shows status |
|
|
434
496
|
| Need context from last session | Run `gsdd-resume` — restores state, routes to next action |
|
|
435
497
|
| Plans seem wrong | Check `workflow.research: true` in config |
|
|
@@ -443,7 +505,7 @@ For detailed troubleshooting and recovery procedures, see the [User Guide](docs/
|
|
|
443
505
|
|
|
444
506
|
## Design Decisions
|
|
445
507
|
|
|
446
|
-
|
|
508
|
+
This repo records 58 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
509
|
|
|
448
510
|
Key choices:
|
|
449
511
|
- **4-file codebase standard** — drop state that rots (STRUCTURE, INTEGRATIONS, TESTING), keep rules that don't
|
|
@@ -461,7 +523,7 @@ Key choices:
|
|
|
461
523
|
|
|
462
524
|
## Testing
|
|
463
525
|
|
|
464
|
-
|
|
526
|
+
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
527
|
|
|
466
528
|
### Invariant Suites (I-series)
|
|
467
529
|
|
|
@@ -538,21 +600,9 @@ npm test
|
|
|
538
600
|
|
|
539
601
|
---
|
|
540
602
|
|
|
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
603
|
## Credits
|
|
554
604
|
|
|
555
|
-
|
|
605
|
+
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
606
|
|
|
557
607
|
---
|
|
558
608
|
|
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,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// gsdd -
|
|
3
|
+
// gsdd - Workspine CLI
|
|
4
4
|
|
|
5
|
-
import { realpathSync } from 'fs';
|
|
5
|
+
import { realpathSync, readFileSync } from 'fs';
|
|
6
6
|
import { join, dirname } from 'path';
|
|
7
7
|
import { fileURLToPath } from 'url';
|
|
8
8
|
import { createAdapterRegistry } from './adapters/index.mjs';
|
|
@@ -19,12 +19,14 @@ 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
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
22
|
+
import { cmdLifecyclePreflight } from './lib/lifecycle-preflight.mjs';
|
|
23
|
+
|
|
24
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
25
|
+
const __dirname = dirname(__filename);
|
|
26
|
+
const DISTILLED_DIR = join(__dirname, '..', 'distilled');
|
|
27
|
+
const AGENTS_DIR = join(__dirname, '..', 'agents');
|
|
28
|
+
const PACKAGE_JSON = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
29
|
+
const CWD = process.cwd();
|
|
28
30
|
const IS_MAIN = process.argv[1]
|
|
29
31
|
? realpathSync(process.argv[1]) === realpathSync(__filename)
|
|
30
32
|
: false;
|
|
@@ -57,16 +59,18 @@ const WORKFLOWS = [
|
|
|
57
59
|
defineWorkflow({ name: 'gsdd-progress', workflow: 'progress.md', description: 'Check progress - show project status and route to next action', mutatesArtifacts: false }),
|
|
58
60
|
];
|
|
59
61
|
|
|
60
|
-
const FRAMEWORK_VERSION = 'v1.
|
|
61
|
-
|
|
62
|
-
function createCliContext(cwd = process.cwd()) {
|
|
63
|
-
return {
|
|
64
|
-
cwd,
|
|
65
|
-
planningDir: join(cwd, '.planning'),
|
|
66
|
-
distilledDir: DISTILLED_DIR,
|
|
67
|
-
agentsDir: AGENTS_DIR,
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
const FRAMEWORK_VERSION = 'v1.4';
|
|
63
|
+
|
|
64
|
+
function createCliContext(cwd = process.cwd()) {
|
|
65
|
+
return {
|
|
66
|
+
cwd,
|
|
67
|
+
planningDir: join(cwd, '.planning'),
|
|
68
|
+
distilledDir: DISTILLED_DIR,
|
|
69
|
+
agentsDir: AGENTS_DIR,
|
|
70
|
+
packageName: PACKAGE_JSON.name,
|
|
71
|
+
packageVersion: PACKAGE_JSON.version,
|
|
72
|
+
workflows: WORKFLOWS,
|
|
73
|
+
frameworkVersion: FRAMEWORK_VERSION,
|
|
70
74
|
adapters: createAdapterRegistry({
|
|
71
75
|
cwd,
|
|
72
76
|
workflows: WORKFLOWS,
|
|
@@ -87,7 +91,7 @@ const INIT_CONTEXT = createCliContext(CWD);
|
|
|
87
91
|
|
|
88
92
|
const cmdInit = createCmdInit(INIT_CONTEXT);
|
|
89
93
|
const cmdUpdate = createCmdUpdate(INIT_CONTEXT);
|
|
90
|
-
const cmdHealth = createCmdHealth(
|
|
94
|
+
const cmdHealth = createCmdHealth(INIT_CONTEXT);
|
|
91
95
|
|
|
92
96
|
const COMMANDS = {
|
|
93
97
|
init: cmdInit,
|
|
@@ -95,6 +99,7 @@ const COMMANDS = {
|
|
|
95
99
|
models: cmdModels,
|
|
96
100
|
health: cmdHealth,
|
|
97
101
|
'file-op': cmdFileOp,
|
|
102
|
+
'lifecycle-preflight': cmdLifecyclePreflight,
|
|
98
103
|
'find-phase': cmdFindPhase,
|
|
99
104
|
'phase-status': cmdPhaseStatus,
|
|
100
105
|
verify: cmdVerify,
|
|
@@ -124,4 +129,4 @@ if (IS_MAIN) {
|
|
|
124
129
|
await runCli();
|
|
125
130
|
}
|
|
126
131
|
|
|
127
|
-
export { cmdHelp, cmdInit, cmdUpdate, cmdModels, cmdHealth, cmdFileOp, cmdFindPhase, cmdPhaseStatus, cmdVerify, cmdScaffold, runCli, FRAMEWORK_VERSION, createCliContext };
|
|
132
|
+
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
|
+
}
|