gsd-lite 0.6.5 → 0.6.7

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.
Files changed (57) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.mcp.json +0 -0
  4. package/README.md +0 -0
  5. package/agents/debugger.md +0 -0
  6. package/agents/executor.md +0 -0
  7. package/agents/researcher.md +0 -0
  8. package/agents/reviewer.md +0 -0
  9. package/commands/doctor.md +0 -0
  10. package/commands/prd.md +0 -0
  11. package/commands/resume.md +0 -0
  12. package/commands/start.md +0 -0
  13. package/commands/status.md +0 -0
  14. package/commands/stop.md +0 -0
  15. package/hooks/context-monitor.js +0 -0
  16. package/hooks/gsd-auto-update.cjs +0 -0
  17. package/hooks/gsd-context-monitor.cjs +0 -0
  18. package/hooks/gsd-session-init.cjs +1 -0
  19. package/hooks/gsd-session-stop.cjs +0 -0
  20. package/hooks/gsd-statusline.cjs +0 -0
  21. package/hooks/hooks.json +0 -0
  22. package/hooks/lib/gsd-finder.cjs +0 -0
  23. package/hooks/lib/semver-sort.cjs +0 -0
  24. package/hooks/lib/statusline-composite.cjs +0 -0
  25. package/install.js +0 -0
  26. package/launcher.js +0 -0
  27. package/package.json +2 -1
  28. package/references/anti-rationalization-full.md +0 -0
  29. package/references/evidence-spec.md +0 -0
  30. package/references/execution-loop.md +0 -0
  31. package/references/git-worktrees.md +0 -0
  32. package/references/questioning.md +0 -0
  33. package/references/review-classification.md +0 -0
  34. package/references/state-diagram.md +0 -0
  35. package/references/testing-patterns.md +0 -0
  36. package/src/schema.js +0 -0
  37. package/src/server.js +0 -0
  38. package/src/tools/orchestrator/debugger.js +0 -0
  39. package/src/tools/orchestrator/executor.js +0 -0
  40. package/src/tools/orchestrator/helpers.js +0 -0
  41. package/src/tools/orchestrator/index.js +0 -0
  42. package/src/tools/orchestrator/researcher.js +0 -0
  43. package/src/tools/orchestrator/resume.js +3 -2
  44. package/src/tools/orchestrator/reviewer.js +0 -0
  45. package/src/tools/state/constants.js +0 -0
  46. package/src/tools/state/crud.js +19 -5
  47. package/src/tools/state/index.js +0 -0
  48. package/src/tools/state/logic.js +0 -0
  49. package/src/tools/verify.js +0 -0
  50. package/src/utils.js +0 -0
  51. package/uninstall.js +0 -0
  52. package/workflows/debugging.md +0 -0
  53. package/workflows/deviation-rules.md +0 -0
  54. package/workflows/execution-flow.md +0 -0
  55. package/workflows/research.md +0 -0
  56. package/workflows/review-cycle.md +0 -0
  57. 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.6.5",
16
+ "version": "0.6.7",
17
17
  "keywords": [
18
18
  "orchestration",
19
19
  "mcp",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd",
3
- "version": "0.6.5",
3
+ "version": "0.6.7",
4
4
  "description": "AI orchestration tool for Claude Code — GSD management shell + Superpowers quality core",
5
5
  "author": {
6
6
  "name": "sdsrss",
package/.mcp.json CHANGED
File without changes
package/README.md CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/commands/prd.md CHANGED
File without changes
File without changes
package/commands/start.md CHANGED
File without changes
File without changes
package/commands/stop.md CHANGED
File without changes
File without changes
File without changes
File without changes
@@ -94,6 +94,7 @@ setTimeout(() => process.exit(0), 4000).unref();
94
94
  if (gsdEntry) {
95
95
  const mcpContent = JSON.stringify({
96
96
  mcpServers: {
97
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: intentional — Claude plugin system substitutes this at runtime
97
98
  gsd: { command: 'node', args: ['${CLAUDE_PLUGIN_ROOT}/launcher.js'] },
98
99
  },
99
100
  }, null, 2) + '\n';
File without changes
File without changes
package/hooks/hooks.json CHANGED
File without changes
File without changes
File without changes
File without changes
package/install.js CHANGED
File without changes
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.6.5",
3
+ "version": "0.6.7",
4
4
  "description": "AI orchestration tool for Claude Code — GSD management shell + Superpowers quality core",
5
5
  "type": "module",
6
6
  "bin": {
@@ -13,6 +13,7 @@
13
13
  "lint:fix": "biome check --write src/ tests/ hooks/",
14
14
  "start": "node src/server.js",
15
15
  "version": "node scripts/sync-versions.js && git add .claude-plugin/plugin.json .claude-plugin/marketplace.json",
16
+ "prepare": "[ -d .git ] && ln -sf ../../scripts/pre-commit.sh .git/hooks/pre-commit || true",
16
17
  "prepublishOnly": "node scripts/sync-versions.js && npm run lint && npm test"
17
18
  },
18
19
  "repository": {
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
@@ -216,7 +216,8 @@ async function resumeExecutingTask(state, basePath) {
216
216
  // signal complete_phase instead of going idle
217
217
  const allAccepted = phase.todo.length > 0 && phase.todo.every(t => t.lifecycle === 'accepted');
218
218
  const reviewPassed = phase.phase_review?.status === 'accepted'
219
- || phase.phase_handoff?.required_reviews_passed === true;
219
+ || phase.phase_handoff?.required_reviews_passed === true
220
+ || allAccepted;
220
221
  if (allAccepted && reviewPassed) {
221
222
  // Auto-advance phase lifecycle to 'reviewing' if currently 'active'
222
223
  // (mirrors trigger_review path at line 480-482)
@@ -531,7 +532,7 @@ export async function resumeWorkflow({ basePath = process.cwd(), _depth = 0, unb
531
532
  }
532
533
 
533
534
  // Attach display-ready summary to all successful responses
534
- if (result && result.success && !result.summary) {
535
+ if (result?.success && !result.summary) {
535
536
  const summary = _buildResumeSummary(state, result);
536
537
  // Use the response's workflow_mode if it differs from state (e.g., preflight override)
537
538
  if (result.workflow_mode && result.workflow_mode !== state.workflow_mode) {
File without changes
File without changes
@@ -486,8 +486,11 @@ export async function phaseComplete({
486
486
  };
487
487
  }
488
488
 
489
+ const allTasksAutoAccepted = phase.lifecycle === 'active'
490
+ && phase.todo?.length > 0 && phase.todo.every(t => t.lifecycle === 'accepted');
489
491
  const reviewPassed = phase.phase_review?.status === 'accepted'
490
- || phase.phase_handoff.required_reviews_passed === true;
492
+ || phase.phase_handoff.required_reviews_passed === true
493
+ || allTasksAutoAccepted;
491
494
  if (!reviewPassed) {
492
495
  return {
493
496
  error: true,
@@ -579,7 +582,16 @@ export async function phaseComplete({
579
582
  }
580
583
  state._version = (state._version ?? 0) + 1;
581
584
  await writeJson(statePath, state);
582
- return { success: true };
585
+ const isCompleted = state.workflow_mode === 'completed';
586
+ const nextPhaseInfo = !isCompleted && state.phases.find(p => p.id === state.current_phase);
587
+ return {
588
+ success: true,
589
+ phase_id,
590
+ phase_name: phase.name,
591
+ next_phase: nextPhaseInfo ? { id: nextPhaseInfo.id, name: nextPhaseInfo.name, tasks: nextPhaseInfo.todo?.length || 0 } : null,
592
+ workflow_mode: state.workflow_mode,
593
+ ...(isCompleted ? { message: 'All phases completed — project finished' } : {}),
594
+ };
583
595
  });
584
596
  }
585
597
 
@@ -894,7 +906,7 @@ function _applyPatchOp(state, op) {
894
906
  }
895
907
 
896
908
  case 'update_task': {
897
- const { task_id, ...fields } = op;
909
+ const { task_id, task: taskObj, ...fields } = op;
898
910
  if (typeof task_id !== 'string') return { error: true, message: 'task_id must be a string' };
899
911
 
900
912
  const phase = state.phases.find(p => p.todo?.some(t => t.id === task_id));
@@ -902,10 +914,12 @@ function _applyPatchOp(state, op) {
902
914
 
903
915
  const task = phase.todo.find(t => t.id === task_id);
904
916
  const allowedFields = ['name', 'level', 'review_required', 'verification_required', 'research_basis'];
917
+ // Support both flat fields and nested task object (consistent with add_task API)
918
+ const source = (taskObj && typeof taskObj === 'object') ? { ...taskObj, ...fields } : fields;
905
919
  const updates = {};
906
920
  for (const key of allowedFields) {
907
- if (key in fields) {
908
- updates[key] = fields[key];
921
+ if (key in source) {
922
+ updates[key] = source[key];
909
923
  }
910
924
  }
911
925
 
File without changes
File without changes
File without changes
package/src/utils.js CHANGED
File without changes
package/uninstall.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes