@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
|
@@ -19,8 +19,7 @@ export var ErrorCategory;
|
|
|
19
19
|
* Create a standardized error message
|
|
20
20
|
*/
|
|
21
21
|
export function createErrorMessage(category, operation, error) {
|
|
22
|
-
|
|
23
|
-
return `[${category}] ${operation} failed: ${errorMessage}`;
|
|
22
|
+
return `[${category}] ${operation} failed: ${extractErrorMessage(error)}`;
|
|
24
23
|
}
|
|
25
24
|
/**
|
|
26
25
|
* Create a standardized ToolResult error
|
|
@@ -40,6 +39,13 @@ export function createToolSuccess(output) {
|
|
|
40
39
|
output,
|
|
41
40
|
};
|
|
42
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Extract error message from unknown error type
|
|
44
|
+
* Consolidates the common pattern: error instanceof Error ? error.message : String(error)
|
|
45
|
+
*/
|
|
46
|
+
export function extractErrorMessage(error) {
|
|
47
|
+
return error instanceof Error ? error.message : String(error);
|
|
48
|
+
}
|
|
43
49
|
/**
|
|
44
50
|
* Safely parse JSON with error handling
|
|
45
51
|
*/
|
|
@@ -51,7 +57,7 @@ export function safeJsonParse(json) {
|
|
|
51
57
|
catch (error) {
|
|
52
58
|
return {
|
|
53
59
|
success: false,
|
|
54
|
-
error: error
|
|
60
|
+
error: extractErrorMessage(error),
|
|
55
61
|
};
|
|
56
62
|
}
|
|
57
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAN,IAAY,aAQX;AARD,WAAY,aAAa;IACvB,kDAAiC,CAAA;IACjC,8CAA6B,CAAA;IAC7B,kDAAiC,CAAA;IACjC,kDAAiC,CAAA;IACjC,0CAAyB,CAAA;IACzB,oCAAmB,CAAA;IACnB,gDAA+B,CAAA;AACjC,CAAC,EARW,aAAa,KAAb,aAAa,QAQxB;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAuB,EACvB,SAAiB,EACjB,KAAc;IAEd,
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAN,IAAY,aAQX;AARD,WAAY,aAAa;IACvB,kDAAiC,CAAA;IACjC,8CAA6B,CAAA;IAC7B,kDAAiC,CAAA;IACjC,kDAAiC,CAAA;IACjC,0CAAyB,CAAA;IACzB,oCAAmB,CAAA;IACnB,gDAA+B,CAAA;AACjC,CAAC,EARW,aAAa,KAAb,aAAa,QAQxB;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAuB,EACvB,SAAiB,EACjB,KAAc;IAEd,OAAO,IAAI,QAAQ,KAAK,SAAS,YAAY,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAuB,EACvB,SAAiB,EACjB,KAAc;IAEd,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;KACtD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY;IAEZ,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC;SAClC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAuB,EACvB,SAAiB,EACjB,EAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO,iBAAiB,CACtB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAC7D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview utilities for init command
|
|
3
|
+
*/
|
|
4
|
+
import type { ProjectInfo } from '../types/project-analysis.js';
|
|
5
|
+
export interface PreviewOptions {
|
|
6
|
+
showDiff?: boolean;
|
|
7
|
+
showFull?: boolean;
|
|
8
|
+
maxLines?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface FilePreview {
|
|
11
|
+
path: string;
|
|
12
|
+
exists: boolean;
|
|
13
|
+
currentContent?: string;
|
|
14
|
+
newContent: string;
|
|
15
|
+
changes?: {
|
|
16
|
+
added: number;
|
|
17
|
+
removed: number;
|
|
18
|
+
modified: boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare class InitPreviewer {
|
|
22
|
+
private projectRoot;
|
|
23
|
+
constructor(projectRoot: string);
|
|
24
|
+
/**
|
|
25
|
+
* Preview what will be created/modified
|
|
26
|
+
*/
|
|
27
|
+
preview(customMdContent: string, indexContent: string, options?: PreviewOptions): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Display preview for a single file
|
|
30
|
+
*/
|
|
31
|
+
private displayFilePreview;
|
|
32
|
+
/**
|
|
33
|
+
* Calculate changes between old and new content
|
|
34
|
+
*/
|
|
35
|
+
private calculateChanges;
|
|
36
|
+
/**
|
|
37
|
+
* Generate diff view (simplified)
|
|
38
|
+
*/
|
|
39
|
+
private generateDiff;
|
|
40
|
+
/**
|
|
41
|
+
* Truncate content to max lines
|
|
42
|
+
*/
|
|
43
|
+
private truncateContent;
|
|
44
|
+
/**
|
|
45
|
+
* Generate summary of all changes
|
|
46
|
+
*/
|
|
47
|
+
private generateSummary;
|
|
48
|
+
/**
|
|
49
|
+
* Interactive confirmation after preview
|
|
50
|
+
*/
|
|
51
|
+
confirmChanges(): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Preview project analysis results
|
|
54
|
+
*/
|
|
55
|
+
static previewProjectInfo(projectInfo: ProjectInfo): Promise<void>;
|
|
56
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview utilities for init command
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as prompts from '@clack/prompts';
|
|
7
|
+
import { TOKEN_CONFIG } from '../constants.js';
|
|
8
|
+
export class InitPreviewer {
|
|
9
|
+
projectRoot;
|
|
10
|
+
constructor(projectRoot) {
|
|
11
|
+
this.projectRoot = projectRoot;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Preview what will be created/modified
|
|
15
|
+
*/
|
|
16
|
+
async preview(customMdContent, indexContent, options = {}) {
|
|
17
|
+
const customMdPath = path.join(this.projectRoot, '.ax-cli', 'CUSTOM.md');
|
|
18
|
+
const indexPath = path.join(this.projectRoot, '.ax-cli', 'index.json');
|
|
19
|
+
prompts.intro('Preview: Init Changes');
|
|
20
|
+
// Preview CUSTOM.md
|
|
21
|
+
const customMdPreview = {
|
|
22
|
+
path: customMdPath,
|
|
23
|
+
exists: fs.existsSync(customMdPath),
|
|
24
|
+
currentContent: fs.existsSync(customMdPath) ? fs.readFileSync(customMdPath, 'utf-8') : undefined,
|
|
25
|
+
newContent: customMdContent,
|
|
26
|
+
};
|
|
27
|
+
if (customMdPreview.exists && customMdPreview.currentContent) {
|
|
28
|
+
customMdPreview.changes = this.calculateChanges(customMdPreview.currentContent, customMdPreview.newContent);
|
|
29
|
+
}
|
|
30
|
+
// Preview index.json
|
|
31
|
+
const indexPreview = {
|
|
32
|
+
path: indexPath,
|
|
33
|
+
exists: fs.existsSync(indexPath),
|
|
34
|
+
currentContent: fs.existsSync(indexPath) ? fs.readFileSync(indexPath, 'utf-8') : undefined,
|
|
35
|
+
newContent: indexContent,
|
|
36
|
+
};
|
|
37
|
+
if (indexPreview.exists && indexPreview.currentContent) {
|
|
38
|
+
indexPreview.changes = this.calculateChanges(indexPreview.currentContent, indexPreview.newContent);
|
|
39
|
+
}
|
|
40
|
+
// Display CUSTOM.md preview
|
|
41
|
+
await this.displayFilePreview(customMdPreview, options);
|
|
42
|
+
// Display index.json preview
|
|
43
|
+
await this.displayFilePreview(indexPreview, { ...options, maxLines: 20 });
|
|
44
|
+
// Summary
|
|
45
|
+
const summary = this.generateSummary([customMdPreview, indexPreview]);
|
|
46
|
+
await prompts.note(summary, 'Summary');
|
|
47
|
+
prompts.outro('Preview complete');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Display preview for a single file
|
|
51
|
+
*/
|
|
52
|
+
async displayFilePreview(preview, options) {
|
|
53
|
+
const status = preview.exists ? '📝 Modified' : '✨ New';
|
|
54
|
+
const title = `${status}: ${path.basename(preview.path)}`;
|
|
55
|
+
if (options.showDiff && preview.exists && preview.currentContent) {
|
|
56
|
+
// Show diff
|
|
57
|
+
const diff = this.generateDiff(preview.currentContent, preview.newContent, options.maxLines);
|
|
58
|
+
await prompts.note(diff, title);
|
|
59
|
+
}
|
|
60
|
+
else if (options.showFull) {
|
|
61
|
+
// Show full content
|
|
62
|
+
const content = this.truncateContent(preview.newContent, options.maxLines);
|
|
63
|
+
await prompts.note(content, title);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Show summary
|
|
67
|
+
const lines = preview.newContent.split('\n').length;
|
|
68
|
+
const chars = preview.newContent.length;
|
|
69
|
+
// Rough approximation: actual tokens vary by content (English ~4 chars/token, code ~3)
|
|
70
|
+
const tokens = Math.ceil(chars / TOKEN_CONFIG.CHARS_PER_TOKEN_ESTIMATE);
|
|
71
|
+
let summary = `Lines: ${lines}\nCharacters: ${chars}\nEstimated Tokens: ~${tokens}`;
|
|
72
|
+
if (preview.changes) {
|
|
73
|
+
summary += `\n\nChanges:\n`;
|
|
74
|
+
summary += ` + ${preview.changes.added} lines added\n`;
|
|
75
|
+
summary += ` - ${preview.changes.removed} lines removed`;
|
|
76
|
+
}
|
|
77
|
+
await prompts.note(summary, title);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Calculate changes between old and new content
|
|
82
|
+
*/
|
|
83
|
+
calculateChanges(oldContent, newContent) {
|
|
84
|
+
const oldLines = oldContent.split('\n');
|
|
85
|
+
const newLines = newContent.split('\n');
|
|
86
|
+
// Simple line-based diff (optimized)
|
|
87
|
+
const oldSet = new Set(oldLines);
|
|
88
|
+
const newSet = new Set(newLines);
|
|
89
|
+
// Count added lines (in new but not in old)
|
|
90
|
+
const added = newLines.filter(line => !oldSet.has(line)).length;
|
|
91
|
+
// Count removed lines (in old but not in new)
|
|
92
|
+
const removed = oldLines.filter(line => !newSet.has(line)).length;
|
|
93
|
+
return {
|
|
94
|
+
added,
|
|
95
|
+
removed,
|
|
96
|
+
modified: added > 0 || removed > 0,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Generate diff view (simplified)
|
|
101
|
+
*/
|
|
102
|
+
generateDiff(oldContent, newContent, maxLines) {
|
|
103
|
+
const oldLines = oldContent.split('\n');
|
|
104
|
+
const newLines = newContent.split('\n');
|
|
105
|
+
const diff = [];
|
|
106
|
+
let lineCount = 0;
|
|
107
|
+
let i = 0;
|
|
108
|
+
// Simple line-by-line comparison
|
|
109
|
+
const maxLength = Math.max(oldLines.length, newLines.length);
|
|
110
|
+
for (i = 0; i < maxLength && (!maxLines || lineCount < maxLines); i++) {
|
|
111
|
+
const oldLine = oldLines[i];
|
|
112
|
+
const newLine = newLines[i];
|
|
113
|
+
if (oldLine === newLine) {
|
|
114
|
+
diff.push(` ${newLine}`);
|
|
115
|
+
}
|
|
116
|
+
else if (oldLine && !newLine) {
|
|
117
|
+
diff.push(`- ${oldLine}`);
|
|
118
|
+
lineCount++;
|
|
119
|
+
}
|
|
120
|
+
else if (!oldLine && newLine) {
|
|
121
|
+
diff.push(`+ ${newLine}`);
|
|
122
|
+
lineCount++;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
diff.push(`- ${oldLine}`);
|
|
126
|
+
diff.push(`+ ${newLine}`);
|
|
127
|
+
lineCount += 2;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Calculate remaining lines correctly
|
|
131
|
+
if (maxLines && i < maxLength) {
|
|
132
|
+
const remaining = maxLength - i;
|
|
133
|
+
diff.push(`\n... (${remaining} more lines)`);
|
|
134
|
+
}
|
|
135
|
+
return diff.join('\n');
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Truncate content to max lines
|
|
139
|
+
*/
|
|
140
|
+
truncateContent(content, maxLines) {
|
|
141
|
+
if (!maxLines) {
|
|
142
|
+
return content;
|
|
143
|
+
}
|
|
144
|
+
const lines = content.split('\n');
|
|
145
|
+
if (lines.length <= maxLines) {
|
|
146
|
+
return content;
|
|
147
|
+
}
|
|
148
|
+
return lines.slice(0, maxLines).join('\n') + `\n\n... (${lines.length - maxLines} more lines)`;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Generate summary of all changes
|
|
152
|
+
*/
|
|
153
|
+
generateSummary(previews) {
|
|
154
|
+
const newFiles = previews.filter(p => !p.exists);
|
|
155
|
+
const modifiedFiles = previews.filter(p => p.exists && p.changes?.modified);
|
|
156
|
+
const unchangedFiles = previews.filter(p => p.exists && !p.changes?.modified);
|
|
157
|
+
const parts = [];
|
|
158
|
+
if (newFiles.length > 0) {
|
|
159
|
+
parts.push(`✨ ${newFiles.length} new file(s)`);
|
|
160
|
+
}
|
|
161
|
+
if (modifiedFiles.length > 0) {
|
|
162
|
+
parts.push(`📝 ${modifiedFiles.length} modified file(s)`);
|
|
163
|
+
}
|
|
164
|
+
if (unchangedFiles.length > 0) {
|
|
165
|
+
parts.push(`✓ ${unchangedFiles.length} unchanged file(s)`);
|
|
166
|
+
}
|
|
167
|
+
// Calculate total changes
|
|
168
|
+
const totalAdded = previews.reduce((sum, p) => sum + (p.changes?.added || 0), 0);
|
|
169
|
+
const totalRemoved = previews.reduce((sum, p) => sum + (p.changes?.removed || 0), 0);
|
|
170
|
+
if (totalAdded > 0 || totalRemoved > 0) {
|
|
171
|
+
parts.push('');
|
|
172
|
+
parts.push(`Lines: +${totalAdded} -${totalRemoved}`);
|
|
173
|
+
}
|
|
174
|
+
return parts.join('\n');
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Interactive confirmation after preview
|
|
178
|
+
*/
|
|
179
|
+
async confirmChanges() {
|
|
180
|
+
const confirmed = await prompts.confirm({
|
|
181
|
+
message: 'Apply these changes?',
|
|
182
|
+
initialValue: true,
|
|
183
|
+
});
|
|
184
|
+
if (prompts.isCancel(confirmed)) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
return confirmed;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Preview project analysis results
|
|
191
|
+
*/
|
|
192
|
+
static async previewProjectInfo(projectInfo) {
|
|
193
|
+
prompts.intro('Project Analysis');
|
|
194
|
+
const info = [
|
|
195
|
+
`Name: ${projectInfo.name}`,
|
|
196
|
+
`Type: ${projectInfo.projectType}`,
|
|
197
|
+
`Language: ${projectInfo.primaryLanguage}`,
|
|
198
|
+
projectInfo.techStack.length > 0 ? `Stack: ${projectInfo.techStack.join(', ')}` : '',
|
|
199
|
+
projectInfo.entryPoint ? `Entry: ${projectInfo.entryPoint}` : '',
|
|
200
|
+
projectInfo.packageManager ? `Package Manager: ${projectInfo.packageManager}` : '',
|
|
201
|
+
].filter(Boolean).join('\n');
|
|
202
|
+
await prompts.note(info, 'Detected');
|
|
203
|
+
if (projectInfo.directories && Object.keys(projectInfo.directories).length > 0) {
|
|
204
|
+
const dirs = Object.entries(projectInfo.directories)
|
|
205
|
+
.map(([key, value]) => `${key}: ${value}`)
|
|
206
|
+
.join('\n');
|
|
207
|
+
await prompts.note(dirs, 'Directories');
|
|
208
|
+
}
|
|
209
|
+
if (projectInfo.conventions && Object.keys(projectInfo.conventions).length > 0) {
|
|
210
|
+
const conventions = Object.entries(projectInfo.conventions)
|
|
211
|
+
.map(([key, value]) => `${key}: ${value}`)
|
|
212
|
+
.join('\n');
|
|
213
|
+
await prompts.note(conventions, 'Conventions');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=init-previewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-previewer.js","sourceRoot":"","sources":["../../src/utils/init-previewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for init command
|
|
3
|
+
*/
|
|
4
|
+
import type { ProjectInfo } from '../types/project-analysis.js';
|
|
5
|
+
export interface ValidationResult {
|
|
6
|
+
valid: boolean;
|
|
7
|
+
warnings: string[];
|
|
8
|
+
errors: string[];
|
|
9
|
+
suggestions: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface ValidationChecks {
|
|
12
|
+
hasPackageJson?: boolean;
|
|
13
|
+
hasGitRepo?: boolean;
|
|
14
|
+
hasExistingConfig?: boolean;
|
|
15
|
+
hasValidStructure?: boolean;
|
|
16
|
+
hasMinimumFiles?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class InitValidator {
|
|
19
|
+
private projectRoot;
|
|
20
|
+
constructor(projectRoot: string);
|
|
21
|
+
/**
|
|
22
|
+
* Run all validation checks
|
|
23
|
+
*/
|
|
24
|
+
validate(projectInfo?: ProjectInfo): ValidationResult;
|
|
25
|
+
/**
|
|
26
|
+
* Check for package.json
|
|
27
|
+
*/
|
|
28
|
+
private checkPackageJson;
|
|
29
|
+
/**
|
|
30
|
+
* Check for git repository
|
|
31
|
+
*/
|
|
32
|
+
private checkGitRepo;
|
|
33
|
+
/**
|
|
34
|
+
* Check for existing AX CLI configuration
|
|
35
|
+
*/
|
|
36
|
+
private checkExistingConfig;
|
|
37
|
+
/**
|
|
38
|
+
* Check project structure
|
|
39
|
+
*/
|
|
40
|
+
private checkProjectStructure;
|
|
41
|
+
/**
|
|
42
|
+
* Check for minimum files
|
|
43
|
+
*/
|
|
44
|
+
private checkMinimumFiles;
|
|
45
|
+
/**
|
|
46
|
+
* Validate project info
|
|
47
|
+
*/
|
|
48
|
+
private validateProjectInfo;
|
|
49
|
+
/**
|
|
50
|
+
* Validate custom instructions content
|
|
51
|
+
*/
|
|
52
|
+
static validateCustomInstructions(content: string): ValidationResult;
|
|
53
|
+
/**
|
|
54
|
+
* Check if force flag is needed
|
|
55
|
+
*/
|
|
56
|
+
needsForceFlag(): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get validation summary string
|
|
59
|
+
*/
|
|
60
|
+
static formatValidationResult(result: ValidationResult): string;
|
|
61
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for init command
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { parseJson, parseJsonFile } from './json-utils.js';
|
|
7
|
+
export class InitValidator {
|
|
8
|
+
projectRoot;
|
|
9
|
+
constructor(projectRoot) {
|
|
10
|
+
this.projectRoot = projectRoot;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Run all validation checks
|
|
14
|
+
*/
|
|
15
|
+
validate(projectInfo) {
|
|
16
|
+
const result = {
|
|
17
|
+
valid: true,
|
|
18
|
+
warnings: [],
|
|
19
|
+
errors: [],
|
|
20
|
+
suggestions: [],
|
|
21
|
+
};
|
|
22
|
+
// Check for package.json
|
|
23
|
+
this.checkPackageJson(result);
|
|
24
|
+
// Check for git repository
|
|
25
|
+
this.checkGitRepo(result);
|
|
26
|
+
// Check for existing AX CLI config
|
|
27
|
+
this.checkExistingConfig(result);
|
|
28
|
+
// Check project structure
|
|
29
|
+
this.checkProjectStructure(result);
|
|
30
|
+
// Check if project has minimum files
|
|
31
|
+
this.checkMinimumFiles(result);
|
|
32
|
+
// Validate project info if provided
|
|
33
|
+
if (projectInfo) {
|
|
34
|
+
this.validateProjectInfo(projectInfo, result);
|
|
35
|
+
}
|
|
36
|
+
// Set overall validity
|
|
37
|
+
result.valid = result.errors.length === 0;
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check for package.json
|
|
42
|
+
*/
|
|
43
|
+
checkPackageJson(result) {
|
|
44
|
+
const packageJsonPath = path.join(this.projectRoot, 'package.json');
|
|
45
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
46
|
+
result.warnings.push('No package.json found - may not be a Node.js project');
|
|
47
|
+
result.suggestions.push('Run: npm init (if this is a Node.js project)');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
try {
|
|
51
|
+
const content = fs.readFileSync(packageJsonPath, 'utf-8');
|
|
52
|
+
// Check for empty file
|
|
53
|
+
if (!content || content.trim() === '') {
|
|
54
|
+
result.errors.push('package.json is empty');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const parseResult = parseJson(content);
|
|
58
|
+
if (!parseResult.success) {
|
|
59
|
+
result.errors.push(`Invalid package.json - ${parseResult.error}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const packageJson = parseResult.data;
|
|
63
|
+
// Check if package.json is actually an object
|
|
64
|
+
if (typeof packageJson !== 'object' || packageJson === null) {
|
|
65
|
+
result.errors.push('package.json is not a valid JSON object');
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Check for common issues
|
|
69
|
+
if (!packageJson.name) {
|
|
70
|
+
result.warnings.push('package.json missing "name" field');
|
|
71
|
+
}
|
|
72
|
+
if (!packageJson.version) {
|
|
73
|
+
result.warnings.push('package.json missing "version" field');
|
|
74
|
+
}
|
|
75
|
+
// Check for type: module (ESM)
|
|
76
|
+
if (packageJson.type !== 'module') {
|
|
77
|
+
result.suggestions.push('Consider adding "type": "module" for ESM support');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
result.errors.push(`Invalid package.json - ${error instanceof Error ? error.message : 'File read error'}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check for git repository
|
|
87
|
+
*/
|
|
88
|
+
checkGitRepo(result) {
|
|
89
|
+
const gitDir = path.join(this.projectRoot, '.git');
|
|
90
|
+
if (!fs.existsSync(gitDir)) {
|
|
91
|
+
result.warnings.push('Not a git repository');
|
|
92
|
+
result.suggestions.push('Run: git init (for version control)');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check for existing AX CLI configuration
|
|
97
|
+
*/
|
|
98
|
+
checkExistingConfig(result) {
|
|
99
|
+
const axCliDir = path.join(this.projectRoot, '.ax-cli');
|
|
100
|
+
const customMdPath = path.join(axCliDir, 'CUSTOM.md');
|
|
101
|
+
const indexPath = path.join(axCliDir, 'index.json');
|
|
102
|
+
if (fs.existsSync(customMdPath)) {
|
|
103
|
+
result.warnings.push('Existing CUSTOM.md found - will be overwritten unless --force is used');
|
|
104
|
+
}
|
|
105
|
+
if (fs.existsSync(indexPath)) {
|
|
106
|
+
const parseResult = parseJsonFile(indexPath);
|
|
107
|
+
if (parseResult.success) {
|
|
108
|
+
const indexData = parseResult.data;
|
|
109
|
+
const lastUpdated = indexData.lastAnalyzed || indexData.templateAppliedAt;
|
|
110
|
+
if (lastUpdated) {
|
|
111
|
+
const date = new Date(lastUpdated);
|
|
112
|
+
const daysSince = Math.floor((Date.now() - date.getTime()) / (1000 * 60 * 60 * 24));
|
|
113
|
+
if (daysSince > 30) {
|
|
114
|
+
result.suggestions.push(`CUSTOM.md is ${daysSince} days old - consider refreshing`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
result.warnings.push('Existing index.json is invalid');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check project structure
|
|
125
|
+
*/
|
|
126
|
+
checkProjectStructure(result) {
|
|
127
|
+
const commonDirs = ['src', 'lib', 'dist', 'build', 'test', 'tests', '__tests__'];
|
|
128
|
+
const foundDirs = commonDirs.filter(dir => fs.existsSync(path.join(this.projectRoot, dir)));
|
|
129
|
+
if (foundDirs.length === 0) {
|
|
130
|
+
result.warnings.push('No standard project directories found (src/, lib/, etc.)');
|
|
131
|
+
result.suggestions.push('Project may be empty or have non-standard structure');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check for minimum files
|
|
136
|
+
*/
|
|
137
|
+
checkMinimumFiles(result) {
|
|
138
|
+
try {
|
|
139
|
+
const files = fs.readdirSync(this.projectRoot);
|
|
140
|
+
const nonHiddenFiles = files.filter(f => !f.startsWith('.'));
|
|
141
|
+
if (nonHiddenFiles.length === 0) {
|
|
142
|
+
result.errors.push('Project directory is empty');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (nonHiddenFiles.length === 1 && nonHiddenFiles[0] === 'package.json') {
|
|
146
|
+
result.warnings.push('Project only contains package.json - no source files found');
|
|
147
|
+
result.suggestions.push('Add source files before initializing AX CLI');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
result.errors.push(`Cannot read project directory: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Validate project info
|
|
156
|
+
*/
|
|
157
|
+
validateProjectInfo(projectInfo, result) {
|
|
158
|
+
// Check if project type was detected
|
|
159
|
+
if (projectInfo.projectType === 'unknown' || projectInfo.projectType === 'application') {
|
|
160
|
+
result.warnings.push('Could not determine specific project type');
|
|
161
|
+
result.suggestions.push('Consider using a template: ax-cli init --template <type>');
|
|
162
|
+
}
|
|
163
|
+
// Check if primary language was detected
|
|
164
|
+
if (projectInfo.primaryLanguage === 'Unknown') {
|
|
165
|
+
result.warnings.push('Could not determine primary programming language');
|
|
166
|
+
}
|
|
167
|
+
// Check if tech stack was detected
|
|
168
|
+
if (projectInfo.techStack.length === 0) {
|
|
169
|
+
result.warnings.push('No tech stack detected');
|
|
170
|
+
result.suggestions.push('Ensure package.json has dependencies listed');
|
|
171
|
+
}
|
|
172
|
+
// Check entry point
|
|
173
|
+
if (!projectInfo.entryPoint) {
|
|
174
|
+
result.warnings.push('No entry point detected');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Validate custom instructions content
|
|
179
|
+
*/
|
|
180
|
+
static validateCustomInstructions(content) {
|
|
181
|
+
const result = {
|
|
182
|
+
valid: true,
|
|
183
|
+
warnings: [],
|
|
184
|
+
errors: [],
|
|
185
|
+
suggestions: [],
|
|
186
|
+
};
|
|
187
|
+
// Check minimum length
|
|
188
|
+
if (content.length < 100) {
|
|
189
|
+
result.errors.push('CUSTOM.md is too short (< 100 characters)');
|
|
190
|
+
}
|
|
191
|
+
// Check for required sections
|
|
192
|
+
const requiredSections = [
|
|
193
|
+
'## 🎯 Critical Rules',
|
|
194
|
+
'## 📋 Project Overview',
|
|
195
|
+
'## 🔧 Code Patterns',
|
|
196
|
+
];
|
|
197
|
+
for (const section of requiredSections) {
|
|
198
|
+
if (!content.includes(section)) {
|
|
199
|
+
result.warnings.push(`Missing recommended section: ${section}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Check token count (rough estimate)
|
|
203
|
+
const estimatedTokens = Math.ceil(content.length / 4);
|
|
204
|
+
if (estimatedTokens > 2000) {
|
|
205
|
+
result.warnings.push(`CUSTOM.md is large (~${estimatedTokens} tokens)`);
|
|
206
|
+
result.suggestions.push('Consider using template imports or reducing content');
|
|
207
|
+
}
|
|
208
|
+
// Check for common issues
|
|
209
|
+
if (content.includes('TODO') || content.includes('FIXME')) {
|
|
210
|
+
result.warnings.push('CUSTOM.md contains TODO/FIXME markers');
|
|
211
|
+
}
|
|
212
|
+
if (content.includes('__placeholder__') || content.includes('<insert')) {
|
|
213
|
+
result.errors.push('CUSTOM.md contains placeholder text');
|
|
214
|
+
}
|
|
215
|
+
result.valid = result.errors.length === 0;
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Check if force flag is needed
|
|
220
|
+
*/
|
|
221
|
+
needsForceFlag() {
|
|
222
|
+
const customMdPath = path.join(this.projectRoot, '.ax-cli', 'CUSTOM.md');
|
|
223
|
+
return fs.existsSync(customMdPath);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get validation summary string
|
|
227
|
+
*/
|
|
228
|
+
static formatValidationResult(result) {
|
|
229
|
+
const parts = [];
|
|
230
|
+
if (result.errors.length > 0) {
|
|
231
|
+
parts.push('❌ Errors:');
|
|
232
|
+
result.errors.forEach(e => parts.push(` - ${e}`));
|
|
233
|
+
}
|
|
234
|
+
if (result.warnings.length > 0) {
|
|
235
|
+
parts.push('⚠️ Warnings:');
|
|
236
|
+
result.warnings.forEach(w => parts.push(` - ${w}`));
|
|
237
|
+
}
|
|
238
|
+
if (result.suggestions.length > 0) {
|
|
239
|
+
parts.push('💡 Suggestions:');
|
|
240
|
+
result.suggestions.forEach(s => parts.push(` - ${s}`));
|
|
241
|
+
}
|
|
242
|
+
if (result.valid && result.warnings.length === 0 && result.suggestions.length === 0) {
|
|
243
|
+
parts.push('✅ All validation checks passed');
|
|
244
|
+
}
|
|
245
|
+
return parts.join('\n');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=init-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-validator.js","sourceRoot":"","sources":["../../src/utils/init-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAiB3D,MAAM,OAAO,aAAa;IAChB,WAAW,CAAS;IAE5B,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,WAAyB;QAChC,MAAM,MAAM,GAAqB;YAC/B,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE;SAChB,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE9B,2BAA2B;QAC3B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE1B,mCAAmC;QACnC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjC,0BAA0B;QAC1B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAEnC,qCAAqC;QACrC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE/B,oCAAoC;QACpC,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAED,uBAAuB;QACvB,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAE1C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,MAAwB;QAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAEpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YAC7E,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAE1D,uBAAuB;gBACvB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBAED,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;oBAClE,OAAO;gBACT,CAAC;gBAED,MAAM,WAAW,GAAG,WAAW,CAAC,IAAW,CAAC;gBAE5C,8CAA8C;gBAC9C,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;oBAC5D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;oBAC9D,OAAO;gBACT,CAAC;gBAED,0BAA0B;gBAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;oBACtB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBAC5D,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBAC/D,CAAC;gBAED,+BAA+B;gBAC/B,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAClC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,MAAwB;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,MAAwB;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEpD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QAChG,CAAC;QAED,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAW,CAAC;gBAC1C,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,iBAAiB,CAAC;gBAE1E,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;oBACnC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBAEpF,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;wBACnB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,SAAS,iCAAiC,CAAC,CAAC;oBACtF,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,MAAwB;QACpD,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAChD,CAAC;QAEF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YACjF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,MAAwB;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAE7D,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,cAAc,EAAE,CAAC;gBACxE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;gBACnF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,WAAwB,EAAE,MAAwB;QAC5E,qCAAqC;QACrC,IAAI,WAAW,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,WAAW,KAAK,aAAa,EAAE,CAAC;YACvF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAClE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACtF,CAAC;QAED,yCAAyC;QACzC,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAC3E,CAAC;QAED,mCAAmC;QACnC,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC/C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACzE,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,0BAA0B,CAAC,OAAe;QAC/C,MAAM,MAAM,GAAqB;YAC/B,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE;SAChB,CAAC;QAEF,uBAAuB;QACvB,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAClE,CAAC;QAED,8BAA8B;QAC9B,MAAM,gBAAgB,GAAG;YACvB,sBAAsB;YACtB,wBAAwB;YACxB,qBAAqB;SACtB,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtD,IAAI,eAAe,GAAG,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,eAAe,UAAU,CAAC,CAAC;YACxE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACjF,CAAC;QAED,0BAA0B;QAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAE1C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACzE,OAAO,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAwB;QACpD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpF,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
|