@defai.digital/ax-cli 2.3.0 → 2.4.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 (104) hide show
  1. package/.ax-cli/CUSTOM.md +111 -89
  2. package/.ax-cli/index.json +4 -3
  3. package/README.md +43 -16
  4. package/config/prompts.yaml +9 -0
  5. package/config/settings.yaml +2 -0
  6. package/dist/agent/llm-agent.d.ts +17 -0
  7. package/dist/agent/llm-agent.js +151 -52
  8. package/dist/agent/llm-agent.js.map +1 -1
  9. package/dist/commands/init/wizard.d.ts +66 -0
  10. package/dist/commands/init/wizard.js +310 -0
  11. package/dist/commands/init/wizard.js.map +1 -0
  12. package/dist/commands/init.js +146 -26
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/mcp.js +3 -2
  15. package/dist/commands/mcp.js.map +1 -1
  16. package/dist/commands/memory.d.ts +5 -0
  17. package/dist/commands/memory.js +257 -0
  18. package/dist/commands/memory.js.map +1 -0
  19. package/dist/commands/setup.js +1 -1
  20. package/dist/commands/setup.js.map +1 -1
  21. package/dist/commands/templates.d.ts +5 -0
  22. package/dist/commands/templates.js +244 -0
  23. package/dist/commands/templates.js.map +1 -0
  24. package/dist/commands/update.js +9 -2
  25. package/dist/commands/update.js.map +1 -1
  26. package/dist/commands/usage.js +1 -1
  27. package/dist/commands/usage.js.map +1 -1
  28. package/dist/constants.d.ts +2 -0
  29. package/dist/constants.js +2 -0
  30. package/dist/constants.js.map +1 -1
  31. package/dist/hooks/use-input-handler.js +49 -12
  32. package/dist/hooks/use-input-handler.js.map +1 -1
  33. package/dist/index.js +143 -16
  34. package/dist/index.js.map +1 -1
  35. package/dist/llm/client.d.ts +5 -0
  36. package/dist/llm/client.js +43 -37
  37. package/dist/llm/client.js.map +1 -1
  38. package/dist/schemas/index.d.ts +69 -0
  39. package/dist/schemas/index.js +29 -0
  40. package/dist/schemas/index.js.map +1 -1
  41. package/dist/schemas/yaml-schemas.d.ts +10 -0
  42. package/dist/schemas/yaml-schemas.js +2 -0
  43. package/dist/schemas/yaml-schemas.js.map +1 -1
  44. package/dist/tools/search.js +7 -1
  45. package/dist/tools/search.js.map +1 -1
  46. package/dist/tools/text-editor.js +24 -14
  47. package/dist/tools/text-editor.js.map +1 -1
  48. package/dist/tools/todo-tool.js +62 -21
  49. package/dist/tools/todo-tool.js.map +1 -1
  50. package/dist/types/template.d.ts +53 -0
  51. package/dist/types/template.js +5 -0
  52. package/dist/types/template.js.map +1 -0
  53. package/dist/ui/components/command-suggestions.js +2 -2
  54. package/dist/ui/components/command-suggestions.js.map +1 -1
  55. package/dist/utils/cache.d.ts +1 -0
  56. package/dist/utils/cache.js +39 -5
  57. package/dist/utils/cache.js.map +1 -1
  58. package/dist/utils/config-loader.d.ts +2 -0
  59. package/dist/utils/config-loader.js +2 -1
  60. package/dist/utils/config-loader.js.map +1 -1
  61. package/dist/utils/confirmation-service.js +6 -3
  62. package/dist/utils/confirmation-service.js.map +1 -1
  63. package/dist/utils/error-handler.d.ts +5 -0
  64. package/dist/utils/error-handler.js +9 -3
  65. package/dist/utils/error-handler.js.map +1 -1
  66. package/dist/utils/init-previewer.d.ts +56 -0
  67. package/dist/utils/init-previewer.js +217 -0
  68. package/dist/utils/init-previewer.js.map +1 -0
  69. package/dist/utils/init-validator.d.ts +61 -0
  70. package/dist/utils/init-validator.js +248 -0
  71. package/dist/utils/init-validator.js.map +1 -0
  72. package/dist/utils/llm-optimized-instruction-generator.d.ts +31 -0
  73. package/dist/utils/llm-optimized-instruction-generator.js +296 -0
  74. package/dist/utils/llm-optimized-instruction-generator.js.map +1 -0
  75. package/dist/utils/onboarding-manager.d.ts +45 -0
  76. package/dist/utils/onboarding-manager.js +130 -0
  77. package/dist/utils/onboarding-manager.js.map +1 -0
  78. package/dist/utils/path-utils.d.ts +83 -0
  79. package/dist/utils/path-utils.js +122 -0
  80. package/dist/utils/path-utils.js.map +1 -0
  81. package/dist/utils/progress-tracker.d.ts +51 -0
  82. package/dist/utils/progress-tracker.js +152 -0
  83. package/dist/utils/progress-tracker.js.map +1 -0
  84. package/dist/utils/project-analyzer.js +8 -14
  85. package/dist/utils/project-analyzer.js.map +1 -1
  86. package/dist/utils/settings-manager.d.ts +3 -3
  87. package/dist/utils/settings-manager.js +6 -13
  88. package/dist/utils/settings-manager.js.map +1 -1
  89. package/dist/utils/string-utils.d.ts +19 -0
  90. package/dist/utils/string-utils.js +28 -0
  91. package/dist/utils/string-utils.js.map +1 -0
  92. package/dist/utils/template-manager.d.ts +54 -0
  93. package/dist/utils/template-manager.js +421 -0
  94. package/dist/utils/template-manager.js.map +1 -0
  95. package/dist/utils/text-utils.js +3 -1
  96. package/dist/utils/text-utils.js.map +1 -1
  97. package/package.json +2 -1
  98. package/vitest.config.ts +6 -0
  99. package/dist/utils/model-config.d.ts +0 -28
  100. package/dist/utils/model-config.js +0 -43
  101. package/dist/utils/model-config.js.map +0 -1
  102. package/dist/utils/tool-helpers.d.ts +0 -25
  103. package/dist/utils/tool-helpers.js +0 -53
  104. package/dist/utils/tool-helpers.js.map +0 -1
@@ -0,0 +1,31 @@
1
+ /**
2
+ * LLM-Optimized Instruction Generator
3
+ * Generates token-efficient, comprehension-optimized project instructions
4
+ */
5
+ import type { ProjectInfo } from '../types/project-analysis.js';
6
+ interface OptimizationConfig {
7
+ compressionLevel: 'none' | 'moderate' | 'aggressive';
8
+ hierarchyEnabled: boolean;
9
+ criticalRulesCount: number;
10
+ includeDODONT: boolean;
11
+ includeTroubleshooting: boolean;
12
+ }
13
+ export declare class LLMOptimizedInstructionGenerator {
14
+ private config;
15
+ constructor(config?: Partial<OptimizationConfig>);
16
+ /**
17
+ * Generate LLM-optimized custom instructions
18
+ */
19
+ generateInstructions(projectInfo: ProjectInfo): string;
20
+ private generateHeader;
21
+ private generateCriticalRules;
22
+ private generateProjectOverview;
23
+ private generateCodePatterns;
24
+ private generateWorkflow;
25
+ private generateTroubleshooting;
26
+ /**
27
+ * Generate project index JSON
28
+ */
29
+ generateIndex(projectInfo: ProjectInfo): string;
30
+ }
31
+ export {};
@@ -0,0 +1,296 @@
1
+ /**
2
+ * LLM-Optimized Instruction Generator
3
+ * Generates token-efficient, comprehension-optimized project instructions
4
+ */
5
+ export class LLMOptimizedInstructionGenerator {
6
+ config;
7
+ constructor(config = {}) {
8
+ this.config = {
9
+ compressionLevel: config.compressionLevel || 'moderate',
10
+ hierarchyEnabled: config.hierarchyEnabled ?? true,
11
+ criticalRulesCount: config.criticalRulesCount || 5,
12
+ includeDODONT: config.includeDODONT ?? true,
13
+ includeTroubleshooting: config.includeTroubleshooting ?? true,
14
+ };
15
+ }
16
+ /**
17
+ * Generate LLM-optimized custom instructions
18
+ */
19
+ generateInstructions(projectInfo) {
20
+ const sections = [];
21
+ // Header (compressed)
22
+ sections.push(this.generateHeader(projectInfo));
23
+ // Critical Rules (front-loaded)
24
+ if (this.config.hierarchyEnabled) {
25
+ sections.push(this.generateCriticalRules(projectInfo));
26
+ }
27
+ // Project Overview (compressed)
28
+ sections.push(this.generateProjectOverview(projectInfo));
29
+ // Code Patterns with DO/DON'T
30
+ sections.push(this.generateCodePatterns(projectInfo));
31
+ // Development Workflow (compressed, tool-agnostic)
32
+ sections.push(this.generateWorkflow(projectInfo));
33
+ // Troubleshooting
34
+ if (this.config.includeTroubleshooting) {
35
+ sections.push(this.generateTroubleshooting(projectInfo));
36
+ }
37
+ return sections.join('\n\n---\n\n');
38
+ }
39
+ generateHeader(projectInfo) {
40
+ // Compressed header - remove "Custom Instructions for AX CLI"
41
+ const version = projectInfo.version ? ` v${projectInfo.version}` : '';
42
+ const stack = projectInfo.techStack.length > 0
43
+ ? `\n**Stack:** ${projectInfo.techStack.join(', ')}`
44
+ : '';
45
+ return `# ${projectInfo.name} - Quick Reference
46
+
47
+ **Type:** ${projectInfo.projectType} | **Lang:** ${projectInfo.primaryLanguage}${version ? ` | **Ver:** ${version}` : ''}${stack}`;
48
+ }
49
+ generateCriticalRules(projectInfo) {
50
+ const rules = [];
51
+ // Rule 1: ESM imports (if applicable)
52
+ if (projectInfo.conventions.importExtension === '.js') {
53
+ rules.push('**ESM Imports:** Always use `.js` extension: `import { x } from \'./y.js\'`');
54
+ }
55
+ // Rule 2: Validation (if applicable)
56
+ if (projectInfo.conventions.validation) {
57
+ rules.push(`**Validation:** Use ${projectInfo.conventions.validation} for all external inputs`);
58
+ }
59
+ // Rule 3: TypeScript types (if applicable)
60
+ if (projectInfo.primaryLanguage === 'TypeScript') {
61
+ rules.push('**Types:** Explicit return types required on all functions');
62
+ }
63
+ // Rule 4: Testing coverage
64
+ if (projectInfo.scripts.test) {
65
+ rules.push('**Testing:** 80%+ coverage, test error paths');
66
+ }
67
+ // Rule 5: Module system
68
+ if (projectInfo.conventions.moduleSystem === 'esm') {
69
+ rules.push('**Modules:** Use `import/export` (not `require/module.exports`)');
70
+ }
71
+ // Take only top N rules
72
+ const topRules = rules.slice(0, this.config.criticalRulesCount);
73
+ if (topRules.length === 0) {
74
+ return '';
75
+ }
76
+ return `## 🎯 Critical Rules\n\n${topRules.map((rule, i) => `${i + 1}. ${rule}`).join('\n')}`;
77
+ }
78
+ generateProjectOverview(projectInfo) {
79
+ const parts = [`## 📋 Project Overview`];
80
+ // Tech details (compressed)
81
+ const details = [];
82
+ if (projectInfo.entryPoint) {
83
+ details.push(`**Entry:** \`${projectInfo.entryPoint}\``);
84
+ }
85
+ if (projectInfo.packageManager) {
86
+ details.push(`**PM:** ${projectInfo.packageManager}`);
87
+ }
88
+ if (projectInfo.conventions.moduleSystem) {
89
+ details.push(`**Module:** ${projectInfo.conventions.moduleSystem.toUpperCase()}`);
90
+ }
91
+ if (details.length > 0) {
92
+ parts.push(details.join(' | '));
93
+ }
94
+ // Directories (compressed)
95
+ const dirs = [];
96
+ if (projectInfo.directories.source) {
97
+ dirs.push(`- \`${projectInfo.directories.source}/\` - Source code`);
98
+ }
99
+ if (projectInfo.directories.tests) {
100
+ dirs.push(`- \`${projectInfo.directories.tests}/\` - Tests`);
101
+ }
102
+ if (projectInfo.directories.tools) {
103
+ dirs.push(`- \`${projectInfo.directories.tools}/\` - Tools`);
104
+ }
105
+ // Add typical subdirectories for CLI/API
106
+ if (projectInfo.projectType === 'cli' || projectInfo.projectType === 'api') {
107
+ if (projectInfo.directories.source) {
108
+ dirs.push(`- \`${projectInfo.directories.source}/commands/\` - Commands`);
109
+ dirs.push(`- \`${projectInfo.directories.source}/utils/\` - Utilities`);
110
+ }
111
+ }
112
+ if (dirs.length > 0) {
113
+ parts.push('\n**Directories:**\n' + dirs.join('\n'));
114
+ }
115
+ return parts.join('\n\n');
116
+ }
117
+ generateCodePatterns(projectInfo) {
118
+ let content = '## 🔧 Code Patterns';
119
+ // TypeScript patterns with DO/DON'T
120
+ if (projectInfo.primaryLanguage === 'TypeScript' && this.config.includeDODONT) {
121
+ content += '\n\n### TypeScript\n';
122
+ content += '\n✅ **DO:**\n';
123
+ content += '```typescript\n';
124
+ content += '// Explicit types\n';
125
+ content += 'function process(x: string): Promise<Result> { }\n';
126
+ if (projectInfo.conventions.importExtension === '.js') {
127
+ content += '\n// ESM imports with .js extension\n';
128
+ content += 'import { foo } from \'./bar.js\';\n';
129
+ }
130
+ content += '```\n';
131
+ content += '\n❌ **DON\'T:**\n';
132
+ content += '```typescript\n';
133
+ content += '// No any types\n';
134
+ content += 'function process(x: any) { } // ❌\n';
135
+ if (projectInfo.conventions.importExtension === '.js') {
136
+ content += '\n// Missing .js extension\n';
137
+ content += 'import { foo } from \'./bar\'; // ❌\n';
138
+ }
139
+ content += '```';
140
+ }
141
+ // Validation patterns (if applicable)
142
+ if (projectInfo.conventions.validation && this.config.includeDODONT) {
143
+ content += `\n\n### Validation (${projectInfo.conventions.validation})\n`;
144
+ content += '\n✅ **DO:**\n';
145
+ content += '```typescript\n';
146
+ content += `const result = schema.safeParse(data);\n`;
147
+ content += 'if (!result.success) {\n';
148
+ content += ' return { success: false, error: result.error };\n';
149
+ content += '}\n';
150
+ content += '```';
151
+ }
152
+ // Project-specific patterns based on type
153
+ if (projectInfo.projectType === 'cli') {
154
+ content += '\n\n### CLI Commands\n';
155
+ content += 'Commands should:\n';
156
+ content += '- Accept options via flags (`-f, --flag <value>`)\n';
157
+ content += '- Validate input before execution\n';
158
+ content += '- Provide clear error messages\n';
159
+ content += '- Return exit codes (0 = success, 1+ = error)';
160
+ }
161
+ else if (projectInfo.projectType === 'api') {
162
+ content += '\n\n### API Endpoints\n';
163
+ content += 'Endpoints should:\n';
164
+ content += '- Validate request body/params\n';
165
+ content += '- Use proper HTTP status codes\n';
166
+ content += '- Handle errors with consistent format\n';
167
+ content += '- Document with OpenAPI/Swagger';
168
+ }
169
+ else if (projectInfo.projectType === 'library') {
170
+ content += '\n\n### Library API\n';
171
+ content += 'Public API should:\n';
172
+ content += '- Have clear, typed interfaces\n';
173
+ content += '- Validate all inputs\n';
174
+ content += '- Avoid breaking changes\n';
175
+ content += '- Document all exports';
176
+ }
177
+ return content;
178
+ }
179
+ generateWorkflow(projectInfo) {
180
+ let workflow = '## 🔄 Workflow';
181
+ // Before (compressed, tool-agnostic)
182
+ workflow += '\n\n**Before:**\n';
183
+ workflow += '- Read files to understand implementation\n';
184
+ workflow += '- Search for related patterns\n';
185
+ workflow += '- Review tests for expected behavior';
186
+ // Changes (compressed)
187
+ workflow += '\n\n**Changes:**\n';
188
+ workflow += '- Edit existing files (never recreate)\n';
189
+ workflow += '- Keep changes focused and atomic\n';
190
+ workflow += '- Preserve code style\n';
191
+ workflow += '- Update tests when changing functionality';
192
+ // After (compressed with actual commands)
193
+ const afterSteps = [];
194
+ if (projectInfo.scripts.lint) {
195
+ afterSteps.push(`Lint: \`${projectInfo.scripts.lint}\``);
196
+ }
197
+ if (projectInfo.scripts.test) {
198
+ afterSteps.push(`Test: \`${projectInfo.scripts.test}\``);
199
+ }
200
+ if (projectInfo.scripts.build) {
201
+ afterSteps.push(`Build: \`${projectInfo.scripts.build}\``);
202
+ }
203
+ if (afterSteps.length > 0) {
204
+ workflow += '\n\n**After:**\n';
205
+ workflow += afterSteps.map((step, i) => `${i + 1}. ${step}`).join('\n');
206
+ }
207
+ // Quick commands (compressed)
208
+ if (projectInfo.packageManager && Object.keys(projectInfo.scripts).length > 0) {
209
+ workflow += '\n\n**Quick Commands:**\n```bash\n';
210
+ const pm = projectInfo.packageManager;
211
+ const run = pm === 'npm' ? 'npm run' : pm;
212
+ const test = pm === 'npm' ? 'npm' : pm;
213
+ if (projectInfo.scripts.dev) {
214
+ workflow += `${run} dev # Development\n`;
215
+ }
216
+ if (projectInfo.scripts.test) {
217
+ workflow += `${test} test # Run tests\n`;
218
+ }
219
+ if (projectInfo.scripts.build) {
220
+ workflow += `${run} build # Production build\n`;
221
+ }
222
+ workflow += '```';
223
+ }
224
+ return workflow;
225
+ }
226
+ generateTroubleshooting(projectInfo) {
227
+ let content = '## 🐛 Troubleshooting';
228
+ const issues = [];
229
+ // ESM import issues
230
+ if (projectInfo.conventions.importExtension === '.js') {
231
+ issues.push({
232
+ problem: '"Module not found" errors',
233
+ solution: 'Add `.js` extension to imports (ESM requirement)',
234
+ code: `// ✅ Correct\nimport { x } from './y.js';\n\n// ❌ Wrong\nimport { x } from './y'; // Missing .js`,
235
+ });
236
+ }
237
+ // Validation errors
238
+ if (projectInfo.conventions.validation) {
239
+ issues.push({
240
+ problem: `${projectInfo.conventions.validation} validation errors`,
241
+ solution: 'Use `.safeParse()` for detailed error messages. Check schema matches data structure.',
242
+ });
243
+ }
244
+ // Test failures
245
+ if (projectInfo.conventions.testFramework) {
246
+ issues.push({
247
+ problem: 'Tests fail locally but pass in CI',
248
+ solution: `Check Node version, clear node_modules, check environment-specific code`,
249
+ });
250
+ }
251
+ // TypeScript errors
252
+ if (projectInfo.primaryLanguage === 'TypeScript') {
253
+ issues.push({
254
+ problem: 'TypeScript compilation errors',
255
+ solution: 'Check `tsconfig.json` settings, ensure all types are imported, verify `moduleResolution`',
256
+ });
257
+ }
258
+ if (issues.length === 0) {
259
+ return '';
260
+ }
261
+ for (const issue of issues) {
262
+ content += `\n\n### ${issue.problem}\n`;
263
+ content += `**Solution:** ${issue.solution}`;
264
+ if (issue.code) {
265
+ content += `\n\`\`\`typescript\n${issue.code}\n\`\`\``;
266
+ }
267
+ }
268
+ return content;
269
+ }
270
+ /**
271
+ * Generate project index JSON
272
+ */
273
+ generateIndex(projectInfo) {
274
+ const index = {
275
+ projectName: projectInfo.name,
276
+ version: projectInfo.version,
277
+ primaryLanguage: projectInfo.primaryLanguage,
278
+ techStack: projectInfo.techStack,
279
+ projectType: projectInfo.projectType,
280
+ entryPoint: projectInfo.entryPoint,
281
+ directories: projectInfo.directories,
282
+ keyFiles: Object.keys(projectInfo.keyFiles),
283
+ conventions: {
284
+ moduleSystem: projectInfo.conventions.moduleSystem,
285
+ importExtension: projectInfo.conventions.importExtension,
286
+ testFramework: projectInfo.conventions.testFramework,
287
+ validation: projectInfo.conventions.validation,
288
+ },
289
+ scripts: projectInfo.scripts,
290
+ packageManager: projectInfo.packageManager,
291
+ lastAnalyzed: projectInfo.lastAnalyzed,
292
+ };
293
+ return JSON.stringify(index, null, 2);
294
+ }
295
+ }
296
+ //# sourceMappingURL=llm-optimized-instruction-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-optimized-instruction-generator.js","sourceRoot":"","sources":["../../src/utils/llm-optimized-instruction-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Onboarding Manager - First-run detection and state management
3
+ */
4
+ export interface OnboardingState {
5
+ isFirstRun: boolean;
6
+ setupCompleted: boolean;
7
+ completedAt?: string;
8
+ version: string;
9
+ }
10
+ export declare class OnboardingManager {
11
+ private static readonly FIRST_RUN_MARKER;
12
+ private static readonly USER_CONFIG_DIR;
13
+ /**
14
+ * Get the user's AX CLI configuration directory
15
+ */
16
+ private static getUserConfigDir;
17
+ /**
18
+ * Get the path to the first-run marker file
19
+ */
20
+ private static getMarkerPath;
21
+ /**
22
+ * Detect if this is the user's first run of AX CLI
23
+ */
24
+ static detectFirstRun(): boolean;
25
+ /**
26
+ * Mark onboarding as completed
27
+ */
28
+ static markCompleted(): void;
29
+ /**
30
+ * Get current onboarding state
31
+ */
32
+ static getCurrentState(): OnboardingState;
33
+ /**
34
+ * Reset onboarding state (useful for testing)
35
+ */
36
+ static resetOnboarding(): void;
37
+ /**
38
+ * Check if welcome screen should be shown
39
+ */
40
+ static shouldShowWelcome(): boolean;
41
+ /**
42
+ * Get current CLI version
43
+ */
44
+ private static getVersion;
45
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Onboarding Manager - First-run detection and state management
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import * as os from 'os';
7
+ import { fileURLToPath } from 'url';
8
+ import { parseJsonFile } from './json-utils.js';
9
+ export class OnboardingManager {
10
+ static FIRST_RUN_MARKER = '.first-run-complete';
11
+ static USER_CONFIG_DIR = '.ax-cli';
12
+ /**
13
+ * Get the user's AX CLI configuration directory
14
+ */
15
+ static getUserConfigDir() {
16
+ return path.join(os.homedir(), OnboardingManager.USER_CONFIG_DIR);
17
+ }
18
+ /**
19
+ * Get the path to the first-run marker file
20
+ */
21
+ static getMarkerPath() {
22
+ return path.join(OnboardingManager.getUserConfigDir(), OnboardingManager.FIRST_RUN_MARKER);
23
+ }
24
+ /**
25
+ * Detect if this is the user's first run of AX CLI
26
+ */
27
+ static detectFirstRun() {
28
+ const markerPath = OnboardingManager.getMarkerPath();
29
+ return !fs.existsSync(markerPath);
30
+ }
31
+ /**
32
+ * Mark onboarding as completed
33
+ */
34
+ static markCompleted() {
35
+ const configDir = OnboardingManager.getUserConfigDir();
36
+ const markerPath = OnboardingManager.getMarkerPath();
37
+ // Create config directory if it doesn't exist
38
+ if (!fs.existsSync(configDir)) {
39
+ fs.mkdirSync(configDir, { recursive: true });
40
+ }
41
+ // Create marker file with timestamp
42
+ const state = {
43
+ isFirstRun: false,
44
+ setupCompleted: true,
45
+ completedAt: new Date().toISOString(),
46
+ version: this.getVersion(),
47
+ };
48
+ // Atomic write using temp file
49
+ const tmpPath = `${markerPath}.tmp`;
50
+ try {
51
+ fs.writeFileSync(tmpPath, JSON.stringify(state, null, 2), 'utf-8');
52
+ fs.renameSync(tmpPath, markerPath); // Atomic on POSIX systems
53
+ }
54
+ catch (error) {
55
+ // Cleanup temp file on error
56
+ if (fs.existsSync(tmpPath)) {
57
+ try {
58
+ fs.unlinkSync(tmpPath);
59
+ }
60
+ catch {
61
+ // Ignore cleanup errors
62
+ }
63
+ }
64
+ throw error;
65
+ }
66
+ }
67
+ /**
68
+ * Get current onboarding state
69
+ */
70
+ static getCurrentState() {
71
+ const markerPath = OnboardingManager.getMarkerPath();
72
+ if (!fs.existsSync(markerPath)) {
73
+ return {
74
+ isFirstRun: true,
75
+ setupCompleted: false,
76
+ version: this.getVersion(),
77
+ };
78
+ }
79
+ const parseResult = parseJsonFile(markerPath);
80
+ if (!parseResult.success) {
81
+ // If marker file is corrupted, treat as first run
82
+ return {
83
+ isFirstRun: true,
84
+ setupCompleted: false,
85
+ version: this.getVersion(),
86
+ };
87
+ }
88
+ return parseResult.data;
89
+ }
90
+ /**
91
+ * Reset onboarding state (useful for testing)
92
+ */
93
+ static resetOnboarding() {
94
+ const markerPath = OnboardingManager.getMarkerPath();
95
+ if (fs.existsSync(markerPath)) {
96
+ fs.unlinkSync(markerPath);
97
+ }
98
+ }
99
+ /**
100
+ * Check if welcome screen should be shown
101
+ */
102
+ static shouldShowWelcome() {
103
+ return OnboardingManager.detectFirstRun();
104
+ }
105
+ /**
106
+ * Get current CLI version
107
+ */
108
+ static getVersion() {
109
+ try {
110
+ // Use import.meta.url to find the actual CLI installation path
111
+ const currentModulePath = fileURLToPath(import.meta.url);
112
+ const cliRootPath = path.join(path.dirname(currentModulePath), '../..');
113
+ const packageJsonPath = path.join(cliRootPath, 'package.json');
114
+ if (fs.existsSync(packageJsonPath)) {
115
+ const parseResult = parseJsonFile(packageJsonPath);
116
+ if (parseResult.success) {
117
+ const pkg = parseResult.data;
118
+ if (pkg && typeof pkg === 'object' && 'version' in pkg && typeof pkg.version === 'string') {
119
+ return pkg.version;
120
+ }
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // Ignore errors
126
+ }
127
+ return '0.0.0';
128
+ }
129
+ }
130
+ //# sourceMappingURL=onboarding-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-manager.js","sourceRoot":"","sources":["../../src/utils/onboarding-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Cross-platform path utility functions
3
+ *
4
+ * This module provides utilities for handling file paths consistently
5
+ * across different operating systems (Windows, macOS, Linux).
6
+ *
7
+ * @module path-utils
8
+ */
9
+ /**
10
+ * Normalize path separators to forward slashes (for display and logging)
11
+ *
12
+ * This function converts all path separators to forward slashes, which is
13
+ * useful for consistent display across platforms and for comparison in tests.
14
+ *
15
+ * @example
16
+ * // Windows
17
+ * normalizePath('C:\\Users\\foo\\bar') // => 'C:/Users/foo/bar'
18
+ *
19
+ * // Unix
20
+ * normalizePath('/Users/foo/bar') // => '/Users/foo/bar'
21
+ *
22
+ * @param filePath - The path to normalize
23
+ * @returns Path with forward slashes (empty string if input is falsy)
24
+ */
25
+ export declare function normalizePath(filePath: string): string;
26
+ /**
27
+ * Convert path to platform-native format (for filesystem operations)
28
+ *
29
+ * This function normalizes the path to use the platform's native separator,
30
+ * which is necessary for filesystem operations.
31
+ *
32
+ * @example
33
+ * // Windows
34
+ * platformPath('foo/bar/baz') // => 'foo\\bar\\baz'
35
+ *
36
+ * // Unix
37
+ * platformPath('foo/bar/baz') // => 'foo/bar/baz'
38
+ *
39
+ * @param filePath - The path to convert
40
+ * @returns Path with platform-native separators (empty string if input is falsy)
41
+ */
42
+ export declare function platformPath(filePath: string): string;
43
+ /**
44
+ * Check if running on Windows
45
+ *
46
+ * @returns True if running on Windows platform
47
+ */
48
+ export declare function isWindows(): boolean;
49
+ /**
50
+ * Compare two paths for equality (ignoring separator differences)
51
+ *
52
+ * This function compares two paths by normalizing both to forward slashes
53
+ * and then comparing case-insensitively on Windows.
54
+ *
55
+ * @example
56
+ * // Windows
57
+ * pathsEqual('foo/bar', 'foo\\bar') // => true
58
+ * pathsEqual('Foo/Bar', 'foo/bar') // => true
59
+ *
60
+ * // Unix
61
+ * pathsEqual('foo/bar', 'foo/bar') // => true
62
+ * pathsEqual('Foo/Bar', 'foo/bar') // => false
63
+ *
64
+ * @param path1 - First path to compare
65
+ * @param path2 - Second path to compare
66
+ * @returns True if paths are equal
67
+ */
68
+ export declare function pathsEqual(path1: string, path2: string): boolean;
69
+ /**
70
+ * Check if a path contains a segment (cross-platform)
71
+ *
72
+ * This function checks if a full path contains a specific segment,
73
+ * normalizing both paths before comparison.
74
+ *
75
+ * @example
76
+ * pathContains('/foo/bar/baz', 'bar/baz') // => true
77
+ * pathContains('C:\\foo\\bar', 'bar') // => true
78
+ *
79
+ * @param fullPath - Full path to search in
80
+ * @param segment - Segment to search for
81
+ * @returns True if fullPath contains segment
82
+ */
83
+ export declare function pathContains(fullPath: string, segment: string): boolean;