magicpath-ai 1.3.0-beta.8 → 1.3.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/README.md +24 -26
- package/dist/cli.js +15 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +0 -3
- package/dist/commands/add.js +347 -246
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/auth.js +14 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/info.js +9 -5
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/inspect.d.ts +53 -0
- package/dist/commands/inspect.js +122 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/list-installed.d.ts +2 -0
- package/dist/commands/list-installed.js +112 -0
- package/dist/commands/list-installed.js.map +1 -0
- package/dist/commands/list.js +6 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/schema.js +11 -24
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/search.js +2 -1
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/setup-skills.d.ts +2 -0
- package/dist/commands/setup-skills.js +13 -0
- package/dist/commands/setup-skills.js.map +1 -0
- package/dist/commands/whoami.js +5 -13
- package/dist/commands/whoami.js.map +1 -1
- package/dist/util/auth.d.ts +19 -6
- package/dist/util/auth.js +70 -10
- package/dist/util/auth.js.map +1 -1
- package/dist/util/banner.d.ts +1 -0
- package/dist/util/banner.js +79 -0
- package/dist/util/banner.js.map +1 -0
- package/package.json +3 -5
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.js +0 -113
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/integrate.d.ts +0 -2
- package/dist/commands/integrate.js +0 -202
- package/dist/commands/integrate.js.map +0 -1
- package/dist/commands/retheme.d.ts +0 -2
- package/dist/commands/retheme.js +0 -327
- package/dist/commands/retheme.js.map +0 -1
- package/dist/commands/skills.d.ts +0 -2
- package/dist/commands/skills.js +0 -55
- package/dist/commands/skills.js.map +0 -1
- package/dist/util/diff.d.ts +0 -13
- package/dist/util/diff.js +0 -63
- package/dist/util/diff.js.map +0 -1
- package/dist/util/integrate.d.ts +0 -84
- package/dist/util/integrate.js +0 -762
- package/dist/util/integrate.js.map +0 -1
- package/skills/cli-reference.md +0 -146
- package/skills/guide.md +0 -63
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import prompts from 'prompts';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import fs from 'fs-extra';
|
|
4
|
-
import { enableDebugLogger } from '../util/logger.js';
|
|
5
|
-
import { MagicPathError } from '../util/error.js';
|
|
6
|
-
import { isJsonMode, jsonResult, jsonError } from '../util/output.js';
|
|
7
|
-
import { brandSpinner } from '../util/ui.js';
|
|
8
|
-
import { reviewAndApplyChanges, applyChanges } from '../util/diff.js';
|
|
9
|
-
import { detectFramework, findCandidates, readTargetWithContext, requestIntegration, detectProjectLanguage, detectLanguageFromExtension, getLanguageDisplayName, } from '../util/integrate.js';
|
|
10
|
-
import { runLoginFlow } from './auth.js';
|
|
11
|
-
export function registerIntegrateCommand(program) {
|
|
12
|
-
program
|
|
13
|
-
.command('integrate')
|
|
14
|
-
.description('Integrate a MagicPath component into your project using AI')
|
|
15
|
-
.argument('<generatedName>', 'The generated name of the component (e.g., wispy-river-5234)')
|
|
16
|
-
.option('-d, --debug', 'Enable debug logging', false)
|
|
17
|
-
.option('--no-review', 'Apply each file immediately without review or confirmation')
|
|
18
|
-
.option('-t, --target <file>', 'Target file to integrate into (skips interactive prompts)')
|
|
19
|
-
.option('--dry-run', 'Show what would happen without writing files', false)
|
|
20
|
-
.action(async (generatedName, options) => {
|
|
21
|
-
try {
|
|
22
|
-
if (options.debug)
|
|
23
|
-
enableDebugLogger();
|
|
24
|
-
const json = isJsonMode();
|
|
25
|
-
const cwd = process.cwd();
|
|
26
|
-
// In JSON mode, require --target
|
|
27
|
-
if (json && !options.target) {
|
|
28
|
-
throw new MagicPathError('In JSON mode, --target <file> is required for integrate.', {
|
|
29
|
-
code: 'MISSING_TARGET',
|
|
30
|
-
suggestion: 'Pass `--target <file>` to specify the file to integrate into.',
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
// Step 1: Detect project language and framework
|
|
34
|
-
const hasPackageJson = fs.existsSync(path.join(cwd, 'package.json'));
|
|
35
|
-
const framework = hasPackageJson
|
|
36
|
-
? detectFramework(cwd)
|
|
37
|
-
: 'unknown';
|
|
38
|
-
const language = hasPackageJson
|
|
39
|
-
? 'js'
|
|
40
|
-
: detectProjectLanguage(cwd);
|
|
41
|
-
// Step 2: Verify auth
|
|
42
|
-
const { getAuthHeaders } = await import('../util/auth.js');
|
|
43
|
-
try {
|
|
44
|
-
getAuthHeaders();
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
if (json) {
|
|
48
|
-
throw new MagicPathError('Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.', {
|
|
49
|
-
code: 'NOT_AUTHENTICATED',
|
|
50
|
-
suggestion: 'Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable.',
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
console.log('You need to be logged in to use AI integration.');
|
|
54
|
-
const { shouldLogin } = await prompts({
|
|
55
|
-
type: 'confirm',
|
|
56
|
-
name: 'shouldLogin',
|
|
57
|
-
message: 'Log in now?',
|
|
58
|
-
initial: true,
|
|
59
|
-
});
|
|
60
|
-
if (!shouldLogin) {
|
|
61
|
-
console.log('Integration cancelled.');
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const loggedIn = await runLoginFlow();
|
|
65
|
-
if (!loggedIn) {
|
|
66
|
-
console.log('Integration cancelled.');
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// If --target is provided, skip interactive prompts and go straight to integrate
|
|
71
|
-
if (options.target) {
|
|
72
|
-
await runIntegrateFlow(generatedName, cwd, language, framework, options.target, json ? true : options.review === false, options.dryRun);
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
// ── Integrate flow ──
|
|
76
|
-
await runIntegrateFlow(generatedName, cwd, language, framework);
|
|
77
|
-
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
if (isJsonMode())
|
|
80
|
-
jsonError(err);
|
|
81
|
-
if (err instanceof MagicPathError) {
|
|
82
|
-
console.error(`\n${err.message}`);
|
|
83
|
-
process.exit(1);
|
|
84
|
-
}
|
|
85
|
-
throw err;
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
async function runIntegrateFlow(generatedName, cwd, language, framework, providedTarget, noReview, dryRun) {
|
|
90
|
-
const json = isJsonMode();
|
|
91
|
-
let targetPath;
|
|
92
|
-
if (providedTarget) {
|
|
93
|
-
// Non-interactive: use provided target directly
|
|
94
|
-
targetPath = providedTarget;
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
// Interactive: let user pick from candidates
|
|
98
|
-
const candidates = findCandidates(cwd, language, framework);
|
|
99
|
-
if (candidates.length === 0) {
|
|
100
|
-
throw new MagicPathError('No suitable files found for integration.');
|
|
101
|
-
}
|
|
102
|
-
const allChoices = candidates.map((c) => ({
|
|
103
|
-
title: `${c.relativePath}${c.label ? ` ${c.label}` : ''}`,
|
|
104
|
-
value: c.relativePath,
|
|
105
|
-
}));
|
|
106
|
-
const result = await prompts({
|
|
107
|
-
type: 'autocomplete',
|
|
108
|
-
name: 'targetPath',
|
|
109
|
-
message: 'Where do you want to use this component?',
|
|
110
|
-
choices: allChoices,
|
|
111
|
-
limit: 10,
|
|
112
|
-
suggest: async (input, _choices) => {
|
|
113
|
-
const query = input.toLowerCase();
|
|
114
|
-
if (!query)
|
|
115
|
-
return allChoices;
|
|
116
|
-
const filtered = allChoices.filter((c) => c.title.toLowerCase().includes(query));
|
|
117
|
-
if (filtered.length === 0) {
|
|
118
|
-
return [{ title: input, value: input }];
|
|
119
|
-
}
|
|
120
|
-
return filtered;
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
if (!result.targetPath) {
|
|
124
|
-
console.log('Integration cancelled.');
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
targetPath = result.targetPath;
|
|
128
|
-
}
|
|
129
|
-
const absTarget = path.resolve(cwd, targetPath);
|
|
130
|
-
if (!fs.existsSync(absTarget)) {
|
|
131
|
-
throw new MagicPathError(`File not found: ${targetPath}`, {
|
|
132
|
-
code: 'NOT_FOUND',
|
|
133
|
-
suggestion: 'Check that the `--target` path is correct and relative to the project root.',
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
// Refine language from the actual file extension
|
|
137
|
-
const fileLanguage = detectLanguageFromExtension(targetPath);
|
|
138
|
-
if (fileLanguage !== 'unknown') {
|
|
139
|
-
language = fileLanguage;
|
|
140
|
-
}
|
|
141
|
-
if (!json && language !== 'js') {
|
|
142
|
-
console.log(` Target language: ${getLanguageDisplayName(language)}`);
|
|
143
|
-
}
|
|
144
|
-
// Optional user instruction (skip in non-interactive mode)
|
|
145
|
-
let userInstruction;
|
|
146
|
-
if (!providedTarget) {
|
|
147
|
-
const result = await prompts({
|
|
148
|
-
type: 'text',
|
|
149
|
-
name: 'userInstruction',
|
|
150
|
-
message: 'How should this component be used? (optional — press Enter to skip)',
|
|
151
|
-
});
|
|
152
|
-
userInstruction = result.userInstruction;
|
|
153
|
-
}
|
|
154
|
-
// Read target with context
|
|
155
|
-
const { targetFile, importedFiles, referencingFiles } = readTargetWithContext(targetPath, cwd, undefined, language);
|
|
156
|
-
// Call integrate API
|
|
157
|
-
const integrationSpinner = json
|
|
158
|
-
? null
|
|
159
|
-
: brandSpinner('Generating integration...').start();
|
|
160
|
-
try {
|
|
161
|
-
const result = await requestIntegration({
|
|
162
|
-
targetFile,
|
|
163
|
-
importedFiles,
|
|
164
|
-
referencingFiles,
|
|
165
|
-
componentGeneratedName: generatedName,
|
|
166
|
-
framework,
|
|
167
|
-
userInstruction: userInstruction || undefined,
|
|
168
|
-
targetLanguage: language !== 'js' ? language : undefined,
|
|
169
|
-
});
|
|
170
|
-
integrationSpinner?.succeed('Integration generated');
|
|
171
|
-
// JSON mode: return file contents without writing — the agent decides
|
|
172
|
-
if (json) {
|
|
173
|
-
jsonResult({
|
|
174
|
-
modifiedFiles: result.modifiedFiles.map((f) => ({
|
|
175
|
-
path: f.path,
|
|
176
|
-
content: f.content,
|
|
177
|
-
})),
|
|
178
|
-
framework,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
// Dry run (human mode): show what would change
|
|
182
|
-
if (dryRun) {
|
|
183
|
-
console.log('\n[Dry run] Would modify:');
|
|
184
|
-
for (const f of result.modifiedFiles) {
|
|
185
|
-
console.log(` ${f.path}`);
|
|
186
|
-
}
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
if (noReview) {
|
|
190
|
-
applyChanges(result.modifiedFiles, cwd);
|
|
191
|
-
console.log(` Applied ${result.modifiedFiles.length} file(s).`);
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
await reviewAndApplyChanges(result.modifiedFiles, cwd, 'Integration');
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
catch (intErr) {
|
|
198
|
-
integrationSpinner?.fail('Integration failed');
|
|
199
|
-
throw intErr;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=integrate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integrate.js","sourceRoot":"","sources":["../../src/commands/integrate.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/retheme.js
DELETED
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
import prompts from 'prompts';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import fs from 'fs-extra';
|
|
4
|
-
import { enableDebugLogger } from '../util/logger.js';
|
|
5
|
-
import { MagicPathError } from '../util/error.js';
|
|
6
|
-
import { isJsonMode, jsonError } from '../util/output.js';
|
|
7
|
-
import { brandSpinner, BRAND_GREEN, ANSI_RESET } from '../util/ui.js';
|
|
8
|
-
import { reviewAndApplyChanges, applyChanges } from '../util/diff.js';
|
|
9
|
-
import { detectFramework, requestRetheme, gatherProjectFiles, findThemeFile, detectProjectLanguage, SkipFileError, } from '../util/integrate.js';
|
|
10
|
-
import { runLoginFlow } from './auth.js';
|
|
11
|
-
export function registerRethemeCommand(program) {
|
|
12
|
-
program
|
|
13
|
-
.command('retheme')
|
|
14
|
-
.description("Retheme your entire project to match a MagicPath component's style using AI (EXPERIMENTAL)")
|
|
15
|
-
.argument('<generatedName>', 'The generated name of the component to match (e.g., wispy-river-5234)')
|
|
16
|
-
.option('-d, --debug', 'Enable debug logging', false)
|
|
17
|
-
.option('--batch [size]', 'Process retheme in batches, pause between each')
|
|
18
|
-
.option('--no-review', 'Apply each file immediately without review or confirmation')
|
|
19
|
-
.action(async (generatedName, options) => {
|
|
20
|
-
try {
|
|
21
|
-
if (options.debug)
|
|
22
|
-
enableDebugLogger();
|
|
23
|
-
const json = isJsonMode();
|
|
24
|
-
const cwd = process.cwd();
|
|
25
|
-
// Step 1: Detect project language and framework
|
|
26
|
-
const hasPackageJson = fs.existsSync(path.join(cwd, 'package.json'));
|
|
27
|
-
const framework = hasPackageJson
|
|
28
|
-
? detectFramework(cwd)
|
|
29
|
-
: 'unknown';
|
|
30
|
-
const language = hasPackageJson
|
|
31
|
-
? 'js'
|
|
32
|
-
: detectProjectLanguage(cwd);
|
|
33
|
-
// Step 2: Verify auth
|
|
34
|
-
const { getAuthHeaders } = await import('../util/auth.js');
|
|
35
|
-
try {
|
|
36
|
-
getAuthHeaders();
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
if (json) {
|
|
40
|
-
throw new MagicPathError('Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.', {
|
|
41
|
-
code: 'NOT_AUTHENTICATED',
|
|
42
|
-
suggestion: 'Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable.',
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
console.log('You need to be logged in to use retheme.');
|
|
46
|
-
const { shouldLogin } = await prompts({
|
|
47
|
-
type: 'confirm',
|
|
48
|
-
name: 'shouldLogin',
|
|
49
|
-
message: 'Log in now?',
|
|
50
|
-
initial: true,
|
|
51
|
-
});
|
|
52
|
-
if (!shouldLogin) {
|
|
53
|
-
console.log('Retheme cancelled.');
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const loggedIn = await runLoginFlow();
|
|
57
|
-
if (!loggedIn) {
|
|
58
|
-
console.log('Retheme cancelled.');
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
const batchSize = options.batch != null
|
|
63
|
-
? options.batch === true
|
|
64
|
-
? 10
|
|
65
|
-
: parseInt(options.batch, 10)
|
|
66
|
-
: undefined;
|
|
67
|
-
await runRethemeFlow(generatedName, cwd, language, framework, batchSize, options.review === false);
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
if (isJsonMode())
|
|
71
|
-
jsonError(err);
|
|
72
|
-
if (err instanceof MagicPathError) {
|
|
73
|
-
console.error(`\n${err.message}`);
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
throw err;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
async function runRethemeFlow(generatedName, cwd, language, framework, batchSize, noReview) {
|
|
81
|
-
// Optional user instruction
|
|
82
|
-
const { userInstruction: rethemeInstruction } = await prompts({
|
|
83
|
-
type: 'text',
|
|
84
|
-
name: 'userInstruction',
|
|
85
|
-
message: 'Any specific instructions for the retheme? (optional — press Enter to skip)',
|
|
86
|
-
});
|
|
87
|
-
// Gather all project UI files
|
|
88
|
-
const gatherSpinner = brandSpinner('Scanning project files...').start();
|
|
89
|
-
const { files: projectFiles, truncated, skippedFiles, } = gatherProjectFiles(cwd, language, framework);
|
|
90
|
-
gatherSpinner.succeed(`Found ${projectFiles.length} UI files`);
|
|
91
|
-
if (truncated && skippedFiles.length > 0) {
|
|
92
|
-
console.log(` Note: ${skippedFiles.length} file(s) skipped to stay within the 1MB total size budget. Pages and layouts are prioritized.`);
|
|
93
|
-
for (const f of skippedFiles) {
|
|
94
|
-
console.log(` - ${f}`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (projectFiles.length === 0) {
|
|
98
|
-
throw new MagicPathError('No UI files found in the project.');
|
|
99
|
-
}
|
|
100
|
-
// Detect theme file (globals.css etc.)
|
|
101
|
-
let themeFile = findThemeFile(cwd, language, framework);
|
|
102
|
-
if (themeFile) {
|
|
103
|
-
console.log(` Found theme file: ${themeFile.path}`);
|
|
104
|
-
}
|
|
105
|
-
// Sort files by directory so related files are processed together
|
|
106
|
-
if (batchSize) {
|
|
107
|
-
projectFiles.sort((a, b) => {
|
|
108
|
-
const dirA = path.dirname(a.path);
|
|
109
|
-
const dirB = path.dirname(b.path);
|
|
110
|
-
return dirA.localeCompare(dirB);
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
// Process files one by one
|
|
114
|
-
const totalFiles = projectFiles.length;
|
|
115
|
-
const allModifiedFiles = [];
|
|
116
|
-
let batchModifiedFiles = [];
|
|
117
|
-
const rethemeSpinner = brandSpinner('').start();
|
|
118
|
-
rethemeSpinner.spinner = {
|
|
119
|
-
frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'].map((f) => `${BRAND_GREEN}${f}${ANSI_RESET}`),
|
|
120
|
-
};
|
|
121
|
-
const totalStart = Date.now();
|
|
122
|
-
const BAR_WIDTH = 20;
|
|
123
|
-
const fmtTime = (ms) => {
|
|
124
|
-
const s = Math.floor(ms / 1000);
|
|
125
|
-
const m = Math.floor(s / 60);
|
|
126
|
-
return m > 0 ? `${m}m ${s % 60}s` : `${s}s`;
|
|
127
|
-
};
|
|
128
|
-
const makeBar = (done, total) => {
|
|
129
|
-
const filled = Math.round((done / total) * BAR_WIDTH);
|
|
130
|
-
const filledStr = '█'.repeat(filled);
|
|
131
|
-
const emptyStr = '░'.repeat(BAR_WIDTH - filled);
|
|
132
|
-
return `\x1b[38;2;8;92;52m${filledStr}${emptyStr}\x1b[0m`;
|
|
133
|
-
};
|
|
134
|
-
let currentBatch = 0;
|
|
135
|
-
let appliedCount = 0;
|
|
136
|
-
let filesInCurrentBatch = 0;
|
|
137
|
-
const failedFiles = [];
|
|
138
|
-
const userSkippedFiles = [];
|
|
139
|
-
// Enable raw mode to capture 's' keypress for skipping files
|
|
140
|
-
const stdin = process.stdin;
|
|
141
|
-
const wasRaw = stdin.isRaw;
|
|
142
|
-
if (stdin.isTTY)
|
|
143
|
-
stdin.setRawMode(true);
|
|
144
|
-
stdin.resume();
|
|
145
|
-
stdin.setEncoding('utf8');
|
|
146
|
-
console.log(` Press ${BRAND_GREEN}s${ANSI_RESET} to skip the current file\n`);
|
|
147
|
-
try {
|
|
148
|
-
for (let i = 0; i < totalFiles; i++) {
|
|
149
|
-
const file = projectFiles[i];
|
|
150
|
-
const fileStart = Date.now();
|
|
151
|
-
const fileElapsed = () => fmtTime(Date.now() - fileStart);
|
|
152
|
-
const totalElapsed = () => fmtTime(Date.now() - totalStart);
|
|
153
|
-
const status = () => `${makeBar(i, totalFiles)} ${i + 1}/${totalFiles} ${file.path} — ${fileElapsed()} (${totalElapsed()} total)`;
|
|
154
|
-
rethemeSpinner.text = status();
|
|
155
|
-
const elapsedTimer = setInterval(() => {
|
|
156
|
-
rethemeSpinner.text = status();
|
|
157
|
-
}, 1000);
|
|
158
|
-
const controller = new AbortController();
|
|
159
|
-
const onKeypress = (key) => {
|
|
160
|
-
if (key === 's' || key === 'S')
|
|
161
|
-
controller.abort();
|
|
162
|
-
// Ctrl+C — restore stdin and exit
|
|
163
|
-
if (key === '\x03') {
|
|
164
|
-
if (stdin.isTTY)
|
|
165
|
-
stdin.setRawMode(wasRaw ?? false);
|
|
166
|
-
stdin.pause();
|
|
167
|
-
process.exit(130);
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
stdin.on('data', onKeypress);
|
|
171
|
-
let fileResult;
|
|
172
|
-
try {
|
|
173
|
-
fileResult = await requestRetheme({
|
|
174
|
-
mode: 'retheme',
|
|
175
|
-
projectFiles: [file],
|
|
176
|
-
componentGeneratedName: generatedName,
|
|
177
|
-
framework,
|
|
178
|
-
userInstruction: rethemeInstruction || undefined,
|
|
179
|
-
targetLanguage: language !== 'js' ? language : undefined,
|
|
180
|
-
themeFile: themeFile || undefined,
|
|
181
|
-
}, controller.signal);
|
|
182
|
-
}
|
|
183
|
-
catch (fileErr) {
|
|
184
|
-
clearInterval(elapsedTimer);
|
|
185
|
-
stdin.removeListener('data', onKeypress);
|
|
186
|
-
if (fileErr instanceof SkipFileError) {
|
|
187
|
-
userSkippedFiles.push(file.path);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
failedFiles.push(file.path);
|
|
191
|
-
}
|
|
192
|
-
filesInCurrentBatch++;
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
finally {
|
|
196
|
-
clearInterval(elapsedTimer);
|
|
197
|
-
stdin.removeListener('data', onKeypress);
|
|
198
|
-
}
|
|
199
|
-
for (const modified of fileResult.modifiedFiles) {
|
|
200
|
-
// If the AI returned an updated theme file, accumulate it for subsequent iterations
|
|
201
|
-
if (themeFile && modified.path === themeFile.path) {
|
|
202
|
-
themeFile = { ...themeFile, content: modified.content };
|
|
203
|
-
}
|
|
204
|
-
allModifiedFiles.push(modified);
|
|
205
|
-
batchModifiedFiles.push(modified);
|
|
206
|
-
}
|
|
207
|
-
filesInCurrentBatch++;
|
|
208
|
-
// No-review mode: apply each file's changes immediately
|
|
209
|
-
if (noReview && !batchSize) {
|
|
210
|
-
applyChanges(fileResult.modifiedFiles, cwd);
|
|
211
|
-
appliedCount += fileResult.modifiedFiles.length;
|
|
212
|
-
}
|
|
213
|
-
// Batch mode: pause once we've hit batchSize AND we're at a directory boundary
|
|
214
|
-
if (batchSize && filesInCurrentBatch >= batchSize && i + 1 < totalFiles) {
|
|
215
|
-
const currentDir = path.dirname(file.path);
|
|
216
|
-
const nextDir = path.dirname(projectFiles[i + 1].path);
|
|
217
|
-
if (currentDir !== nextDir) {
|
|
218
|
-
currentBatch++;
|
|
219
|
-
rethemeSpinner.stop();
|
|
220
|
-
applyChanges(batchModifiedFiles, cwd);
|
|
221
|
-
appliedCount += batchModifiedFiles.length;
|
|
222
|
-
console.log(`\n Batch ${currentBatch} applied (${filesInCurrentBatch} files). Elapsed: ${fmtTime(Date.now() - totalStart)}`);
|
|
223
|
-
// Restore normal stdin for interactive prompt
|
|
224
|
-
if (stdin.isTTY)
|
|
225
|
-
stdin.setRawMode(false);
|
|
226
|
-
stdin.pause();
|
|
227
|
-
const { shouldContinue } = await prompts({
|
|
228
|
-
type: 'confirm',
|
|
229
|
-
name: 'shouldContinue',
|
|
230
|
-
message: 'Continue to next batch?',
|
|
231
|
-
initial: true,
|
|
232
|
-
});
|
|
233
|
-
if (!shouldContinue) {
|
|
234
|
-
console.log(`\n Stopped after batch ${currentBatch}. Applied ${appliedCount} files total.`);
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
// Re-enable raw mode for skip keypress
|
|
238
|
-
if (stdin.isTTY)
|
|
239
|
-
stdin.setRawMode(true);
|
|
240
|
-
stdin.resume();
|
|
241
|
-
batchModifiedFiles = [];
|
|
242
|
-
filesInCurrentBatch = 0;
|
|
243
|
-
rethemeSpinner.start();
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
const totalSeconds = Math.floor((Date.now() - totalStart) / 1000);
|
|
248
|
-
const minutes = Math.floor(totalSeconds / 60);
|
|
249
|
-
const seconds = totalSeconds % 60;
|
|
250
|
-
const timeStr = minutes > 0 ? `${minutes}m ${seconds}s` : `${totalSeconds}s`;
|
|
251
|
-
const failSuffix = failedFiles.length > 0 ? `, ${failedFiles.length} failed` : '';
|
|
252
|
-
const skipSuffix = userSkippedFiles.length > 0 ? `, ${userSkippedFiles.length} skipped` : '';
|
|
253
|
-
rethemeSpinner.succeed(`Retheme generated (${totalFiles} files in ${timeStr}${failSuffix}${skipSuffix})`);
|
|
254
|
-
if (failedFiles.length > 0) {
|
|
255
|
-
console.log(`\n Failed files:`);
|
|
256
|
-
for (const f of failedFiles) {
|
|
257
|
-
console.log(` ✖ ${f}`);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
if (userSkippedFiles.length > 0) {
|
|
261
|
-
console.log(`\n Skipped files:`);
|
|
262
|
-
for (const f of userSkippedFiles) {
|
|
263
|
-
console.log(` ⏭ ${f}`);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
// Deduplicate theme file in allModifiedFiles — only keep the last version
|
|
267
|
-
if (themeFile) {
|
|
268
|
-
let lastThemeIdx = -1;
|
|
269
|
-
for (let j = allModifiedFiles.length - 1; j >= 0; j--) {
|
|
270
|
-
if (allModifiedFiles[j].path === themeFile.path) {
|
|
271
|
-
if (lastThemeIdx === -1) {
|
|
272
|
-
lastThemeIdx = j;
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
allModifiedFiles.splice(j, 1);
|
|
276
|
-
lastThemeIdx--;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
if (batchSize) {
|
|
282
|
-
// Deduplicate theme file in batchModifiedFiles as well
|
|
283
|
-
if (themeFile) {
|
|
284
|
-
let lastThemeIdx = -1;
|
|
285
|
-
for (let j = batchModifiedFiles.length - 1; j >= 0; j--) {
|
|
286
|
-
if (batchModifiedFiles[j].path === themeFile.path) {
|
|
287
|
-
if (lastThemeIdx === -1) {
|
|
288
|
-
lastThemeIdx = j;
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
batchModifiedFiles.splice(j, 1);
|
|
292
|
-
lastThemeIdx--;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
// Apply remaining files from the final (possibly partial) batch
|
|
298
|
-
if (batchModifiedFiles.length > 0) {
|
|
299
|
-
applyChanges(batchModifiedFiles, cwd);
|
|
300
|
-
appliedCount += batchModifiedFiles.length;
|
|
301
|
-
}
|
|
302
|
-
console.log(`\n✅ Retheme complete! Applied ${appliedCount} files.`);
|
|
303
|
-
}
|
|
304
|
-
else if (noReview) {
|
|
305
|
-
// Already applied per-file above; just print summary
|
|
306
|
-
console.log(`\n✅ Retheme complete! Applied ${appliedCount} files.`);
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
// Restore normal stdin for interactive review prompt
|
|
310
|
-
if (stdin.isTTY)
|
|
311
|
-
stdin.setRawMode(wasRaw ?? false);
|
|
312
|
-
stdin.pause();
|
|
313
|
-
await reviewAndApplyChanges(allModifiedFiles, cwd, 'Retheme');
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
catch (rethemeErr) {
|
|
317
|
-
rethemeSpinner.fail('Retheme failed');
|
|
318
|
-
throw rethemeErr;
|
|
319
|
-
}
|
|
320
|
-
finally {
|
|
321
|
-
// Restore stdin to normal mode (safe to call even if already restored)
|
|
322
|
-
if (stdin.isTTY && stdin.isRaw)
|
|
323
|
-
stdin.setRawMode(wasRaw ?? false);
|
|
324
|
-
stdin.pause();
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
//# sourceMappingURL=retheme.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retheme.js","sourceRoot":"","sources":["../../src/commands/retheme.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/skills.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/util/diff.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export interface ModifiedFile {
|
|
2
|
-
path: string;
|
|
3
|
-
content: string;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Write modified files to disk without any prompts or review.
|
|
7
|
-
*/
|
|
8
|
-
export declare function applyChanges(modifiedFiles: ModifiedFile[], cwd: string): void;
|
|
9
|
-
/**
|
|
10
|
-
* Show a list of modified files, optionally display colored diffs,
|
|
11
|
-
* then prompt the user to apply changes. Returns true if changes were applied.
|
|
12
|
-
*/
|
|
13
|
-
export declare function reviewAndApplyChanges(modifiedFiles: ModifiedFile[], cwd: string, label: string): Promise<boolean>;
|