@spaceflow/core 0.21.0 → 0.23.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/dist/976.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"976.js","sources":["webpack://@spaceflow/core/./src/shared/logger/renderers/tui.renderer.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\nimport logUpdate from \"log-update\";\nimport type {\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n TaskStatus,\n} from \"../logger.interface\";\n\n/** 进度条默认宽度 */\nconst DEFAULT_BAR_WIDTH = 30;\n\n/** 任务状态图标 */\nconst TASK_ICONS: Record<TaskStatus, string> = {\n pending: chalk.gray(\"○\"),\n running: chalk.cyan(\"◌\"),\n success: chalk.green(\"✔\"),\n failed: chalk.red(\"✖\"),\n skipped: chalk.yellow(\"⊘\"),\n};\n\n/** 渲染进度条字符串 */\nconst renderBar = (current: number, total: number, width: number): string => {\n const ratio = Math.min(current / total, 1);\n const filled = Math.round(ratio * width);\n const empty = width - filled;\n const bar = chalk.green(\"█\".repeat(filled)) + chalk.gray(\"░\".repeat(empty));\n const pct = Math.round(ratio * 100);\n return `${bar} ${pct}%`;\n};\n\n/** TUI 模式渲染器:富交互输出,适合终端 */\nexport class TuiRenderer implements LogRenderer {\n info(prefix: string, message: string): void {\n console.log(`${chalk.gray(prefix)} ${message}`);\n }\n\n success(prefix: string, message: string): void {\n console.log(`${chalk.gray(prefix)} ${chalk.green(\"✔\")} ${message}`);\n }\n\n warn(prefix: string, message: string): void {\n console.warn(`${chalk.gray(prefix)} ${chalk.yellow(\"⚠\")} ${chalk.yellow(message)}`);\n }\n\n error(prefix: string, message: string): void {\n console.error(`${chalk.gray(prefix)} ${chalk.red(\"✖\")} ${chalk.red(message)}`);\n }\n\n debug(prefix: string, message: string): void {\n console.log(`${chalk.gray(prefix)} ${chalk.magenta(\"[DEBUG]\")} ${chalk.gray(message)}`);\n }\n\n verbose(prefix: string, message: string): void {\n console.log(`${chalk.gray(prefix)} ${chalk.gray(message)}`);\n }\n\n createSpinner(prefix: string, message: string): Spinner {\n const spinner = ora({\n text: `${chalk.gray(prefix)} ${message}`,\n prefixText: \"\",\n }).start();\n return {\n update: (msg: string) => {\n spinner.text = `${chalk.gray(prefix)} ${msg}`;\n },\n succeed: (msg?: string) => {\n spinner.succeed(`${chalk.gray(prefix)} ${msg ?? message}`);\n },\n fail: (msg?: string) => {\n spinner.fail(`${chalk.gray(prefix)} ${msg ?? message}`);\n },\n stop: () => {\n spinner.stop();\n },\n };\n }\n\n createProgressBar(prefix: string, options: ProgressBarOptions): ProgressBar {\n const { total, label = \"\", width = DEFAULT_BAR_WIDTH } = options;\n const tag = label ? `${label} ` : \"\";\n logUpdate(`${chalk.gray(prefix)} ${tag}${renderBar(0, total, width)} 0/${total}`);\n return {\n update: (current: number, msg?: string) => {\n const suffix = msg ? ` ${chalk.gray(msg)}` : \"\";\n logUpdate(\n `${chalk.gray(prefix)} ${tag}${renderBar(current, total, width)} ${current}/${total}${suffix}`,\n );\n },\n finish: (msg?: string) => {\n const suffix = msg ? ` ${msg}` : \"\";\n logUpdate.done();\n console.log(\n `${chalk.gray(prefix)} ${chalk.green(\"✔\")} ${tag}${total}/${total} (100%)${suffix}`,\n );\n },\n };\n }\n\n async runTasks<T>(prefix: string, items: TaskItem<T>[]): Promise<T[]> {\n const enabledItems = items.filter((item) => item.enabled !== false);\n const statuses: TaskStatus[] = enabledItems.map(() => \"pending\");\n const messages: string[] = enabledItems.map((item) => item.title);\n const results: T[] = [];\n const renderTaskList = (): string => {\n return enabledItems\n .map((item, i) => {\n const icon = TASK_ICONS[statuses[i]];\n const title = statuses[i] === \"running\" ? chalk.cyan(item.title) : item.title;\n const suffix = messages[i] !== item.title ? chalk.gray(` ${messages[i]}`) : \"\";\n return `${chalk.gray(prefix)} ${icon} ${title}${suffix}`;\n })\n .join(\"\\n\");\n };\n logUpdate(renderTaskList());\n for (let i = 0; i < enabledItems.length; i++) {\n statuses[i] = \"running\";\n logUpdate(renderTaskList());\n let skipped = false;\n let skipReason = \"\";\n const control: TaskControl = {\n update: (msg: string) => {\n messages[i] = msg;\n logUpdate(renderTaskList());\n },\n skip: (reason?: string) => {\n skipped = true;\n skipReason = reason ?? \"\";\n },\n };\n try {\n const ctx = (results.length > 0 ? results[results.length - 1] : undefined) as T;\n const result = await enabledItems[i].task(ctx, control);\n if (skipped) {\n statuses[i] = \"skipped\";\n messages[i] = skipReason ? `${enabledItems[i].title} (${skipReason})` : enabledItems[i].title;\n } else {\n statuses[i] = \"success\";\n messages[i] = enabledItems[i].title;\n }\n results.push(result);\n } catch (err) {\n statuses[i] = \"failed\";\n messages[i] = err instanceof Error ? err.message : String(err);\n logUpdate(renderTaskList());\n logUpdate.done();\n throw err;\n }\n logUpdate(renderTaskList());\n }\n logUpdate.done();\n return results;\n }\n\n table(_prefix: string, data: Record<string, unknown>[]): void {\n console.table(data);\n }\n}\n"],"names":["chalk","ora","logUpdate","DEFAULT_BAR_WIDTH","TASK_ICONS","renderBar","current","total","width","ratio","Math","filled","empty","bar","pct","TuiRenderer","prefix","message","console","spinner","msg","options","label","tag","suffix","items","enabledItems","item","statuses","messages","results","renderTaskList","i","icon","title","skipped","skipReason","control","reason","ctx","undefined","result","err","Error","String","_prefix","data"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"976.js","sources":["webpack://@spaceflow/core/./src/shared/logger/renderers/tui.renderer.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\nimport logUpdate from \"log-update\";\nimport type {\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n TaskStatus,\n} from \"../logger.interface\";\n\n/** 进度条默认宽度 */\nconst DEFAULT_BAR_WIDTH = 30;\n\n/** 任务状态图标 */\nconst TASK_ICONS: Record<TaskStatus, string> = {\n pending: chalk.gray(\"○\"),\n running: chalk.cyan(\"◌\"),\n success: chalk.green(\"✔\"),\n failed: chalk.red(\"✖\"),\n skipped: chalk.yellow(\"⊘\"),\n};\n\n/** 渲染进度条字符串 */\nconst renderBar = (current: number, total: number, width: number): string => {\n const ratio = Math.min(current / total, 1);\n const filled = Math.round(ratio * width);\n const empty = width - filled;\n const bar = chalk.green(\"█\".repeat(filled)) + chalk.gray(\"░\".repeat(empty));\n const pct = Math.round(ratio * 100);\n return `${bar} ${pct}%`;\n};\n\n/** TUI 模式渲染器:富交互输出,适合终端 */\nexport class TuiRenderer implements LogRenderer {\n info(prefix: string, message: string): void {\n console.log(`${chalk.gray(prefix)} ${message}`);\n }\n\n success(prefix: string, message: string): void {\n console.log(`${chalk.gray(prefix)} ${chalk.green(\"✔\")} ${message}`);\n }\n\n warn(prefix: string, message: string): void {\n console.warn(`${chalk.gray(prefix)} ${chalk.yellow(\"⚠\")} ${chalk.yellow(message)}`);\n }\n\n error(prefix: string, message: string): void {\n console.error(`${chalk.gray(prefix)} ${chalk.red(\"✖\")} ${chalk.red(message)}`);\n }\n\n debug(prefix: string, message: string): void {\n console.log(`${chalk.gray(prefix)} ${chalk.magenta(\"[DEBUG]\")} ${chalk.gray(message)}`);\n }\n\n verbose(prefix: string, message: string): void {\n console.log(`${chalk.gray(prefix)} ${chalk.gray(message)}`);\n }\n\n createSpinner(prefix: string, message: string): Spinner {\n const spinner = ora({\n text: `${chalk.gray(prefix)} ${message}`,\n prefixText: \"\",\n }).start();\n return {\n update: (msg: string) => {\n spinner.text = `${chalk.gray(prefix)} ${msg}`;\n },\n succeed: (msg?: string) => {\n spinner.succeed(`${chalk.gray(prefix)} ${msg ?? message}`);\n },\n fail: (msg?: string) => {\n spinner.fail(`${chalk.gray(prefix)} ${msg ?? message}`);\n },\n stop: () => {\n spinner.stop();\n },\n };\n }\n\n createProgressBar(prefix: string, options: ProgressBarOptions): ProgressBar {\n const { total, label = \"\", width = DEFAULT_BAR_WIDTH } = options;\n const tag = label ? `${label} ` : \"\";\n logUpdate(`${chalk.gray(prefix)} ${tag}${renderBar(0, total, width)} 0/${total}`);\n return {\n update: (current: number, msg?: string) => {\n const suffix = msg ? ` ${chalk.gray(msg)}` : \"\";\n logUpdate(\n `${chalk.gray(prefix)} ${tag}${renderBar(current, total, width)} ${current}/${total}${suffix}`,\n );\n },\n finish: (msg?: string) => {\n const suffix = msg ? ` ${msg}` : \"\";\n logUpdate.done();\n console.log(\n `${chalk.gray(prefix)} ${chalk.green(\"✔\")} ${tag}${total}/${total} (100%)${suffix}`,\n );\n },\n };\n }\n\n async runTasks<T>(prefix: string, items: TaskItem<T>[]): Promise<T[]> {\n const enabledItems = items.filter((item) => item.enabled !== false);\n const statuses: TaskStatus[] = enabledItems.map(() => \"pending\");\n const messages: string[] = enabledItems.map((item) => item.title);\n const results: T[] = [];\n const renderTaskList = (): string => {\n return enabledItems\n .map((item, i) => {\n const icon = TASK_ICONS[statuses[i]];\n const title = statuses[i] === \"running\" ? chalk.cyan(item.title) : item.title;\n const suffix = messages[i] !== item.title ? chalk.gray(` ${messages[i]}`) : \"\";\n return `${chalk.gray(prefix)} ${icon} ${title}${suffix}`;\n })\n .join(\"\\n\");\n };\n logUpdate(renderTaskList());\n for (let i = 0; i < enabledItems.length; i++) {\n statuses[i] = \"running\";\n logUpdate(renderTaskList());\n let skipped = false;\n let skipReason = \"\";\n const control: TaskControl = {\n update: (msg: string) => {\n messages[i] = msg;\n logUpdate(renderTaskList());\n },\n skip: (reason?: string) => {\n skipped = true;\n skipReason = reason ?? \"\";\n },\n };\n try {\n const ctx = (results.length > 0 ? results[results.length - 1] : undefined) as T;\n const result = await enabledItems[i].task(ctx, control);\n if (skipped) {\n statuses[i] = \"skipped\";\n messages[i] = skipReason\n ? `${enabledItems[i].title} (${skipReason})`\n : enabledItems[i].title;\n } else {\n statuses[i] = \"success\";\n messages[i] = enabledItems[i].title;\n }\n results.push(result);\n } catch (err) {\n statuses[i] = \"failed\";\n messages[i] = err instanceof Error ? err.message : String(err);\n logUpdate(renderTaskList());\n logUpdate.done();\n throw err;\n }\n logUpdate(renderTaskList());\n }\n logUpdate.done();\n return results;\n }\n\n table(_prefix: string, data: Record<string, unknown>[]): void {\n console.table(data);\n }\n}\n"],"names":["chalk","ora","logUpdate","DEFAULT_BAR_WIDTH","TASK_ICONS","renderBar","current","total","width","ratio","Math","filled","empty","bar","pct","TuiRenderer","prefix","message","console","spinner","msg","options","label","tag","suffix","items","enabledItems","item","statuses","messages","results","renderTaskList","i","icon","title","skipped","skipReason","control","reason","ctx","undefined","result","err","Error","String","_prefix","data"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8495,10 +8495,10 @@ class InstallService {
|
|
|
8495
8495
|
}
|
|
8496
8496
|
/**
|
|
8497
8497
|
* 将插件关联到各个编辑器的目录
|
|
8498
|
-
* pluginConfig 包含 flows/commands/
|
|
8498
|
+
* pluginConfig 包含 flows/commands/skills/mcps 四种类型
|
|
8499
8499
|
* - flows: CLI 子命令,不需要复制到编辑器目录
|
|
8500
8500
|
* - commands: 编辑器命令,复制到 .claude/commands/ 等目录
|
|
8501
|
-
* -
|
|
8501
|
+
* - skills: 技能文件,复制到 .claude/skills/ 等目录
|
|
8502
8502
|
* - mcps: MCP Server,注册到编辑器的 mcp.json 配置
|
|
8503
8503
|
*/ async linkPluginToEditors(options) {
|
|
8504
8504
|
const { name, depPath, pluginConfig, cwd, isGlobal = false, verbose = 1 } = options;
|
|
@@ -8508,16 +8508,16 @@ class InstallService {
|
|
|
8508
8508
|
for (const editor of editors){
|
|
8509
8509
|
const editorDirName = getEditorDirName(editor);
|
|
8510
8510
|
const editorRoot = isGlobal ? (0,external_path_.join)(home, editorDirName) : (0,external_path_.join)(workingDir, editorDirName);
|
|
8511
|
-
// 处理
|
|
8512
|
-
if (pluginConfig.
|
|
8513
|
-
const
|
|
8514
|
-
await this.ensureDir(
|
|
8515
|
-
for (const
|
|
8516
|
-
const
|
|
8517
|
-
const installName =
|
|
8518
|
-
const targetPath = (0,external_path_.join)(
|
|
8519
|
-
await this.copyExtensionToTarget(
|
|
8520
|
-
//
|
|
8511
|
+
// 处理 skills
|
|
8512
|
+
if (pluginConfig.skills.length > 0) {
|
|
8513
|
+
const editorSkillsDir = (0,external_path_.join)(editorRoot, "skills");
|
|
8514
|
+
await this.ensureDir(editorSkillsDir, verbose);
|
|
8515
|
+
for (const skill of pluginConfig.skills){
|
|
8516
|
+
const skillPath = skill.entry === "." ? depPath : (0,external_path_.join)(depPath, skill.entry);
|
|
8517
|
+
const installName = skill.name || name;
|
|
8518
|
+
const targetPath = (0,external_path_.join)(editorSkillsDir, installName);
|
|
8519
|
+
await this.copyExtensionToTarget(skillPath, targetPath, installName);
|
|
8520
|
+
// 将生成的技能文件加入编辑器目录的 .gitignore
|
|
8521
8521
|
await ensureEditorGitignore(editorRoot, "skills", installName);
|
|
8522
8522
|
}
|
|
8523
8523
|
}
|
|
@@ -9018,7 +9018,7 @@ class InstallService {
|
|
|
9018
9018
|
pm
|
|
9019
9019
|
}));
|
|
9020
9020
|
}
|
|
9021
|
-
// 3. 处理每个依赖的
|
|
9021
|
+
// 3. 处理每个依赖的 skills/commands 关联
|
|
9022
9022
|
for (const [name, config] of Object.entries(dependencies)){
|
|
9023
9023
|
const { source } = this.parseExtensionConfig(config);
|
|
9024
9024
|
const sourceType = getSourceType(source);
|
|
@@ -9311,18 +9311,18 @@ class InstallService {
|
|
|
9311
9311
|
}
|
|
9312
9312
|
/**
|
|
9313
9313
|
* 从 package.json 读取插件配置
|
|
9314
|
-
* 返回 { flows: [], commands: [],
|
|
9314
|
+
* 返回 { flows: [], commands: [], skills: [], mcps: [] } 格式的导出映射
|
|
9315
9315
|
*/ async getPluginConfigFromPackageJson(extPath) {
|
|
9316
9316
|
const createEmptyConfig = ()=>({
|
|
9317
9317
|
flows: [],
|
|
9318
9318
|
commands: [],
|
|
9319
|
-
|
|
9319
|
+
skills: [],
|
|
9320
9320
|
mcps: []
|
|
9321
9321
|
});
|
|
9322
|
-
const
|
|
9322
|
+
const createDefaultSkill = (name = "")=>({
|
|
9323
9323
|
flows: [],
|
|
9324
9324
|
commands: [],
|
|
9325
|
-
|
|
9325
|
+
skills: [
|
|
9326
9326
|
{
|
|
9327
9327
|
name,
|
|
9328
9328
|
entry: "."
|
|
@@ -9339,7 +9339,7 @@ class InstallService {
|
|
|
9339
9339
|
name,
|
|
9340
9340
|
entry
|
|
9341
9341
|
});
|
|
9342
|
-
else if (type === "
|
|
9342
|
+
else if (type === "skill") config.skills.push({
|
|
9343
9343
|
name,
|
|
9344
9344
|
entry
|
|
9345
9345
|
});
|
|
@@ -9351,14 +9351,14 @@ class InstallService {
|
|
|
9351
9351
|
};
|
|
9352
9352
|
const pkgJsonPath = (0,external_path_.join)(extPath, "package.json");
|
|
9353
9353
|
if (!existsSync(pkgJsonPath)) {
|
|
9354
|
-
return
|
|
9354
|
+
return createDefaultSkill();
|
|
9355
9355
|
}
|
|
9356
9356
|
try {
|
|
9357
9357
|
const content = await (0,promises_.readFile)(pkgJsonPath, "utf-8");
|
|
9358
9358
|
const pkg = JSON.parse(content);
|
|
9359
9359
|
const spaceflowConfig = pkg.spaceflow;
|
|
9360
9360
|
if (!spaceflowConfig) {
|
|
9361
|
-
return
|
|
9361
|
+
return createDefaultSkill(pkg.name);
|
|
9362
9362
|
}
|
|
9363
9363
|
const config = createEmptyConfig();
|
|
9364
9364
|
// 完整格式:exports 对象
|
|
@@ -9374,9 +9374,9 @@ class InstallService {
|
|
|
9374
9374
|
addExport(config, spaceflowConfig.type || "flow", pkg.name || "", spaceflowConfig.entry, spaceflowConfig.mcp);
|
|
9375
9375
|
return config;
|
|
9376
9376
|
}
|
|
9377
|
-
return
|
|
9377
|
+
return createDefaultSkill(pkg.name);
|
|
9378
9378
|
} catch {
|
|
9379
|
-
return
|
|
9379
|
+
return createDefaultSkill();
|
|
9380
9380
|
}
|
|
9381
9381
|
}
|
|
9382
9382
|
/**
|
|
@@ -11461,7 +11461,7 @@ async function exec(extensions = [], options = {}) {
|
|
|
11461
11461
|
// 6. 创建 CLI 程序
|
|
11462
11462
|
const program = new Command();
|
|
11463
11463
|
const cliVersion = options.cliVersion || "0.0.0";
|
|
11464
|
-
const coreVersion = true ? "0.
|
|
11464
|
+
const coreVersion = true ? "0.23.0" : 0;
|
|
11465
11465
|
const versionOutput = `spaceflow/${cliVersion} core/${coreVersion}`;
|
|
11466
11466
|
program.name("spaceflow").description("Spaceflow CLI").version(versionOutput, "-V, --version", "显示版本信息");
|
|
11467
11467
|
// 定义全局 verbose 选项(支持计数:-v, -vv, -vvv)
|