get-shit-done-cc 1.7.1 → 1.9.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.
Files changed (44) hide show
  1. package/README.md +104 -0
  2. package/agents/gsd-debugger.md +20 -1
  3. package/agents/gsd-executor.md +30 -0
  4. package/agents/gsd-phase-researcher.md +9 -0
  5. package/agents/gsd-planner.md +41 -0
  6. package/agents/gsd-research-synthesizer.md +9 -0
  7. package/bin/install.js +78 -7
  8. package/commands/gsd/add-todo.md +11 -0
  9. package/commands/gsd/analyze-codebase.md +363 -0
  10. package/commands/gsd/audit-milestone.md +20 -1
  11. package/commands/gsd/check-todos.md +11 -0
  12. package/commands/gsd/debug.md +20 -0
  13. package/commands/gsd/execute-phase.md +40 -5
  14. package/commands/gsd/help.md +118 -0
  15. package/commands/gsd/new-milestone.md +267 -263
  16. package/commands/gsd/new-project.md +116 -10
  17. package/commands/gsd/pause-work.md +11 -0
  18. package/commands/gsd/plan-milestone-gaps.md +11 -0
  19. package/commands/gsd/plan-phase.md +84 -26
  20. package/commands/gsd/progress.md +8 -0
  21. package/commands/gsd/query-intel.md +128 -0
  22. package/commands/gsd/quick.md +23 -0
  23. package/commands/gsd/remove-phase.md +11 -0
  24. package/commands/gsd/research-phase.md +20 -0
  25. package/commands/gsd/set-profile.md +106 -0
  26. package/commands/gsd/settings.md +136 -0
  27. package/get-shit-done/references/model-profiles.md +73 -0
  28. package/get-shit-done/references/planning-config.md +94 -0
  29. package/get-shit-done/templates/config.json +9 -0
  30. package/get-shit-done/templates/entity.md +173 -0
  31. package/get-shit-done/workflows/complete-milestone.md +11 -0
  32. package/get-shit-done/workflows/diagnose-issues.md +11 -0
  33. package/get-shit-done/workflows/discuss-phase.md +11 -0
  34. package/get-shit-done/workflows/execute-phase.md +68 -9
  35. package/get-shit-done/workflows/execute-plan.md +188 -4
  36. package/get-shit-done/workflows/map-codebase.md +35 -2
  37. package/get-shit-done/workflows/verify-work.md +33 -0
  38. package/hooks/dist/gsd-intel-index.js +97 -0
  39. package/hooks/dist/gsd-intel-prune.js +78 -0
  40. package/hooks/dist/gsd-intel-session.js +39 -0
  41. package/package.json +12 -2
  42. package/scripts/build-hooks.js +95 -0
  43. /package/hooks/{gsd-check-update.js → dist/gsd-check-update.js} +0 -0
  44. /package/hooks/{statusline.js → dist/statusline.js} +0 -0
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Intel Prune Hook (Stop event)
5
+ *
6
+ * Removes stale entries from index.json when files no longer exist.
7
+ * Runs after each Claude response to keep intel fresh.
8
+ *
9
+ * Fast: Only does fs.existsSync checks, no file reading.
10
+ * Silent: Never blocks or errors, always exits 0.
11
+ */
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ function pruneIndex() {
17
+ const intelDir = path.join(process.cwd(), '.planning', 'intel');
18
+ const indexPath = path.join(intelDir, 'index.json');
19
+
20
+ // Only run if intel directory exists (opt-in check)
21
+ if (!fs.existsSync(intelDir)) {
22
+ return { pruned: 0, total: 0 };
23
+ }
24
+
25
+ // Read existing index
26
+ let index;
27
+ try {
28
+ const content = fs.readFileSync(indexPath, 'utf8');
29
+ index = JSON.parse(content);
30
+ } catch (e) {
31
+ // No index or invalid JSON
32
+ return { pruned: 0, total: 0 };
33
+ }
34
+
35
+ if (!index.files || typeof index.files !== 'object') {
36
+ return { pruned: 0, total: 0 };
37
+ }
38
+
39
+ // Check each file and collect deleted ones
40
+ const filePaths = Object.keys(index.files);
41
+ const deleted = filePaths.filter(filePath => !fs.existsSync(filePath));
42
+
43
+ if (deleted.length === 0) {
44
+ return { pruned: 0, total: filePaths.length };
45
+ }
46
+
47
+ // Remove deleted entries
48
+ for (const filePath of deleted) {
49
+ delete index.files[filePath];
50
+ }
51
+ index.updated = Date.now();
52
+
53
+ // Write updated index
54
+ fs.writeFileSync(indexPath, JSON.stringify(index, null, 2));
55
+
56
+ // Regenerate conventions and summary after pruning
57
+ // Import detection logic from intel-index.js would be complex,
58
+ // so we just update the index. Conventions/summary stay until
59
+ // next PostToolUse or /gsd:analyze-codebase refresh.
60
+
61
+ return { pruned: deleted.length, total: filePaths.length };
62
+ }
63
+
64
+ // Read JSON from stdin (standard hook pattern)
65
+ let input = '';
66
+ process.stdin.setEncoding('utf8');
67
+ process.stdin.on('data', chunk => input += chunk);
68
+ process.stdin.on('end', () => {
69
+ try {
70
+ // Stop hook receives session data, but we don't need it
71
+ // Just prune stale entries
72
+ pruneIndex();
73
+ process.exit(0);
74
+ } catch (error) {
75
+ // Silent failure - never block Claude
76
+ process.exit(0);
77
+ }
78
+ });
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ // Codebase Intelligence - SessionStart Context Injection Hook
3
+ // Reads pre-generated summary.md and injects into Claude's context
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+
8
+ // Read JSON from stdin (standard hook pattern)
9
+ let input = '';
10
+ process.stdin.setEncoding('utf8');
11
+ process.stdin.on('data', chunk => input += chunk);
12
+ process.stdin.on('end', () => {
13
+ try {
14
+ const data = JSON.parse(input);
15
+
16
+ // Only inject on startup or resume
17
+ if (!['startup', 'resume'].includes(data.source)) {
18
+ process.exit(0);
19
+ }
20
+
21
+ // Read pre-generated summary (created by gsd-intel-index.js)
22
+ const summaryPath = path.join(process.cwd(), '.planning', 'intel', 'summary.md');
23
+
24
+ if (!fs.existsSync(summaryPath)) {
25
+ process.exit(0); // No intel, skip silently
26
+ }
27
+
28
+ const summary = fs.readFileSync(summaryPath, 'utf8').trim();
29
+
30
+ if (summary) {
31
+ process.stdout.write(`<codebase-intelligence>\n${summary}\n</codebase-intelligence>`);
32
+ }
33
+
34
+ process.exit(0);
35
+ } catch (error) {
36
+ // Silent failure - never block Claude
37
+ process.exit(0);
38
+ }
39
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "get-shit-done-cc",
3
- "version": "1.7.1",
3
+ "version": "1.9.0",
4
4
  "description": "A meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.",
5
5
  "bin": {
6
6
  "get-shit-done-cc": "bin/install.js"
@@ -10,7 +10,8 @@
10
10
  "commands",
11
11
  "get-shit-done",
12
12
  "agents",
13
- "hooks"
13
+ "hooks/dist",
14
+ "scripts"
14
15
  ],
15
16
  "keywords": [
16
17
  "claude",
@@ -32,5 +33,14 @@
32
33
  },
33
34
  "engines": {
34
35
  "node": ">=16.7.0"
36
+ },
37
+ "dependencies": {},
38
+ "devDependencies": {
39
+ "esbuild": "^0.24.0",
40
+ "sql.js": "^1.12.0"
41
+ },
42
+ "scripts": {
43
+ "build:hooks": "node scripts/build-hooks.js",
44
+ "prepublishOnly": "npm run build:hooks"
35
45
  }
36
46
  }
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Bundle GSD hooks with dependencies for zero-config installation.
4
+ *
5
+ * sql.js includes a WASM binary that must be inlined for portability.
6
+ * This script bundles hooks into self-contained files that work from any cwd.
7
+ */
8
+
9
+ const esbuild = require('esbuild');
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+
13
+ const HOOKS_DIR = path.join(__dirname, '..', 'hooks');
14
+ const DIST_DIR = path.join(HOOKS_DIR, 'dist');
15
+
16
+ // Hooks that need bundling (have npm dependencies)
17
+ const HOOKS_TO_BUNDLE = [
18
+ 'gsd-intel-index.js'
19
+ ];
20
+
21
+ // Hooks that are pure Node.js (just copy)
22
+ const HOOKS_TO_COPY = [
23
+ 'gsd-intel-session.js',
24
+ 'gsd-intel-prune.js',
25
+ 'gsd-check-update.js',
26
+ 'statusline.js'
27
+ ];
28
+
29
+ async function build() {
30
+ // Ensure dist directory exists
31
+ if (!fs.existsSync(DIST_DIR)) {
32
+ fs.mkdirSync(DIST_DIR, { recursive: true });
33
+ }
34
+
35
+ // Bundle hooks with dependencies
36
+ for (const hook of HOOKS_TO_BUNDLE) {
37
+ const entryPoint = path.join(HOOKS_DIR, hook);
38
+ const outfile = path.join(DIST_DIR, hook);
39
+
40
+ if (!fs.existsSync(entryPoint)) {
41
+ console.warn(`Warning: ${hook} not found, skipping`);
42
+ continue;
43
+ }
44
+
45
+ console.log(`Bundling ${hook}...`);
46
+
47
+ await esbuild.build({
48
+ entryPoints: [entryPoint],
49
+ bundle: true,
50
+ platform: 'node',
51
+ target: 'node18',
52
+ outfile,
53
+ format: 'cjs',
54
+ // Inline WASM as base64 for sql.js
55
+ loader: {
56
+ '.wasm': 'binary'
57
+ },
58
+ // Don't externalize anything - bundle it all
59
+ external: [],
60
+ // Minify for smaller package size
61
+ minify: true,
62
+ // Keep function names for debugging
63
+ keepNames: true,
64
+ // Handle sql.js WASM loading
65
+ define: {
66
+ 'process.env.NODE_ENV': '"production"'
67
+ }
68
+ // Note: shebang preserved from source file by esbuild
69
+ });
70
+
71
+ console.log(` → ${outfile}`);
72
+ }
73
+
74
+ // Copy pure Node.js hooks (no bundling needed)
75
+ for (const hook of HOOKS_TO_COPY) {
76
+ const src = path.join(HOOKS_DIR, hook);
77
+ const dest = path.join(DIST_DIR, hook);
78
+
79
+ if (!fs.existsSync(src)) {
80
+ console.warn(`Warning: ${hook} not found, skipping`);
81
+ continue;
82
+ }
83
+
84
+ console.log(`Copying ${hook}...`);
85
+ fs.copyFileSync(src, dest);
86
+ console.log(` → ${dest}`);
87
+ }
88
+
89
+ console.log('\nBuild complete.');
90
+ }
91
+
92
+ build().catch(err => {
93
+ console.error('Build failed:', err);
94
+ process.exit(1);
95
+ });
File without changes