@spaceflow/core 0.22.0 → 0.24.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
|
@@ -4,6 +4,7 @@ import * as __rspack_external_fs_promises_400951f8 from "fs/promises";
|
|
|
4
4
|
import * as __rspack_external_path from "path";
|
|
5
5
|
import * as __rspack_external_zod from "zod";
|
|
6
6
|
import { execSync, spawn, spawnSync } from "child_process";
|
|
7
|
+
import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, writeFileSync } from "fs";
|
|
7
8
|
import { query as claude_agent_sdk_query } from "@anthropic-ai/claude-agent-sdk";
|
|
8
9
|
import { homedir, platform } from "os";
|
|
9
10
|
import { CONFIG_FILE_NAME, DEFAULT_EDITOR, DEFAULT_SUPPORT_EDITOR, EDITOR_DIR_MAPPING, LOG_LEVEL_PRIORITY, PACKAGE_JSON, RC_FILE_NAME, SPACEFLOW_DIR, buildGitPackageSpec, deepMerge, detectPackageManager, ensureDependencies, ensureEditorGitignore, ensureSpaceflowDir, ensureSpaceflowPackageJson, extractName, extractNpmPackageName, findConfigFileWithField, findProjectRoot, getConfigPath, getConfigPaths, getDependencies, getEditorDirName, getEnvFilePaths, getPackageManager, getSourceType, getSpaceflowCoreVersion, getSpaceflowDir, getSupportedEditors, isGitUrl, isLocalPath, isPnpmWorkspace as shared_isPnpmWorkspace, loadEnvFiles, loadExtensionsFromDir, normalizeSource, normalizeVerbose, parseVerbose, readConfigSync, removeDependency, shouldLog, toLogLevel, updateDependency, writeConfigSync } from "@spaceflow/shared";
|
|
@@ -12,7 +13,6 @@ import { createOpencode } from "@opencode-ai/sdk";
|
|
|
12
13
|
import { createHash, randomUUID } from "crypto";
|
|
13
14
|
import { EventEmitter } from "events";
|
|
14
15
|
import { AppType, Client, Domain, EventDispatcher } from "@larksuiteoapi/node-sdk";
|
|
15
|
-
import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, writeFileSync } from "fs";
|
|
16
16
|
import { jsonrepair } from "jsonrepair";
|
|
17
17
|
import "reflect-metadata";
|
|
18
18
|
import { Command } from "commander";
|
|
@@ -2671,9 +2671,15 @@ function parseDiffText(diffText) {
|
|
|
2671
2671
|
|
|
2672
2672
|
|
|
2673
2673
|
|
|
2674
|
+
;// CONCATENATED MODULE: external "fs"
|
|
2675
|
+
|
|
2676
|
+
// EXTERNAL MODULE: external "path"
|
|
2677
|
+
var external_path_ = __webpack_require__(521);
|
|
2674
2678
|
;// CONCATENATED MODULE: ./src/shared/git-sdk/git-sdk.service.ts
|
|
2675
2679
|
|
|
2676
2680
|
|
|
2681
|
+
|
|
2682
|
+
|
|
2677
2683
|
class GitSdkService {
|
|
2678
2684
|
defaultOptions = {
|
|
2679
2685
|
cwd: process.cwd(),
|
|
@@ -2862,6 +2868,15 @@ class GitSdkService {
|
|
|
2862
2868
|
`${ref}:${filename}`
|
|
2863
2869
|
], options);
|
|
2864
2870
|
}
|
|
2871
|
+
/**
|
|
2872
|
+
* 获取工作区文件的当前内容(包含未提交的修改)
|
|
2873
|
+
* 直接读取文件系统,而不是从 git 获取
|
|
2874
|
+
* @throws 如果文件不存在或无法读取
|
|
2875
|
+
*/ getWorkingFileContent(filename, options) {
|
|
2876
|
+
const cwd = options?.cwd || process.cwd();
|
|
2877
|
+
const filepath = external_path_.join(cwd, filename);
|
|
2878
|
+
return readFileSync(filepath, "utf-8");
|
|
2879
|
+
}
|
|
2865
2880
|
getCommitDiff(sha, options) {
|
|
2866
2881
|
try {
|
|
2867
2882
|
const output = this.runCommandSync([
|
|
@@ -2877,6 +2892,153 @@ class GitSdkService {
|
|
|
2877
2892
|
}
|
|
2878
2893
|
}
|
|
2879
2894
|
/**
|
|
2895
|
+
* 获取暂存区的变更文件列表
|
|
2896
|
+
*/ getStagedFiles(options) {
|
|
2897
|
+
try {
|
|
2898
|
+
const output = this.runCommandSync([
|
|
2899
|
+
"diff",
|
|
2900
|
+
"--cached",
|
|
2901
|
+
"--name-status"
|
|
2902
|
+
], options);
|
|
2903
|
+
return this.parseNameStatusOutput(output);
|
|
2904
|
+
} catch {
|
|
2905
|
+
return [];
|
|
2906
|
+
}
|
|
2907
|
+
}
|
|
2908
|
+
/**
|
|
2909
|
+
* 获取暂存区的 diff(包含 patch 信息)
|
|
2910
|
+
*/ getStagedDiff(options) {
|
|
2911
|
+
try {
|
|
2912
|
+
const output = this.runCommandSync([
|
|
2913
|
+
"diff",
|
|
2914
|
+
"--cached"
|
|
2915
|
+
], options);
|
|
2916
|
+
return parseDiffText(output);
|
|
2917
|
+
} catch {
|
|
2918
|
+
return [];
|
|
2919
|
+
}
|
|
2920
|
+
}
|
|
2921
|
+
/**
|
|
2922
|
+
* 获取工作区未暂存的变更文件列表
|
|
2923
|
+
*/ getUnstagedFiles(options) {
|
|
2924
|
+
try {
|
|
2925
|
+
const output = this.runCommandSync([
|
|
2926
|
+
"diff",
|
|
2927
|
+
"--name-status"
|
|
2928
|
+
], options);
|
|
2929
|
+
return this.parseNameStatusOutput(output);
|
|
2930
|
+
} catch {
|
|
2931
|
+
return [];
|
|
2932
|
+
}
|
|
2933
|
+
}
|
|
2934
|
+
/**
|
|
2935
|
+
* 获取工作区未暂存的 diff(包含 patch 信息)
|
|
2936
|
+
*/ getUnstagedDiff(options) {
|
|
2937
|
+
try {
|
|
2938
|
+
const output = this.runCommandSync([
|
|
2939
|
+
"diff"
|
|
2940
|
+
], options);
|
|
2941
|
+
return parseDiffText(output);
|
|
2942
|
+
} catch {
|
|
2943
|
+
return [];
|
|
2944
|
+
}
|
|
2945
|
+
}
|
|
2946
|
+
/**
|
|
2947
|
+
* 获取所有未提交的变更文件(暂存区 + 工作区 + untracked)
|
|
2948
|
+
* 注意:staged 状态优先于 unstaged(因为 staged 反映了文件的原始变更类型)
|
|
2949
|
+
*/ getUncommittedFiles(options) {
|
|
2950
|
+
const staged = this.getStagedFiles(options);
|
|
2951
|
+
const unstaged = this.getUnstagedFiles(options);
|
|
2952
|
+
const untracked = this.getUntrackedFiles(options);
|
|
2953
|
+
// staged 优先:如果文件在 staged 中是 added,即使 unstaged 中是 modified,也应该保持 added
|
|
2954
|
+
const fileMap = new Map();
|
|
2955
|
+
for (const file of [
|
|
2956
|
+
...unstaged,
|
|
2957
|
+
...staged
|
|
2958
|
+
]){
|
|
2959
|
+
fileMap.set(file.filename, file);
|
|
2960
|
+
}
|
|
2961
|
+
// 添加 untracked 文件
|
|
2962
|
+
for (const filename of untracked){
|
|
2963
|
+
if (!fileMap.has(filename)) {
|
|
2964
|
+
fileMap.set(filename, {
|
|
2965
|
+
filename,
|
|
2966
|
+
status: "added"
|
|
2967
|
+
});
|
|
2968
|
+
}
|
|
2969
|
+
}
|
|
2970
|
+
return Array.from(fileMap.values());
|
|
2971
|
+
}
|
|
2972
|
+
/**
|
|
2973
|
+
* 获取未跟踪的文件列表
|
|
2974
|
+
*/ getUntrackedFiles(options) {
|
|
2975
|
+
try {
|
|
2976
|
+
const output = this.runCommandSync([
|
|
2977
|
+
"ls-files",
|
|
2978
|
+
"--others",
|
|
2979
|
+
"--exclude-standard"
|
|
2980
|
+
], options);
|
|
2981
|
+
return output.trim().split("\n").filter(Boolean);
|
|
2982
|
+
} catch {
|
|
2983
|
+
return [];
|
|
2984
|
+
}
|
|
2985
|
+
}
|
|
2986
|
+
/**
|
|
2987
|
+
* 获取所有未提交的 diff(暂存区 + 工作区 + untracked)
|
|
2988
|
+
* 使用 HEAD 作为基准比较,untracked 文件生成伪 patch
|
|
2989
|
+
*/ getUncommittedDiff(options) {
|
|
2990
|
+
const diffs = [];
|
|
2991
|
+
// 1. 获取已跟踪文件的 diff(staged + unstaged)
|
|
2992
|
+
try {
|
|
2993
|
+
const output = this.runCommandSync([
|
|
2994
|
+
"diff",
|
|
2995
|
+
"HEAD"
|
|
2996
|
+
], options);
|
|
2997
|
+
diffs.push(...parseDiffText(output));
|
|
2998
|
+
} catch {
|
|
2999
|
+
// ignore
|
|
3000
|
+
}
|
|
3001
|
+
// 2. 为 untracked 文件生成伪 patch
|
|
3002
|
+
const untrackedFiles = this.getUntrackedFiles(options);
|
|
3003
|
+
for (const filename of untrackedFiles){
|
|
3004
|
+
try {
|
|
3005
|
+
const content = this.getWorkingFileContent(filename, options);
|
|
3006
|
+
const patch = this.generateAddedFilePatch(content);
|
|
3007
|
+
diffs.push({
|
|
3008
|
+
filename,
|
|
3009
|
+
patch
|
|
3010
|
+
});
|
|
3011
|
+
} catch {
|
|
3012
|
+
// 文件读取失败,跳过
|
|
3013
|
+
}
|
|
3014
|
+
}
|
|
3015
|
+
return diffs;
|
|
3016
|
+
}
|
|
3017
|
+
/**
|
|
3018
|
+
* 为新增文件生成伪 patch(所有行都是新增)
|
|
3019
|
+
*/ generateAddedFilePatch(content) {
|
|
3020
|
+
const lines = content.split("\n");
|
|
3021
|
+
const lineCount = lines.length;
|
|
3022
|
+
const patchLines = lines.map((line)=>`+${line}`);
|
|
3023
|
+
return `@@ -0,0 +1,${lineCount} @@\n${patchLines.join("\n")}`;
|
|
3024
|
+
}
|
|
3025
|
+
/**
|
|
3026
|
+
* 解析 git diff --name-status 输出
|
|
3027
|
+
*/ parseNameStatusOutput(output) {
|
|
3028
|
+
const files = [];
|
|
3029
|
+
const lines = output.trim().split("\n").filter(Boolean);
|
|
3030
|
+
for (const line of lines){
|
|
3031
|
+
const [status, filename] = line.split("\t");
|
|
3032
|
+
if (filename) {
|
|
3033
|
+
files.push({
|
|
3034
|
+
filename,
|
|
3035
|
+
status: mapGitStatus(status)
|
|
3036
|
+
});
|
|
3037
|
+
}
|
|
3038
|
+
}
|
|
3039
|
+
return files;
|
|
3040
|
+
}
|
|
3041
|
+
/**
|
|
2880
3042
|
* 解析 ref,支持本地分支、远程分支、commit SHA
|
|
2881
3043
|
* 优先级:commit SHA > 本地分支 > origin/分支 > fetch后重试 > 原始值
|
|
2882
3044
|
*/ async resolveRef(ref, options) {
|
|
@@ -2944,8 +3106,6 @@ const LLM_ADAPTER = Symbol("LLM_ADAPTER");
|
|
|
2944
3106
|
|
|
2945
3107
|
// EXTERNAL MODULE: external "fs/promises"
|
|
2946
3108
|
var promises_ = __webpack_require__(932);
|
|
2947
|
-
// EXTERNAL MODULE: external "path"
|
|
2948
|
-
var external_path_ = __webpack_require__(521);
|
|
2949
3109
|
;// CONCATENATED MODULE: external "os"
|
|
2950
3110
|
|
|
2951
3111
|
;// CONCATENATED MODULE: external "@spaceflow/shared"
|
|
@@ -4491,8 +4651,6 @@ class LlmProxyService {
|
|
|
4491
4651
|
}
|
|
4492
4652
|
}
|
|
4493
4653
|
|
|
4494
|
-
;// CONCATENATED MODULE: external "fs"
|
|
4495
|
-
|
|
4496
4654
|
;// CONCATENATED MODULE: ./src/shared/storage/adapters/file.adapter.ts
|
|
4497
4655
|
|
|
4498
4656
|
|
|
@@ -11461,7 +11619,7 @@ async function exec(extensions = [], options = {}) {
|
|
|
11461
11619
|
// 6. 创建 CLI 程序
|
|
11462
11620
|
const program = new Command();
|
|
11463
11621
|
const cliVersion = options.cliVersion || "0.0.0";
|
|
11464
|
-
const coreVersion = true ? "0.
|
|
11622
|
+
const coreVersion = true ? "0.24.0" : 0;
|
|
11465
11623
|
const versionOutput = `spaceflow/${cliVersion} core/${coreVersion}`;
|
|
11466
11624
|
program.name("spaceflow").description("Spaceflow CLI").version(versionOutput, "-V, --version", "显示版本信息");
|
|
11467
11625
|
// 定义全局 verbose 选项(支持计数:-v, -vv, -vvv)
|