@claudetools/cli 0.9.2

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 (45) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +106 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/onboard/agents-md-builder.d.ts +14 -0
  6. package/dist/onboard/agents-md-builder.d.ts.map +1 -0
  7. package/dist/onboard/agents-md-builder.js +378 -0
  8. package/dist/onboard/agents-md-builder.js.map +1 -0
  9. package/dist/onboard/context7-fetcher.d.ts +27 -0
  10. package/dist/onboard/context7-fetcher.d.ts.map +1 -0
  11. package/dist/onboard/context7-fetcher.js +116 -0
  12. package/dist/onboard/context7-fetcher.js.map +1 -0
  13. package/dist/onboard/docs-generator.d.ts +8 -0
  14. package/dist/onboard/docs-generator.d.ts.map +1 -0
  15. package/dist/onboard/docs-generator.js +250 -0
  16. package/dist/onboard/docs-generator.js.map +1 -0
  17. package/dist/onboard/index.d.ts +11 -0
  18. package/dist/onboard/index.d.ts.map +1 -0
  19. package/dist/onboard/index.js +128 -0
  20. package/dist/onboard/index.js.map +1 -0
  21. package/dist/onboard/stack-detector.d.ts +4 -0
  22. package/dist/onboard/stack-detector.d.ts.map +1 -0
  23. package/dist/onboard/stack-detector.js +324 -0
  24. package/dist/onboard/stack-detector.js.map +1 -0
  25. package/dist/onboard/types.d.ts +80 -0
  26. package/dist/onboard/types.d.ts.map +1 -0
  27. package/dist/onboard/types.js +5 -0
  28. package/dist/onboard/types.js.map +1 -0
  29. package/dist/onboard/web-research.d.ts +11 -0
  30. package/dist/onboard/web-research.d.ts.map +1 -0
  31. package/dist/onboard/web-research.js +209 -0
  32. package/dist/onboard/web-research.js.map +1 -0
  33. package/dist/setup.d.ts +3 -0
  34. package/dist/setup.d.ts.map +1 -0
  35. package/dist/setup.js +190 -0
  36. package/dist/setup.js.map +1 -0
  37. package/dist/templates/agents-md.d.ts +10 -0
  38. package/dist/templates/agents-md.d.ts.map +1 -0
  39. package/dist/templates/agents-md.js +125 -0
  40. package/dist/templates/agents-md.js.map +1 -0
  41. package/dist/templates/claude-md.d.ts +12 -0
  42. package/dist/templates/claude-md.d.ts.map +1 -0
  43. package/dist/templates/claude-md.js +62 -0
  44. package/dist/templates/claude-md.js.map +1 -0
  45. package/package.json +54 -0
@@ -0,0 +1,116 @@
1
+ // =============================================================================
2
+ // Context7 Documentation Fetcher
3
+ // =============================================================================
4
+ // Fetches official documentation via Context7 MCP integration
5
+ import { execSync } from 'child_process';
6
+ // Cache for library IDs to avoid repeated lookups
7
+ const libraryIdCache = new Map();
8
+ /**
9
+ * Check if mcp-cli is available
10
+ */
11
+ export function isMcpCliAvailable() {
12
+ try {
13
+ execSync('which mcp-cli', { encoding: 'utf-8', stdio: 'pipe' });
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ /**
21
+ * Resolve a library name to its Context7 library ID
22
+ */
23
+ export async function resolveLibraryId(libraryName) {
24
+ // Check cache first
25
+ if (libraryIdCache.has(libraryName)) {
26
+ return libraryIdCache.get(libraryName);
27
+ }
28
+ try {
29
+ const result = execSync(`mcp-cli call context7/resolve-library-id '${JSON.stringify({
30
+ libraryName,
31
+ })}'`, { encoding: 'utf-8', timeout: 30000, stdio: 'pipe' });
32
+ const parsed = JSON.parse(result);
33
+ const libraryId = parsed?.libraryId || parsed?.library_id;
34
+ if (libraryId) {
35
+ libraryIdCache.set(libraryName, libraryId);
36
+ return libraryId;
37
+ }
38
+ }
39
+ catch {
40
+ // Silent fail - library might not be in Context7
41
+ }
42
+ return null;
43
+ }
44
+ /**
45
+ * Query documentation for a library
46
+ */
47
+ export async function queryDocs(libraryId, query) {
48
+ try {
49
+ const result = execSync(`mcp-cli call context7/query-docs '${JSON.stringify({
50
+ context7CompatibleLibraryID: libraryId,
51
+ topic: query,
52
+ })}'`, { encoding: 'utf-8', timeout: 60000, stdio: 'pipe' });
53
+ // The result should contain the documentation
54
+ if (result && result.trim().length > 0) {
55
+ return result.trim();
56
+ }
57
+ }
58
+ catch {
59
+ // Silent fail
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * Fetch comprehensive documentation for a library
65
+ * Makes up to 3 queries to get a complete overview
66
+ */
67
+ export async function fetchLibraryDocs(libraryName, context7Id) {
68
+ const result = {
69
+ overview: null,
70
+ bestPractices: null,
71
+ examples: null,
72
+ };
73
+ // Resolve library ID
74
+ const libraryId = context7Id || (await resolveLibraryId(libraryName));
75
+ if (!libraryId) {
76
+ return result;
77
+ }
78
+ // Query 1: Overview and getting started
79
+ result.overview = await queryDocs(libraryId, `Overview, installation, and getting started guide for ${libraryName}`);
80
+ // Query 2: Best practices and patterns
81
+ result.bestPractices = await queryDocs(libraryId, `Best practices, recommended patterns, and common conventions for ${libraryName}`);
82
+ // Query 3: Examples
83
+ result.examples = await queryDocs(libraryId, `Code examples and common use cases for ${libraryName}`);
84
+ return result;
85
+ }
86
+ /**
87
+ * Search for available libraries in Context7
88
+ */
89
+ export async function searchLibraries(query) {
90
+ try {
91
+ const result = execSync(`mcp-cli call context7/resolve-library-id '${JSON.stringify({
92
+ libraryName: query,
93
+ })}'`, { encoding: 'utf-8', timeout: 30000, stdio: 'pipe' });
94
+ const parsed = JSON.parse(result);
95
+ // Return as array if multiple results, or single item array
96
+ if (Array.isArray(parsed)) {
97
+ return parsed.map((item) => ({
98
+ libraryId: item.libraryId || item.library_id || '',
99
+ name: item.name || query,
100
+ description: item.description,
101
+ }));
102
+ }
103
+ if (parsed?.libraryId || parsed?.library_id) {
104
+ return [{
105
+ libraryId: parsed.libraryId || parsed.library_id,
106
+ name: parsed.name || query,
107
+ description: parsed.description,
108
+ }];
109
+ }
110
+ }
111
+ catch {
112
+ // Silent fail
113
+ }
114
+ return [];
115
+ }
116
+ //# sourceMappingURL=context7-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context7-fetcher.js","sourceRoot":"","sources":["../../src/onboard/context7-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { StackInfo, DocumentationFile } from './types.js';
2
+ /**
3
+ * Generate documentation directory structure
4
+ */
5
+ export declare function generateDocs(projectPath: string, stack: StackInfo, options?: {
6
+ verbose?: boolean;
7
+ }): Promise<DocumentationFile[]>;
8
+ //# sourceMappingURL=docs-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-generator.d.ts","sourceRoot":"","sources":["../../src/onboard/docs-generator.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAgB,MAAM,YAAY,CAAC;AAI7E;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAqN9B"}
@@ -0,0 +1,250 @@
1
+ // =============================================================================
2
+ // Documentation Generator
3
+ // =============================================================================
4
+ // Generates the /docs/ directory structure with fetched documentation
5
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { fetchLibraryDocs, isMcpCliAvailable } from './context7-fetcher.js';
8
+ import { researchLibrary } from './web-research.js';
9
+ /**
10
+ * Generate documentation directory structure
11
+ */
12
+ export async function generateDocs(projectPath, stack, options = {}) {
13
+ const docsPath = join(projectPath, 'docs');
14
+ const files = [];
15
+ // Create docs directory structure
16
+ const dirs = [
17
+ docsPath,
18
+ join(docsPath, 'frameworks'),
19
+ join(docsPath, 'libraries'),
20
+ join(docsPath, 'tooling'),
21
+ join(docsPath, 'patterns'),
22
+ ];
23
+ for (const dir of dirs) {
24
+ if (!existsSync(dir)) {
25
+ mkdirSync(dir, { recursive: true });
26
+ }
27
+ }
28
+ const hasContext7 = isMcpCliAvailable();
29
+ // Generate framework documentation
30
+ for (const framework of stack.frameworks) {
31
+ if (options.verbose) {
32
+ console.log(` Fetching docs for ${framework.name}...`);
33
+ }
34
+ let content = '';
35
+ let source = 'generated';
36
+ if (hasContext7 && framework.context7Id) {
37
+ const docs = await fetchLibraryDocs(framework.name, framework.context7Id);
38
+ if (docs.overview) {
39
+ content = `# ${framework.name}\n\n`;
40
+ content += `## Overview\n\n${docs.overview}\n\n`;
41
+ if (docs.bestPractices) {
42
+ content += `## Best Practices\n\n${docs.bestPractices}\n\n`;
43
+ }
44
+ if (docs.examples) {
45
+ content += `## Examples\n\n${docs.examples}\n\n`;
46
+ }
47
+ source = 'context7';
48
+ }
49
+ }
50
+ // Supplement with web research
51
+ const research = await researchLibrary(framework.name);
52
+ if (research.bestPractices.length > 0 || !content) {
53
+ if (!content) {
54
+ content = `# ${framework.name}\n\n`;
55
+ content += `**Version:** ${framework.version}\n`;
56
+ content += `**Category:** ${framework.category}\n\n`;
57
+ }
58
+ if (research.bestPractices.length > 0) {
59
+ content += `## Best Practices\n\n`;
60
+ content += research.bestPractices.map(bp => `- ${bp}`).join('\n');
61
+ content += '\n\n';
62
+ source = source === 'context7' ? 'context7' : 'web-research';
63
+ }
64
+ if (research.commonPatterns.length > 0) {
65
+ content += `## Common Patterns\n\n`;
66
+ content += research.commonPatterns.map(p => `- ${p}`).join('\n');
67
+ content += '\n\n';
68
+ }
69
+ if (research.gotchas.length > 0) {
70
+ content += `## Gotchas\n\n`;
71
+ content += research.gotchas.map(g => `- ${g}`).join('\n');
72
+ content += '\n\n';
73
+ }
74
+ }
75
+ if (content) {
76
+ const fileName = `${framework.name.toLowerCase().replace(/[^a-z0-9]/g, '-')}.md`;
77
+ const filePath = join(docsPath, 'frameworks', fileName);
78
+ writeFileSync(filePath, content);
79
+ files.push({
80
+ path: `docs/frameworks/${fileName}`,
81
+ title: framework.name,
82
+ category: 'frameworks',
83
+ content,
84
+ source,
85
+ lastUpdated: new Date().toISOString(),
86
+ });
87
+ }
88
+ }
89
+ // Generate library documentation
90
+ const significantLibraries = stack.libraries.filter(lib => ['database', 'state-management', 'data-fetching', 'validation', 'authentication'].includes(lib.category));
91
+ for (const library of significantLibraries) {
92
+ if (options.verbose) {
93
+ console.log(` Fetching docs for ${library.name}...`);
94
+ }
95
+ let content = '';
96
+ let source = 'generated';
97
+ if (hasContext7 && library.context7Id) {
98
+ const docs = await fetchLibraryDocs(library.name, library.context7Id);
99
+ if (docs.overview) {
100
+ content = `# ${library.name}\n\n`;
101
+ content += `## Overview\n\n${docs.overview}\n\n`;
102
+ if (docs.bestPractices) {
103
+ content += `## Best Practices\n\n${docs.bestPractices}\n\n`;
104
+ }
105
+ source = 'context7';
106
+ }
107
+ }
108
+ // Supplement with web research
109
+ const research = await researchLibrary(library.name);
110
+ if (research.bestPractices.length > 0 || !content) {
111
+ if (!content) {
112
+ content = `# ${library.name}\n\n`;
113
+ content += `**Version:** ${library.version}\n`;
114
+ content += `**Category:** ${library.category}\n\n`;
115
+ }
116
+ if (research.bestPractices.length > 0) {
117
+ content += `## Best Practices\n\n`;
118
+ content += research.bestPractices.map(bp => `- ${bp}`).join('\n');
119
+ content += '\n\n';
120
+ source = source === 'context7' ? 'context7' : 'web-research';
121
+ }
122
+ if (research.gotchas.length > 0) {
123
+ content += `## Gotchas\n\n`;
124
+ content += research.gotchas.map(g => `- ${g}`).join('\n');
125
+ content += '\n\n';
126
+ }
127
+ }
128
+ if (content) {
129
+ const fileName = `${library.name.toLowerCase().replace(/[^a-z0-9]/g, '-')}.md`;
130
+ const filePath = join(docsPath, 'libraries', fileName);
131
+ writeFileSync(filePath, content);
132
+ files.push({
133
+ path: `docs/libraries/${fileName}`,
134
+ title: library.name,
135
+ category: 'libraries',
136
+ content,
137
+ source,
138
+ lastUpdated: new Date().toISOString(),
139
+ });
140
+ }
141
+ }
142
+ // Generate dev tools documentation
143
+ for (const tool of stack.devTools) {
144
+ if (options.verbose) {
145
+ console.log(` Fetching docs for ${tool.name}...`);
146
+ }
147
+ const research = await researchLibrary(tool.name);
148
+ let content = `# ${tool.name}\n\n`;
149
+ content += `**Version:** ${tool.version}\n`;
150
+ content += `**Category:** ${tool.category}\n\n`;
151
+ if (research.bestPractices.length > 0) {
152
+ content += `## Best Practices\n\n`;
153
+ content += research.bestPractices.map(bp => `- ${bp}`).join('\n');
154
+ content += '\n\n';
155
+ }
156
+ if (research.gotchas.length > 0) {
157
+ content += `## Gotchas\n\n`;
158
+ content += research.gotchas.map(g => `- ${g}`).join('\n');
159
+ content += '\n\n';
160
+ }
161
+ const fileName = `${tool.name.toLowerCase().replace(/[^a-z0-9]/g, '-')}.md`;
162
+ const filePath = join(docsPath, 'tooling', fileName);
163
+ writeFileSync(filePath, content);
164
+ files.push({
165
+ path: `docs/tooling/${fileName}`,
166
+ title: tool.name,
167
+ category: 'tooling',
168
+ content,
169
+ source: research.bestPractices.length > 0 ? 'web-research' : 'generated',
170
+ lastUpdated: new Date().toISOString(),
171
+ });
172
+ }
173
+ // Generate index.md
174
+ const indexContent = generateDocsIndex(stack, files);
175
+ writeFileSync(join(docsPath, 'index.md'), indexContent);
176
+ files.push({
177
+ path: 'docs/index.md',
178
+ title: 'Documentation Index',
179
+ category: 'frameworks',
180
+ content: indexContent,
181
+ source: 'generated',
182
+ lastUpdated: new Date().toISOString(),
183
+ });
184
+ // Generate metadata file
185
+ const metadata = {
186
+ generatedAt: new Date().toISOString(),
187
+ projectPath,
188
+ stack,
189
+ files: files.map(f => ({ path: f.path, title: f.title, source: f.source })),
190
+ };
191
+ writeFileSync(join(docsPath, '.metadata.json'), JSON.stringify(metadata, null, 2));
192
+ // Add docs/ to .gitignore
193
+ addToGitignore(projectPath, 'docs/');
194
+ return files;
195
+ }
196
+ /**
197
+ * Generate documentation index file
198
+ */
199
+ function generateDocsIndex(stack, files) {
200
+ let content = `# Project Documentation\n\n`;
201
+ content += `> Auto-generated documentation. Refresh with \`claudetools onboard --refresh\`\n\n`;
202
+ const frameworkFiles = files.filter(f => f.category === 'frameworks');
203
+ const libraryFiles = files.filter(f => f.category === 'libraries');
204
+ const toolingFiles = files.filter(f => f.category === 'tooling');
205
+ if (frameworkFiles.length > 0) {
206
+ content += `## Frameworks\n\n`;
207
+ for (const file of frameworkFiles) {
208
+ content += `- [${file.title}](${file.path.replace('docs/', '')})\n`;
209
+ }
210
+ content += '\n';
211
+ }
212
+ if (libraryFiles.length > 0) {
213
+ content += `## Libraries\n\n`;
214
+ for (const file of libraryFiles) {
215
+ content += `- [${file.title}](${file.path.replace('docs/', '')})\n`;
216
+ }
217
+ content += '\n';
218
+ }
219
+ if (toolingFiles.length > 0) {
220
+ content += `## Tooling\n\n`;
221
+ for (const file of toolingFiles) {
222
+ content += `- [${file.title}](${file.path.replace('docs/', '')})\n`;
223
+ }
224
+ content += '\n';
225
+ }
226
+ content += `---\n\n`;
227
+ content += `*Generated: ${new Date().toISOString()}*\n`;
228
+ return content;
229
+ }
230
+ /**
231
+ * Add entry to .gitignore if not present
232
+ */
233
+ function addToGitignore(projectPath, entry) {
234
+ const gitignorePath = join(projectPath, '.gitignore');
235
+ try {
236
+ if (existsSync(gitignorePath)) {
237
+ const content = readFileSync(gitignorePath, 'utf-8');
238
+ if (!content.includes(entry)) {
239
+ appendFileSync(gitignorePath, `\n# ClaudeTools generated docs (regenerate with claudetools onboard)\n${entry}\n`);
240
+ }
241
+ }
242
+ else {
243
+ writeFileSync(gitignorePath, `# ClaudeTools generated docs (regenerate with claudetools onboard)\n${entry}\n`);
244
+ }
245
+ }
246
+ catch {
247
+ // Non-fatal, just skip gitignore update
248
+ }
249
+ }
250
+ //# sourceMappingURL=docs-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-generator.js","sourceRoot":"","sources":["../../src/onboard/docs-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface OnboardOptions {
2
+ refresh?: boolean;
3
+ verbose?: boolean;
4
+ skipDocs?: boolean;
5
+ }
6
+ /**
7
+ * Run the complete onboarding workflow
8
+ */
9
+ export declare function runOnboard(projectPath: string, options?: OnboardOptions): Promise<void>;
10
+ export type { StackInfo } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/onboard/index.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA4Df;AAyED,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,128 @@
1
+ // =============================================================================
2
+ // Onboard Module - Main Orchestrator
3
+ // =============================================================================
4
+ // Coordinates the documentation-driven onboarding workflow
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import { existsSync, writeFileSync, mkdirSync, readFileSync } from 'fs';
8
+ import { join, basename } from 'path';
9
+ import { detectStack, getStackSummary } from './stack-detector.js';
10
+ import { generateDocs } from './docs-generator.js';
11
+ import { buildAgentsMd, writeAgentsMd } from './agents-md-builder.js';
12
+ import { isMcpCliAvailable } from './context7-fetcher.js';
13
+ /**
14
+ * Run the complete onboarding workflow
15
+ */
16
+ export async function runOnboard(projectPath, options = {}) {
17
+ const projectName = basename(projectPath);
18
+ console.log('\n' + chalk.bold.cyan(' ClaudeTools Onboarding') + '\n');
19
+ console.log(' ' + chalk.dim(`Project: ${projectName}`) + '\n');
20
+ // Phase 1: Stack Detection
21
+ const stackSpinner = ora('Detecting project stack...').start();
22
+ const stack = detectStack(projectPath);
23
+ stackSpinner.succeed(`Detected: ${getStackSummary(stack)}`);
24
+ if (options.verbose) {
25
+ printStackDetails(stack);
26
+ }
27
+ // Phase 2: Documentation Generation
28
+ if (!options.skipDocs) {
29
+ const hasContext7 = isMcpCliAvailable();
30
+ if (hasContext7) {
31
+ console.log(chalk.dim(' Context7 MCP available - fetching official docs'));
32
+ }
33
+ else {
34
+ console.log(chalk.dim(' Context7 not available - using built-in knowledge'));
35
+ }
36
+ const docsSpinner = ora('Generating documentation...').start();
37
+ try {
38
+ const docFiles = await generateDocs(projectPath, stack, { verbose: options.verbose });
39
+ docsSpinner.succeed(`Generated ${docFiles.length} documentation files`);
40
+ // Phase 3: Build AGENTS.md
41
+ const agentsSpinner = ora('Building AGENTS.md...').start();
42
+ const agentsContent = buildAgentsMd(projectPath, stack, docFiles);
43
+ writeAgentsMd(projectPath, agentsContent);
44
+ agentsSpinner.succeed('Created AGENTS.md');
45
+ // Phase 4: Create minimal CLAUDE.md pointer
46
+ createClaudeMdPointer(projectPath, projectName);
47
+ }
48
+ catch (err) {
49
+ docsSpinner.fail('Documentation generation failed');
50
+ console.error(chalk.red(` ${err instanceof Error ? err.message : String(err)}`));
51
+ }
52
+ }
53
+ else {
54
+ // Skip docs, just create AGENTS.md from stack
55
+ const agentsSpinner = ora('Building AGENTS.md...').start();
56
+ const agentsContent = buildAgentsMd(projectPath, stack, []);
57
+ writeAgentsMd(projectPath, agentsContent);
58
+ agentsSpinner.succeed('Created AGENTS.md');
59
+ createClaudeMdPointer(projectPath, projectName);
60
+ }
61
+ // Done
62
+ console.log('\n' + chalk.green(' Onboarding complete!'));
63
+ console.log(chalk.dim('\n Generated files:'));
64
+ console.log(chalk.dim(' - AGENTS.md (comprehensive agent context)'));
65
+ console.log(chalk.dim(' - docs/ (stack documentation, gitignored)'));
66
+ console.log(chalk.dim(' - .claude/CLAUDE.md (minimal pointer)'));
67
+ console.log('\n');
68
+ }
69
+ /**
70
+ * Create minimal CLAUDE.md that points to AGENTS.md
71
+ */
72
+ function createClaudeMdPointer(projectPath, projectName) {
73
+ const claudeDir = join(projectPath, '.claude');
74
+ const claudeMdPath = join(claudeDir, 'CLAUDE.md');
75
+ // Create .claude directory if needed
76
+ if (!existsSync(claudeDir)) {
77
+ mkdirSync(claudeDir, { recursive: true });
78
+ }
79
+ // Check if CLAUDE.md already exists with custom content
80
+ if (existsSync(claudeMdPath)) {
81
+ const existing = readFileSync(claudeMdPath, 'utf-8');
82
+ // If it has substantial custom content, don't overwrite
83
+ if (existing.length > 500 && !existing.includes('See [AGENTS.md]')) {
84
+ console.log(chalk.dim(' Existing CLAUDE.md preserved (has custom content)'));
85
+ return;
86
+ }
87
+ }
88
+ const content = `# ${projectName}
89
+
90
+ See [AGENTS.md](../AGENTS.md) for comprehensive project context.
91
+
92
+ ## Quick Links
93
+
94
+ - Project docs: \`docs/\`
95
+ - Agent context: \`AGENTS.md\`
96
+
97
+ ---
98
+
99
+ *Generated by ClaudeTools. Refresh: \`claudetools onboard --refresh\`*
100
+ `;
101
+ writeFileSync(claudeMdPath, content);
102
+ }
103
+ /**
104
+ * Print detailed stack information
105
+ */
106
+ function printStackDetails(stack) {
107
+ console.log(chalk.dim('\n Stack Details:'));
108
+ if (stack.frameworks.length > 0) {
109
+ console.log(chalk.dim(' Frameworks:'));
110
+ for (const fw of stack.frameworks) {
111
+ console.log(chalk.dim(` - ${fw.name} ${fw.version} (${fw.category})`));
112
+ }
113
+ }
114
+ if (stack.libraries.length > 0) {
115
+ console.log(chalk.dim(' Libraries:'));
116
+ for (const lib of stack.libraries) {
117
+ console.log(chalk.dim(` - ${lib.name} ${lib.version} (${lib.category})`));
118
+ }
119
+ }
120
+ if (stack.devTools.length > 0) {
121
+ console.log(chalk.dim(' Dev Tools:'));
122
+ for (const tool of stack.devTools) {
123
+ console.log(chalk.dim(` - ${tool.name} (${tool.category})`));
124
+ }
125
+ }
126
+ console.log('');
127
+ }
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/onboard/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { StackInfo } from './types.js';
2
+ export declare function detectStack(projectPath: string): StackInfo;
3
+ export declare function getStackSummary(stack: StackInfo): string;
4
+ //# sourceMappingURL=stack-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-detector.d.ts","sourceRoot":"","sources":["../../src/onboard/stack-detector.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAA2C,MAAM,YAAY,CAAC;AAoHrF,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAgD1D;AA2KD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYxD"}