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.
Files changed (62) hide show
  1. package/assets/flow-2.jpg +0 -0
  2. package/assets/flow.jpg +0 -0
  3. package/assets/hero.jpg +0 -0
  4. package/bin/install.js +64 -73
  5. package/package.json +1 -1
  6. package/skills/{gsd/plan → plan}/SKILL.md +2 -2
  7. package/skills/{gsd/seed → seed}/SKILL.md +3 -3
  8. package/skills/{gsd/unify → unify}/SKILL.md +3 -3
  9. /package/{skills/gsd/apply → checklists}/.gitkeep +0 -0
  10. /package/{skills/gsd/checklists → checklists}/planning-ready.md +0 -0
  11. /package/{skills/gsd/checklists → checklists}/unify-complete.md +0 -0
  12. /package/{skills/gsd/auto → commands}/.gitkeep +0 -0
  13. /package/{skills/gsd/prompts → commands}/apply-instructions.txt +0 -0
  14. /package/{skills/gsd/prompts → commands}/plan-instructions.txt +0 -0
  15. /package/{skills/gsd/prompts → commands}/reassess-instructions.txt +0 -0
  16. /package/{skills/gsd/prompts → commands}/unify-instructions.txt +0 -0
  17. /package/skills/{gsd/checklists → apply}/.gitkeep +0 -0
  18. /package/skills/{gsd/apply → apply}/SKILL.md +0 -0
  19. /package/skills/{gsd/discuss → auto}/.gitkeep +0 -0
  20. /package/skills/{gsd/auto → auto}/SKILL.md +0 -0
  21. /package/skills/{gsd/auto → auto}/auto-loop.sh +0 -0
  22. /package/skills/{gsd/config → config}/SKILL.md +0 -0
  23. /package/skills/{gsd/plan → discuss}/.gitkeep +0 -0
  24. /package/skills/{gsd/discuss → discuss}/SKILL.md +0 -0
  25. /package/skills/{gsd → gsd-cc}/SKILL.md +0 -0
  26. /package/skills/{gsd/help → help}/SKILL.md +0 -0
  27. /package/skills/{gsd/ideate → ideate}/SKILL.md +0 -0
  28. /package/skills/{gsd/ingest → ingest}/SKILL.md +0 -0
  29. /package/skills/{gsd/prompts → plan}/.gitkeep +0 -0
  30. /package/skills/{gsd/profile → profile}/SKILL.md +0 -0
  31. /package/skills/{gsd/seed → seed}/types/application/.gitkeep +0 -0
  32. /package/skills/{gsd/seed → seed}/types/application/config.md +0 -0
  33. /package/skills/{gsd/seed → seed}/types/application/guide.md +0 -0
  34. /package/skills/{gsd/seed → seed}/types/application/loadout.md +0 -0
  35. /package/skills/{gsd/seed → seed}/types/campaign/.gitkeep +0 -0
  36. /package/skills/{gsd/seed → seed}/types/campaign/config.md +0 -0
  37. /package/skills/{gsd/seed → seed}/types/campaign/guide.md +0 -0
  38. /package/skills/{gsd/seed → seed}/types/campaign/loadout.md +0 -0
  39. /package/skills/{gsd/seed → seed}/types/client/.gitkeep +0 -0
  40. /package/skills/{gsd/seed → seed}/types/client/config.md +0 -0
  41. /package/skills/{gsd/seed → seed}/types/client/guide.md +0 -0
  42. /package/skills/{gsd/seed → seed}/types/client/loadout.md +0 -0
  43. /package/skills/{gsd/seed → seed}/types/utility/.gitkeep +0 -0
  44. /package/skills/{gsd/seed → seed}/types/utility/config.md +0 -0
  45. /package/skills/{gsd/seed → seed}/types/utility/guide.md +0 -0
  46. /package/skills/{gsd/seed → seed}/types/utility/loadout.md +0 -0
  47. /package/skills/{gsd/seed → seed}/types/workflow/.gitkeep +0 -0
  48. /package/skills/{gsd/seed → seed}/types/workflow/config.md +0 -0
  49. /package/skills/{gsd/seed → seed}/types/workflow/guide.md +0 -0
  50. /package/skills/{gsd/seed → seed}/types/workflow/loadout.md +0 -0
  51. /package/skills/{gsd/stack → stack}/SKILL.md +0 -0
  52. /package/skills/{gsd/status → status}/.gitkeep +0 -0
  53. /package/skills/{gsd/status → status}/SKILL.md +0 -0
  54. /package/skills/{gsd/tutorial → tutorial}/SKILL.md +0 -0
  55. /package/skills/{gsd/templates → unify}/.gitkeep +0 -0
  56. /package/skills/{gsd/update → update}/SKILL.md +0 -0
  57. /package/skills/{gsd/vision → vision}/SKILL.md +0 -0
  58. /package/{skills/gsd/unify → templates}/.gitkeep +0 -0
  59. /package/{skills/gsd/templates → templates}/PLAN.xml +0 -0
  60. /package/{skills/gsd/templates → templates}/PLANNING.md +0 -0
  61. /package/{skills/gsd/templates → templates}/STATE.md +0 -0
  62. /package/{skills/gsd/templates → templates}/UNIFY.md +0 -0
Binary file
Binary file
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
- // Sub-skills that get their own top-level directory under .claude/skills/
30
- const SUB_SKILLS = ['apply', 'auto', 'config', 'discuss', 'help', 'ideate', 'ingest', 'plan', 'profile', 'seed', 'stack', 'status', 'tutorial', 'unify', 'update', 'vision'];
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 skills base directory
94
+ * Resolve .claude base directory
98
95
  */
99
- function getSkillsBase(isGlobal) {
96
+ function getClaudeBase(isGlobal) {
100
97
  if (isGlobal) {
101
- return path.join(os.homedir(), '.claude', 'skills');
98
+ return path.join(os.homedir(), '.claude');
102
99
  }
103
- return path.join(process.cwd(), '.claude', 'skills');
100
+ return path.join(process.cwd(), '.claude');
104
101
  }
105
102
 
106
103
  /**
107
- * Install skills to target directory
104
+ * Install everything into .claude/
105
+ * Source structure mirrors target structure 1:1.
108
106
  */
109
107
  function install(isGlobal) {
110
- const skillsSrc = path.join(__dirname, '..', 'skills', 'gsd');
111
- const skillsBase = getSkillsBase(isGlobal);
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
- ? skillsBase.replace(os.homedir(), '~')
114
- : skillsBase.replace(process.cwd(), '.');
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
- // 1. Install main router: gsd-cc/SKILL.md
126
- const routerDest = path.join(skillsBase, 'gsd-cc');
127
- fs.mkdirSync(routerDest, { recursive: true });
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, destDir);
138
- fileCount += countFiles(destDir);
124
+ copyDir(srcDir, path.join(claudeBase, dir));
125
+ fileCount += countFiles(path.join(claudeBase, dir));
139
126
  }
140
127
  }
141
128
 
142
- // 3. Install shared resources (templates, checklists, prompts)
143
- const sharedDest = path.join(skillsBase, 'gsd-cc-shared');
144
- for (const dir of SHARED_DIRS) {
145
- const srcDir = path.join(skillsSrc, dir);
146
- if (fs.existsSync(srcDir)) {
147
- copyDir(srcDir, path.join(sharedDest, dir));
148
- fileCount += countFiles(path.join(sharedDest, dir));
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
- // 5. Install hooks
159
- const hooksSrc = path.join(__dirname, '..', 'hooks');
160
- const hooksBase = isGlobal
161
- ? path.join(os.homedir(), '.claude', 'hooks')
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 skills
283
+ * Uninstall GSD-CC
310
284
  */
311
285
  function uninstall() {
312
- const locations = [getSkillsBase(true), getSkillsBase(false)];
313
- const allDirs = ['gsd-cc', ...SUB_SKILLS.map(s => `gsd-cc-${s}`), 'gsd-cc-shared', 'gsd'];
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 base of locations) {
318
- const label = base.includes(os.homedir())
319
- ? base.replace(os.homedir(), '~')
320
- : base.replace(process.cwd(), '.');
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
- for (const dir of allDirs) {
324
- const fullPath = path.join(base, dir);
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 = getSkillsBase(true).replace(os.homedir(), '~');
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/skills/)${reset} — this project only
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.4.0",
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/skills/gsd-cc-shared/checklists/planning-ready.md`
206
- (or `./.claude/skills/gsd-cc-shared/checklists/planning-ready.md`)
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/skills/gsd-cc-shared/checklists/planning-ready.md`
106
- (or `./.claude/skills/gsd-cc-shared/checklists/planning-ready.md`)
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/skills/gsd-cc-shared/templates/PLANNING.md` (or `./.claude/skills/gsd-cc-shared/templates/PLANNING.md`). Fill in all sections from the conversation:
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/skills/gsd-cc-shared/checklists/unify-complete.md`
198
- (or `./.claude/skills/gsd-cc-shared/checklists/unify-complete.md`)
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/skills/gsd-cc-shared/templates/UNIFY.md` (or `./.claude/skills/gsd-cc-shared/templates/UNIFY.md`). Include all sections from Steps 2-7.
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