@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.
- package/.ax-cli/CUSTOM.md +111 -89
- package/.ax-cli/index.json +4 -3
- package/README.md +43 -16
- package/config/prompts.yaml +9 -0
- package/config/settings.yaml +2 -0
- package/dist/agent/llm-agent.d.ts +17 -0
- package/dist/agent/llm-agent.js +151 -52
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/commands/init/wizard.d.ts +66 -0
- package/dist/commands/init/wizard.js +310 -0
- package/dist/commands/init/wizard.js.map +1 -0
- package/dist/commands/init.js +146 -26
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.js +3 -2
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/memory.d.ts +5 -0
- package/dist/commands/memory.js +257 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/setup.js +1 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/templates.d.ts +5 -0
- package/dist/commands/templates.js +244 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/update.js +9 -2
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/usage.js +1 -1
- package/dist/commands/usage.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/hooks/use-input-handler.js +49 -12
- package/dist/hooks/use-input-handler.js.map +1 -1
- package/dist/index.js +143 -16
- package/dist/index.js.map +1 -1
- package/dist/llm/client.d.ts +5 -0
- package/dist/llm/client.js +43 -37
- package/dist/llm/client.js.map +1 -1
- package/dist/schemas/index.d.ts +69 -0
- package/dist/schemas/index.js +29 -0
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/yaml-schemas.d.ts +10 -0
- package/dist/schemas/yaml-schemas.js +2 -0
- package/dist/schemas/yaml-schemas.js.map +1 -1
- package/dist/tools/search.js +7 -1
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/text-editor.js +24 -14
- package/dist/tools/text-editor.js.map +1 -1
- package/dist/tools/todo-tool.js +62 -21
- package/dist/tools/todo-tool.js.map +1 -1
- package/dist/types/template.d.ts +53 -0
- package/dist/types/template.js +5 -0
- package/dist/types/template.js.map +1 -0
- package/dist/ui/components/command-suggestions.js +2 -2
- package/dist/ui/components/command-suggestions.js.map +1 -1
- package/dist/utils/cache.d.ts +1 -0
- package/dist/utils/cache.js +39 -5
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/config-loader.d.ts +2 -0
- package/dist/utils/config-loader.js +2 -1
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/confirmation-service.js +6 -3
- package/dist/utils/confirmation-service.js.map +1 -1
- package/dist/utils/error-handler.d.ts +5 -0
- package/dist/utils/error-handler.js +9 -3
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/init-previewer.d.ts +56 -0
- package/dist/utils/init-previewer.js +217 -0
- package/dist/utils/init-previewer.js.map +1 -0
- package/dist/utils/init-validator.d.ts +61 -0
- package/dist/utils/init-validator.js +248 -0
- package/dist/utils/init-validator.js.map +1 -0
- package/dist/utils/llm-optimized-instruction-generator.d.ts +31 -0
- package/dist/utils/llm-optimized-instruction-generator.js +296 -0
- package/dist/utils/llm-optimized-instruction-generator.js.map +1 -0
- package/dist/utils/onboarding-manager.d.ts +45 -0
- package/dist/utils/onboarding-manager.js +130 -0
- package/dist/utils/onboarding-manager.js.map +1 -0
- package/dist/utils/path-utils.d.ts +83 -0
- package/dist/utils/path-utils.js +122 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/utils/progress-tracker.d.ts +51 -0
- package/dist/utils/progress-tracker.js +152 -0
- package/dist/utils/progress-tracker.js.map +1 -0
- package/dist/utils/project-analyzer.js +8 -14
- package/dist/utils/project-analyzer.js.map +1 -1
- package/dist/utils/settings-manager.d.ts +3 -3
- package/dist/utils/settings-manager.js +6 -13
- package/dist/utils/settings-manager.js.map +1 -1
- package/dist/utils/string-utils.d.ts +19 -0
- package/dist/utils/string-utils.js +28 -0
- package/dist/utils/string-utils.js.map +1 -0
- package/dist/utils/template-manager.d.ts +54 -0
- package/dist/utils/template-manager.js +421 -0
- package/dist/utils/template-manager.js.map +1 -0
- package/dist/utils/text-utils.js +3 -1
- package/dist/utils/text-utils.js.map +1 -1
- package/package.json +2 -1
- package/vitest.config.ts +6 -0
- package/dist/utils/model-config.d.ts +0 -28
- package/dist/utils/model-config.js +0 -43
- package/dist/utils/model-config.js.map +0 -1
- package/dist/utils/tool-helpers.d.ts +0 -25
- package/dist/utils/tool-helpers.js +0 -53
- 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;
|