gsd-cc 1.4.0 → 1.5.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/assets/flow-2.jpg +0 -0
- package/assets/flow.jpg +0 -0
- package/assets/hero.jpg +0 -0
- package/bin/install.js +64 -73
- package/package.json +1 -1
- package/skills/{gsd/plan → plan}/SKILL.md +2 -2
- package/skills/{gsd/seed → seed}/SKILL.md +3 -3
- package/skills/{gsd/unify → unify}/SKILL.md +3 -3
- /package/{skills/gsd/apply → checklists}/.gitkeep +0 -0
- /package/{skills/gsd/checklists → checklists}/planning-ready.md +0 -0
- /package/{skills/gsd/checklists → checklists}/unify-complete.md +0 -0
- /package/{skills/gsd/auto → commands}/.gitkeep +0 -0
- /package/{skills/gsd/prompts → commands}/apply-instructions.txt +0 -0
- /package/{skills/gsd/prompts → commands}/plan-instructions.txt +0 -0
- /package/{skills/gsd/prompts → commands}/reassess-instructions.txt +0 -0
- /package/{skills/gsd/prompts → commands}/unify-instructions.txt +0 -0
- /package/skills/{gsd/checklists → apply}/.gitkeep +0 -0
- /package/skills/{gsd/apply → apply}/SKILL.md +0 -0
- /package/skills/{gsd/discuss → auto}/.gitkeep +0 -0
- /package/skills/{gsd/auto → auto}/SKILL.md +0 -0
- /package/skills/{gsd/auto → auto}/auto-loop.sh +0 -0
- /package/skills/{gsd/config → config}/SKILL.md +0 -0
- /package/skills/{gsd/plan → discuss}/.gitkeep +0 -0
- /package/skills/{gsd/discuss → discuss}/SKILL.md +0 -0
- /package/skills/{gsd → gsd-cc}/SKILL.md +0 -0
- /package/skills/{gsd/help → help}/SKILL.md +0 -0
- /package/skills/{gsd/ideate → ideate}/SKILL.md +0 -0
- /package/skills/{gsd/ingest → ingest}/SKILL.md +0 -0
- /package/skills/{gsd/prompts → plan}/.gitkeep +0 -0
- /package/skills/{gsd/profile → profile}/SKILL.md +0 -0
- /package/skills/{gsd/seed → seed}/types/application/.gitkeep +0 -0
- /package/skills/{gsd/seed → seed}/types/application/config.md +0 -0
- /package/skills/{gsd/seed → seed}/types/application/guide.md +0 -0
- /package/skills/{gsd/seed → seed}/types/application/loadout.md +0 -0
- /package/skills/{gsd/seed → seed}/types/campaign/.gitkeep +0 -0
- /package/skills/{gsd/seed → seed}/types/campaign/config.md +0 -0
- /package/skills/{gsd/seed → seed}/types/campaign/guide.md +0 -0
- /package/skills/{gsd/seed → seed}/types/campaign/loadout.md +0 -0
- /package/skills/{gsd/seed → seed}/types/client/.gitkeep +0 -0
- /package/skills/{gsd/seed → seed}/types/client/config.md +0 -0
- /package/skills/{gsd/seed → seed}/types/client/guide.md +0 -0
- /package/skills/{gsd/seed → seed}/types/client/loadout.md +0 -0
- /package/skills/{gsd/seed → seed}/types/utility/.gitkeep +0 -0
- /package/skills/{gsd/seed → seed}/types/utility/config.md +0 -0
- /package/skills/{gsd/seed → seed}/types/utility/guide.md +0 -0
- /package/skills/{gsd/seed → seed}/types/utility/loadout.md +0 -0
- /package/skills/{gsd/seed → seed}/types/workflow/.gitkeep +0 -0
- /package/skills/{gsd/seed → seed}/types/workflow/config.md +0 -0
- /package/skills/{gsd/seed → seed}/types/workflow/guide.md +0 -0
- /package/skills/{gsd/seed → seed}/types/workflow/loadout.md +0 -0
- /package/skills/{gsd/stack → stack}/SKILL.md +0 -0
- /package/skills/{gsd/status → status}/.gitkeep +0 -0
- /package/skills/{gsd/status → status}/SKILL.md +0 -0
- /package/skills/{gsd/tutorial → tutorial}/SKILL.md +0 -0
- /package/skills/{gsd/templates → unify}/.gitkeep +0 -0
- /package/skills/{gsd/update → update}/SKILL.md +0 -0
- /package/skills/{gsd/vision → vision}/SKILL.md +0 -0
- /package/{skills/gsd/unify → templates}/.gitkeep +0 -0
- /package/{skills/gsd/templates → templates}/PLAN.xml +0 -0
- /package/{skills/gsd/templates → templates}/PLANNING.md +0 -0
- /package/{skills/gsd/templates → templates}/STATE.md +0 -0
- /package/{skills/gsd/templates → templates}/UNIFY.md +0 -0
|
Binary file
|
package/assets/flow.jpg
ADDED
|
Binary file
|
package/assets/hero.jpg
ADDED
|
Binary file
|
package/bin/install.js
CHANGED
|
@@ -26,11 +26,8 @@ ${cyan} ██████╗ ███████╗██████╗
|
|
|
26
26
|
Get Shit Done on Claude Code ${dim}v${pkg.version}${reset}
|
|
27
27
|
`;
|
|
28
28
|
|
|
29
|
-
//
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
// Shared directories that go into gsd-cc-shared/
|
|
33
|
-
const SHARED_DIRS = ['checklists', 'prompts', 'templates'];
|
|
29
|
+
// Directories inside gsd-cc/ that map 1:1 into .claude/
|
|
30
|
+
const CLAUDE_DIRS = ['skills', 'hooks', 'checklists', 'commands', 'templates'];
|
|
34
31
|
|
|
35
32
|
// Parse args
|
|
36
33
|
const args = process.argv.slice(2);
|
|
@@ -94,85 +91,62 @@ function removeDir(dir) {
|
|
|
94
91
|
}
|
|
95
92
|
|
|
96
93
|
/**
|
|
97
|
-
* Resolve
|
|
94
|
+
* Resolve .claude base directory
|
|
98
95
|
*/
|
|
99
|
-
function
|
|
96
|
+
function getClaudeBase(isGlobal) {
|
|
100
97
|
if (isGlobal) {
|
|
101
|
-
return path.join(os.homedir(), '.claude'
|
|
98
|
+
return path.join(os.homedir(), '.claude');
|
|
102
99
|
}
|
|
103
|
-
return path.join(process.cwd(), '.claude'
|
|
100
|
+
return path.join(process.cwd(), '.claude');
|
|
104
101
|
}
|
|
105
102
|
|
|
106
103
|
/**
|
|
107
|
-
* Install
|
|
104
|
+
* Install everything into .claude/
|
|
105
|
+
* Source structure mirrors target structure 1:1.
|
|
108
106
|
*/
|
|
109
107
|
function install(isGlobal) {
|
|
110
|
-
const
|
|
111
|
-
const
|
|
108
|
+
const srcBase = path.join(__dirname, '..');
|
|
109
|
+
const claudeBase = isGlobal
|
|
110
|
+
? path.join(os.homedir(), '.claude')
|
|
111
|
+
: path.join(process.cwd(), '.claude');
|
|
112
112
|
const label = isGlobal
|
|
113
|
-
?
|
|
114
|
-
:
|
|
115
|
-
|
|
116
|
-
if (!fs.existsSync(skillsSrc)) {
|
|
117
|
-
console.error(` ${red}Error:${reset} Skills source not found at ${skillsSrc}`);
|
|
118
|
-
process.exit(1);
|
|
119
|
-
}
|
|
113
|
+
? claudeBase.replace(os.homedir(), '~')
|
|
114
|
+
: claudeBase.replace(process.cwd(), '.');
|
|
120
115
|
|
|
121
116
|
console.log(` Installing to ${cyan}${label}${reset}\n`);
|
|
122
117
|
|
|
123
118
|
let fileCount = 0;
|
|
124
119
|
|
|
125
|
-
//
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
fs.copyFileSync(path.join(skillsSrc, 'SKILL.md'), path.join(routerDest, 'SKILL.md'));
|
|
129
|
-
fileCount++;
|
|
130
|
-
|
|
131
|
-
// 2. Install each sub-skill as its own top-level directory
|
|
132
|
-
for (const skill of SUB_SKILLS) {
|
|
133
|
-
const srcDir = path.join(skillsSrc, skill);
|
|
134
|
-
const destDir = path.join(skillsBase, `gsd-cc-${skill}`);
|
|
135
|
-
|
|
120
|
+
// Copy each directory 1:1 into .claude/
|
|
121
|
+
for (const dir of CLAUDE_DIRS) {
|
|
122
|
+
const srcDir = path.join(srcBase, dir);
|
|
136
123
|
if (fs.existsSync(srcDir)) {
|
|
137
|
-
copyDir(srcDir,
|
|
138
|
-
fileCount += countFiles(
|
|
124
|
+
copyDir(srcDir, path.join(claudeBase, dir));
|
|
125
|
+
fileCount += countFiles(path.join(claudeBase, dir));
|
|
139
126
|
}
|
|
140
127
|
}
|
|
141
128
|
|
|
142
|
-
//
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
129
|
+
// Make shell scripts executable
|
|
130
|
+
const makeExecutable = (dir) => {
|
|
131
|
+
if (!fs.existsSync(dir)) return;
|
|
132
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
133
|
+
for (const entry of entries) {
|
|
134
|
+
const fullPath = path.join(dir, entry.name);
|
|
135
|
+
if (entry.isDirectory()) {
|
|
136
|
+
makeExecutable(fullPath);
|
|
137
|
+
} else if (entry.name.endsWith('.sh')) {
|
|
138
|
+
fs.chmodSync(fullPath, 0o755);
|
|
139
|
+
}
|
|
149
140
|
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// 4. Make auto-loop.sh executable
|
|
153
|
-
const autoLoop = path.join(skillsBase, 'gsd-cc-auto', 'auto-loop.sh');
|
|
154
|
-
if (fs.existsSync(autoLoop)) {
|
|
155
|
-
fs.chmodSync(autoLoop, 0o755);
|
|
156
|
-
}
|
|
141
|
+
};
|
|
142
|
+
makeExecutable(claudeBase);
|
|
157
143
|
|
|
158
|
-
//
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
: path.join(process.cwd(), '.claude', 'hooks');
|
|
163
|
-
if (fs.existsSync(hooksSrc)) {
|
|
164
|
-
copyDir(hooksSrc, hooksBase);
|
|
165
|
-
// Make hooks executable
|
|
166
|
-
const hookFiles = fs.readdirSync(hooksBase);
|
|
167
|
-
for (const f of hookFiles) {
|
|
168
|
-
fs.chmodSync(path.join(hooksBase, f), 0o755);
|
|
169
|
-
}
|
|
170
|
-
fileCount += hookFiles.length;
|
|
144
|
+
// Configure hooks in settings.json
|
|
145
|
+
const hooksDir = path.join(claudeBase, 'hooks');
|
|
146
|
+
if (fs.existsSync(hooksDir)) {
|
|
147
|
+
installHooks(isGlobal, hooksDir);
|
|
171
148
|
}
|
|
172
149
|
|
|
173
|
-
// 6. Configure hooks in settings.json
|
|
174
|
-
installHooks(isGlobal, hooksBase);
|
|
175
|
-
|
|
176
150
|
console.log(` ${green}✓${reset} Installed ${fileCount} files to ${label}`);
|
|
177
151
|
}
|
|
178
152
|
|
|
@@ -306,27 +280,44 @@ function countFiles(dir) {
|
|
|
306
280
|
}
|
|
307
281
|
|
|
308
282
|
/**
|
|
309
|
-
* Uninstall
|
|
283
|
+
* Uninstall GSD-CC
|
|
310
284
|
*/
|
|
311
285
|
function uninstall() {
|
|
312
|
-
const
|
|
313
|
-
|
|
286
|
+
const claudeBases = [
|
|
287
|
+
path.join(os.homedir(), '.claude'),
|
|
288
|
+
path.join(process.cwd(), '.claude')
|
|
289
|
+
];
|
|
314
290
|
|
|
315
291
|
let removed = false;
|
|
316
292
|
|
|
317
|
-
for (const
|
|
318
|
-
const label =
|
|
319
|
-
?
|
|
320
|
-
:
|
|
293
|
+
for (const claudeBase of claudeBases) {
|
|
294
|
+
const label = claudeBase.includes(os.homedir())
|
|
295
|
+
? claudeBase.replace(os.homedir(), '~')
|
|
296
|
+
: claudeBase.replace(process.cwd(), '.');
|
|
321
297
|
|
|
322
298
|
let removedFromLocation = false;
|
|
323
|
-
|
|
324
|
-
|
|
299
|
+
|
|
300
|
+
// Remove all CLAUDE_DIRS
|
|
301
|
+
for (const dir of [...CLAUDE_DIRS, 'prompts']) { // 'prompts' for legacy cleanup
|
|
302
|
+
const fullPath = path.join(claudeBase, dir);
|
|
325
303
|
if (removeDir(fullPath)) {
|
|
326
304
|
removedFromLocation = true;
|
|
327
305
|
}
|
|
328
306
|
}
|
|
329
307
|
|
|
308
|
+
// Also clean up old skill names (legacy: gsd-cc-shared, gsd)
|
|
309
|
+
const skillsDir = path.join(claudeBase, 'skills');
|
|
310
|
+
if (fs.existsSync(skillsDir)) {
|
|
311
|
+
const entries = fs.readdirSync(skillsDir);
|
|
312
|
+
for (const entry of entries) {
|
|
313
|
+
if (entry.startsWith('gsd-cc') || entry === 'gsd') {
|
|
314
|
+
if (removeDir(path.join(skillsDir, entry))) {
|
|
315
|
+
removedFromLocation = true;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
330
321
|
if (removedFromLocation) {
|
|
331
322
|
console.log(` ${green}✓${reset} Removed GSD-CC from ${label}`);
|
|
332
323
|
removed = true;
|
|
@@ -372,12 +363,12 @@ function promptLocation() {
|
|
|
372
363
|
output: process.stdout,
|
|
373
364
|
});
|
|
374
365
|
|
|
375
|
-
const globalPath =
|
|
366
|
+
const globalPath = getClaudeBase(true).replace(os.homedir(), '~');
|
|
376
367
|
|
|
377
368
|
console.log(` ${yellow}Where would you like to install?${reset}
|
|
378
369
|
|
|
379
370
|
${cyan}1${reset}) Global ${dim}(${globalPath})${reset} — available in all projects
|
|
380
|
-
${cyan}2${reset}) Local ${dim}(./.claude/
|
|
371
|
+
${cyan}2${reset}) Local ${dim}(./.claude/)${reset} — this project only
|
|
381
372
|
`);
|
|
382
373
|
|
|
383
374
|
rl.question(` Choice ${dim}[1]${reset}: `, (answer) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-cc",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Get Shit Done on Claude Code — structured AI development with your Max plan",
|
|
5
5
|
"author": "Philipp Briese (https://github.com/0ui-labs)",
|
|
6
6
|
"homepage": "https://github.com/0ui-labs/GSD-CC#readme",
|
|
@@ -202,8 +202,8 @@ One file per task, using the PLAN.xml template format:
|
|
|
202
202
|
|
|
203
203
|
Before finishing, check against `checklists/planning-ready.md`:
|
|
204
204
|
|
|
205
|
-
Read: `~/.claude/
|
|
206
|
-
(or `./.claude/
|
|
205
|
+
Read: `~/.claude/checklists/planning-ready.md`
|
|
206
|
+
(or `./.claude/checklists/planning-ready.md`)
|
|
207
207
|
|
|
208
208
|
Verify ALL of these:
|
|
209
209
|
|
|
@@ -102,8 +102,8 @@ Walk through the guide sections **one at a time**. For each section:
|
|
|
102
102
|
|
|
103
103
|
After completing all sections, mentally check against `checklists/planning-ready.md`:
|
|
104
104
|
|
|
105
|
-
Read: `~/.claude/
|
|
106
|
-
(or `./.claude/
|
|
105
|
+
Read: `~/.claude/checklists/planning-ready.md`
|
|
106
|
+
(or `./.claude/checklists/planning-ready.md`)
|
|
107
107
|
|
|
108
108
|
Verify:
|
|
109
109
|
- Is there enough information to create a roadmap?
|
|
@@ -118,7 +118,7 @@ Create the `.gsd/` directory and write these files:
|
|
|
118
118
|
|
|
119
119
|
#### `.gsd/PLANNING.md`
|
|
120
120
|
|
|
121
|
-
Use the template from `~/.claude/
|
|
121
|
+
Use the template from `~/.claude/templates/PLANNING.md` (or `./.claude/templates/PLANNING.md`). Fill in all sections from the conversation:
|
|
122
122
|
- Vision (from their initial description + refinements)
|
|
123
123
|
- Users (from user/auth discussions)
|
|
124
124
|
- Requirements v1, v2, Out of Scope (from exploration)
|
|
@@ -194,14 +194,14 @@ If no VISION.md exists, skip this step.
|
|
|
194
194
|
|
|
195
195
|
Check against `checklists/unify-complete.md`:
|
|
196
196
|
|
|
197
|
-
Read: `~/.claude/
|
|
198
|
-
(or `./.claude/
|
|
197
|
+
Read: `~/.claude/checklists/unify-complete.md`
|
|
198
|
+
(or `./.claude/checklists/unify-complete.md`)
|
|
199
199
|
|
|
200
200
|
Verify ALL items pass. If any fails, fix the UNIFY document before proceeding.
|
|
201
201
|
|
|
202
202
|
## Step 9: Write UNIFY.md
|
|
203
203
|
|
|
204
|
-
Write `.gsd/S{nn}-UNIFY.md` using the template from `~/.claude/
|
|
204
|
+
Write `.gsd/S{nn}-UNIFY.md` using the template from `~/.claude/templates/UNIFY.md` (or `./.claude/templates/UNIFY.md`). Include all sections from Steps 2-7.
|
|
205
205
|
|
|
206
206
|
Set frontmatter:
|
|
207
207
|
```yaml
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|