@sylphx/flow 0.2.13 → 1.0.1
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/CHANGELOG.md +318 -0
- package/LOOP_MODE.md +446 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +59398 -698
- package/dist/lancedb.linux-x64-gnu-b7f0jgsz.node +0 -0
- package/dist/lancedb.linux-x64-musl-tgcv22rx.node +0 -0
- package/dist/shared/chunk-25dwp0dp.js +89 -0
- package/dist/shared/chunk-3pjb6063.js +208 -0
- package/dist/shared/chunk-4d6ydpw7.js +2854 -0
- package/dist/shared/chunk-4wjcadjk.js +225 -0
- package/dist/shared/chunk-5j4w74t6.js +30 -0
- package/dist/shared/chunk-5j8m3dh3.js +58 -0
- package/dist/shared/chunk-5thh3qem.js +91 -0
- package/dist/shared/chunk-6g9xy73m.js +252 -0
- package/dist/shared/chunk-7eq34c42.js +23 -0
- package/dist/shared/chunk-c2gwgx3r.js +115 -0
- package/dist/shared/chunk-cjd3mk4c.js +1320 -0
- package/dist/shared/chunk-g5cv6703.js +368 -0
- package/dist/shared/chunk-hpkhykhq.js +574 -0
- package/dist/shared/chunk-m2322pdk.js +122 -0
- package/dist/shared/chunk-nd5fdvaq.js +26 -0
- package/dist/shared/chunk-pgd3m6zf.js +108 -0
- package/dist/shared/chunk-qk8n91hw.js +494 -0
- package/dist/shared/chunk-rkkn8szp.js +16855 -0
- package/dist/shared/chunk-t16rfxh0.js +61 -0
- package/dist/shared/chunk-t4fbfa5v.js +19 -0
- package/dist/shared/chunk-t77h86w6.js +276 -0
- package/dist/shared/chunk-v0ez4aef.js +71 -0
- package/dist/shared/chunk-v29j2r3s.js +32051 -0
- package/dist/shared/chunk-vfbc6ew5.js +765 -0
- package/dist/shared/chunk-vmeqwm1c.js +204 -0
- package/dist/shared/chunk-x66eh37x.js +137 -0
- package/package.json +45 -93
- package/README.md +0 -625
- package/assets/agents/coder.md +0 -32
- package/assets/agents/orchestrator.md +0 -36
- package/assets/agents/reviewer.md +0 -30
- package/assets/agents/writer.md +0 -30
- package/assets/knowledge/data/sql.md +0 -216
- package/assets/knowledge/guides/saas-template.md +0 -85
- package/assets/knowledge/guides/system-prompt.md +0 -344
- package/assets/knowledge/guides/tech-stack.md +0 -92
- package/assets/knowledge/guides/ui-ux.md +0 -44
- package/assets/knowledge/stacks/nextjs-app.md +0 -165
- package/assets/knowledge/stacks/node-api.md +0 -220
- package/assets/knowledge/stacks/react-app.md +0 -232
- package/assets/knowledge/universal/deployment.md +0 -109
- package/assets/knowledge/universal/performance.md +0 -121
- package/assets/knowledge/universal/security.md +0 -79
- package/assets/knowledge/universal/testing.md +0 -111
- package/assets/output-styles/silent.md +0 -23
- package/assets/rules/core.md +0 -197
- package/assets/slash-commands/commit.md +0 -23
- package/assets/slash-commands/context.md +0 -112
- package/assets/slash-commands/explain.md +0 -35
- package/assets/slash-commands/mep.md +0 -63
- package/assets/slash-commands/review.md +0 -39
- package/assets/slash-commands/test.md +0 -30
- package/dist/assets/agents/coder.md +0 -32
- package/dist/assets/agents/orchestrator.md +0 -36
- package/dist/assets/agents/reviewer.md +0 -30
- package/dist/assets/agents/writer.md +0 -30
- package/dist/assets/knowledge/data/sql.md +0 -216
- package/dist/assets/knowledge/guides/saas-template.md +0 -85
- package/dist/assets/knowledge/guides/system-prompt.md +0 -344
- package/dist/assets/knowledge/guides/tech-stack.md +0 -92
- package/dist/assets/knowledge/guides/ui-ux.md +0 -44
- package/dist/assets/knowledge/stacks/nextjs-app.md +0 -165
- package/dist/assets/knowledge/stacks/node-api.md +0 -220
- package/dist/assets/knowledge/stacks/react-app.md +0 -232
- package/dist/assets/knowledge/universal/deployment.md +0 -109
- package/dist/assets/knowledge/universal/performance.md +0 -121
- package/dist/assets/knowledge/universal/security.md +0 -79
- package/dist/assets/knowledge/universal/testing.md +0 -111
- package/dist/assets/output-styles/silent.md +0 -23
- package/dist/assets/rules/core.md +0 -197
- package/dist/assets/slash-commands/commit.md +0 -23
- package/dist/assets/slash-commands/context.md +0 -112
- package/dist/assets/slash-commands/explain.md +0 -35
- package/dist/assets/slash-commands/mep.md +0 -63
- package/dist/assets/slash-commands/review.md +0 -39
- package/dist/assets/slash-commands/test.md +0 -30
- package/dist/chunk-01gv4qey.js +0 -4
- package/dist/chunk-01gv4qey.js.map +0 -11
- package/dist/chunk-1e8xf3f6.js +0 -27
- package/dist/chunk-1e8xf3f6.js.map +0 -23
- package/dist/chunk-3m9whg4q.js +0 -4
- package/dist/chunk-3m9whg4q.js.map +0 -9
- package/dist/chunk-3qxj0zy3.js +0 -23
- package/dist/chunk-3qxj0zy3.js.map +0 -11
- package/dist/chunk-3w6pd43t.js +0 -25
- package/dist/chunk-3w6pd43t.js.map +0 -61
- package/dist/chunk-4e5g3df9.js +0 -105
- package/dist/chunk-4e5g3df9.js.map +0 -27
- package/dist/chunk-4nm4ere4.js +0 -4
- package/dist/chunk-4nm4ere4.js.map +0 -11
- package/dist/chunk-4vrj3f8r.js +0 -26
- package/dist/chunk-4vrj3f8r.js.map +0 -75
- package/dist/chunk-5njgv5k5.js +0 -161
- package/dist/chunk-5njgv5k5.js.map +0 -83
- package/dist/chunk-67n29s4q.js +0 -7
- package/dist/chunk-67n29s4q.js.map +0 -10
- package/dist/chunk-7yyg008s.js +0 -27
- package/dist/chunk-7yyg008s.js.map +0 -14
- package/dist/chunk-86ce45n6.js +0 -3
- package/dist/chunk-86ce45n6.js.map +0 -10
- package/dist/chunk-99pz5wm0.js +0 -75
- package/dist/chunk-99pz5wm0.js.map +0 -12
- package/dist/chunk-cv1nhr27.js +0 -2
- package/dist/chunk-cv1nhr27.js.map +0 -9
- package/dist/chunk-g4baca7p.js +0 -10
- package/dist/chunk-g4baca7p.js.map +0 -23
- package/dist/chunk-gc66xe7z.js +0 -4
- package/dist/chunk-gc66xe7z.js.map +0 -11
- package/dist/chunk-hj6qtsqp.js +0 -15
- package/dist/chunk-hj6qtsqp.js.map +0 -10
- package/dist/chunk-jbd95k1f.js +0 -14
- package/dist/chunk-jbd95k1f.js.map +0 -20
- package/dist/chunk-jk1ebfqn.js +0 -23
- package/dist/chunk-jk1ebfqn.js.map +0 -132
- package/dist/chunk-kn908zkk.js +0 -4
- package/dist/chunk-kn908zkk.js.map +0 -10
- package/dist/chunk-mw13a082.js +0 -4
- package/dist/chunk-mw13a082.js.map +0 -10
- package/dist/chunk-n8vzewr3.js +0 -4
- package/dist/chunk-n8vzewr3.js.map +0 -12
- package/dist/chunk-nke51f3c.js +0 -4
- package/dist/chunk-nke51f3c.js.map +0 -10
- package/dist/chunk-ns5atzyz.js +0 -3
- package/dist/chunk-ns5atzyz.js.map +0 -10
- package/dist/chunk-q4nh3vst.js +0 -54
- package/dist/chunk-q4nh3vst.js.map +0 -53
- package/dist/chunk-q5gqgs0p.js +0 -4
- package/dist/chunk-q5gqgs0p.js.map +0 -10
- package/dist/chunk-qpej66sh.js +0 -6
- package/dist/chunk-qpej66sh.js.map +0 -11
- package/dist/chunk-s9bsh0gp.js +0 -4
- package/dist/chunk-s9bsh0gp.js.map +0 -10
- package/dist/chunk-waemzsf4.js +0 -4
- package/dist/chunk-waemzsf4.js.map +0 -10
- package/dist/chunk-wnhhwtsy.js +0 -19
- package/dist/chunk-wnhhwtsy.js.map +0 -11
- package/dist/chunk-xs370t8p.js +0 -119
- package/dist/chunk-xs370t8p.js.map +0 -26
- package/dist/chunk-xtrn4wn0.js +0 -3
- package/dist/chunk-xtrn4wn0.js.map +0 -10
- package/dist/index.js.map +0 -920
- package/drizzle/0000_wooden_lady_bullseye.sql +0 -52
- package/drizzle/0001_material_pyro.sql +0 -85
- package/drizzle/0002_lyrical_random.sql +0 -2
- package/drizzle/0003_romantic_lockjaw.sql +0 -4
- package/drizzle/0004_blushing_meteorite.sql +0 -6
- package/drizzle/meta/0000_snapshot.json +0 -310
- package/drizzle/meta/0001_snapshot.json +0 -906
- package/drizzle/meta/0002_snapshot.json +0 -920
- package/drizzle/meta/0003_snapshot.json +0 -920
- package/drizzle/meta/0004_snapshot.json +0 -921
- package/drizzle/meta/_journal.json +0 -41
|
@@ -0,0 +1,765 @@
|
|
|
1
|
+
import {
|
|
2
|
+
StateDetector
|
|
3
|
+
} from "./chunk-t77h86w6.js";
|
|
4
|
+
import {
|
|
5
|
+
extractAgentInstructions,
|
|
6
|
+
loadAgentContent
|
|
7
|
+
} from "./chunk-5j8m3dh3.js";
|
|
8
|
+
import {
|
|
9
|
+
UpgradeManager
|
|
10
|
+
} from "./chunk-3pjb6063.js";
|
|
11
|
+
import"./chunk-x66eh37x.js";
|
|
12
|
+
import"./chunk-7eq34c42.js";
|
|
13
|
+
import {
|
|
14
|
+
projectSettings,
|
|
15
|
+
targetManager
|
|
16
|
+
} from "./chunk-vmeqwm1c.js";
|
|
17
|
+
import"./chunk-qk8n91hw.js";
|
|
18
|
+
import"./chunk-nd5fdvaq.js";
|
|
19
|
+
import {
|
|
20
|
+
CLIError
|
|
21
|
+
} from "./chunk-cjd3mk4c.js";
|
|
22
|
+
import"./chunk-t16rfxh0.js";
|
|
23
|
+
import"./chunk-hpkhykhq.js";
|
|
24
|
+
import {
|
|
25
|
+
__require,
|
|
26
|
+
__toESM
|
|
27
|
+
} from "./chunk-5j4w74t6.js";
|
|
28
|
+
|
|
29
|
+
// src/commands/flow-command.ts
|
|
30
|
+
import { Command } from "commander";
|
|
31
|
+
import chalk from "chalk";
|
|
32
|
+
import boxen from "boxen";
|
|
33
|
+
import path from "node:path";
|
|
34
|
+
import fs from "node:fs/promises";
|
|
35
|
+
function showWelcome() {
|
|
36
|
+
console.log(boxen(`${chalk.cyan.bold("Sylphx Flow")} ${chalk.dim("- AI-Powered Development Framework")}
|
|
37
|
+
` + `${chalk.dim("Auto-initialization • Smart upgrades • One-click launch")}`, {
|
|
38
|
+
padding: 1,
|
|
39
|
+
margin: { bottom: 1 },
|
|
40
|
+
borderStyle: "round",
|
|
41
|
+
borderColor: "cyan"
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
async function showStatus(state) {
|
|
45
|
+
console.log(chalk.cyan.bold(`\uD83D\uDCCA Project Status
|
|
46
|
+
`));
|
|
47
|
+
if (!state.initialized) {
|
|
48
|
+
console.log(" " + chalk.yellow("⚠ Not initialized"));
|
|
49
|
+
} else {
|
|
50
|
+
console.log(` ${chalk.green("✓")} Initialized (Flow v${state.version || "unknown"})`);
|
|
51
|
+
if (state.target) {
|
|
52
|
+
const versionStr = state.targetVersion ? ` (v${state.targetVersion})` : "";
|
|
53
|
+
console.log(` ${chalk.green("✓")} Target platform: ${state.target}${versionStr}`);
|
|
54
|
+
}
|
|
55
|
+
const components = state.components;
|
|
56
|
+
console.log(`
|
|
57
|
+
${chalk.cyan("Components:")}`);
|
|
58
|
+
console.log(` Agents: ${components.agents.installed ? chalk.green(`✓ ${components.agents.count}`) : chalk.red("✗")}`);
|
|
59
|
+
console.log(` Rules: ${components.rules.installed ? chalk.green(`✓ ${components.rules.count}`) : chalk.red("✗")}`);
|
|
60
|
+
console.log(` Hooks: ${components.hooks.installed ? chalk.green("✓") : chalk.red("✗")}`);
|
|
61
|
+
console.log(` MCP: ${components.mcp.installed ? chalk.green(`✓ ${components.mcp.serverCount} servers`) : chalk.red("✗")}`);
|
|
62
|
+
console.log(` Output styles: ${components.outputStyles.installed ? chalk.green("✓") : chalk.red("✗")}`);
|
|
63
|
+
console.log(` Slash commands: ${components.slashCommands.installed ? chalk.green(`✓ ${components.slashCommands.count}`) : chalk.red("✗")}`);
|
|
64
|
+
if (state.outdated) {
|
|
65
|
+
console.log(`
|
|
66
|
+
${chalk.yellow("⚠")} Flow version outdated: ${state.version} → ${state.latestVersion}`);
|
|
67
|
+
}
|
|
68
|
+
if (state.targetVersion && state.targetLatestVersion && isVersionOutdated(state.targetVersion, state.targetLatestVersion)) {
|
|
69
|
+
console.log(` ${chalk.yellow("⚠")} ${state.target} update available: v${state.targetVersion} → v${state.targetLatestVersion}`);
|
|
70
|
+
}
|
|
71
|
+
if (state.lastUpdated) {
|
|
72
|
+
const days = Math.floor((Date.now() - state.lastUpdated.getTime()) / (1000 * 60 * 60 * 24));
|
|
73
|
+
if (days > 7) {
|
|
74
|
+
console.log(`
|
|
75
|
+
${chalk.yellow("⚠")} Last updated: ${days} days ago`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
console.log("");
|
|
80
|
+
}
|
|
81
|
+
function getExecutableTargets() {
|
|
82
|
+
return targetManager.getImplementedTargetIDs().filter((targetId) => {
|
|
83
|
+
const targetOption = targetManager.getTarget(targetId);
|
|
84
|
+
if (targetOption._tag === "None") {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
return targetOption.value.executeCommand !== undefined;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async function executeTargetCommand(targetId, systemPrompt, userPrompt, options) {
|
|
91
|
+
const targetOption = targetManager.getTarget(targetId);
|
|
92
|
+
if (targetOption._tag === "None") {
|
|
93
|
+
throw new CLIError(`Target not found: ${targetId}`, "TARGET_NOT_FOUND");
|
|
94
|
+
}
|
|
95
|
+
const target = targetOption.value;
|
|
96
|
+
if (!target.isImplemented) {
|
|
97
|
+
throw new CLIError(`Target '${targetId}' is not implemented. Supported targets: ${getExecutableTargets().join(", ")}`, "TARGET_NOT_IMPLEMENTED");
|
|
98
|
+
}
|
|
99
|
+
if (!target.executeCommand) {
|
|
100
|
+
throw new CLIError(`Target '${targetId}' does not support command execution. Supported targets: ${getExecutableTargets().join(", ")}`, "EXECUTION_NOT_SUPPORTED");
|
|
101
|
+
}
|
|
102
|
+
return target.executeCommand(systemPrompt, userPrompt, options);
|
|
103
|
+
}
|
|
104
|
+
function isVersionOutdated(current, latest) {
|
|
105
|
+
try {
|
|
106
|
+
return compareVersions(current, latest) < 0;
|
|
107
|
+
} catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function compareVersions(v1, v2) {
|
|
112
|
+
const parts1 = v1.split(".").map(Number);
|
|
113
|
+
const parts2 = v2.split(".").map(Number);
|
|
114
|
+
for (let i = 0;i < Math.min(parts1.length, parts2.length); i++) {
|
|
115
|
+
if (parts1[i] !== parts2[i]) {
|
|
116
|
+
return parts1[i] - parts2[i];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return parts1.length - parts2.length;
|
|
120
|
+
}
|
|
121
|
+
async function resolvePrompt(prompt) {
|
|
122
|
+
if (!prompt)
|
|
123
|
+
return prompt;
|
|
124
|
+
if (prompt.startsWith("@")) {
|
|
125
|
+
const filePath = prompt.slice(1);
|
|
126
|
+
try {
|
|
127
|
+
const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
|
|
128
|
+
const content = await fs.readFile(resolvedPath, "utf-8");
|
|
129
|
+
console.log(chalk.dim(` ✓ Loaded prompt from: ${filePath}
|
|
130
|
+
`));
|
|
131
|
+
return content.trim();
|
|
132
|
+
} catch (error) {
|
|
133
|
+
throw new Error(`Failed to read prompt file: ${filePath}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return prompt;
|
|
137
|
+
}
|
|
138
|
+
async function executeFlow(prompt, options) {
|
|
139
|
+
const resolvedPrompt = await resolvePrompt(prompt);
|
|
140
|
+
if (options.loop !== undefined) {
|
|
141
|
+
const { LoopController } = await import("./chunk-c2gwgx3r.js");
|
|
142
|
+
const controller = new LoopController;
|
|
143
|
+
const interval = typeof options.loop === "number" ? options.loop : 0;
|
|
144
|
+
options.print = true;
|
|
145
|
+
const setupContext = await executeSetupPhase(resolvedPrompt, options);
|
|
146
|
+
const originalContinue = options.continue || false;
|
|
147
|
+
await controller.run(async () => {
|
|
148
|
+
const isFirstIteration = controller["state"].iteration === 1;
|
|
149
|
+
options.continue = originalContinue || !isFirstIteration;
|
|
150
|
+
try {
|
|
151
|
+
await executeCommandOnly(setupContext, resolvedPrompt, options);
|
|
152
|
+
return { exitCode: 0 };
|
|
153
|
+
} catch (error) {
|
|
154
|
+
return { exitCode: 1, error };
|
|
155
|
+
}
|
|
156
|
+
}, {
|
|
157
|
+
enabled: true,
|
|
158
|
+
interval,
|
|
159
|
+
maxRuns: options.maxRuns
|
|
160
|
+
});
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
await executeFlowOnce(resolvedPrompt, options);
|
|
164
|
+
}
|
|
165
|
+
async function executeSetupPhase(prompt, options) {
|
|
166
|
+
if (options.quick) {
|
|
167
|
+
options.useDefaults = true;
|
|
168
|
+
console.log(chalk.cyan(`⚡ Quick mode enabled - using saved defaults
|
|
169
|
+
`));
|
|
170
|
+
}
|
|
171
|
+
const {
|
|
172
|
+
checkUpgrades,
|
|
173
|
+
checkComponentIntegrity,
|
|
174
|
+
selectTarget,
|
|
175
|
+
initializeProject
|
|
176
|
+
} = await import("./chunk-4wjcadjk.js");
|
|
177
|
+
showWelcome();
|
|
178
|
+
let selectedTarget;
|
|
179
|
+
let state;
|
|
180
|
+
const initialTarget = options.target || await projectSettings.getDefaultTarget();
|
|
181
|
+
if (initialTarget && !options.sync) {
|
|
182
|
+
const detector = new StateDetector;
|
|
183
|
+
if (options.verbose) {
|
|
184
|
+
console.log(chalk.dim(`\uD83E\uDD14 Checking project status...
|
|
185
|
+
`));
|
|
186
|
+
}
|
|
187
|
+
state = await detector.detect();
|
|
188
|
+
if (options.verbose) {
|
|
189
|
+
await showStatus(state);
|
|
190
|
+
}
|
|
191
|
+
if (!options.quick) {
|
|
192
|
+
await checkUpgrades(state, options);
|
|
193
|
+
}
|
|
194
|
+
await checkComponentIntegrity(state, options);
|
|
195
|
+
}
|
|
196
|
+
const shouldInitialize = !state?.initialized || options.sync || options.repair || options.initOnly;
|
|
197
|
+
if (shouldInitialize) {
|
|
198
|
+
try {
|
|
199
|
+
const { selectAndValidateTarget, previewDryRun, installComponents } = await import("./chunk-6g9xy73m.js");
|
|
200
|
+
const initOptions = {
|
|
201
|
+
target: options.target,
|
|
202
|
+
verbose: options.verbose || false,
|
|
203
|
+
dryRun: options.dryRun || false,
|
|
204
|
+
clear: options.sync || false,
|
|
205
|
+
mcp: options.mcp !== false,
|
|
206
|
+
agents: options.agents !== false,
|
|
207
|
+
rules: options.rules !== false,
|
|
208
|
+
outputStyles: options.outputStyles !== false,
|
|
209
|
+
slashCommands: options.slashCommands !== false,
|
|
210
|
+
hooks: options.hooks !== false
|
|
211
|
+
};
|
|
212
|
+
if (options.sync && !options.dryRun) {
|
|
213
|
+
const { buildSyncManifest, showSyncPreview, confirmSync, executeSyncDelete } = await import("./chunk-m2322pdk.js");
|
|
214
|
+
const targetId = await selectAndValidateTarget(initOptions);
|
|
215
|
+
selectedTarget = targetId;
|
|
216
|
+
const targetOption = targetManager.getTarget(targetId);
|
|
217
|
+
if (targetOption._tag === "None") {
|
|
218
|
+
throw new Error(`Target not found: ${targetId}`);
|
|
219
|
+
}
|
|
220
|
+
const target = targetOption.value;
|
|
221
|
+
const manifest = await buildSyncManifest(process.cwd(), target);
|
|
222
|
+
console.log(chalk.cyan.bold(`━━━ \uD83D\uDD04 Synchronizing Files
|
|
223
|
+
`));
|
|
224
|
+
showSyncPreview(manifest, process.cwd());
|
|
225
|
+
const confirmed = await confirmSync();
|
|
226
|
+
if (!confirmed) {
|
|
227
|
+
console.log(chalk.yellow(`
|
|
228
|
+
✗ Sync cancelled
|
|
229
|
+
`));
|
|
230
|
+
process.exit(0);
|
|
231
|
+
}
|
|
232
|
+
const deletedCount = await executeSyncDelete(manifest);
|
|
233
|
+
console.log(chalk.green(`
|
|
234
|
+
✓ Deleted ${deletedCount} files
|
|
235
|
+
`));
|
|
236
|
+
} else if (!options.sync) {
|
|
237
|
+
const targetId = await selectAndValidateTarget(initOptions);
|
|
238
|
+
selectedTarget = targetId;
|
|
239
|
+
}
|
|
240
|
+
if (options.dryRun) {
|
|
241
|
+
if (!selectedTarget) {
|
|
242
|
+
const targetId = await selectAndValidateTarget(initOptions);
|
|
243
|
+
selectedTarget = targetId;
|
|
244
|
+
}
|
|
245
|
+
console.log(boxen(chalk.yellow("⚠ Dry Run Mode") + chalk.dim(`
|
|
246
|
+
No changes will be made to your project`), {
|
|
247
|
+
padding: 1,
|
|
248
|
+
margin: { top: 0, bottom: 1, left: 0, right: 0 },
|
|
249
|
+
borderStyle: "round",
|
|
250
|
+
borderColor: "yellow"
|
|
251
|
+
}));
|
|
252
|
+
await previewDryRun(selectedTarget, initOptions);
|
|
253
|
+
console.log(`
|
|
254
|
+
` + boxen(chalk.green.bold("✓ Dry run complete"), {
|
|
255
|
+
padding: { top: 0, bottom: 0, left: 2, right: 2 },
|
|
256
|
+
margin: 0,
|
|
257
|
+
borderStyle: "round",
|
|
258
|
+
borderColor: "green"
|
|
259
|
+
}) + `
|
|
260
|
+
`);
|
|
261
|
+
console.log(chalk.dim(`✓ Initialization dry run complete
|
|
262
|
+
`));
|
|
263
|
+
} else {
|
|
264
|
+
if (!selectedTarget) {
|
|
265
|
+
const targetId = await selectAndValidateTarget(initOptions);
|
|
266
|
+
selectedTarget = targetId;
|
|
267
|
+
}
|
|
268
|
+
await installComponents(selectedTarget, initOptions);
|
|
269
|
+
console.log(chalk.green.bold(`✓ Initialization complete
|
|
270
|
+
`));
|
|
271
|
+
}
|
|
272
|
+
} catch (error) {
|
|
273
|
+
console.error(chalk.red.bold("✗ Initialization failed:"), error);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
let targetForResolution = options.target || state?.target || selectedTarget;
|
|
278
|
+
if (selectedTarget) {
|
|
279
|
+
targetForResolution = selectedTarget;
|
|
280
|
+
}
|
|
281
|
+
if (!targetForResolution) {
|
|
282
|
+
console.error(chalk.red.bold("✗ No target selected. Use --target or run init first."));
|
|
283
|
+
process.exit(1);
|
|
284
|
+
}
|
|
285
|
+
const resolvedTarget = await targetManager.resolveTarget({
|
|
286
|
+
target: targetForResolution,
|
|
287
|
+
allowSelection: false
|
|
288
|
+
});
|
|
289
|
+
console.log(chalk.cyan.bold(`━━━ \uD83C\uDFAF Launching ${resolvedTarget}
|
|
290
|
+
`));
|
|
291
|
+
const { getTargetsWithCommandSupport } = await import("./chunk-qk8n91hw.js");
|
|
292
|
+
const supportedTargets = getTargetsWithCommandSupport().map((t) => t.id);
|
|
293
|
+
if (!supportedTargets.includes(resolvedTarget)) {
|
|
294
|
+
console.log(chalk.red.bold(`✗ Unsupported target platform
|
|
295
|
+
`));
|
|
296
|
+
console.log(chalk.yellow(`Target '${resolvedTarget}' does not support agent execution.`));
|
|
297
|
+
console.log(chalk.cyan(`Supported platforms: ${supportedTargets.join(", ")}
|
|
298
|
+
`));
|
|
299
|
+
console.log(chalk.dim("Tip: Use --target claude-code to specify Claude Code platform"));
|
|
300
|
+
console.log(chalk.dim(`Example: bun dev:flow --target claude-code
|
|
301
|
+
`));
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
if (resolvedTarget === "claude-code") {
|
|
305
|
+
const { SmartConfigService } = await import("./chunk-g5cv6703.js");
|
|
306
|
+
const { ConfigService } = await import("./chunk-x66eh37x.js");
|
|
307
|
+
if (!await ConfigService.hasInitialSetup()) {
|
|
308
|
+
console.log(chalk.cyan(`\uD83D\uDD11 First-time setup for Claude Code
|
|
309
|
+
`));
|
|
310
|
+
await SmartConfigService.initialSetup();
|
|
311
|
+
console.log(chalk.green(`✓ Setup complete!
|
|
312
|
+
`));
|
|
313
|
+
}
|
|
314
|
+
const runtimeChoices = await SmartConfigService.selectRuntimeChoices({
|
|
315
|
+
selectProvider: options.selectProvider,
|
|
316
|
+
selectAgent: options.selectAgent,
|
|
317
|
+
useDefaults: options.useDefaults,
|
|
318
|
+
provider: options.provider,
|
|
319
|
+
agent: options.agent
|
|
320
|
+
});
|
|
321
|
+
await SmartConfigService.setupEnvironment(runtimeChoices.provider);
|
|
322
|
+
options.agent = runtimeChoices.agent;
|
|
323
|
+
}
|
|
324
|
+
const agent = options.agent || "coder";
|
|
325
|
+
const verbose = options.verbose || false;
|
|
326
|
+
if (verbose || options.runOnly || !options.quick) {
|
|
327
|
+
console.log(` \uD83E\uDD16 Agent: ${chalk.cyan(agent)}`);
|
|
328
|
+
console.log(` \uD83C\uDFAF Target: ${chalk.cyan(resolvedTarget)}`);
|
|
329
|
+
if (prompt) {
|
|
330
|
+
console.log(` \uD83D\uDCAC Prompt: ${chalk.dim(prompt)}
|
|
331
|
+
`);
|
|
332
|
+
} else {
|
|
333
|
+
console.log(` \uD83D\uDCAC Mode: ${chalk.dim("Interactive")}
|
|
334
|
+
`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const agentContent = await loadAgentContent(agent, options.agentFile);
|
|
338
|
+
const agentInstructions = extractAgentInstructions(agentContent);
|
|
339
|
+
const systemPrompt = `AGENT INSTRUCTIONS:
|
|
340
|
+
${agentInstructions}`;
|
|
341
|
+
const runOptions = {
|
|
342
|
+
target: resolvedTarget,
|
|
343
|
+
verbose,
|
|
344
|
+
dryRun: options.dryRun,
|
|
345
|
+
agent,
|
|
346
|
+
agentFile: options.agentFile,
|
|
347
|
+
prompt,
|
|
348
|
+
print: options.print,
|
|
349
|
+
continue: options.continue
|
|
350
|
+
};
|
|
351
|
+
return {
|
|
352
|
+
resolvedTarget,
|
|
353
|
+
agent,
|
|
354
|
+
systemPrompt,
|
|
355
|
+
runOptions
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
async function executeCommandOnly(context, prompt, options) {
|
|
359
|
+
const userPrompt = prompt?.trim() || "";
|
|
360
|
+
const runOptions = {
|
|
361
|
+
...context.runOptions,
|
|
362
|
+
continue: options.continue
|
|
363
|
+
};
|
|
364
|
+
try {
|
|
365
|
+
await executeTargetCommand(context.resolvedTarget, context.systemPrompt, userPrompt, runOptions);
|
|
366
|
+
} catch (error) {
|
|
367
|
+
console.error(chalk.red.bold(`
|
|
368
|
+
✗ Launch failed:`), error);
|
|
369
|
+
throw error;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async function executeFlowOnce(prompt, options) {
|
|
373
|
+
if (options.quick) {
|
|
374
|
+
options.useDefaults = true;
|
|
375
|
+
console.log(chalk.cyan(`⚡ Quick mode enabled - using saved defaults
|
|
376
|
+
`));
|
|
377
|
+
}
|
|
378
|
+
if (options.continue && !options.print) {
|
|
379
|
+
options.print = true;
|
|
380
|
+
}
|
|
381
|
+
const {
|
|
382
|
+
checkUpgrades,
|
|
383
|
+
checkComponentIntegrity,
|
|
384
|
+
selectTarget,
|
|
385
|
+
initializeProject,
|
|
386
|
+
launchTarget
|
|
387
|
+
} = await import("./chunk-4wjcadjk.js");
|
|
388
|
+
showWelcome();
|
|
389
|
+
let selectedTarget;
|
|
390
|
+
let state;
|
|
391
|
+
const initialTarget = options.target || await projectSettings.getDefaultTarget();
|
|
392
|
+
if (initialTarget && !options.sync) {
|
|
393
|
+
const detector = new StateDetector;
|
|
394
|
+
const upgradeManager = new UpgradeManager;
|
|
395
|
+
if (options.verbose) {
|
|
396
|
+
console.log(chalk.dim(`\uD83E\uDD14 Checking project status...
|
|
397
|
+
`));
|
|
398
|
+
}
|
|
399
|
+
state = await detector.detect();
|
|
400
|
+
if (options.verbose) {
|
|
401
|
+
await showStatus(state);
|
|
402
|
+
}
|
|
403
|
+
if (!options.quick) {
|
|
404
|
+
await checkUpgrades(state, options);
|
|
405
|
+
}
|
|
406
|
+
if (options.upgrade && state.outdated && state.latestVersion) {
|
|
407
|
+
console.log(chalk.cyan.bold(`━━━ \uD83D\uDCE6 Upgrading Flow
|
|
408
|
+
`));
|
|
409
|
+
await upgradeManager.upgradeFlow(state);
|
|
410
|
+
console.log(chalk.green(`✓ Upgrade complete
|
|
411
|
+
`));
|
|
412
|
+
state.version = state.latestVersion;
|
|
413
|
+
state.outdated = false;
|
|
414
|
+
}
|
|
415
|
+
if (options.upgradeTarget && state.target) {
|
|
416
|
+
console.log(chalk.cyan.bold(`━━━ \uD83C\uDFAF Upgrading ${state.target}
|
|
417
|
+
`));
|
|
418
|
+
await upgradeManager.upgradeTarget(state);
|
|
419
|
+
console.log(chalk.green(`✓ Target upgrade complete
|
|
420
|
+
`));
|
|
421
|
+
}
|
|
422
|
+
await checkComponentIntegrity(state, options);
|
|
423
|
+
}
|
|
424
|
+
const shouldInitialize = !state?.initialized || options.sync || options.repair || options.initOnly;
|
|
425
|
+
if (shouldInitialize) {
|
|
426
|
+
console.log(chalk.cyan.bold(`━━━ \uD83D\uDE80 Initializing Project
|
|
427
|
+
`));
|
|
428
|
+
const {
|
|
429
|
+
selectAndValidateTarget,
|
|
430
|
+
previewDryRun,
|
|
431
|
+
installComponents
|
|
432
|
+
} = await import("./chunk-6g9xy73m.js");
|
|
433
|
+
try {
|
|
434
|
+
const targetForInit = options.repair && state?.target ? state.target : options.target;
|
|
435
|
+
const initOptions = {
|
|
436
|
+
target: targetForInit,
|
|
437
|
+
verbose: options.verbose,
|
|
438
|
+
dryRun: options.dryRun,
|
|
439
|
+
clear: options.sync || false,
|
|
440
|
+
mcp: options.mcp !== false,
|
|
441
|
+
agents: options.agents !== false,
|
|
442
|
+
rules: options.rules !== false,
|
|
443
|
+
outputStyles: options.outputStyles !== false,
|
|
444
|
+
slashCommands: options.slashCommands !== false,
|
|
445
|
+
hooks: options.hooks !== false
|
|
446
|
+
};
|
|
447
|
+
if (options.sync && !options.dryRun) {
|
|
448
|
+
const { buildSyncManifest, showSyncPreview, confirmSync, executeSyncDelete } = await import("./chunk-m2322pdk.js");
|
|
449
|
+
const targetId = await selectAndValidateTarget(initOptions);
|
|
450
|
+
selectedTarget = targetId;
|
|
451
|
+
const targetOption = targetManager.getTarget(targetId);
|
|
452
|
+
if (targetOption._tag === "None") {
|
|
453
|
+
throw new Error(`Target not found: ${targetId}`);
|
|
454
|
+
}
|
|
455
|
+
const target = targetOption.value;
|
|
456
|
+
const manifest = await buildSyncManifest(process.cwd(), target);
|
|
457
|
+
console.log(chalk.cyan.bold(`━━━ \uD83D\uDD04 Synchronizing Files
|
|
458
|
+
`));
|
|
459
|
+
showSyncPreview(manifest, process.cwd());
|
|
460
|
+
const confirmed = await confirmSync();
|
|
461
|
+
if (!confirmed) {
|
|
462
|
+
console.log(chalk.yellow(`
|
|
463
|
+
✗ Sync cancelled
|
|
464
|
+
`));
|
|
465
|
+
process.exit(0);
|
|
466
|
+
}
|
|
467
|
+
const deletedCount = await executeSyncDelete(manifest);
|
|
468
|
+
console.log(chalk.green(`
|
|
469
|
+
✓ Deleted ${deletedCount} files
|
|
470
|
+
`));
|
|
471
|
+
} else {
|
|
472
|
+
const targetId = await selectAndValidateTarget(initOptions);
|
|
473
|
+
selectedTarget = targetId;
|
|
474
|
+
}
|
|
475
|
+
if (options.dryRun) {
|
|
476
|
+
if (!selectedTarget) {
|
|
477
|
+
const targetId = await selectAndValidateTarget(initOptions);
|
|
478
|
+
selectedTarget = targetId;
|
|
479
|
+
}
|
|
480
|
+
console.log(boxen(chalk.yellow("⚠ Dry Run Mode") + chalk.dim(`
|
|
481
|
+
No changes will be made to your project`), {
|
|
482
|
+
padding: 1,
|
|
483
|
+
margin: { top: 0, bottom: 1, left: 0, right: 0 },
|
|
484
|
+
borderStyle: "round",
|
|
485
|
+
borderColor: "yellow"
|
|
486
|
+
}));
|
|
487
|
+
await previewDryRun(selectedTarget, initOptions);
|
|
488
|
+
console.log(`
|
|
489
|
+
` + boxen(chalk.green.bold("✓ Dry run complete"), {
|
|
490
|
+
padding: { top: 0, bottom: 0, left: 2, right: 2 },
|
|
491
|
+
margin: 0,
|
|
492
|
+
borderStyle: "round",
|
|
493
|
+
borderColor: "green"
|
|
494
|
+
}) + `
|
|
495
|
+
`);
|
|
496
|
+
console.log(chalk.dim(`✓ Initialization dry run complete
|
|
497
|
+
`));
|
|
498
|
+
} else {
|
|
499
|
+
if (!selectedTarget) {
|
|
500
|
+
const targetId = await selectAndValidateTarget(initOptions);
|
|
501
|
+
selectedTarget = targetId;
|
|
502
|
+
}
|
|
503
|
+
const result = await installComponents(selectedTarget, initOptions);
|
|
504
|
+
console.log(chalk.green.bold(`✓ Initialization complete
|
|
505
|
+
`));
|
|
506
|
+
}
|
|
507
|
+
} catch (error) {
|
|
508
|
+
console.error(chalk.red.bold("✗ Initialization failed:"), error);
|
|
509
|
+
process.exit(1);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
if (!options.initOnly) {
|
|
513
|
+
let targetForResolution = options.target || state?.target || selectedTarget;
|
|
514
|
+
if (selectedTarget) {
|
|
515
|
+
targetForResolution = selectedTarget;
|
|
516
|
+
}
|
|
517
|
+
if (!targetForResolution) {
|
|
518
|
+
console.error(chalk.red.bold("✗ No target selected. Use --target or run init first."));
|
|
519
|
+
process.exit(1);
|
|
520
|
+
}
|
|
521
|
+
const resolvedTarget = await targetManager.resolveTarget({
|
|
522
|
+
target: targetForResolution,
|
|
523
|
+
allowSelection: false
|
|
524
|
+
});
|
|
525
|
+
console.log(chalk.cyan.bold(`━━━ \uD83C\uDFAF Launching ${resolvedTarget}
|
|
526
|
+
`));
|
|
527
|
+
const { getTargetsWithCommandSupport } = await import("./chunk-qk8n91hw.js");
|
|
528
|
+
const supportedTargets = getTargetsWithCommandSupport().map((t) => t.id);
|
|
529
|
+
if (!supportedTargets.includes(resolvedTarget)) {
|
|
530
|
+
console.log(chalk.red.bold(`✗ Unsupported target platform
|
|
531
|
+
`));
|
|
532
|
+
console.log(chalk.yellow(`Target '${resolvedTarget}' does not support agent execution.`));
|
|
533
|
+
console.log(chalk.cyan(`Supported platforms: ${supportedTargets.join(", ")}
|
|
534
|
+
`));
|
|
535
|
+
console.log(chalk.dim("Tip: Use --target claude-code to specify Claude Code platform"));
|
|
536
|
+
console.log(chalk.dim(`Example: bun dev:flow --target claude-code
|
|
537
|
+
`));
|
|
538
|
+
process.exit(1);
|
|
539
|
+
}
|
|
540
|
+
if (resolvedTarget === "claude-code") {
|
|
541
|
+
const { SmartConfigService } = await import("./chunk-g5cv6703.js");
|
|
542
|
+
const { ConfigService } = await import("./chunk-x66eh37x.js");
|
|
543
|
+
if (!await ConfigService.hasInitialSetup()) {
|
|
544
|
+
console.log(chalk.cyan(`\uD83D\uDD11 First-time setup for Claude Code
|
|
545
|
+
`));
|
|
546
|
+
await SmartConfigService.initialSetup();
|
|
547
|
+
console.log(chalk.green(`✓ Setup complete!
|
|
548
|
+
`));
|
|
549
|
+
}
|
|
550
|
+
const runtimeChoices = await SmartConfigService.selectRuntimeChoices({
|
|
551
|
+
selectProvider: options.selectProvider,
|
|
552
|
+
selectAgent: options.selectAgent,
|
|
553
|
+
useDefaults: options.useDefaults,
|
|
554
|
+
provider: options.provider,
|
|
555
|
+
agent: options.agent
|
|
556
|
+
});
|
|
557
|
+
await SmartConfigService.setupEnvironment(runtimeChoices.provider);
|
|
558
|
+
options.agent = runtimeChoices.agent;
|
|
559
|
+
}
|
|
560
|
+
const agent = options.agent || "coder";
|
|
561
|
+
const verbose = options.verbose || false;
|
|
562
|
+
if (verbose || options.runOnly || !options.quick) {
|
|
563
|
+
console.log(` \uD83E\uDD16 Agent: ${chalk.cyan(agent)}`);
|
|
564
|
+
console.log(` \uD83C\uDFAF Target: ${chalk.cyan(resolvedTarget)}`);
|
|
565
|
+
if (prompt) {
|
|
566
|
+
console.log(` \uD83D\uDCAC Prompt: ${chalk.dim(prompt)}
|
|
567
|
+
`);
|
|
568
|
+
} else {
|
|
569
|
+
console.log(` \uD83D\uDCAC Mode: ${chalk.dim("Interactive")}
|
|
570
|
+
`);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
const agentContent = await loadAgentContent(agent, options.agentFile);
|
|
574
|
+
const agentInstructions = extractAgentInstructions(agentContent);
|
|
575
|
+
const systemPrompt = `AGENT INSTRUCTIONS:
|
|
576
|
+
${agentInstructions}`;
|
|
577
|
+
const userPrompt = prompt?.trim() || "";
|
|
578
|
+
const runOptions = {
|
|
579
|
+
target: resolvedTarget,
|
|
580
|
+
verbose,
|
|
581
|
+
dryRun: options.dryRun,
|
|
582
|
+
agent,
|
|
583
|
+
agentFile: options.agentFile,
|
|
584
|
+
prompt,
|
|
585
|
+
print: options.print,
|
|
586
|
+
continue: options.continue
|
|
587
|
+
};
|
|
588
|
+
try {
|
|
589
|
+
await executeTargetCommand(resolvedTarget, systemPrompt, userPrompt, runOptions);
|
|
590
|
+
} catch (error) {
|
|
591
|
+
console.error(chalk.red.bold(`
|
|
592
|
+
✗ Launch failed:`), error);
|
|
593
|
+
process.exit(1);
|
|
594
|
+
}
|
|
595
|
+
if (!options.dryRun) {
|
|
596
|
+
console.log(chalk.dim(`━━━
|
|
597
|
+
`));
|
|
598
|
+
console.log(chalk.green(`✓ Session complete
|
|
599
|
+
`));
|
|
600
|
+
}
|
|
601
|
+
} else {
|
|
602
|
+
console.log(chalk.dim(`✓ Init-only mode, skipping execution
|
|
603
|
+
`));
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
var flowCommand = new Command("flow").description("Intelligent development flow (auto-detect state and act accordingly)").option("--init-only", "Only initialize, do not run").option("--run-only", "Only run, skip initialization").option("--sync", "Synchronize with Flow templates (delete and re-install template files)").option("--upgrade", "Upgrade Sylphx Flow to latest version").option("--upgrade-target", "Upgrade target platform (Claude Code/OpenCode)").option("--quick", "Quick mode: use saved defaults and skip all prompts").option("--select-provider", "Prompt to select provider each run").option("--select-agent", "Prompt to select agent each run").option("--use-defaults", "Skip prompts, use saved defaults").option("--provider <provider>", "Override provider for this run (anthropic|z.ai|kimi)").option("--target <type>", "Target platform (opencode, claude-code, auto-detect)").option("--verbose", "Show detailed output").option("--dry-run", "Show what would be done without making changes").option("--no-mcp", "Skip MCP installation").option("--no-agents", "Skip agents installation").option("--no-rules", "Skip rules installation").option("--no-output-styles", "Skip output styles installation").option("--no-slash-commands", "Skip slash commands installation").option("--no-hooks", "Skip hooks setup").option("--agent <name>", "Agent to use (default: coder)", "coder").option("--agent-file <path>", "Load agent from specific file").option("-p, --print", "Headless print mode (output only, no interactive)").option("-c, --continue", "Continue previous conversation (requires print mode)").argument("[prompt]", "Prompt to execute with agent (optional, supports @file.txt for file input)").action(async (prompt, options) => {
|
|
607
|
+
await executeFlow(prompt, options);
|
|
608
|
+
});
|
|
609
|
+
var setupCommand = new Command("setup").description("Initialize project configuration (alias for: flow --init-only)").action(async () => {
|
|
610
|
+
console.log(chalk.yellow('ℹ The "setup" command is deprecated.'));
|
|
611
|
+
console.log(chalk.yellow(` Please use: flow --init-only
|
|
612
|
+
`));
|
|
613
|
+
showWelcome();
|
|
614
|
+
const { runInit } = await import("./chunk-v0ez4aef.js");
|
|
615
|
+
await runInit({
|
|
616
|
+
target: undefined,
|
|
617
|
+
verbose: false,
|
|
618
|
+
dryRun: false,
|
|
619
|
+
clear: false,
|
|
620
|
+
mcp: true,
|
|
621
|
+
agents: true,
|
|
622
|
+
rules: true,
|
|
623
|
+
outputStyles: true,
|
|
624
|
+
slashCommands: true,
|
|
625
|
+
hooks: true,
|
|
626
|
+
helpOption: () => {}
|
|
627
|
+
});
|
|
628
|
+
console.log(chalk.green(`
|
|
629
|
+
✅ Setup complete!`));
|
|
630
|
+
console.log(chalk.dim(`
|
|
631
|
+
Next time, use: flow --init-only`));
|
|
632
|
+
});
|
|
633
|
+
var statusCommand = new Command("status").description("Show project status and configuration").option("--verbose", "Show detailed information").action(async (options) => {
|
|
634
|
+
const detector = new StateDetector;
|
|
635
|
+
const state = await detector.detect();
|
|
636
|
+
showWelcome();
|
|
637
|
+
await showStatus(state);
|
|
638
|
+
if (options.verbose) {
|
|
639
|
+
console.log(chalk.cyan.bold(`
|
|
640
|
+
\uD83D\uDCCB 详细信息
|
|
641
|
+
`));
|
|
642
|
+
try {
|
|
643
|
+
const { getProjectSettingsFile } = await import("./chunk-7eq34c42.js");
|
|
644
|
+
const configPath = path.join(process.cwd(), getProjectSettingsFile());
|
|
645
|
+
const config = JSON.parse(await fs.readFile(configPath, "utf-8"));
|
|
646
|
+
console.log("配置文件:", JSON.stringify(config, null, 2));
|
|
647
|
+
} catch {
|
|
648
|
+
console.log("配置文件: 不存在");
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
var doctorCommand = new Command("doctor").description("Diagnose and fix common issues").option("--fix", "Automatically fix issues").option("--verbose", "Show detailed diagnostics").action(async (options) => {
|
|
653
|
+
console.log(chalk.cyan.bold(`\uD83D\uDD0D 诊断项目
|
|
654
|
+
`));
|
|
655
|
+
const detector = new StateDetector;
|
|
656
|
+
const state = await detector.detect();
|
|
657
|
+
let issuesFound = false;
|
|
658
|
+
console.log("检查 Claude Code 安装...");
|
|
659
|
+
try {
|
|
660
|
+
const { exec } = await import("node:child_process");
|
|
661
|
+
const { promisify } = await import("node:util");
|
|
662
|
+
const execAsync = promisify(exec);
|
|
663
|
+
await execAsync("which claude");
|
|
664
|
+
console.log(chalk.green(" ✓ Claude Code 已安装"));
|
|
665
|
+
} catch {
|
|
666
|
+
console.log(chalk.red(" ✗ Claude Code 未安装"));
|
|
667
|
+
console.log(chalk.dim(" 运行: npm install -g @anthropic-ai/claude-code"));
|
|
668
|
+
issuesFound = true;
|
|
669
|
+
}
|
|
670
|
+
console.log(`
|
|
671
|
+
检查配置...`);
|
|
672
|
+
if (state.corrupted) {
|
|
673
|
+
console.log(chalk.red(" ✗ 配置损坏"));
|
|
674
|
+
issuesFound = true;
|
|
675
|
+
if (options.fix) {
|
|
676
|
+
console.log(chalk.yellow(" \uD83D\uDD04 正在修复..."));
|
|
677
|
+
const { executeFlow: executeFlow2 } = await Promise.resolve().then(() => require_flow_command());
|
|
678
|
+
await executeFlow2(undefined, { clean: true });
|
|
679
|
+
console.log(chalk.green(" ✓ 已修复"));
|
|
680
|
+
}
|
|
681
|
+
} else if (!state.initialized) {
|
|
682
|
+
console.log(chalk.yellow(" ⚠ 项目未初始化"));
|
|
683
|
+
issuesFound = true;
|
|
684
|
+
} else {
|
|
685
|
+
console.log(chalk.green(" ✓ 配置正常"));
|
|
686
|
+
}
|
|
687
|
+
console.log(`
|
|
688
|
+
检查组件...`);
|
|
689
|
+
Object.entries(state.components).forEach(([name, component]) => {
|
|
690
|
+
const status = component.installed ? chalk.green("✓") : chalk.red("✗");
|
|
691
|
+
const count = "count" in component && component.count ? ` (${component.count})` : "";
|
|
692
|
+
console.log(` ${status} ${name}${count}`);
|
|
693
|
+
});
|
|
694
|
+
console.log(`
|
|
695
|
+
` + chalk.bold("结果:"));
|
|
696
|
+
if (!issuesFound) {
|
|
697
|
+
console.log(chalk.green("✓ 所有检查通过"));
|
|
698
|
+
} else if (options.fix) {
|
|
699
|
+
console.log(chalk.green("✓ 所有问题已修复"));
|
|
700
|
+
} else {
|
|
701
|
+
console.log(chalk.yellow("⚠ 发现问题,运行加 --fix 参数自动修复"));
|
|
702
|
+
}
|
|
703
|
+
});
|
|
704
|
+
var upgradeCommand = new Command("upgrade").description("Upgrade Sylphx Flow and components").option("--check", "Only check for updates, do not upgrade").option("--components", "Upgrade components (agents, rules, etc)", true).option("--target", "Upgrade target platform (Claude Code/OpenCode)").option("--verbose", "Show detailed output").action(async (options) => {
|
|
705
|
+
console.log(chalk.cyan.bold(`\uD83D\uDCE6 检查更新
|
|
706
|
+
`));
|
|
707
|
+
const detector = new StateDetector;
|
|
708
|
+
const upgradeManager = new UpgradeManager;
|
|
709
|
+
const updates = await upgradeManager.checkUpdates();
|
|
710
|
+
if (!updates.flowUpdate && !updates.targetUpdate) {
|
|
711
|
+
console.log(chalk.green(`✓ 所有组件已是最新版本
|
|
712
|
+
`));
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
if (updates.flowVersion) {
|
|
716
|
+
console.log(`Sylphx Flow: ${updates.flowVersion.current} → ${chalk.green(updates.flowVersion.latest)}`);
|
|
717
|
+
}
|
|
718
|
+
if (updates.targetVersion) {
|
|
719
|
+
console.log(`${updates.targetVersion.current ? "claude-code" : "target"}: ${updates.targetVersion.current} → ${chalk.green(updates.targetVersion.latest)}`);
|
|
720
|
+
}
|
|
721
|
+
if (options.check) {
|
|
722
|
+
console.log(`
|
|
723
|
+
` + chalk.dim("使用 --no-check 或省略参数进行升级"));
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
const { default: inquirer } = await import("inquirer");
|
|
727
|
+
const { confirm } = await inquirer.prompt([
|
|
728
|
+
{
|
|
729
|
+
type: "confirm",
|
|
730
|
+
name: "confirm",
|
|
731
|
+
message: "确认升级到最新版本?",
|
|
732
|
+
default: true
|
|
733
|
+
}
|
|
734
|
+
]);
|
|
735
|
+
if (!confirm) {
|
|
736
|
+
console.log(chalk.dim(`
|
|
737
|
+
升级已取消`));
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
console.log("");
|
|
741
|
+
const state = await detector.detect();
|
|
742
|
+
if (updates.flowUpdate) {
|
|
743
|
+
console.log(chalk.cyan.bold(`
|
|
744
|
+
━ 升级 Sylphx Flow
|
|
745
|
+
`));
|
|
746
|
+
await upgradeManager.upgradeFlow(state);
|
|
747
|
+
}
|
|
748
|
+
if (updates.targetUpdate && options.target) {
|
|
749
|
+
console.log(chalk.cyan.bold(`
|
|
750
|
+
━ 升级 Target
|
|
751
|
+
`));
|
|
752
|
+
await upgradeManager.upgradeTarget(state);
|
|
753
|
+
}
|
|
754
|
+
console.log(chalk.green(`
|
|
755
|
+
✓ 升级完成
|
|
756
|
+
`));
|
|
757
|
+
});
|
|
758
|
+
export {
|
|
759
|
+
upgradeCommand,
|
|
760
|
+
statusCommand,
|
|
761
|
+
setupCommand,
|
|
762
|
+
flowCommand,
|
|
763
|
+
executeFlow,
|
|
764
|
+
doctorCommand
|
|
765
|
+
};
|