gsd-lite 0.6.0 → 0.6.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.
@@ -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.6.0",
16
+ "version": "0.6.1",
17
17
  "keywords": [
18
18
  "orchestration",
19
19
  "mcp",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "AI orchestration tool for Claude Code — GSD management shell + Superpowers quality core",
5
5
  "author": {
6
6
  "name": "sdsrss",
package/README.md CHANGED
@@ -213,8 +213,8 @@ All state lives in `.gsd/state.json` — a single source of truth with:
213
213
  |-----------|-----|----------|
214
214
  | Commands | 32 | **6** |
215
215
  | Agents | 12 | **4** |
216
- | Source files | 100+ | **~35** |
217
- | Installer | 2465 lines | **~80 lines** |
216
+ | Source files | 100+ | **~48** |
217
+ | Installer | 2465 lines | **~290 lines** |
218
218
  | User interactions | 6+ confirmations | **Typically 2** |
219
219
  | TDD / Anti-rationalization | No | **Yes** |
220
220
  | State machine recovery | Partial | **Full (12 modes)** |
@@ -249,7 +249,7 @@ gsd-lite/
249
249
  ├── references/ # 8 reference docs
250
250
  ├── hooks/ # Session lifecycle (StatusLine + PostToolUse + SessionStart + Stop + AutoUpdate)
251
251
  │ └── lib/ # Shared hook utilities (gsd-finder)
252
- ├── tests/ # 826 tests (unit + simulation + E2E)
252
+ ├── tests/ # 866 tests (unit + simulation + E2E)
253
253
  ├── cli.js # Install/uninstall CLI entry
254
254
  ├── install.js # Installation script
255
255
  └── uninstall.js # Uninstall script
@@ -258,7 +258,7 @@ gsd-lite/
258
258
  ## Testing
259
259
 
260
260
  ```bash
261
- npm test # Run all 826 tests
261
+ npm test # Run all 866 tests
262
262
  npm run test:coverage # Tests + coverage report (94%+ lines, 83%+ branches)
263
263
  npm run lint # Biome lint
264
264
  node --test tests/file.js # Run a single test file
@@ -112,7 +112,7 @@ process.stdin.on('end', () => {
112
112
  if (isCritical) {
113
113
  message = `CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. `
114
114
  + 'Context is nearly exhausted. Complete current task checkpoint immediately, '
115
- + 'set workflow_mode = awaiting_clear via gsd-state-update, and tell user to /clear then /gsd:resume.';
115
+ + 'set workflow_mode = awaiting_clear via state-update, and tell user to /clear then /gsd:resume.';
116
116
  } else {
117
117
  message = `CONTEXT WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. `
118
118
  + 'Context is getting limited. Avoid starting new complex work. Complete current task then save state.';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-lite",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "AI orchestration tool for Claude Code — GSD management shell + Superpowers quality core",
5
5
  "type": "module",
6
6
  "bin": {
@@ -109,26 +109,28 @@ async function resumeExecutingTask(state, basePath) {
109
109
  };
110
110
  }
111
111
 
112
- if (state.current_task) {
113
- const currentTask = getTaskById(phase, state.current_task);
114
- if (currentTask?.lifecycle === 'running') {
115
- const isRetrying = (currentTask.retry_count || 0) > 0;
116
- const persistError = await persist(basePath, {
117
- workflow_mode: 'executing_task',
118
- current_task: currentTask.id,
119
- current_review: null,
120
- });
121
- if (persistError) return persistError;
122
- return buildExecutorDispatch(state, phase, currentTask, {
123
- resumed: true,
124
- interruption_recovered: !isRetrying,
125
- ...(isRetrying ? {
126
- retry_after_failure: true,
127
- retry_count: currentTask.retry_count,
128
- last_failure_summary: currentTask.last_failure_summary,
129
- } : {}),
130
- });
131
- }
112
+ // Find the running task — either from current_task or by scanning (orphan recovery)
113
+ const runningTask = state.current_task
114
+ ? getTaskById(phase, state.current_task)
115
+ : (phase.todo || []).find(t => t.lifecycle === 'running');
116
+
117
+ if (runningTask?.lifecycle === 'running') {
118
+ const isRetrying = (runningTask.retry_count || 0) > 0;
119
+ const persistError = await persist(basePath, {
120
+ workflow_mode: 'executing_task',
121
+ current_task: runningTask.id,
122
+ current_review: null,
123
+ });
124
+ if (persistError) return persistError;
125
+ return buildExecutorDispatch(state, phase, runningTask, {
126
+ resumed: true,
127
+ interruption_recovered: !isRetrying,
128
+ ...(isRetrying ? {
129
+ retry_after_failure: true,
130
+ retry_count: runningTask.retry_count,
131
+ last_failure_summary: runningTask.last_failure_summary,
132
+ } : {}),
133
+ });
132
134
  }
133
135
 
134
136
  const selection = selectRunnableTask(phase, state);
@@ -153,8 +153,8 @@ export async function handleReviewerResult({ result, basePath = process.cwd() }
153
153
  workflow_mode: workflowMode,
154
154
  phase_id: phase.id,
155
155
  review_status: reviewStatus,
156
- accepted_count: result.accepted_tasks?.length || 0,
157
- rework_count: result.rework_tasks?.length || 0,
156
+ accepted_count: taskPatches.filter(p => p.lifecycle === 'accepted').length,
157
+ rework_count: taskPatches.filter(p => p.lifecycle === 'needs_revalidation').length,
158
158
  critical_count: result.critical_issues?.length || 0,
159
159
  };
160
160
  }