@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,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Manager for AX CLI
|
|
3
|
+
* Manages project templates including built-in and user-created templates
|
|
4
|
+
*/
|
|
5
|
+
import { type ProjectTemplate } from '../schemas/index.js';
|
|
6
|
+
import type { TemplateListItem, TemplateCreateOptions } from '../types/template.js';
|
|
7
|
+
export declare class TemplateManager {
|
|
8
|
+
private static readonly BUILTIN_TEMPLATES_DIR;
|
|
9
|
+
private static readonly USER_TEMPLATES_DIR;
|
|
10
|
+
/**
|
|
11
|
+
* Ensure user templates directory exists
|
|
12
|
+
*/
|
|
13
|
+
private static ensureUserTemplatesDir;
|
|
14
|
+
/**
|
|
15
|
+
* List all available templates (built-in + user)
|
|
16
|
+
*/
|
|
17
|
+
static listTemplates(): TemplateListItem[];
|
|
18
|
+
/**
|
|
19
|
+
* Get a specific template by ID
|
|
20
|
+
*/
|
|
21
|
+
static getTemplate(templateId: string): ProjectTemplate | null;
|
|
22
|
+
/**
|
|
23
|
+
* Load and validate a template from file
|
|
24
|
+
*/
|
|
25
|
+
private static loadTemplate;
|
|
26
|
+
/**
|
|
27
|
+
* Save a user template
|
|
28
|
+
*/
|
|
29
|
+
static saveTemplate(template: ProjectTemplate): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Generate a unique template ID
|
|
32
|
+
*/
|
|
33
|
+
private static generateUniqueId;
|
|
34
|
+
/**
|
|
35
|
+
* Create a new template from current project
|
|
36
|
+
*/
|
|
37
|
+
static createFromProject(projectRoot: string, options: TemplateCreateOptions): ProjectTemplate;
|
|
38
|
+
/**
|
|
39
|
+
* Delete a user template
|
|
40
|
+
*/
|
|
41
|
+
static deleteTemplate(templateId: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Export a template to a file (with atomic write)
|
|
44
|
+
*/
|
|
45
|
+
static exportTemplate(templateId: string, outputPath: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Import a template from a file
|
|
48
|
+
*/
|
|
49
|
+
static importTemplate(filePath: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Apply a template to a project directory
|
|
52
|
+
*/
|
|
53
|
+
static applyTemplate(template: ProjectTemplate, projectRoot: string): boolean;
|
|
54
|
+
}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Manager for AX CLI
|
|
3
|
+
* Manages project templates including built-in and user-created templates
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as os from 'os';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { safeValidateProjectTemplate, ProjectTemplateSchema } from '../schemas/index.js';
|
|
10
|
+
import { parseJsonFile } from './json-utils.js';
|
|
11
|
+
// ESM-compatible __dirname
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = path.dirname(__filename);
|
|
14
|
+
export class TemplateManager {
|
|
15
|
+
static BUILTIN_TEMPLATES_DIR = path.join(__dirname, '../../templates');
|
|
16
|
+
static USER_TEMPLATES_DIR = path.join(os.homedir(), '.ax-cli', 'templates');
|
|
17
|
+
/**
|
|
18
|
+
* Ensure user templates directory exists
|
|
19
|
+
*/
|
|
20
|
+
static ensureUserTemplatesDir() {
|
|
21
|
+
if (!fs.existsSync(this.USER_TEMPLATES_DIR)) {
|
|
22
|
+
fs.mkdirSync(this.USER_TEMPLATES_DIR, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* List all available templates (built-in + user)
|
|
27
|
+
*/
|
|
28
|
+
static listTemplates() {
|
|
29
|
+
const templates = [];
|
|
30
|
+
// Load built-in templates
|
|
31
|
+
if (fs.existsSync(this.BUILTIN_TEMPLATES_DIR)) {
|
|
32
|
+
const builtinFiles = fs.readdirSync(this.BUILTIN_TEMPLATES_DIR)
|
|
33
|
+
.filter(f => f.endsWith('.json'));
|
|
34
|
+
for (const file of builtinFiles) {
|
|
35
|
+
try {
|
|
36
|
+
const templatePath = path.join(this.BUILTIN_TEMPLATES_DIR, file);
|
|
37
|
+
const template = this.loadTemplate(templatePath);
|
|
38
|
+
if (template) {
|
|
39
|
+
templates.push({
|
|
40
|
+
id: template.id,
|
|
41
|
+
name: template.name,
|
|
42
|
+
description: template.description,
|
|
43
|
+
projectType: template.projectType,
|
|
44
|
+
tags: template.tags,
|
|
45
|
+
isBuiltIn: true,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// Skip invalid templates
|
|
51
|
+
console.warn(`Failed to load built-in template ${file}:`, error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Load user templates
|
|
56
|
+
this.ensureUserTemplatesDir();
|
|
57
|
+
const userFiles = fs.readdirSync(this.USER_TEMPLATES_DIR)
|
|
58
|
+
.filter(f => f.endsWith('.json'));
|
|
59
|
+
for (const file of userFiles) {
|
|
60
|
+
try {
|
|
61
|
+
const templatePath = path.join(this.USER_TEMPLATES_DIR, file);
|
|
62
|
+
const template = this.loadTemplate(templatePath);
|
|
63
|
+
if (template) {
|
|
64
|
+
templates.push({
|
|
65
|
+
id: template.id,
|
|
66
|
+
name: template.name,
|
|
67
|
+
description: template.description,
|
|
68
|
+
projectType: template.projectType,
|
|
69
|
+
tags: template.tags,
|
|
70
|
+
isBuiltIn: false,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// Skip invalid templates
|
|
76
|
+
console.warn(`Failed to load user template ${file}:`, error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return templates;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get a specific template by ID
|
|
83
|
+
*/
|
|
84
|
+
static getTemplate(templateId) {
|
|
85
|
+
// Check built-in templates first
|
|
86
|
+
const builtinPath = path.join(this.BUILTIN_TEMPLATES_DIR, `${templateId}.json`);
|
|
87
|
+
if (fs.existsSync(builtinPath)) {
|
|
88
|
+
return this.loadTemplate(builtinPath);
|
|
89
|
+
}
|
|
90
|
+
// Check user templates
|
|
91
|
+
this.ensureUserTemplatesDir();
|
|
92
|
+
const userPath = path.join(this.USER_TEMPLATES_DIR, `${templateId}.json`);
|
|
93
|
+
if (fs.existsSync(userPath)) {
|
|
94
|
+
return this.loadTemplate(userPath);
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Load and validate a template from file
|
|
100
|
+
*/
|
|
101
|
+
static loadTemplate(filePath) {
|
|
102
|
+
try {
|
|
103
|
+
const result = parseJsonFile(filePath, ProjectTemplateSchema);
|
|
104
|
+
if (result.success) {
|
|
105
|
+
return result.data;
|
|
106
|
+
}
|
|
107
|
+
console.warn(`Invalid template at ${filePath}:`, result.error);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.warn(`Failed to load template at ${filePath}:`, error);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Save a user template
|
|
117
|
+
*/
|
|
118
|
+
static saveTemplate(template) {
|
|
119
|
+
try {
|
|
120
|
+
// Only save user templates (not built-in)
|
|
121
|
+
if (template.isBuiltIn) {
|
|
122
|
+
console.error('Cannot modify built-in templates');
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
this.ensureUserTemplatesDir();
|
|
126
|
+
const templatePath = path.join(this.USER_TEMPLATES_DIR, `${template.id}.json`);
|
|
127
|
+
// Validate template before saving
|
|
128
|
+
const result = safeValidateProjectTemplate(template);
|
|
129
|
+
if (!result.success) {
|
|
130
|
+
console.error('Invalid template data:', result.error);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
// Atomic write using temporary file
|
|
134
|
+
const tmpPath = `${templatePath}.tmp`;
|
|
135
|
+
try {
|
|
136
|
+
fs.writeFileSync(tmpPath, JSON.stringify(template, null, 2), 'utf-8');
|
|
137
|
+
fs.renameSync(tmpPath, templatePath); // Atomic operation on POSIX systems
|
|
138
|
+
}
|
|
139
|
+
catch (writeError) {
|
|
140
|
+
// Cleanup temp file on error
|
|
141
|
+
if (fs.existsSync(tmpPath)) {
|
|
142
|
+
try {
|
|
143
|
+
fs.unlinkSync(tmpPath);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Ignore cleanup errors
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw writeError;
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Failed to save template:', error);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Generate a unique template ID
|
|
160
|
+
*/
|
|
161
|
+
static generateUniqueId(name) {
|
|
162
|
+
const MAX_ATTEMPTS = 1000;
|
|
163
|
+
let baseId = name.toLowerCase()
|
|
164
|
+
.replace(/\s+/g, '-')
|
|
165
|
+
.replace(/[^a-z0-9-]/g, '')
|
|
166
|
+
.substring(0, 50); // Limit base ID length
|
|
167
|
+
if (!baseId) {
|
|
168
|
+
baseId = 'template'; // Fallback for empty names
|
|
169
|
+
}
|
|
170
|
+
let id = baseId;
|
|
171
|
+
let counter = 1;
|
|
172
|
+
while (this.getTemplate(id)) {
|
|
173
|
+
if (counter >= MAX_ATTEMPTS) {
|
|
174
|
+
// Use timestamp + random string to ensure uniqueness
|
|
175
|
+
const randomSuffix = Math.random().toString(36).substring(2, 9);
|
|
176
|
+
id = `${baseId}-${Date.now()}-${randomSuffix}`;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
id = `${baseId}-${counter++}`;
|
|
180
|
+
}
|
|
181
|
+
// Final verification
|
|
182
|
+
if (this.getTemplate(id)) {
|
|
183
|
+
throw new Error('Failed to generate unique template ID after maximum attempts');
|
|
184
|
+
}
|
|
185
|
+
return id;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create a new template from current project
|
|
189
|
+
*/
|
|
190
|
+
static createFromProject(projectRoot, options) {
|
|
191
|
+
const customMdPath = path.join(projectRoot, '.ax-cli', 'CUSTOM.md');
|
|
192
|
+
const indexPath = path.join(projectRoot, '.ax-cli', 'index.json');
|
|
193
|
+
// Load existing instructions if available
|
|
194
|
+
let instructions = '';
|
|
195
|
+
if (fs.existsSync(customMdPath)) {
|
|
196
|
+
instructions = fs.readFileSync(customMdPath, 'utf-8');
|
|
197
|
+
}
|
|
198
|
+
// Validate instructions are non-empty
|
|
199
|
+
if (!instructions || instructions.trim().length === 0) {
|
|
200
|
+
throw new Error('Cannot create template: CUSTOM.md is empty. ' +
|
|
201
|
+
'Run "ax-cli init" first to generate custom instructions.');
|
|
202
|
+
}
|
|
203
|
+
// Validate minimum length
|
|
204
|
+
if (instructions.trim().length < 100) {
|
|
205
|
+
throw new Error('Cannot create template: CUSTOM.md is too short (< 100 characters). ' +
|
|
206
|
+
'Ensure the file contains meaningful instructions.');
|
|
207
|
+
}
|
|
208
|
+
// Load existing metadata if available
|
|
209
|
+
let metadata = {};
|
|
210
|
+
if (fs.existsSync(indexPath)) {
|
|
211
|
+
const result = parseJsonFile(indexPath);
|
|
212
|
+
if (result.success) {
|
|
213
|
+
const indexData = result.data;
|
|
214
|
+
metadata = {
|
|
215
|
+
conventions: indexData.conventions,
|
|
216
|
+
scripts: indexData.scripts,
|
|
217
|
+
directories: indexData.directories,
|
|
218
|
+
keyFiles: indexData.keyFiles,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// Use empty metadata if index.json is invalid
|
|
222
|
+
}
|
|
223
|
+
const template = {
|
|
224
|
+
id: this.generateUniqueId(options.name),
|
|
225
|
+
name: options.name,
|
|
226
|
+
description: options.description,
|
|
227
|
+
version: '1.0.0',
|
|
228
|
+
projectType: options.projectType,
|
|
229
|
+
tags: options.tags || [],
|
|
230
|
+
instructions,
|
|
231
|
+
metadata,
|
|
232
|
+
createdAt: new Date().toISOString(),
|
|
233
|
+
isBuiltIn: false,
|
|
234
|
+
author: options.author,
|
|
235
|
+
};
|
|
236
|
+
return template;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Delete a user template
|
|
240
|
+
*/
|
|
241
|
+
static deleteTemplate(templateId) {
|
|
242
|
+
try {
|
|
243
|
+
const template = this.getTemplate(templateId);
|
|
244
|
+
if (!template) {
|
|
245
|
+
console.error(`Template '${templateId}' not found`);
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
if (template.isBuiltIn) {
|
|
249
|
+
console.error('Cannot delete built-in templates');
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
const userPath = path.join(this.USER_TEMPLATES_DIR, `${templateId}.json`);
|
|
253
|
+
fs.unlinkSync(userPath);
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
console.error('Failed to delete template:', error);
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Export a template to a file (with atomic write)
|
|
263
|
+
*/
|
|
264
|
+
static exportTemplate(templateId, outputPath) {
|
|
265
|
+
try {
|
|
266
|
+
const template = this.getTemplate(templateId);
|
|
267
|
+
if (!template) {
|
|
268
|
+
console.error(`Template '${templateId}' not found`);
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
// Atomic write using temporary file
|
|
272
|
+
const tmpPath = `${outputPath}.tmp`;
|
|
273
|
+
try {
|
|
274
|
+
fs.writeFileSync(tmpPath, JSON.stringify(template, null, 2), 'utf-8');
|
|
275
|
+
fs.renameSync(tmpPath, outputPath); // Atomic operation
|
|
276
|
+
}
|
|
277
|
+
catch (writeError) {
|
|
278
|
+
// Cleanup temp file on error
|
|
279
|
+
if (fs.existsSync(tmpPath)) {
|
|
280
|
+
try {
|
|
281
|
+
fs.unlinkSync(tmpPath);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// Ignore cleanup errors
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
throw writeError;
|
|
288
|
+
}
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
console.error('Failed to export template:', error);
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Import a template from a file
|
|
298
|
+
*/
|
|
299
|
+
static importTemplate(filePath) {
|
|
300
|
+
try {
|
|
301
|
+
// Validate path to prevent directory traversal attacks
|
|
302
|
+
const resolvedPath = path.resolve(filePath);
|
|
303
|
+
// Check if path is absolute
|
|
304
|
+
if (!path.isAbsolute(resolvedPath)) {
|
|
305
|
+
console.error('Invalid file path - must be absolute');
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
// Ensure path is within safe directories (home or cwd)
|
|
309
|
+
const userHome = os.homedir();
|
|
310
|
+
const cwd = process.cwd();
|
|
311
|
+
const isInHome = resolvedPath.startsWith(userHome);
|
|
312
|
+
const isInCwd = resolvedPath.startsWith(cwd);
|
|
313
|
+
if (!isInHome && !isInCwd) {
|
|
314
|
+
console.error('Template must be in home directory or current directory');
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
// Prevent access to sensitive files
|
|
318
|
+
const sensitivePatterns = [
|
|
319
|
+
/\.ssh/i,
|
|
320
|
+
/\.gnupg/i,
|
|
321
|
+
/password/i,
|
|
322
|
+
/secret/i,
|
|
323
|
+
/\.env/i,
|
|
324
|
+
/id_rsa/i,
|
|
325
|
+
/\.pem$/i,
|
|
326
|
+
/\.key$/i,
|
|
327
|
+
];
|
|
328
|
+
const basename = path.basename(resolvedPath);
|
|
329
|
+
if (sensitivePatterns.some(pattern => pattern.test(basename))) {
|
|
330
|
+
console.error('Cannot import sensitive files');
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
// Ensure file has .json extension
|
|
334
|
+
if (path.extname(resolvedPath) !== '.json') {
|
|
335
|
+
console.error('Template file must have .json extension');
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
// Ensure file exists and is readable
|
|
339
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
340
|
+
console.error(`File not found: ${resolvedPath}`);
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
// Ensure it's a file, not a directory
|
|
344
|
+
const stats = fs.statSync(resolvedPath);
|
|
345
|
+
if (!stats.isFile()) {
|
|
346
|
+
console.error('Path must be a file, not a directory');
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
// Check file size to prevent DOS
|
|
350
|
+
const MAX_TEMPLATE_SIZE = 10 * 1024 * 1024; // 10MB
|
|
351
|
+
if (stats.size > MAX_TEMPLATE_SIZE) {
|
|
352
|
+
console.error(`Template file too large: ${(stats.size / 1024 / 1024).toFixed(2)}MB (max: 10MB)`);
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
const template = this.loadTemplate(resolvedPath);
|
|
356
|
+
if (!template) {
|
|
357
|
+
console.error('Invalid template file');
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
// Force as user template (not built-in)
|
|
361
|
+
template.isBuiltIn = false;
|
|
362
|
+
return this.saveTemplate(template);
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
console.error('Failed to import template:', error);
|
|
366
|
+
return false;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Apply a template to a project directory
|
|
371
|
+
*/
|
|
372
|
+
static applyTemplate(template, projectRoot) {
|
|
373
|
+
try {
|
|
374
|
+
const axCliDir = path.join(projectRoot, '.ax-cli');
|
|
375
|
+
if (!fs.existsSync(axCliDir)) {
|
|
376
|
+
fs.mkdirSync(axCliDir, { recursive: true });
|
|
377
|
+
}
|
|
378
|
+
// Write CUSTOM.md using atomic operation
|
|
379
|
+
const customMdPath = path.join(axCliDir, 'CUSTOM.md');
|
|
380
|
+
const tmpCustomPath = `${customMdPath}.tmp`;
|
|
381
|
+
// Write index.json with template metadata
|
|
382
|
+
const indexPath = path.join(axCliDir, 'index.json');
|
|
383
|
+
const tmpIndexPath = `${indexPath}.tmp`;
|
|
384
|
+
const indexData = {
|
|
385
|
+
projectName: template.name,
|
|
386
|
+
version: template.version,
|
|
387
|
+
projectType: template.projectType,
|
|
388
|
+
...template.metadata,
|
|
389
|
+
templateId: template.id,
|
|
390
|
+
templateAppliedAt: new Date().toISOString(),
|
|
391
|
+
};
|
|
392
|
+
try {
|
|
393
|
+
// Write to temp files first
|
|
394
|
+
fs.writeFileSync(tmpCustomPath, template.instructions, 'utf-8');
|
|
395
|
+
fs.writeFileSync(tmpIndexPath, JSON.stringify(indexData, null, 2), 'utf-8');
|
|
396
|
+
// Atomic rename
|
|
397
|
+
fs.renameSync(tmpCustomPath, customMdPath);
|
|
398
|
+
fs.renameSync(tmpIndexPath, indexPath);
|
|
399
|
+
}
|
|
400
|
+
catch (writeError) {
|
|
401
|
+
// Cleanup temp files on error
|
|
402
|
+
try {
|
|
403
|
+
if (fs.existsSync(tmpCustomPath))
|
|
404
|
+
fs.unlinkSync(tmpCustomPath);
|
|
405
|
+
if (fs.existsSync(tmpIndexPath))
|
|
406
|
+
fs.unlinkSync(tmpIndexPath);
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
// Ignore cleanup errors
|
|
410
|
+
}
|
|
411
|
+
throw writeError;
|
|
412
|
+
}
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
console.error('Failed to apply template:', error);
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=template-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-manager.js","sourceRoot":"","sources":["../../src/utils/template-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/text-utils.js
CHANGED
|
@@ -181,9 +181,11 @@ export function deleteCharAfter(text, position) {
|
|
|
181
181
|
*/
|
|
182
182
|
export function insertText(text, position, insert) {
|
|
183
183
|
const newText = text.slice(0, position) + insert + text.slice(position);
|
|
184
|
+
// Use grapheme-aware length for correct cursor position with emoji/Unicode
|
|
185
|
+
const insertGraphemes = [...insert].length;
|
|
184
186
|
return {
|
|
185
187
|
text: newText,
|
|
186
|
-
position: position +
|
|
188
|
+
position: position + insertGraphemes,
|
|
187
189
|
};
|
|
188
190
|
}
|
|
189
191
|
//# sourceMappingURL=text-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-utils.js","sourceRoot":"","sources":["../../src/utils/text-utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"text-utils.js","sourceRoot":"","sources":["../../src/utils/text-utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defai.digital/ax-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Enterprise-Class AI Command Line Interface - Primary support for GLM (General Language Model) with multi-provider AI orchestration powered by AutomatosX.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"workspaces": [
|
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
"license": "MIT",
|
|
66
66
|
"dependencies": {
|
|
67
67
|
"@ax-cli/schemas": "npm:@defai.digital/ax-cli-schemas@^1.0.0",
|
|
68
|
+
"@clack/prompts": "^0.11.0",
|
|
68
69
|
"@modelcontextprotocol/sdk": "^1.17.0",
|
|
69
70
|
"axios": "^1.7.0",
|
|
70
71
|
"cfonts": "^3.3.0",
|
package/vitest.config.ts
CHANGED
|
@@ -4,6 +4,11 @@ export default defineConfig({
|
|
|
4
4
|
test: {
|
|
5
5
|
globals: true,
|
|
6
6
|
environment: 'node',
|
|
7
|
+
exclude: [
|
|
8
|
+
'**/node_modules/**',
|
|
9
|
+
'**/dist/**',
|
|
10
|
+
'**/vscode-extension/**', // VSCode extension has its own test setup
|
|
11
|
+
],
|
|
7
12
|
coverage: {
|
|
8
13
|
provider: 'v8',
|
|
9
14
|
reporter: ['text', 'json', 'html', 'json-summary'],
|
|
@@ -14,6 +19,7 @@ export default defineConfig({
|
|
|
14
19
|
'**/*.config.*',
|
|
15
20
|
'**/mockData',
|
|
16
21
|
'tests/',
|
|
22
|
+
'vscode-extension/', // Exclude from coverage
|
|
17
23
|
],
|
|
18
24
|
},
|
|
19
25
|
},
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { UserSettings, ProjectSettings } from './settings-manager.js';
|
|
2
|
-
export interface ModelOption {
|
|
3
|
-
model: string;
|
|
4
|
-
}
|
|
5
|
-
export type ModelConfig = string;
|
|
6
|
-
export { UserSettings, ProjectSettings };
|
|
7
|
-
/**
|
|
8
|
-
* Get the effective current model
|
|
9
|
-
* Priority: project current model > user default model > system default
|
|
10
|
-
*/
|
|
11
|
-
export declare function getCurrentModel(): string;
|
|
12
|
-
/**
|
|
13
|
-
* Load model configuration
|
|
14
|
-
* Priority: user-settings.json models > default hardcoded
|
|
15
|
-
*/
|
|
16
|
-
export declare function loadModelConfig(): ModelOption[];
|
|
17
|
-
/**
|
|
18
|
-
* Get default models list
|
|
19
|
-
*/
|
|
20
|
-
export declare function getDefaultModels(): string[];
|
|
21
|
-
/**
|
|
22
|
-
* Update the current model in project settings
|
|
23
|
-
*/
|
|
24
|
-
export declare function updateCurrentModel(modelName: string): void;
|
|
25
|
-
/**
|
|
26
|
-
* Update the user's default model preference
|
|
27
|
-
*/
|
|
28
|
-
export declare function updateDefaultModel(modelName: string): void;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { getSettingsManager } from './settings-manager.js';
|
|
2
|
-
import { ModelIdSchema } from '@ax-cli/schemas';
|
|
3
|
-
/**
|
|
4
|
-
* Get the effective current model
|
|
5
|
-
* Priority: project current model > user default model > system default
|
|
6
|
-
*/
|
|
7
|
-
export function getCurrentModel() {
|
|
8
|
-
const manager = getSettingsManager();
|
|
9
|
-
return manager.getCurrentModel();
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Load model configuration
|
|
13
|
-
* Priority: user-settings.json models > default hardcoded
|
|
14
|
-
*/
|
|
15
|
-
export function loadModelConfig() {
|
|
16
|
-
const manager = getSettingsManager();
|
|
17
|
-
const models = manager.getAvailableModels();
|
|
18
|
-
return models.map(model => ({
|
|
19
|
-
model: model.trim()
|
|
20
|
-
}));
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Get default models list
|
|
24
|
-
*/
|
|
25
|
-
export function getDefaultModels() {
|
|
26
|
-
const manager = getSettingsManager();
|
|
27
|
-
return manager.getAvailableModels();
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Update the current model in project settings
|
|
31
|
-
*/
|
|
32
|
-
export function updateCurrentModel(modelName) {
|
|
33
|
-
const manager = getSettingsManager();
|
|
34
|
-
manager.setCurrentModel(modelName);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Update the user's default model preference
|
|
38
|
-
*/
|
|
39
|
-
export function updateDefaultModel(modelName) {
|
|
40
|
-
const manager = getSettingsManager();
|
|
41
|
-
manager.updateUserSetting('defaultModel', ModelIdSchema.parse(modelName));
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=model-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-config.js","sourceRoot":"","sources":["../../src/utils/model-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAiC,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAWhD;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,OAAO,OAAO,CAAC,eAAe,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAE5C,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;KACpB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,OAAO,OAAO,CAAC,kBAAkB,EAAE,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,OAAO,CAAC,iBAAiB,CAAC,cAAc,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5E,CAAC"}
|