@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
@@ -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
- const errorMessage = error instanceof Error ? error.message : String(error);
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 instanceof Error ? error.message : 'Invalid JSON',
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,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,OAAO,IAAI,QAAQ,KAAK,SAAS,YAAY,YAAY,EAAE,CAAC;AAC9D,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;;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,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;SAC/D,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"}
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"}