@allthingsclaude/blueprints 0.1.1

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 (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +413 -0
  3. package/bin/cli.js +4 -0
  4. package/content/agents/audit.md +553 -0
  5. package/content/agents/bootstrap.md +386 -0
  6. package/content/agents/finalize.md +490 -0
  7. package/content/agents/handoff.md +207 -0
  8. package/content/agents/implement.md +350 -0
  9. package/content/agents/parallelize.md +484 -0
  10. package/content/agents/plan.md +309 -0
  11. package/content/agents/research-codebase.md +33 -0
  12. package/content/agents/research-docs.md +34 -0
  13. package/content/agents/research-web.md +34 -0
  14. package/content/commands/audit.md +54 -0
  15. package/content/commands/bootstrap.md +46 -0
  16. package/content/commands/brainstorm.md +76 -0
  17. package/content/commands/challenge.md +26 -0
  18. package/content/commands/cleanup.md +326 -0
  19. package/content/commands/critique.md +34 -0
  20. package/content/commands/debug.md +283 -0
  21. package/content/commands/explain.md +340 -0
  22. package/content/commands/finalize.md +49 -0
  23. package/content/commands/flush.md +29 -0
  24. package/content/commands/handoff.md +46 -0
  25. package/content/commands/implement.md +67 -0
  26. package/content/commands/kickoff.md +65 -0
  27. package/content/commands/parallelize.md +118 -0
  28. package/content/commands/pickup.md +30 -0
  29. package/content/commands/plan.md +38 -0
  30. package/content/commands/refactor.md +406 -0
  31. package/content/commands/research.md +58 -0
  32. package/content/commands/test.md +229 -0
  33. package/content/commands/verify.md +16 -0
  34. package/dist/cli.d.ts +3 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +150 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/index.d.ts +8 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +7 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/installer.d.ts +49 -0
  43. package/dist/installer.d.ts.map +1 -0
  44. package/dist/installer.js +125 -0
  45. package/dist/installer.js.map +1 -0
  46. package/package.json +64 -0
@@ -0,0 +1,229 @@
1
+ ---
2
+ description: Run tests with intelligent analysis and fix suggestions
3
+ argument-hint: [optional: file pattern, test name, or "generate" for new tests]
4
+ author: "@markoradak"
5
+ ---
6
+
7
+ # Test Assistant
8
+
9
+ I'll help you run tests, analyze failures, and generate missing test coverage.
10
+
11
+ ## Current State
12
+
13
+ **Working Directory**: !`pwd`
14
+
15
+ **Branch**: !`git branch --show-current`
16
+
17
+ **Test Configuration**:
18
+ !`ls -la vitest.config.* jest.config.* 2>/dev/null || echo "No test config found"`
19
+
20
+ **Test Files**:
21
+ !`find . -name "*.test.ts" -o -name "*.test.tsx" -o -name "*.spec.ts" -o -name "*.spec.tsx" 2>/dev/null | head -20 | wc -l` test files found
22
+
23
+ ---
24
+
25
+ ## Focus Area
26
+
27
+ $ARGUMENTS
28
+
29
+ ---
30
+
31
+ ## Test Workflow
32
+
33
+ Based on the arguments, determine the appropriate action:
34
+
35
+ ### If no arguments or "run":
36
+ 1. Run the full test suite: `pnpm test` or `pnpm test:run`
37
+ 2. Analyze any failures
38
+ 3. Provide fix suggestions
39
+
40
+ ### If file pattern provided (e.g., "auth", "user.test.ts"):
41
+ 1. Run targeted tests: `pnpm test [pattern]`
42
+ 2. Show detailed output for failures
43
+ 3. Suggest fixes
44
+
45
+ ### If "generate" or "coverage":
46
+ 1. Identify files without test coverage
47
+ 2. Analyze the code structure
48
+ 3. Generate test file templates with meaningful test cases
49
+
50
+ ### If "watch":
51
+ 1. Start test watcher: `pnpm test:watch` or `pnpm test --watch`
52
+ 2. Provide guidance on TDD workflow
53
+
54
+ ---
55
+
56
+ ## Test Analysis Framework
57
+
58
+ When tests fail, analyze systematically:
59
+
60
+ ### 1. Categorize Failures
61
+
62
+ **Assertion Failures**:
63
+ - Expected vs actual value mismatch
64
+ - Missing or incorrect mock data
65
+ - Race conditions or timing issues
66
+
67
+ **Runtime Errors**:
68
+ - Import/module resolution
69
+ - Missing dependencies or mocks
70
+ - Type errors at runtime
71
+
72
+ **Environment Issues**:
73
+ - Missing env variables
74
+ - Database connection failures
75
+ - External service dependencies
76
+
77
+ ### 2. Root Cause Analysis
78
+
79
+ For each failure:
80
+ - Read the test file and understand intent
81
+ - Read the implementation being tested
82
+ - Identify the gap between expected and actual behavior
83
+ - Check if it's a test bug or implementation bug
84
+
85
+ ### 3. Fix Suggestions
86
+
87
+ Provide specific, actionable fixes:
88
+ ```markdown
89
+ ### `path/to/file.test.ts:42` - Test Name
90
+
91
+ **Error**: [Error message]
92
+
93
+ **Root Cause**: [Analysis]
94
+
95
+ **Fix Option 1** (Update test):
96
+ ```typescript
97
+ // Change this...
98
+ // To this...
99
+ ```
100
+
101
+ **Fix Option 2** (Update implementation):
102
+ ```typescript
103
+ // The implementation should...
104
+ ```
105
+
106
+ **Recommendation**: [Which fix is appropriate and why]
107
+ ```
108
+
109
+ ---
110
+
111
+ ## Test Generation Guidelines
112
+
113
+ When generating tests:
114
+
115
+ ### Structure
116
+ ```typescript
117
+ import { describe, it, expect, vi, beforeEach } from 'vitest'
118
+
119
+ describe('[Component/Function Name]', () => {
120
+ beforeEach(() => {
121
+ // Reset mocks and state
122
+ })
123
+
124
+ describe('[method or behavior]', () => {
125
+ it('should [expected behavior] when [condition]', () => {
126
+ // Arrange
127
+ // Act
128
+ // Assert
129
+ })
130
+
131
+ it('should handle [edge case]', () => {
132
+ // Test edge cases
133
+ })
134
+
135
+ it('should throw when [error condition]', () => {
136
+ // Test error handling
137
+ })
138
+ })
139
+ })
140
+ ```
141
+
142
+ ### Coverage Priorities
143
+ 1. **Happy path**: Normal expected usage
144
+ 2. **Edge cases**: Empty inputs, boundaries, nulls
145
+ 3. **Error cases**: Invalid inputs, network failures
146
+ 4. **Integration points**: API calls, database operations
147
+
148
+ ### Mocking Strategy
149
+ - Mock external dependencies (APIs, databases)
150
+ - Use real implementations for pure functions
151
+ - Mock time-sensitive operations (dates, timers)
152
+ - Use `vi.spyOn` for partial mocks
153
+
154
+ ---
155
+
156
+ ## Output Format
157
+
158
+ ### After Running Tests
159
+
160
+ ```markdown
161
+ # Test Results
162
+
163
+ **Suite**: [test suite name or pattern]
164
+ **Status**: [PASS/FAIL]
165
+ **Duration**: [time]
166
+
167
+ ## Summary
168
+ - Total: [X] tests
169
+ - Passed: [Y]
170
+ - Failed: [Z]
171
+ - Skipped: [N]
172
+
173
+ ## Failures (if any)
174
+
175
+ ### 1. `path/to/test.ts:42` - [Test Name]
176
+
177
+ **Error**:
178
+ ```
179
+ [Error output]
180
+ ```
181
+
182
+ **Analysis**: [Root cause explanation]
183
+
184
+ **Suggested Fix**:
185
+ ```typescript
186
+ [Code fix]
187
+ ```
188
+
189
+ ---
190
+
191
+ ## Recommendations
192
+
193
+ - [Action item 1]
194
+ - [Action item 2]
195
+
196
+ ## Next Steps
197
+
198
+ 1. Fix failing tests (if any)
199
+ 2. Run `pnpm test` to verify fixes
200
+ 3. Consider adding tests for [uncovered area]
201
+ ```
202
+
203
+ ---
204
+
205
+ ## Special Considerations
206
+
207
+ ### Async Testing
208
+ - Use `async/await` properly
209
+ - Handle promise rejections
210
+ - Set appropriate timeouts
211
+
212
+ ### Component Testing (React)
213
+ - Use `@testing-library/react`
214
+ - Test user behavior, not implementation
215
+ - Avoid testing internal state
216
+
217
+ ### API/tRPC Testing
218
+ - Mock Prisma client
219
+ - Test input validation
220
+ - Verify error responses
221
+
222
+ ### Database Testing
223
+ - Use transactions for isolation
224
+ - Clean up test data
225
+ - Consider test fixtures
226
+
227
+ ---
228
+
229
+ Execute the appropriate test workflow based on the arguments provided. Use Bash to run tests, Read to analyze files, and provide comprehensive analysis of results.
@@ -0,0 +1,16 @@
1
+ ---
2
+ description: Verification Mode
3
+ author: "@markoradak"
4
+ ---
5
+
6
+ # Verification Mode
7
+
8
+ Before proceeding with this task, perform a quick verification check:
9
+
10
+ 1. **Is this the right approach?** Briefly mention if there's a more standard or efficient way
11
+ 2. **Any gotchas?** Point out one potential issue or edge case to consider
12
+ 3. **Quick alternative?** If there's an obviously better approach, mention it in one sentence
13
+
14
+ Keep it brief - just enough to make sure we're on the right track.
15
+
16
+ $ARGUMENTS
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ import { program } from 'commander';
3
+ import inquirer from 'inquirer';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { installBlueprints, getDefaultClaudeDir, getInstallPaths } from './installer.js';
7
+ import { createRequire } from 'module';
8
+ const require = createRequire(import.meta.url);
9
+ const pkg = require('../package.json');
10
+ program
11
+ .name('blueprints')
12
+ .description(pkg.description)
13
+ .version(pkg.version)
14
+ .option('-g, --global', 'Install to default Claude directory (~/.claude)')
15
+ .option('-l, --local', 'Install to current directory (./.claude)')
16
+ .option('-p, --path <path>', 'Install to a custom path')
17
+ .option('-y, --yes', 'Skip confirmation prompts')
18
+ .parse(process.argv);
19
+ const options = program.opts();
20
+ async function main() {
21
+ console.log();
22
+ console.log(chalk.bold.cyan(' Claude Code Blueprints'));
23
+ console.log(chalk.dim(' Install commands and agents for enhanced AI-assisted development'));
24
+ console.log();
25
+ let targetPath;
26
+ let installType;
27
+ // Determine installation path
28
+ if (options.path) {
29
+ targetPath = options.path;
30
+ installType = 'custom';
31
+ }
32
+ else if (options.global) {
33
+ targetPath = getDefaultClaudeDir();
34
+ installType = 'global';
35
+ }
36
+ else if (options.local) {
37
+ targetPath = process.cwd();
38
+ installType = 'local';
39
+ }
40
+ else {
41
+ // Interactive mode
42
+ const answer = await inquirer.prompt([
43
+ {
44
+ type: 'list',
45
+ name: 'location',
46
+ message: 'Where would you like to install the blueprints?',
47
+ choices: [
48
+ {
49
+ name: `Global Claude directory (${getDefaultClaudeDir()})`,
50
+ value: 'global',
51
+ short: 'Global'
52
+ },
53
+ {
54
+ name: `Current directory (${process.cwd()})`,
55
+ value: 'local',
56
+ short: 'Local'
57
+ },
58
+ {
59
+ name: 'Custom path...',
60
+ value: 'custom',
61
+ short: 'Custom'
62
+ }
63
+ ]
64
+ }
65
+ ]);
66
+ installType = answer.location;
67
+ if (installType === 'global') {
68
+ targetPath = getDefaultClaudeDir();
69
+ }
70
+ else if (installType === 'local') {
71
+ targetPath = process.cwd();
72
+ }
73
+ else {
74
+ const customAnswer = await inquirer.prompt([
75
+ {
76
+ type: 'input',
77
+ name: 'customPath',
78
+ message: 'Enter the installation path:',
79
+ validate: (input) => input.trim().length > 0 || 'Please enter a valid path'
80
+ }
81
+ ]);
82
+ targetPath = customAnswer.customPath;
83
+ }
84
+ }
85
+ // Show what will be installed
86
+ const paths = getInstallPaths(targetPath);
87
+ console.log();
88
+ console.log(chalk.yellow('Installation Summary:'));
89
+ console.log(chalk.dim('─'.repeat(50)));
90
+ console.log(` ${chalk.bold('Commands:')} 20 files → ${chalk.cyan(paths.commands)}`);
91
+ console.log(` ${chalk.bold('Agents:')} 10 files → ${chalk.cyan(paths.agents)}`);
92
+ console.log(chalk.dim('─'.repeat(50)));
93
+ console.log();
94
+ // Confirm installation unless --yes flag is provided
95
+ if (!options.yes) {
96
+ const confirm = await inquirer.prompt([
97
+ {
98
+ type: 'confirm',
99
+ name: 'proceed',
100
+ message: 'Proceed with installation?',
101
+ default: true
102
+ }
103
+ ]);
104
+ if (!confirm.proceed) {
105
+ console.log(chalk.yellow('Installation cancelled.'));
106
+ process.exit(0);
107
+ }
108
+ }
109
+ // Perform installation
110
+ const spinner = ora('Installing blueprints...').start();
111
+ try {
112
+ const result = await installBlueprints(targetPath);
113
+ spinner.succeed(chalk.green('Installation complete!'));
114
+ console.log();
115
+ console.log(chalk.dim('─'.repeat(50)));
116
+ console.log(` ${chalk.green('✓')} ${result.commands} commands installed`);
117
+ console.log(` ${chalk.green('✓')} ${result.agents} agents installed`);
118
+ console.log(chalk.dim('─'.repeat(50)));
119
+ console.log();
120
+ // Show next steps
121
+ console.log(chalk.bold('Next steps:'));
122
+ console.log();
123
+ if (installType === 'global') {
124
+ console.log(` ${chalk.cyan('1.')} Open Claude Code in any project`);
125
+ console.log(` ${chalk.cyan('2.')} Type ${chalk.yellow('/plan')} to start planning, ${chalk.yellow('/research')} to research, etc.`);
126
+ }
127
+ else {
128
+ console.log(` ${chalk.cyan('1.')} Navigate to ${chalk.cyan(targetPath)}`);
129
+ console.log(` ${chalk.cyan('2.')} Open Claude Code: ${chalk.yellow('claude')}`);
130
+ console.log(` ${chalk.cyan('3.')} Type ${chalk.yellow('/plan')} to start planning, ${chalk.yellow('/research')} to research, etc.`);
131
+ }
132
+ console.log();
133
+ console.log(chalk.dim('Available commands: /audit, /bootstrap, /brainstorm, /challenge, /cleanup,'));
134
+ console.log(chalk.dim('/critique, /debug, /explain, /finalize, /flush, /handoff, /implement,'));
135
+ console.log(chalk.dim('/kickoff, /parallelize, /pickup, /plan, /refactor, /research, /test, /verify'));
136
+ console.log();
137
+ }
138
+ catch (error) {
139
+ spinner.fail(chalk.red('Installation failed'));
140
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
141
+ console.error(chalk.red(`Error: ${errorMessage}`));
142
+ process.exit(1);
143
+ }
144
+ }
145
+ main().catch((error) => {
146
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
147
+ console.error(chalk.red(`Unexpected error: ${errorMessage}`));
148
+ process.exit(1);
149
+ });
150
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAA6C,CAAC;AAWnF,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;KAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,cAAc,EAAE,iDAAiD,CAAC;KACzE,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC;KACjE,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,CAAC;KACvD,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAChD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAc,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,UAAkB,CAAC;IACvB,IAAI,WAAwB,CAAC;IAE7B,8BAA8B;IAC9B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,WAAW,GAAG,QAAQ,CAAC;IACzB,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,UAAU,GAAG,mBAAmB,EAAE,CAAC;QACnC,WAAW,GAAG,QAAQ,CAAC;IACzB,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3B,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA4B;YAC9D;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,iDAAiD;gBAC1D,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,4BAA4B,mBAAmB,EAAE,GAAG;wBAC1D,KAAK,EAAE,QAAQ;wBACf,KAAK,EAAE,QAAQ;qBAChB;oBACD;wBACE,IAAI,EAAE,sBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG;wBAC5C,KAAK,EAAE,OAAO;wBACd,KAAK,EAAE,OAAO;qBACf;oBACD;wBACE,IAAI,EAAE,gBAAgB;wBACtB,KAAK,EAAE,QAAQ;wBACf,KAAK,EAAE,QAAQ;qBAChB;iBACF;aACF;SACF,CAAC,CAAC;QAEH,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;QAE9B,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,UAAU,GAAG,mBAAmB,EAAE,CAAC;QACrC,CAAC;aAAM,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;YACnC,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;gBACjE;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,8BAA8B;oBACvC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,2BAA2B;iBACpF;aACF,CAAC,CAAC;YACH,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;QACvC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,qDAAqD;IACrD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;YAC1D;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,4BAA4B;gBACrC,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAEvD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,qBAAqB,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,mBAAmB,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;QACvI,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;QACvI,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC,CAAC;QACvG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,YAAY,EAAE,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IAC9E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @allthingsclaude/blueprints
3
+ *
4
+ * Install Claude Code commands and agents for enhanced AI-assisted development workflows.
5
+ */
6
+ export { getDefaultClaudeDir, getInstallPaths, getSourcePaths, installBlueprints, checkExistingInstallation, ensureDir, copyDirectory } from './installer.js';
7
+ export type { InstallPaths, SourcePaths, InstallResult, ExistingInstallation } from './installer.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,SAAS,EACT,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,oBAAoB,EACrB,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @allthingsclaude/blueprints
3
+ *
4
+ * Install Claude Code commands and agents for enhanced AI-assisted development workflows.
5
+ */
6
+ export { getDefaultClaudeDir, getInstallPaths, getSourcePaths, installBlueprints, checkExistingInstallation, ensureDir, copyDirectory } from './installer.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,SAAS,EACT,aAAa,EACd,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,49 @@
1
+ export interface InstallPaths {
2
+ base: string;
3
+ commands: string;
4
+ agents: string;
5
+ }
6
+ export interface SourcePaths {
7
+ commands: string;
8
+ agents: string;
9
+ }
10
+ export interface InstallResult {
11
+ commands: number;
12
+ agents: number;
13
+ paths: InstallPaths;
14
+ }
15
+ export interface ExistingInstallation {
16
+ hasCommands: boolean;
17
+ hasAgents: boolean;
18
+ commandsPath: string;
19
+ agentsPath: string;
20
+ }
21
+ /**
22
+ * Get the default Claude directory based on the operating system
23
+ */
24
+ export declare function getDefaultClaudeDir(): string;
25
+ /**
26
+ * Get the installation paths for commands and agents
27
+ */
28
+ export declare function getInstallPaths(basePath: string): InstallPaths;
29
+ /**
30
+ * Get the source directory for blueprints (within the package)
31
+ */
32
+ export declare function getSourcePaths(): SourcePaths;
33
+ /**
34
+ * Ensure a directory exists, creating it if necessary
35
+ */
36
+ export declare function ensureDir(dirPath: string): void;
37
+ /**
38
+ * Copy all files from source to destination directory
39
+ */
40
+ export declare function copyDirectory(srcDir: string, destDir: string): number;
41
+ /**
42
+ * Install blueprints to the target path
43
+ */
44
+ export declare function installBlueprints(targetPath: string): Promise<InstallResult>;
45
+ /**
46
+ * Check if blueprints are already installed at a path
47
+ */
48
+ export declare function checkExistingInstallation(targetPath: string): ExistingInstallation;
49
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAa5C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAqB9D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAO5C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAsBrE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0BlF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CASlF"}
@@ -0,0 +1,125 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { fileURLToPath } from 'url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ /**
8
+ * Get the default Claude directory based on the operating system
9
+ */
10
+ export function getDefaultClaudeDir() {
11
+ const homeDir = os.homedir();
12
+ switch (process.platform) {
13
+ case 'win32':
14
+ // Windows: Use USERPROFILE or fallback to homedir
15
+ return path.join(process.env.USERPROFILE || homeDir, '.claude');
16
+ case 'darwin':
17
+ case 'linux':
18
+ default:
19
+ // macOS and Linux: ~/.claude
20
+ return path.join(homeDir, '.claude');
21
+ }
22
+ }
23
+ /**
24
+ * Get the installation paths for commands and agents
25
+ */
26
+ export function getInstallPaths(basePath) {
27
+ // Resolve ~ to home directory if present
28
+ let resolvedPath = basePath;
29
+ if (basePath.startsWith('~')) {
30
+ resolvedPath = path.join(os.homedir(), basePath.slice(1));
31
+ }
32
+ // If the path already ends with .claude, use it directly
33
+ // Otherwise, append .claude
34
+ let claudeDir;
35
+ if (resolvedPath.endsWith('.claude') || resolvedPath.includes('.claude' + path.sep)) {
36
+ claudeDir = resolvedPath;
37
+ }
38
+ else {
39
+ claudeDir = path.join(resolvedPath, '.claude');
40
+ }
41
+ return {
42
+ base: claudeDir,
43
+ commands: path.join(claudeDir, 'commands'),
44
+ agents: path.join(claudeDir, 'agents')
45
+ };
46
+ }
47
+ /**
48
+ * Get the source directory for blueprints (within the package)
49
+ */
50
+ export function getSourcePaths() {
51
+ // When compiled, __dirname will be in dist/, so we need to go up one level
52
+ const packageRoot = path.join(__dirname, '..');
53
+ return {
54
+ commands: path.join(packageRoot, 'content', 'commands'),
55
+ agents: path.join(packageRoot, 'content', 'agents')
56
+ };
57
+ }
58
+ /**
59
+ * Ensure a directory exists, creating it if necessary
60
+ */
61
+ export function ensureDir(dirPath) {
62
+ if (!fs.existsSync(dirPath)) {
63
+ fs.mkdirSync(dirPath, { recursive: true });
64
+ }
65
+ }
66
+ /**
67
+ * Copy all files from source to destination directory
68
+ */
69
+ export function copyDirectory(srcDir, destDir) {
70
+ ensureDir(destDir);
71
+ const files = fs.readdirSync(srcDir);
72
+ let copiedCount = 0;
73
+ for (const file of files) {
74
+ const srcFile = path.join(srcDir, file);
75
+ const destFile = path.join(destDir, file);
76
+ const stat = fs.statSync(srcFile);
77
+ if (stat.isFile()) {
78
+ fs.copyFileSync(srcFile, destFile);
79
+ copiedCount++;
80
+ }
81
+ else if (stat.isDirectory()) {
82
+ // Recursively copy subdirectories
83
+ copiedCount += copyDirectory(srcFile, path.join(destDir, file));
84
+ }
85
+ }
86
+ return copiedCount;
87
+ }
88
+ /**
89
+ * Install blueprints to the target path
90
+ */
91
+ export async function installBlueprints(targetPath) {
92
+ const sourcePaths = getSourcePaths();
93
+ const installPaths = getInstallPaths(targetPath);
94
+ // Verify source directories exist
95
+ if (!fs.existsSync(sourcePaths.commands)) {
96
+ throw new Error(`Source commands directory not found: ${sourcePaths.commands}`);
97
+ }
98
+ if (!fs.existsSync(sourcePaths.agents)) {
99
+ throw new Error(`Source agents directory not found: ${sourcePaths.agents}`);
100
+ }
101
+ // Ensure base .claude directory exists
102
+ ensureDir(installPaths.base);
103
+ // Copy commands
104
+ const commandsCount = copyDirectory(sourcePaths.commands, installPaths.commands);
105
+ // Copy agents
106
+ const agentsCount = copyDirectory(sourcePaths.agents, installPaths.agents);
107
+ return {
108
+ commands: commandsCount,
109
+ agents: agentsCount,
110
+ paths: installPaths
111
+ };
112
+ }
113
+ /**
114
+ * Check if blueprints are already installed at a path
115
+ */
116
+ export function checkExistingInstallation(targetPath) {
117
+ const paths = getInstallPaths(targetPath);
118
+ return {
119
+ hasCommands: fs.existsSync(paths.commands) && fs.readdirSync(paths.commands).length > 0,
120
+ hasAgents: fs.existsSync(paths.agents) && fs.readdirSync(paths.agents).length > 0,
121
+ commandsPath: paths.commands,
122
+ agentsPath: paths.agents
123
+ };
124
+ }
125
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}