get-shit-done-cc 1.8.0 → 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.
- package/README.md +104 -0
- package/agents/gsd-executor.md +15 -0
- package/agents/gsd-planner.md +22 -0
- package/bin/install.js +78 -7
- package/commands/gsd/analyze-codebase.md +363 -0
- package/commands/gsd/audit-milestone.md +20 -1
- package/commands/gsd/debug.md +20 -0
- package/commands/gsd/execute-phase.md +37 -4
- package/commands/gsd/help.md +91 -0
- package/commands/gsd/new-milestone.md +27 -7
- package/commands/gsd/new-project.md +104 -11
- package/commands/gsd/plan-phase.md +84 -26
- package/commands/gsd/progress.md +2 -0
- package/commands/gsd/query-intel.md +128 -0
- package/commands/gsd/quick.md +23 -0
- package/commands/gsd/research-phase.md +20 -0
- package/commands/gsd/set-profile.md +106 -0
- package/commands/gsd/settings.md +136 -0
- package/get-shit-done/references/model-profiles.md +73 -0
- package/get-shit-done/templates/config.json +5 -0
- package/get-shit-done/templates/entity.md +173 -0
- package/get-shit-done/workflows/execute-phase.md +45 -9
- package/get-shit-done/workflows/execute-plan.md +165 -4
- package/get-shit-done/workflows/map-codebase.md +24 -2
- package/get-shit-done/workflows/verify-work.md +22 -0
- package/hooks/dist/gsd-intel-index.js +97 -0
- package/hooks/dist/gsd-intel-prune.js +78 -0
- package/hooks/dist/gsd-intel-session.js +39 -0
- package/package.json +12 -2
- package/scripts/build-hooks.js +95 -0
- /package/hooks/{gsd-check-update.js → dist/gsd-check-update.js} +0 -0
- /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.
|
|
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
|
|
File without changes
|