@spaceflow/core 0.1.1 → 0.1.3

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 CHANGED
@@ -1,6 +1,9 @@
1
1
  # @spaceflow/core
2
2
 
3
- Spaceflow 核心能力库,提供共享模块、插件系统基础设施和平台适配层。
3
+ [![npm version](https://img.shields.io/npm/v/@spaceflow/core?color=blue)](https://www.npmjs.com/package/@spaceflow/core)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ > Spaceflow 核心能力库,提供共享模块、扩展系统基础设施和平台适配层。
4
7
 
5
8
  ## 安装
6
9
 
@@ -10,7 +13,7 @@ pnpm add @spaceflow/core
10
13
 
11
14
  ## 共享模块
12
15
 
13
- 核心库导出以下共享模块,供插件开发使用:
16
+ 核心库导出以下共享模块,供扩展开发使用:
14
17
 
15
18
  | 模块 | 导入路径 | 说明 |
16
19
  | ----------------- | --------------------------------- | ----------------------------------------- |
@@ -28,7 +31,7 @@ pnpm add @spaceflow/core
28
31
  | `package-manager` | `@spaceflow/core/package-manager` | 包管理器抽象 |
29
32
  | `rspack-config` | `@spaceflow/core/rspack-config` | Rspack 构建配置 |
30
33
 
31
- ## 作为库使用
34
+ ## 快速上手
32
35
 
33
36
  ```typescript
34
37
  import {
@@ -53,7 +56,7 @@ import {
53
56
  core/
54
57
  ├── src/
55
58
  │ ├── config/ # 配置管理(Zod Schema)
56
- │ ├── extension-system/ # 插件系统核心
59
+ │ ├── extension-system/ # 扩展系统核心
57
60
  │ ├── locales/ # 国际化资源(i18next)
58
61
  │ ├── shared/ # 共享模块
59
62
  │ │ ├── git-provider/ # Git 平台适配器
@@ -95,11 +98,11 @@ pnpm run format
95
98
 
96
99
  - **NestJS** — 依赖注入框架
97
100
  - **nest-commander** — CLI 命令框架
98
- - **rspack** — 构建工具
101
+ - **Rspack** — 构建工具
99
102
  - **i18next** — 国际化
100
103
  - **Zod** — 配置校验
101
104
  - **TypeScript** — 类型系统
102
105
 
103
106
  ## 许可证
104
107
 
105
- [MIT](../LICENSE)
108
+ [MIT](../../LICENSE)
package/dist/129.js ADDED
@@ -0,0 +1,9 @@
1
+ export const __rspack_esm_id = "129";
2
+ export const __rspack_esm_ids = ["129"];
3
+ export const __webpack_modules__ = {
4
+ 56(module) {
5
+ module.exports = import("@modelcontextprotocol/sdk/server/mcp.js").then(function(module) { return module; });
6
+
7
+ },
8
+
9
+ };
package/dist/260.js ADDED
@@ -0,0 +1,9 @@
1
+ export const __rspack_esm_id = "260";
2
+ export const __rspack_esm_ids = ["260"];
3
+ export const __webpack_modules__ = {
4
+ 991(module) {
5
+ module.exports = import("@modelcontextprotocol/sdk/server/stdio.js").then(function(module) { return module; });
6
+
7
+ },
8
+
9
+ };
package/dist/524.js ADDED
@@ -0,0 +1,9 @@
1
+ export const __rspack_esm_id = "524";
2
+ export const __rspack_esm_ids = ["524"];
3
+ export const __webpack_modules__ = {
4
+ 463(module) {
5
+ module.exports = import("fs/promises").then(function(module) { return module; });
6
+
7
+ },
8
+
9
+ };
package/dist/976.js ADDED
@@ -0,0 +1,157 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import log_update from "log-update";
4
+ export const __rspack_esm_id = "976";
5
+ export const __rspack_esm_ids = ["976"];
6
+ export const __webpack_modules__ = {
7
+ 115(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
8
+
9
+ // EXPORTS
10
+ __webpack_require__.d(__webpack_exports__, {
11
+ TuiRenderer: () => (/* binding */ TuiRenderer)
12
+ });
13
+
14
+ ;// CONCATENATED MODULE: external "chalk"
15
+
16
+ ;// CONCATENATED MODULE: external "ora"
17
+
18
+ ;// CONCATENATED MODULE: external "log-update"
19
+
20
+ ;// CONCATENATED MODULE: ./src/shared/logger/renderers/tui.renderer.ts
21
+
22
+
23
+
24
+ /** 进度条默认宽度 */ const DEFAULT_BAR_WIDTH = 30;
25
+ /** 任务状态图标 */ const TASK_ICONS = {
26
+ pending: chalk.gray("○"),
27
+ running: chalk.cyan("◌"),
28
+ success: chalk.green("✔"),
29
+ failed: chalk.red("✖"),
30
+ skipped: chalk.yellow("⊘")
31
+ };
32
+ /** 渲染进度条字符串 */ const renderBar = (current, total, width)=>{
33
+ const ratio = Math.min(current / total, 1);
34
+ const filled = Math.round(ratio * width);
35
+ const empty = width - filled;
36
+ const bar = chalk.green("█".repeat(filled)) + chalk.gray("░".repeat(empty));
37
+ const pct = Math.round(ratio * 100);
38
+ return `${bar} ${pct}%`;
39
+ };
40
+ /** TUI 模式渲染器:富交互输出,适合终端 */ class TuiRenderer {
41
+ info(prefix, message) {
42
+ console.log(`${chalk.gray(prefix)} ${message}`);
43
+ }
44
+ success(prefix, message) {
45
+ console.log(`${chalk.gray(prefix)} ${chalk.green("✔")} ${message}`);
46
+ }
47
+ warn(prefix, message) {
48
+ console.warn(`${chalk.gray(prefix)} ${chalk.yellow("⚠")} ${chalk.yellow(message)}`);
49
+ }
50
+ error(prefix, message) {
51
+ console.error(`${chalk.gray(prefix)} ${chalk.red("✖")} ${chalk.red(message)}`);
52
+ }
53
+ debug(prefix, message) {
54
+ console.log(`${chalk.gray(prefix)} ${chalk.magenta("[DEBUG]")} ${chalk.gray(message)}`);
55
+ }
56
+ verbose(prefix, message) {
57
+ console.log(`${chalk.gray(prefix)} ${chalk.gray(message)}`);
58
+ }
59
+ createSpinner(prefix, message) {
60
+ const spinner = ora({
61
+ text: `${chalk.gray(prefix)} ${message}`,
62
+ prefixText: ""
63
+ }).start();
64
+ return {
65
+ update: (msg)=>{
66
+ spinner.text = `${chalk.gray(prefix)} ${msg}`;
67
+ },
68
+ succeed: (msg)=>{
69
+ spinner.succeed(`${chalk.gray(prefix)} ${msg ?? message}`);
70
+ },
71
+ fail: (msg)=>{
72
+ spinner.fail(`${chalk.gray(prefix)} ${msg ?? message}`);
73
+ },
74
+ stop: ()=>{
75
+ spinner.stop();
76
+ }
77
+ };
78
+ }
79
+ createProgressBar(prefix, options) {
80
+ const { total, label = "", width = DEFAULT_BAR_WIDTH } = options;
81
+ const tag = label ? `${label} ` : "";
82
+ log_update(`${chalk.gray(prefix)} ${tag}${renderBar(0, total, width)} 0/${total}`);
83
+ return {
84
+ update: (current, msg)=>{
85
+ const suffix = msg ? ` ${chalk.gray(msg)}` : "";
86
+ log_update(`${chalk.gray(prefix)} ${tag}${renderBar(current, total, width)} ${current}/${total}${suffix}`);
87
+ },
88
+ finish: (msg)=>{
89
+ const suffix = msg ? ` ${msg}` : "";
90
+ log_update.done();
91
+ console.log(`${chalk.gray(prefix)} ${chalk.green("✔")} ${tag}${total}/${total} (100%)${suffix}`);
92
+ }
93
+ };
94
+ }
95
+ async runTasks(prefix, items) {
96
+ const enabledItems = items.filter((item)=>item.enabled !== false);
97
+ const statuses = enabledItems.map(()=>"pending");
98
+ const messages = enabledItems.map((item)=>item.title);
99
+ const results = [];
100
+ const renderTaskList = ()=>{
101
+ return enabledItems.map((item, i)=>{
102
+ const icon = TASK_ICONS[statuses[i]];
103
+ const title = statuses[i] === "running" ? chalk.cyan(item.title) : item.title;
104
+ const suffix = messages[i] !== item.title ? chalk.gray(` ${messages[i]}`) : "";
105
+ return `${chalk.gray(prefix)} ${icon} ${title}${suffix}`;
106
+ }).join("\n");
107
+ };
108
+ log_update(renderTaskList());
109
+ for(let i = 0; i < enabledItems.length; i++){
110
+ statuses[i] = "running";
111
+ log_update(renderTaskList());
112
+ let skipped = false;
113
+ let skipReason = "";
114
+ const control = {
115
+ update: (msg)=>{
116
+ messages[i] = msg;
117
+ log_update(renderTaskList());
118
+ },
119
+ skip: (reason)=>{
120
+ skipped = true;
121
+ skipReason = reason ?? "";
122
+ }
123
+ };
124
+ try {
125
+ const ctx = results.length > 0 ? results[results.length - 1] : undefined;
126
+ const result = await enabledItems[i].task(ctx, control);
127
+ if (skipped) {
128
+ statuses[i] = "skipped";
129
+ messages[i] = skipReason ? `${enabledItems[i].title} (${skipReason})` : enabledItems[i].title;
130
+ } else {
131
+ statuses[i] = "success";
132
+ messages[i] = enabledItems[i].title;
133
+ }
134
+ results.push(result);
135
+ } catch (err) {
136
+ statuses[i] = "failed";
137
+ messages[i] = err instanceof Error ? err.message : String(err);
138
+ log_update(renderTaskList());
139
+ log_update.done();
140
+ throw err;
141
+ }
142
+ log_update(renderTaskList());
143
+ }
144
+ log_update.done();
145
+ return results;
146
+ }
147
+ table(_prefix, data) {
148
+ console.table(data);
149
+ }
150
+ }
151
+
152
+
153
+ },
154
+
155
+ };
156
+
157
+ //# sourceMappingURL=976.js.map
@@ -0,0 +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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"}