gsd-lite 0.7.0 → 0.7.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/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.mcp.json +0 -0
- package/README.md +2 -2
- package/agents/debugger.md +0 -0
- package/agents/executor.md +0 -0
- package/agents/researcher.md +0 -0
- package/agents/reviewer.md +0 -0
- package/commands/doctor.md +17 -10
- package/commands/prd.md +0 -0
- package/commands/resume.md +0 -0
- package/commands/start.md +0 -0
- package/commands/status.md +1 -0
- package/commands/stop.md +0 -0
- package/hooks/context-monitor.js +0 -0
- package/hooks/gsd-auto-update.cjs +0 -0
- package/hooks/gsd-context-monitor.cjs +0 -0
- package/hooks/gsd-session-init.cjs +0 -0
- package/hooks/gsd-session-stop.cjs +0 -0
- package/hooks/gsd-statusline.cjs +0 -0
- package/hooks/hooks.json +0 -0
- package/hooks/lib/gsd-finder.cjs +0 -0
- package/hooks/lib/semver-sort.cjs +0 -0
- package/hooks/lib/statusline-composite.cjs +50 -2
- package/install.js +38 -11
- package/launcher.js +0 -0
- package/package.json +5 -1
- package/references/anti-rationalization-full.md +0 -0
- package/references/evidence-spec.md +0 -0
- package/references/execution-loop.md +0 -0
- package/references/git-worktrees.md +0 -0
- package/references/questioning.md +0 -0
- package/references/review-classification.md +0 -0
- package/references/state-diagram.md +0 -0
- package/references/testing-patterns.md +0 -0
- package/src/schema.js +0 -0
- package/src/server.js +0 -0
- package/src/tools/orchestrator/debugger.js +0 -0
- package/src/tools/orchestrator/executor.js +0 -0
- package/src/tools/orchestrator/helpers.js +0 -0
- package/src/tools/orchestrator/index.js +0 -0
- package/src/tools/orchestrator/researcher.js +0 -0
- package/src/tools/orchestrator/resume.js +2 -2
- package/src/tools/orchestrator/reviewer.js +0 -0
- package/src/tools/state/constants.js +0 -0
- package/src/tools/state/crud.js +6 -6
- package/src/tools/state/index.js +0 -0
- package/src/tools/state/logic.js +1 -1
- package/src/tools/verify.js +0 -0
- package/src/utils.js +0 -0
- package/uninstall.js +0 -0
- package/workflows/debugging.md +0 -0
- package/workflows/deviation-rules.md +0 -0
- package/workflows/execution-flow.md +0 -0
- package/workflows/research.md +0 -0
- package/workflows/review-cycle.md +0 -0
- package/workflows/tdd-cycle.md +0 -0
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"name": "gsd",
|
|
14
14
|
"source": "./",
|
|
15
15
|
"description": "AI orchestration tool — GSD management shell + Superpowers quality core. 5 commands, 4 agents, 5 workflows, MCP server, context monitoring.",
|
|
16
|
-
"version": "0.7.
|
|
16
|
+
"version": "0.7.4",
|
|
17
17
|
"keywords": [
|
|
18
18
|
"orchestration",
|
|
19
19
|
"mcp",
|
package/.mcp.json
CHANGED
|
File without changes
|
package/README.md
CHANGED
|
@@ -291,7 +291,7 @@ gsd-lite/
|
|
|
291
291
|
│ ├── gsd-session-stop.cjs # Graceful shutdown with crash markers
|
|
292
292
|
│ ├── gsd-statusline.cjs # StatusLine display (composite-aware)
|
|
293
293
|
│ └── lib/ # Shared hook utilities (gsd-finder, composite statusline, semver)
|
|
294
|
-
├── tests/ #
|
|
294
|
+
├── tests/ # 966 tests (unit + simulation + E2E integration)
|
|
295
295
|
├── cli.js # Install/uninstall CLI entry
|
|
296
296
|
├── install.js # Installation script (plugin-aware, idempotent)
|
|
297
297
|
└── uninstall.js # Uninstall script
|
|
@@ -300,7 +300,7 @@ gsd-lite/
|
|
|
300
300
|
## Testing
|
|
301
301
|
|
|
302
302
|
```bash
|
|
303
|
-
npm test # Run all
|
|
303
|
+
npm test # Run all 966 tests
|
|
304
304
|
npm run test:coverage # Tests + coverage report (94%+ lines, 83%+ branches)
|
|
305
305
|
npm run lint # Biome lint
|
|
306
306
|
node --test tests/file.js # Run a single test file
|
package/agents/debugger.md
CHANGED
|
File without changes
|
package/agents/executor.md
CHANGED
|
File without changes
|
package/agents/researcher.md
CHANGED
|
File without changes
|
package/agents/reviewer.md
CHANGED
|
File without changes
|
package/commands/doctor.md
CHANGED
|
@@ -28,18 +28,25 @@ Call the `health` MCP tool:
|
|
|
28
28
|
|
|
29
29
|
Check if GSD hooks are registered in Claude settings:
|
|
30
30
|
- Read `~/.claude/settings.json` (or `~/.claude/settings.local.json`)
|
|
31
|
-
- StatusLine check (
|
|
32
|
-
1. Direct: `statusLine`
|
|
33
|
-
2. Composite:
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
- StatusLine check (registered if ANY path matches):
|
|
32
|
+
1. Direct: `statusLine.command` contains `gsd-statusline`
|
|
33
|
+
2. Composite cache registry: `~/.cache/code-graph/statusline-registry.json` — any entry whose `command` contains `gsd-statusline`
|
|
34
|
+
3. Composite backup mirror: `~/.claude/statusline-providers.json` — same match rule (durable mirror written by code-graph's chain CLI)
|
|
35
|
+
- Any path present: StatusLine = registered
|
|
36
|
+
- Check the three hook arrays in `settings.hooks`:
|
|
37
|
+
- `PostToolUse` entry referencing `gsd-context-monitor`
|
|
38
|
+
- `SessionStart` entry referencing `gsd-session-init`
|
|
39
|
+
- `Stop` entry referencing `gsd-session-stop`
|
|
40
|
+
- All four (statusLine + three hooks) present: record PASS
|
|
41
|
+
- Partial: record WARN naming each missing hook
|
|
42
|
+
- None: record FAIL "No GSD hooks registered"
|
|
43
|
+
|
|
44
|
+
Also verify the hook files exist on disk (install.js copies all five):
|
|
41
45
|
- `~/.claude/hooks/gsd-statusline.cjs`
|
|
42
46
|
- `~/.claude/hooks/gsd-context-monitor.cjs`
|
|
47
|
+
- `~/.claude/hooks/gsd-session-init.cjs`
|
|
48
|
+
- `~/.claude/hooks/gsd-session-stop.cjs`
|
|
49
|
+
- `~/.claude/hooks/gsd-auto-update.cjs`
|
|
43
50
|
- Files missing but settings present: record WARN "Hook registered but file missing"
|
|
44
51
|
|
|
45
52
|
## STEP 4: Lock File Check
|
package/commands/prd.md
CHANGED
|
File without changes
|
package/commands/resume.md
CHANGED
|
File without changes
|
package/commands/start.md
CHANGED
|
File without changes
|
package/commands/status.md
CHANGED
package/commands/stop.md
CHANGED
|
File without changes
|
package/hooks/context-monitor.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/hooks/gsd-statusline.cjs
CHANGED
|
File without changes
|
package/hooks/hooks.json
CHANGED
|
File without changes
|
package/hooks/lib/gsd-finder.cjs
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -1,14 +1,26 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
// Detect and register with composite statusline systems (e.g., code-graph).
|
|
3
3
|
// Used by install.js, gsd-session-init.cjs, and uninstall.js.
|
|
4
|
+
//
|
|
5
|
+
// Preferred path (code-graph ≥ shipping statusline-chain.js): invoke that CLI
|
|
6
|
+
// with `register gsd <cmd> --stdin` / `unregister gsd`. The CLI owns both the
|
|
7
|
+
// primary cache registry and the ~/.claude/statusline-providers.json backup
|
|
8
|
+
// mirror, so we do not have to know their layout.
|
|
9
|
+
// Fallback path (older code-graph without the CLI): write the cache registry
|
|
10
|
+
// directly, same as the original behavior.
|
|
4
11
|
|
|
5
12
|
const fs = require('node:fs');
|
|
6
13
|
const path = require('node:path');
|
|
7
14
|
const os = require('node:os');
|
|
15
|
+
const { execFileSync } = require('node:child_process');
|
|
16
|
+
const { semverSortComparator } = require('./semver-sort.cjs');
|
|
8
17
|
|
|
9
|
-
|
|
18
|
+
const CLAUDE_DIR = process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), '.claude');
|
|
19
|
+
|
|
20
|
+
// Known composite statusline registry paths (fallback-only — chain CLI is preferred).
|
|
10
21
|
const REGISTRY_PATHS = [
|
|
11
22
|
path.join(os.homedir(), '.cache', 'code-graph', 'statusline-registry.json'),
|
|
23
|
+
path.join(CLAUDE_DIR, 'statusline-providers.json'),
|
|
12
24
|
];
|
|
13
25
|
|
|
14
26
|
function isCompositeStatusLine(command) {
|
|
@@ -22,13 +34,46 @@ function findCompositeRegistry() {
|
|
|
22
34
|
return null;
|
|
23
35
|
}
|
|
24
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Find code-graph's statusline-chain.js in the plugin cache (newest semver).
|
|
39
|
+
* Returns absolute path or null if the CLI hasn't shipped yet.
|
|
40
|
+
*/
|
|
41
|
+
function findChainScript() {
|
|
42
|
+
const base = path.join(CLAUDE_DIR, 'plugins', 'cache', 'code-graph-mcp', 'code-graph-mcp');
|
|
43
|
+
if (!fs.existsSync(base)) return null;
|
|
44
|
+
let versions;
|
|
45
|
+
try {
|
|
46
|
+
versions = fs.readdirSync(base).filter(v => /^\d+\.\d+\.\d+/.test(v));
|
|
47
|
+
} catch { return null; }
|
|
48
|
+
versions.sort(semverSortComparator).reverse();
|
|
49
|
+
for (const v of versions) {
|
|
50
|
+
const p = path.join(base, v, 'scripts', 'statusline-chain.js');
|
|
51
|
+
if (fs.existsSync(p)) return p;
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function runChainCLI(args) {
|
|
57
|
+
const chainScript = findChainScript();
|
|
58
|
+
if (!chainScript) return false;
|
|
59
|
+
try {
|
|
60
|
+
execFileSync(process.execPath, [chainScript, ...args], { stdio: 'pipe', timeout: 5000 });
|
|
61
|
+
return true;
|
|
62
|
+
} catch { return false; }
|
|
63
|
+
}
|
|
64
|
+
|
|
25
65
|
/**
|
|
26
66
|
* Register GSD as a provider in the composite statusline registry.
|
|
67
|
+
* Prefers code-graph's statusline-chain.js CLI when available; falls back to
|
|
68
|
+
* writing the cache registry directly for older code-graph versions.
|
|
27
69
|
* Idempotent: updates existing entry or inserts before code-graph.
|
|
28
70
|
* @param {string} statuslineScriptPath - Absolute path to gsd-statusline.cjs
|
|
29
71
|
* @returns {boolean} true if registered/updated
|
|
30
72
|
*/
|
|
31
73
|
function registerProvider(statuslineScriptPath) {
|
|
74
|
+
const command = `node ${JSON.stringify(statuslineScriptPath)}`;
|
|
75
|
+
if (runChainCLI(['register', 'gsd', command, '--stdin'])) return true;
|
|
76
|
+
|
|
32
77
|
let registryPath = findCompositeRegistry();
|
|
33
78
|
|
|
34
79
|
// If composite statusLine is configured but registry file is missing,
|
|
@@ -54,7 +99,6 @@ function registerProvider(statuslineScriptPath) {
|
|
|
54
99
|
}
|
|
55
100
|
if (!Array.isArray(registry)) return false;
|
|
56
101
|
|
|
57
|
-
const command = `node ${JSON.stringify(statuslineScriptPath)}`;
|
|
58
102
|
const provider = { id: 'gsd', command, needsStdin: true };
|
|
59
103
|
|
|
60
104
|
// Find existing GSD entry (by id or command)
|
|
@@ -82,9 +126,13 @@ function registerProvider(statuslineScriptPath) {
|
|
|
82
126
|
|
|
83
127
|
/**
|
|
84
128
|
* Remove GSD entry from composite statusline registry.
|
|
129
|
+
* Prefers code-graph's statusline-chain.js CLI when available; falls back to
|
|
130
|
+
* rewriting the cache registry directly for older code-graph versions.
|
|
85
131
|
* @returns {boolean} true if an entry was removed
|
|
86
132
|
*/
|
|
87
133
|
function removeProvider() {
|
|
134
|
+
if (runChainCLI(['unregister', 'gsd'])) return true;
|
|
135
|
+
|
|
88
136
|
const registryPath = findCompositeRegistry();
|
|
89
137
|
if (!registryPath) return false;
|
|
90
138
|
|
package/install.js
CHANGED
|
@@ -158,17 +158,45 @@ export function main() {
|
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
//
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
// 3. Workflows
|
|
168
|
-
copyDir(join(__dirname, 'workflows'), join(CLAUDE_DIR, 'workflows', 'gsd'), 'workflows → ~/.claude/workflows/gsd/');
|
|
161
|
+
// Decide install mode once — plugin-system-managed vs npx/manual.
|
|
162
|
+
// In plugin mode, Claude Code loads commands/agents/workflows/references directly
|
|
163
|
+
// from ~/.claude/plugins/cache/gsd/gsd/<version>/, so writing user-scope copies at
|
|
164
|
+
// ~/.claude/{commands,agents,workflows,references}/gsd/ produces duplicate slash-command
|
|
165
|
+
// entries and silent drift against the plugin cache.
|
|
166
|
+
const isPluginInstall = isInstalledAsPlugin(CLAUDE_DIR);
|
|
169
167
|
|
|
170
|
-
// 4.
|
|
171
|
-
|
|
168
|
+
// 1-4. Commands / agents / workflows / references
|
|
169
|
+
// Only deliver these user-scope copies in non-plugin installs (npx / manual / npm -g),
|
|
170
|
+
// where no plugin cache exists to serve them.
|
|
171
|
+
const userScopeCopies = [
|
|
172
|
+
['commands', 'commands → ~/.claude/commands/gsd/'],
|
|
173
|
+
['agents', 'agents → ~/.claude/agents/gsd/'],
|
|
174
|
+
['workflows', 'workflows → ~/.claude/workflows/gsd/'],
|
|
175
|
+
['references', 'references → ~/.claude/references/gsd/'],
|
|
176
|
+
];
|
|
177
|
+
if (isPluginInstall) {
|
|
178
|
+
// Clean up stale copies left by earlier install.js versions (< 0.7.4) that wrote
|
|
179
|
+
// user-scope copies unconditionally. Keeping them around caused 2× skill-list
|
|
180
|
+
// entries and could shadow plugin-cache versions.
|
|
181
|
+
if (!DRY_RUN) {
|
|
182
|
+
for (const [sub] of userScopeCopies) {
|
|
183
|
+
const dest = join(CLAUDE_DIR, sub, 'gsd');
|
|
184
|
+
if (existsSync(dest)) {
|
|
185
|
+
rmSync(dest, { recursive: true, force: true });
|
|
186
|
+
log(` ✓ Removed legacy user-scope ${sub}/gsd/ (served by plugin cache)`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
} else {
|
|
190
|
+
for (const [sub] of userScopeCopies) {
|
|
191
|
+
const dest = join(CLAUDE_DIR, sub, 'gsd');
|
|
192
|
+
if (existsSync(dest)) log(` [dry-run] Would remove legacy ${dest}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} else {
|
|
196
|
+
for (const [sub, label] of userScopeCopies) {
|
|
197
|
+
copyDir(join(__dirname, sub), join(CLAUDE_DIR, sub, 'gsd'), label);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
172
200
|
|
|
173
201
|
// 5. Hooks (copy scripts only, skip hooks.json to avoid overwriting other plugins)
|
|
174
202
|
for (const hookFile of HOOK_FILES) {
|
|
@@ -213,7 +241,6 @@ export function main() {
|
|
|
213
241
|
// When installed as a plugin, the plugin system handles MCP via .mcp.json,
|
|
214
242
|
// so we skip manual MCP registration to avoid name collisions.
|
|
215
243
|
const settingsPath = join(CLAUDE_DIR, 'settings.json');
|
|
216
|
-
const isPluginInstall = isInstalledAsPlugin(CLAUDE_DIR);
|
|
217
244
|
if (!DRY_RUN) {
|
|
218
245
|
let settings = {};
|
|
219
246
|
try {
|
package/launcher.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-lite",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.4",
|
|
4
4
|
"description": "AI orchestration tool for Claude Code — GSD management shell + Superpowers quality core",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -50,6 +50,10 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@modelcontextprotocol/sdk": "^1.27.1"
|
|
52
52
|
},
|
|
53
|
+
"overrides": {
|
|
54
|
+
"hono": "^4.12.14",
|
|
55
|
+
"@hono/node-server": "^1.19.14"
|
|
56
|
+
},
|
|
53
57
|
"devDependencies": {
|
|
54
58
|
"@biomejs/biome": "^2.4.6",
|
|
55
59
|
"c8": "^11.0.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/src/schema.js
CHANGED
|
File without changes
|
package/src/server.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -493,8 +493,8 @@ export async function resumeWorkflow({ basePath = process.cwd(), _depth = 0, unb
|
|
|
493
493
|
success: true,
|
|
494
494
|
action: 'await_manual_intervention',
|
|
495
495
|
workflow_mode: state.workflow_mode,
|
|
496
|
-
guidance: '
|
|
497
|
-
message: 'Project is in planning mode
|
|
496
|
+
guidance: 'Plan is being revised. Run /gsd:start or /gsd:prd to continue planning, or state-update workflow_mode back to executing_task when ready.',
|
|
497
|
+
message: 'Project is in planning mode (plan revision). Finish the plan then set workflow_mode back to executing_task.',
|
|
498
498
|
};
|
|
499
499
|
break;
|
|
500
500
|
case 'reconcile_workspace': {
|
|
File without changes
|
|
File without changes
|
package/src/tools/state/crud.js
CHANGED
|
@@ -156,7 +156,7 @@ export async function init({ project, phases, research, force = false, basePath
|
|
|
156
156
|
export async function read({ fields, basePath = process.cwd(), validate = false } = {}) {
|
|
157
157
|
const statePath = await getStatePath(basePath);
|
|
158
158
|
if (!statePath) {
|
|
159
|
-
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No .gsd directory
|
|
159
|
+
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No GSD project found (.gsd directory missing). Run /gsd:start or /gsd:prd to begin.' };
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
const result = await readJson(statePath);
|
|
@@ -207,7 +207,7 @@ export async function update({ updates, basePath = process.cwd(), expectedVersio
|
|
|
207
207
|
|
|
208
208
|
const statePath = await getStatePath(basePath);
|
|
209
209
|
if (!statePath) {
|
|
210
|
-
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No .gsd directory
|
|
210
|
+
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No GSD project found (.gsd directory missing). Run /gsd:start or /gsd:prd to begin.' };
|
|
211
211
|
}
|
|
212
212
|
ensureLockPathFromStatePath(statePath);
|
|
213
213
|
|
|
@@ -425,7 +425,7 @@ export async function phaseComplete({
|
|
|
425
425
|
}
|
|
426
426
|
const statePath = await getStatePath(basePath);
|
|
427
427
|
if (!statePath) {
|
|
428
|
-
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No .gsd directory
|
|
428
|
+
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No GSD project found (.gsd directory missing). Run /gsd:start or /gsd:prd to begin.' };
|
|
429
429
|
}
|
|
430
430
|
ensureLockPathFromStatePath(statePath);
|
|
431
431
|
|
|
@@ -612,7 +612,7 @@ export async function addEvidence({ id, data, basePath = process.cwd() }) {
|
|
|
612
612
|
|
|
613
613
|
const statePath = await getStatePath(basePath);
|
|
614
614
|
if (!statePath) {
|
|
615
|
-
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No .gsd directory
|
|
615
|
+
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No GSD project found (.gsd directory missing). Run /gsd:start or /gsd:prd to begin.' };
|
|
616
616
|
}
|
|
617
617
|
ensureLockPathFromStatePath(statePath);
|
|
618
618
|
|
|
@@ -693,7 +693,7 @@ export async function pruneEvidence({ currentPhase, basePath = process.cwd() })
|
|
|
693
693
|
}
|
|
694
694
|
const statePath = await getStatePath(basePath);
|
|
695
695
|
if (!statePath) {
|
|
696
|
-
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No .gsd directory
|
|
696
|
+
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No GSD project found (.gsd directory missing). Run /gsd:start or /gsd:prd to begin.' };
|
|
697
697
|
}
|
|
698
698
|
ensureLockPathFromStatePath(statePath);
|
|
699
699
|
|
|
@@ -733,7 +733,7 @@ export async function patchPlan({ operations, basePath = process.cwd() } = {}) {
|
|
|
733
733
|
|
|
734
734
|
const statePath = await getStatePath(basePath);
|
|
735
735
|
if (!statePath) {
|
|
736
|
-
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No .gsd directory
|
|
736
|
+
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No GSD project found (.gsd directory missing). Run /gsd:start or /gsd:prd to begin.' };
|
|
737
737
|
}
|
|
738
738
|
ensureLockPathFromStatePath(statePath);
|
|
739
739
|
|
package/src/tools/state/index.js
CHANGED
|
File without changes
|
package/src/tools/state/logic.js
CHANGED
|
@@ -430,7 +430,7 @@ export async function storeResearch({ result, artifacts, decision_index, basePat
|
|
|
430
430
|
|
|
431
431
|
const statePath = await getStatePath(basePath);
|
|
432
432
|
if (!statePath) {
|
|
433
|
-
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No .gsd directory
|
|
433
|
+
return { error: true, code: ERROR_CODES.NO_PROJECT_DIR, message: 'No GSD project found (.gsd directory missing). Run /gsd:start or /gsd:prd to begin.' };
|
|
434
434
|
}
|
|
435
435
|
ensureLockPathFromStatePath(statePath);
|
|
436
436
|
|
package/src/tools/verify.js
CHANGED
|
File without changes
|
package/src/utils.js
CHANGED
|
File without changes
|
package/uninstall.js
CHANGED
|
File without changes
|
package/workflows/debugging.md
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/workflows/research.md
CHANGED
|
File without changes
|
|
File without changes
|
package/workflows/tdd-cycle.md
CHANGED
|
File without changes
|