magicpath-ai 1.3.0-beta.2 → 1.3.0-beta.4
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/README.md +63 -8
- package/dist/cli.js +28 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +49 -0
- package/dist/commands/add.js +129 -25
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/auth.js +33 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/clone.js +112 -86
- package/dist/commands/clone.js.map +1 -1
- package/dist/commands/info.d.ts +2 -0
- package/dist/commands/info.js +124 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +280 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/integrate.js +282 -81
- package/dist/commands/integrate.js.map +1 -1
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +138 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/schema.d.ts +2 -0
- package/dist/commands/schema.js +213 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +120 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skills.d.ts +2 -0
- package/dist/commands/skills.js +55 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/view.d.ts +2 -0
- package/dist/commands/view.js +27 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.js +58 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/util/api.d.ts +4 -0
- package/dist/util/api.js +12 -0
- package/dist/util/api.js.map +1 -1
- package/dist/util/auth.js +5 -0
- package/dist/util/auth.js.map +1 -1
- package/dist/util/component.d.ts +8 -8
- package/dist/util/diff.d.ts +4 -0
- package/dist/util/diff.js +11 -3
- package/dist/util/diff.js.map +1 -1
- package/dist/util/integrate.d.ts +13 -2
- package/dist/util/integrate.js +111 -9
- package/dist/util/integrate.js.map +1 -1
- package/dist/util/output.d.ts +14 -0
- package/dist/util/output.js +27 -0
- package/dist/util/output.js.map +1 -0
- package/package.json +3 -2
- package/skills/magicpath-add-component/SKILL.md +49 -0
- package/skills/magicpath-integrate/SKILL.md +50 -0
- package/skills/magicpath-list/SKILL.md +38 -0
- package/skills/magicpath-shared/SKILL.md +34 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { brandSpinner } from '../util/ui.js';
|
|
3
|
+
import { MagicPathError } from '../util/error.js';
|
|
4
|
+
import { getAuthHeaders } from '../util/auth.js';
|
|
5
|
+
import { getUserProjectsUrl, getProjectComponentsUrl } from '../util/api.js';
|
|
6
|
+
import { isJsonMode, jsonResult, jsonError } from '../util/output.js';
|
|
7
|
+
export function registerListCommands(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('list-projects')
|
|
10
|
+
.description('List all projects for the current user')
|
|
11
|
+
.action(async () => {
|
|
12
|
+
const json = isJsonMode();
|
|
13
|
+
try {
|
|
14
|
+
let headers;
|
|
15
|
+
try {
|
|
16
|
+
headers = getAuthHeaders();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new MagicPathError('Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.');
|
|
20
|
+
}
|
|
21
|
+
const spinner = json
|
|
22
|
+
? null
|
|
23
|
+
: brandSpinner('Fetching projects...').start();
|
|
24
|
+
try {
|
|
25
|
+
const response = await axios.get(getUserProjectsUrl(), { headers });
|
|
26
|
+
const projects = response.data.data?.projects ??
|
|
27
|
+
response.data.projects ??
|
|
28
|
+
response.data;
|
|
29
|
+
spinner?.succeed(`Found ${Array.isArray(projects) ? projects.length : 0} project(s)`);
|
|
30
|
+
if (json) {
|
|
31
|
+
jsonResult(projects);
|
|
32
|
+
}
|
|
33
|
+
if (!Array.isArray(projects) || projects.length === 0) {
|
|
34
|
+
console.log('\n No projects found.');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Table output
|
|
38
|
+
console.log('');
|
|
39
|
+
const nameWidth = Math.max(4, ...projects.map((p) => (p.name || '').length));
|
|
40
|
+
console.log(` ${'ID'.padEnd(36)} ${'Name'.padEnd(nameWidth)} Components`);
|
|
41
|
+
console.log(` ${'─'.repeat(36)} ${'─'.repeat(nameWidth)} ${'─'.repeat(10)}`);
|
|
42
|
+
for (const p of projects) {
|
|
43
|
+
const id = String(p.id || '').padEnd(36);
|
|
44
|
+
const name = (p.name || '').padEnd(nameWidth);
|
|
45
|
+
const count = p.componentCount ?? p._count?.components ?? '?';
|
|
46
|
+
console.log(` ${id} ${name} ${count}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
spinner?.fail('Failed to fetch projects');
|
|
51
|
+
if (axios.isAxiosError(err)) {
|
|
52
|
+
if (err.response?.status === 401) {
|
|
53
|
+
throw new MagicPathError('Token is invalid or expired. Run `magicpath-ai login`.');
|
|
54
|
+
}
|
|
55
|
+
throw new MagicPathError(`API error: ${err.response?.status}`);
|
|
56
|
+
}
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (json)
|
|
62
|
+
jsonError(err);
|
|
63
|
+
if (err instanceof MagicPathError) {
|
|
64
|
+
console.error(`\n${err.message}`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
program
|
|
71
|
+
.command('list-components')
|
|
72
|
+
.description('List components in a project')
|
|
73
|
+
.argument('<projectId>', 'The project ID')
|
|
74
|
+
.action(async (projectId) => {
|
|
75
|
+
const json = isJsonMode();
|
|
76
|
+
try {
|
|
77
|
+
let headers;
|
|
78
|
+
try {
|
|
79
|
+
headers = getAuthHeaders();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
throw new MagicPathError('Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.');
|
|
83
|
+
}
|
|
84
|
+
const spinner = json
|
|
85
|
+
? null
|
|
86
|
+
: brandSpinner('Fetching components...').start();
|
|
87
|
+
try {
|
|
88
|
+
const url = `${getProjectComponentsUrl(projectId)}?limit=100&revisionStatus=COMPLETED`;
|
|
89
|
+
const response = await axios.get(url, { headers });
|
|
90
|
+
const components = response.data.data?.components ??
|
|
91
|
+
response.data.components ??
|
|
92
|
+
response.data;
|
|
93
|
+
spinner?.succeed(`Found ${Array.isArray(components) ? components.length : 0} component(s)`);
|
|
94
|
+
if (json) {
|
|
95
|
+
jsonResult(components);
|
|
96
|
+
}
|
|
97
|
+
if (!Array.isArray(components) || components.length === 0) {
|
|
98
|
+
console.log('\n No components found.');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Table output
|
|
102
|
+
console.log('');
|
|
103
|
+
const nameWidth = Math.max(4, ...components.map((c) => (c.name || '').length));
|
|
104
|
+
const genWidth = Math.max(13, ...components.map((c) => (c.generatedName || '').length));
|
|
105
|
+
console.log(` ${'Name'.padEnd(nameWidth)} ${'Generated Name'.padEnd(genWidth)} ID`);
|
|
106
|
+
console.log(` ${'─'.repeat(nameWidth)} ${'─'.repeat(genWidth)} ${'─'.repeat(36)}`);
|
|
107
|
+
for (const c of components) {
|
|
108
|
+
const name = (c.name || '').padEnd(nameWidth);
|
|
109
|
+
const gen = (c.generatedName || '').padEnd(genWidth);
|
|
110
|
+
console.log(` ${name} ${gen} ${c.id || ''}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
spinner?.fail('Failed to fetch components');
|
|
115
|
+
if (axios.isAxiosError(err)) {
|
|
116
|
+
if (err.response?.status === 401) {
|
|
117
|
+
throw new MagicPathError('Token is invalid or expired. Run `magicpath-ai login`.');
|
|
118
|
+
}
|
|
119
|
+
if (err.response?.status === 404) {
|
|
120
|
+
throw new MagicPathError(`Project "${projectId}" not found.`);
|
|
121
|
+
}
|
|
122
|
+
throw new MagicPathError(`API error: ${err.response?.status}`);
|
|
123
|
+
}
|
|
124
|
+
throw err;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (json)
|
|
129
|
+
jsonError(err);
|
|
130
|
+
if (err instanceof MagicPathError) {
|
|
131
|
+
console.error(`\n${err.message}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// ── Command schemas ──
|
|
3
|
+
const addInputSchema = z.object({
|
|
4
|
+
generatedName: z
|
|
5
|
+
.string()
|
|
6
|
+
.describe('The generated name of the component (e.g., wispy-river-5234)'),
|
|
7
|
+
yes: z.boolean().default(false).describe('Skip confirmation prompts'),
|
|
8
|
+
overwrite: z.boolean().default(false).describe('Overwrite existing files'),
|
|
9
|
+
path: z
|
|
10
|
+
.string()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe('Custom path for components (default: src/components/magicpath)'),
|
|
13
|
+
dryRun: z
|
|
14
|
+
.boolean()
|
|
15
|
+
.default(false)
|
|
16
|
+
.describe('Show what would happen without writing files'),
|
|
17
|
+
});
|
|
18
|
+
const addOutputSchema = z.object({
|
|
19
|
+
component: z.string().describe('Component display name'),
|
|
20
|
+
generatedName: z.string().describe('Component generated name'),
|
|
21
|
+
filesWritten: z.array(z.string()).describe('Paths of files written'),
|
|
22
|
+
dependenciesInstalled: z.array(z.string()).describe('Packages installed'),
|
|
23
|
+
importStatement: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Import statement for the component'),
|
|
27
|
+
usage: z.string().optional().describe('JSX usage example'),
|
|
28
|
+
dryRun: z.boolean().describe('Whether this was a dry run'),
|
|
29
|
+
});
|
|
30
|
+
const integrateInputSchema = z.object({
|
|
31
|
+
generatedName: z.string().describe('The generated name of the component'),
|
|
32
|
+
target: z.string().describe('Target file to integrate into'),
|
|
33
|
+
dryRun: z
|
|
34
|
+
.boolean()
|
|
35
|
+
.default(false)
|
|
36
|
+
.describe('Show what would happen without writing files'),
|
|
37
|
+
});
|
|
38
|
+
const integrateOutputSchema = z.object({
|
|
39
|
+
modifiedFiles: z
|
|
40
|
+
.array(z.object({
|
|
41
|
+
path: z.string().describe('File path relative to project root'),
|
|
42
|
+
content: z.string().describe('Full file content after integration'),
|
|
43
|
+
}))
|
|
44
|
+
.describe('Files modified by the integration (not written to disk — agent applies)'),
|
|
45
|
+
framework: z.string().describe('Detected project framework'),
|
|
46
|
+
});
|
|
47
|
+
const cloneInputSchema = z.object({
|
|
48
|
+
key: z.string().describe('One-time access key'),
|
|
49
|
+
dir: z.string().describe('Target directory'),
|
|
50
|
+
name: z.string().describe('Project name'),
|
|
51
|
+
});
|
|
52
|
+
const cloneOutputSchema = z.object({
|
|
53
|
+
projectDir: z.string().describe('Path to the created project'),
|
|
54
|
+
});
|
|
55
|
+
const whoamiOutputSchema = z.object({
|
|
56
|
+
id: z.string().optional(),
|
|
57
|
+
name: z.string().optional(),
|
|
58
|
+
email: z.string().optional(),
|
|
59
|
+
});
|
|
60
|
+
const listProjectsOutputSchema = z.array(z.object({
|
|
61
|
+
id: z.string(),
|
|
62
|
+
name: z.string(),
|
|
63
|
+
componentCount: z.number().optional(),
|
|
64
|
+
}));
|
|
65
|
+
const listComponentsInputSchema = z.object({
|
|
66
|
+
projectId: z.string().describe('The project ID'),
|
|
67
|
+
});
|
|
68
|
+
const listComponentsOutputSchema = z.array(z.object({
|
|
69
|
+
id: z.string(),
|
|
70
|
+
name: z.string(),
|
|
71
|
+
generatedName: z.string(),
|
|
72
|
+
}));
|
|
73
|
+
const viewInputSchema = z.object({
|
|
74
|
+
generatedName: z.string().describe('The generated name of the component'),
|
|
75
|
+
});
|
|
76
|
+
const viewOutputSchema = z.object({
|
|
77
|
+
url: z.string().describe('Preview URL to open in a browser'),
|
|
78
|
+
generatedName: z.string(),
|
|
79
|
+
});
|
|
80
|
+
const schemas = {
|
|
81
|
+
view: {
|
|
82
|
+
description: 'Get the preview URL for a MagicPath component',
|
|
83
|
+
input: viewInputSchema,
|
|
84
|
+
output: viewOutputSchema,
|
|
85
|
+
},
|
|
86
|
+
add: {
|
|
87
|
+
description: 'Add a MagicPath component to your project',
|
|
88
|
+
input: addInputSchema,
|
|
89
|
+
output: addOutputSchema,
|
|
90
|
+
},
|
|
91
|
+
integrate: {
|
|
92
|
+
description: 'Integrate a MagicPath component into a specific file using AI',
|
|
93
|
+
input: integrateInputSchema,
|
|
94
|
+
output: integrateOutputSchema,
|
|
95
|
+
},
|
|
96
|
+
clone: {
|
|
97
|
+
description: 'Clone/download a MagicPath project',
|
|
98
|
+
input: cloneInputSchema,
|
|
99
|
+
output: cloneOutputSchema,
|
|
100
|
+
},
|
|
101
|
+
whoami: {
|
|
102
|
+
description: 'Show the currently authenticated user',
|
|
103
|
+
output: whoamiOutputSchema,
|
|
104
|
+
},
|
|
105
|
+
'list-projects': {
|
|
106
|
+
description: 'List all projects for the current user',
|
|
107
|
+
output: listProjectsOutputSchema,
|
|
108
|
+
},
|
|
109
|
+
'list-components': {
|
|
110
|
+
description: 'List components in a project',
|
|
111
|
+
input: listComponentsInputSchema,
|
|
112
|
+
output: listComponentsOutputSchema,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
function zodToJsonSchema(schema) {
|
|
116
|
+
// Lightweight Zod → JSON Schema conversion
|
|
117
|
+
return zodTypeToJson(schema);
|
|
118
|
+
}
|
|
119
|
+
function zodTypeToJson(schema) {
|
|
120
|
+
const def = schema._def;
|
|
121
|
+
if (!def)
|
|
122
|
+
return {};
|
|
123
|
+
const typeName = def.typeName;
|
|
124
|
+
const result = {};
|
|
125
|
+
if (def.description)
|
|
126
|
+
result.description = def.description;
|
|
127
|
+
switch (typeName) {
|
|
128
|
+
case 'ZodString':
|
|
129
|
+
result.type = 'string';
|
|
130
|
+
break;
|
|
131
|
+
case 'ZodNumber':
|
|
132
|
+
result.type = 'number';
|
|
133
|
+
break;
|
|
134
|
+
case 'ZodBoolean':
|
|
135
|
+
result.type = 'boolean';
|
|
136
|
+
break;
|
|
137
|
+
case 'ZodOptional':
|
|
138
|
+
return zodTypeToJson(def.innerType);
|
|
139
|
+
case 'ZodDefault':
|
|
140
|
+
return { ...zodTypeToJson(def.innerType), default: def.defaultValue() };
|
|
141
|
+
case 'ZodArray':
|
|
142
|
+
result.type = 'array';
|
|
143
|
+
result.items = zodTypeToJson(def.type);
|
|
144
|
+
break;
|
|
145
|
+
case 'ZodObject': {
|
|
146
|
+
result.type = 'object';
|
|
147
|
+
result.properties = {};
|
|
148
|
+
const required = [];
|
|
149
|
+
const shape = def.shape();
|
|
150
|
+
for (const [key, value] of Object.entries(shape)) {
|
|
151
|
+
result.properties[key] = zodTypeToJson(value);
|
|
152
|
+
const innerDef = value._def;
|
|
153
|
+
if (innerDef?.typeName !== 'ZodOptional' &&
|
|
154
|
+
innerDef?.typeName !== 'ZodDefault') {
|
|
155
|
+
required.push(key);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (required.length > 0)
|
|
159
|
+
result.required = required;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
default:
|
|
163
|
+
result.type = 'string';
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
export function registerSchemaCommand(program) {
|
|
168
|
+
program
|
|
169
|
+
.command('schema')
|
|
170
|
+
.description("Show JSON Schema for a command's input/output")
|
|
171
|
+
.argument('[command]', 'Command name (e.g., add, integrate)')
|
|
172
|
+
.option('--all', 'Show schemas for all commands')
|
|
173
|
+
.action((commandName, options) => {
|
|
174
|
+
if (options?.all) {
|
|
175
|
+
const allSchemas = {};
|
|
176
|
+
for (const [name, schemaEntry] of Object.entries(schemas)) {
|
|
177
|
+
allSchemas[name] = {
|
|
178
|
+
description: schemaEntry.description,
|
|
179
|
+
input: schemaEntry.input
|
|
180
|
+
? zodToJsonSchema(schemaEntry.input)
|
|
181
|
+
: undefined,
|
|
182
|
+
output: schemaEntry.output
|
|
183
|
+
? zodToJsonSchema(schemaEntry.output)
|
|
184
|
+
: undefined,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
console.log(JSON.stringify(allSchemas, null, 2));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (!commandName) {
|
|
191
|
+
console.log('Available commands:', Object.keys(schemas).join(', '));
|
|
192
|
+
console.log('\nUsage: magicpath-ai schema <command>');
|
|
193
|
+
console.log(' magicpath-ai schema --all');
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const schema = schemas[commandName];
|
|
197
|
+
if (!schema) {
|
|
198
|
+
console.error(`Unknown command: ${commandName}`);
|
|
199
|
+
console.error('Available:', Object.keys(schemas).join(', '));
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
const result = {
|
|
203
|
+
command: commandName,
|
|
204
|
+
description: schema.description,
|
|
205
|
+
};
|
|
206
|
+
if (schema.input)
|
|
207
|
+
result.input = zodToJsonSchema(schema.input);
|
|
208
|
+
if (schema.output)
|
|
209
|
+
result.output = zodToJsonSchema(schema.output);
|
|
210
|
+
console.log(JSON.stringify(result, null, 2));
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { brandSpinner } from '../util/ui.js';
|
|
3
|
+
import { MagicPathError } from '../util/error.js';
|
|
4
|
+
import { getAuthHeaders } from '../util/auth.js';
|
|
5
|
+
import { getUserProjectsUrl, getProjectComponentsUrl } from '../util/api.js';
|
|
6
|
+
import { isJsonMode, jsonResult, jsonError } from '../util/output.js';
|
|
7
|
+
export function registerSearchCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('search')
|
|
10
|
+
.description('Search component names across all projects')
|
|
11
|
+
.argument('<query>', 'Search query (case-insensitive substring match)')
|
|
12
|
+
.option('--limit <n>', 'Maximum number of results', '20')
|
|
13
|
+
.action(async (query, opts) => {
|
|
14
|
+
const json = isJsonMode();
|
|
15
|
+
const limit = parseInt(opts.limit, 10) || 20;
|
|
16
|
+
try {
|
|
17
|
+
let headers;
|
|
18
|
+
try {
|
|
19
|
+
headers = getAuthHeaders();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
throw new MagicPathError('Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.');
|
|
23
|
+
}
|
|
24
|
+
const spinner = json
|
|
25
|
+
? null
|
|
26
|
+
: brandSpinner('Searching components...').start();
|
|
27
|
+
try {
|
|
28
|
+
// Fetch all projects
|
|
29
|
+
const projResponse = await axios.get(getUserProjectsUrl(), {
|
|
30
|
+
headers,
|
|
31
|
+
});
|
|
32
|
+
const projects = projResponse.data.data?.projects ??
|
|
33
|
+
projResponse.data.projects ??
|
|
34
|
+
projResponse.data;
|
|
35
|
+
if (!Array.isArray(projects) || projects.length === 0) {
|
|
36
|
+
spinner?.succeed('No projects found');
|
|
37
|
+
if (json)
|
|
38
|
+
jsonResult([]);
|
|
39
|
+
console.log('\n No projects found.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Fetch components from all projects in parallel
|
|
43
|
+
const componentResults = await Promise.all(projects.map(async (project) => {
|
|
44
|
+
try {
|
|
45
|
+
const url = `${getProjectComponentsUrl(project.id)}?limit=100&revisionStatus=COMPLETED`;
|
|
46
|
+
const response = await axios.get(url, { headers });
|
|
47
|
+
const components = response.data.data?.components ??
|
|
48
|
+
response.data.components ??
|
|
49
|
+
response.data;
|
|
50
|
+
return {
|
|
51
|
+
project,
|
|
52
|
+
components: Array.isArray(components) ? components : [],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return { project, components: [] };
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
// Filter by query
|
|
60
|
+
const lowerQuery = query.toLowerCase();
|
|
61
|
+
const matches = [];
|
|
62
|
+
for (const { project, components } of componentResults) {
|
|
63
|
+
for (const c of components) {
|
|
64
|
+
if (matches.length >= limit)
|
|
65
|
+
break;
|
|
66
|
+
if ((c.name || '').toLowerCase().includes(lowerQuery)) {
|
|
67
|
+
matches.push({
|
|
68
|
+
name: c.name,
|
|
69
|
+
generatedName: c.generatedName,
|
|
70
|
+
id: c.id,
|
|
71
|
+
projectName: project.name,
|
|
72
|
+
projectId: project.id,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (matches.length >= limit)
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
spinner?.succeed(`Found ${matches.length} match(es) for "${query}"`);
|
|
80
|
+
if (json) {
|
|
81
|
+
jsonResult(matches);
|
|
82
|
+
}
|
|
83
|
+
if (matches.length === 0) {
|
|
84
|
+
console.log(`\n No components matching "${query}".`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Table output
|
|
88
|
+
console.log('');
|
|
89
|
+
const nameWidth = Math.max(4, ...matches.map((m) => m.name.length));
|
|
90
|
+
const genWidth = Math.max(13, ...matches.map((m) => m.generatedName.length));
|
|
91
|
+
const projWidth = Math.max(7, ...matches.map((m) => m.projectName.length));
|
|
92
|
+
console.log(` ${'Name'.padEnd(nameWidth)} ${'Generated Name'.padEnd(genWidth)} ${'Project'.padEnd(projWidth)}`);
|
|
93
|
+
console.log(` ${'─'.repeat(nameWidth)} ${'─'.repeat(genWidth)} ${'─'.repeat(projWidth)}`);
|
|
94
|
+
for (const m of matches) {
|
|
95
|
+
console.log(` ${m.name.padEnd(nameWidth)} ${m.generatedName.padEnd(genWidth)} ${m.projectName.padEnd(projWidth)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
spinner?.fail('Search failed');
|
|
100
|
+
if (axios.isAxiosError(err)) {
|
|
101
|
+
if (err.response?.status === 401) {
|
|
102
|
+
throw new MagicPathError('Token is invalid or expired. Run `magicpath-ai login`.');
|
|
103
|
+
}
|
|
104
|
+
throw new MagicPathError(`API error: ${err.response?.status}`);
|
|
105
|
+
}
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (json)
|
|
111
|
+
jsonError(err);
|
|
112
|
+
if (err instanceof MagicPathError) {
|
|
113
|
+
console.error(`\n${err.message}`);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
function getSkillsDir() {
|
|
5
|
+
// Resolve skills/ relative to the package root
|
|
6
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
7
|
+
// src/commands/skills.ts -> package root is ../../
|
|
8
|
+
return path.resolve(path.dirname(thisFile), '..', '..', 'skills');
|
|
9
|
+
}
|
|
10
|
+
export function registerSkillsCommand(program) {
|
|
11
|
+
program
|
|
12
|
+
.command('skills')
|
|
13
|
+
.description('List available AI agent skill files')
|
|
14
|
+
.argument('[name]', 'Show a specific skill by name')
|
|
15
|
+
.action((name) => {
|
|
16
|
+
const skillsDir = getSkillsDir();
|
|
17
|
+
if (!fs.existsSync(skillsDir)) {
|
|
18
|
+
console.error('No skills directory found.');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
if (name) {
|
|
22
|
+
// Show a specific skill
|
|
23
|
+
const skillDir = path.join(skillsDir, name);
|
|
24
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
25
|
+
if (!fs.existsSync(skillFile)) {
|
|
26
|
+
console.error(`Skill "${name}" not found.`);
|
|
27
|
+
console.error('Available skills:');
|
|
28
|
+
listSkills(skillsDir);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const content = fs.readFileSync(skillFile, 'utf8');
|
|
32
|
+
console.log(content);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// List all skills
|
|
36
|
+
console.log('Available MagicPath skills:\n');
|
|
37
|
+
listSkills(skillsDir);
|
|
38
|
+
console.log('\nUsage: magicpath-ai skills <name>');
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function listSkills(skillsDir) {
|
|
42
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
if (entry.isDirectory()) {
|
|
45
|
+
const skillFile = path.join(skillsDir, entry.name, 'SKILL.md');
|
|
46
|
+
if (fs.existsSync(skillFile)) {
|
|
47
|
+
const content = fs.readFileSync(skillFile, 'utf8');
|
|
48
|
+
// Extract title from first line
|
|
49
|
+
const firstLine = content.split('\n')[0]?.replace(/^#\s*/, '') || entry.name;
|
|
50
|
+
console.log(` ${entry.name.padEnd(30)} ${firstLine}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { makeUrl, APIVersion } from '../util/api.js';
|
|
3
|
+
import { isJsonMode, jsonResult } from '../util/output.js';
|
|
4
|
+
function getPreviewUrl(generatedName) {
|
|
5
|
+
return makeUrl(APIVersion.V1, generatedName);
|
|
6
|
+
}
|
|
7
|
+
export function registerViewCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('view')
|
|
10
|
+
.alias('view-component')
|
|
11
|
+
.description('Open a component preview in the browser')
|
|
12
|
+
.argument('<generatedName>', 'The generated name of the component (e.g., wispy-river-5234)')
|
|
13
|
+
.action((generatedName) => {
|
|
14
|
+
const url = getPreviewUrl(generatedName);
|
|
15
|
+
if (isJsonMode()) {
|
|
16
|
+
jsonResult({ url, generatedName });
|
|
17
|
+
}
|
|
18
|
+
const openCmd = process.platform === 'darwin'
|
|
19
|
+
? 'open'
|
|
20
|
+
: process.platform === 'win32'
|
|
21
|
+
? 'start'
|
|
22
|
+
: 'xdg-open';
|
|
23
|
+
exec(`${openCmd} ${url}`);
|
|
24
|
+
console.log(`Opening ${url}`);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3D,SAAS,aAAa,CAAC,aAAqB;IAC1C,OAAO,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,gBAAgB,CAAC;SACvB,WAAW,CAAC,yCAAyC,CAAC;SACtD,QAAQ,CACP,iBAAiB,EACjB,8DAA8D,CAC/D;SACA,MAAM,CAAC,CAAC,aAAqB,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;QAEzC,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,UAAU,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC3B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC5B,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,UAAU,CAAC;QAEnB,IAAI,CAAC,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC"}
|