@spaceflow/core 0.14.0 → 0.16.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/index.js CHANGED
@@ -6,7 +6,7 @@ import * as __rspack_external_zod from "zod";
6
6
  import { execSync, spawn, spawnSync } from "child_process";
7
7
  import { query as claude_agent_sdk_query } from "@anthropic-ai/claude-agent-sdk";
8
8
  import { homedir, platform } from "os";
9
- import { CONFIG_FILE_NAME, DEFAULT_EDITOR, DEFAULT_SUPPORT_EDITOR, EDITOR_DIR_MAPPING, LOG_LEVEL_PRIORITY, RC_FILE_NAME, buildGitPackageSpec, deepMerge, detectPackageManager, ensureDependencies, ensureEditorGitignore, ensureSpaceflowDir, ensureSpaceflowPackageJson, extractName, extractNpmPackageName, findConfigFileWithField, 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";
9
+ 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";
10
10
  import openai from "openai";
11
11
  import { createOpencode } from "@opencode-ai/sdk";
12
12
  import { createHash, randomUUID } from "crypto";
@@ -278,7 +278,6 @@ __webpack_require__.d(__webpack_exports__, {
278
278
  eC: () => (/* reexport */ LLM_ADAPTER),
279
279
  zn: () => (/* reexport */ en_translation_namespaceObject),
280
280
  mD: () => (/* reexport */ createStreamLoggerState),
281
- jl: () => (/* reexport */ defineMcpServer),
282
281
  ss: () => (/* reexport */ findConfigFileWithField),
283
282
  PR: () => (/* reexport */ OUTPUT_MARKER_END),
284
283
  _k: () => (/* reexport */ mcp_McpServer),
@@ -341,9 +340,9 @@ __webpack_require__.d(__webpack_exports__, {
341
340
  });
342
341
 
343
342
  ;// CONCATENATED MODULE: ./src/extension-system/extension.interface.ts
344
- /** .spaceflow 目录名 */ const SPACEFLOW_DIR = ".spaceflow";
345
- /** package.json 文件名 */ const PACKAGE_JSON = "package.json";
346
343
  /**
344
+ * Extension 元数据
345
+ */ /**
347
346
  * 解析 spaceflow 配置,返回所有导出项
348
347
  */ function resolveSpaceflowConfig(config, packageName, packagePath) {
349
348
  const { join } = __webpack_require__(521);
@@ -384,14 +383,6 @@ __webpack_require__.d(__webpack_exports__, {
384
383
  */ function defineExtension(definition) {
385
384
  return definition;
386
385
  }
387
- /**
388
- * 定义 MCP 服务器
389
- * 这是一个类型安全的工厂函数,用于创建 MCP 服务器定义
390
- * @param definition MCP 服务器定义
391
- * @returns MCP 服务器定义(原样返回,仅用于类型推断)
392
- */ function defineMcpServer(definition) {
393
- return definition;
394
- }
395
386
 
396
387
  ;// CONCATENATED MODULE: ./src/extension-system/index.ts
397
388
  // 旧版接口(保留兼容,后续移除)
@@ -5471,9 +5462,9 @@ var list_namespaceObject = JSON.parse('{"description":"列出已安装的技能
5471
5462
  ;// CONCATENATED MODULE: ./src/locales/en/list.json
5472
5463
  var en_list_namespaceObject = JSON.parse('{"description":"List installed skill packages","extensionDescription":"List installed plugins/skills","noSkills":"📦 No skill packages installed","installHint":"Install skill packages with:","installedExtensions":"📦 Installed extensions ({{installed}}/{{total}}):","commands":"Commands: {{commands}}"}')
5473
5464
  ;// CONCATENATED MODULE: ./src/locales/zh-cn/mcp.json
5474
- var zh_cn_mcp_namespaceObject = JSON.parse('{"description":"启动 MCP Server,提供所有已安装扩展的 MCP 工具","options.inspector":"启动 MCP Inspector 进行交互式调试","inspectorStarting":"🔍 启动 MCP Inspector...","inspectorDebugCmd":" 调试命令: pnpm space mcp","inspectorFailed":"❌ 启动 MCP Inspector 失败: {{error}}","extensionDescription":"启动 MCP Server,提供所有已安装扩展的 MCP 工具","cwdInfo":"📂 工作目录: {{cwd}}","cwdEnvHint":" 💡 可通过环境变量 SPACEFLOW_CWD 指定工作区路径","scanning":"🔍 扫描已安装的扩展...","foundExtensions":" 发现 {{count}} 个扩展","checkingExport":" 检查 {{key}}: __mcp_server__={{hasMcpServer}}","containerSuccess":" ✅ 从容器获取 {{key}} 实例成功","containerFailed":" ⚠️ 从容器获取 {{key}} 失败: {{error}}","loadToolsFailed":" ⚠️ {{name}}: 加载 MCP 工具失败","noToolsFound":"❌ 没有找到任何 MCP 工具","noToolsHint":" 提示: 确保已安装支持 MCP 的扩展,并导出 mcpService 或 getMcpTools\\n 如果工作目录不正确,请在 MCP 配置中设置环境变量:\\n \\"env\\": { \\"SPACEFLOW_CWD\\": \\"/path/to/your/project\\" }","toolsFound":"✅ 共发现 {{count}} 个 MCP 工具","ttyHint":"💡 MCP Server 需要由 MCP 客户端(如 Cursor、Claude Desktop)通过管道启动。\\n 请将以下配置添加到你的 MCP 客户端中:\\n\\n \\"spaceflow\\": {\\n \\"command\\": \\"npx\\",\\n \\"args\\": [\\"@spaceflow/cli\\", \\"mcp\\"],\\n \\"env\\": { \\"SPACEFLOW_CWD\\": \\"/path/to/your/project\\" }\\n }","serverStarted":"🚀 MCP Server 已启动,共 {{count}} 个工具"}')
5465
+ var zh_cn_mcp_namespaceObject = JSON.parse('{"description":"启动 MCP Server,提供所有已安装扩展的 MCP 工具","options.inspector":"启动 MCP Inspector 进行交互式调试","inspectorStarting":"🔍 启动 MCP Inspector...","inspectorDebugCmd":" 调试命令: pnpm space mcp","inspectorFailed":"❌ 启动 MCP Inspector 失败: {{error}}","extensionDescription":"启动 MCP Server,提供所有已安装扩展的 MCP 工具","cwdInfo":"📂 工作目录: {{cwd}}","cwdEnvHint":" 💡 可通过环境变量 SPACEFLOW_CWD 指定工作区路径","scanning":"🔍 扫描已安装的扩展...","foundExtensions":" 发现 {{count}} 个扩展","checkingExport":" 检查 {{key}}: __mcp_server__={{hasMcpServer}}","containerSuccess":" ✅ 从容器获取 {{key}} 实例成功","containerFailed":" ⚠️ 从容器获取 {{key}} 失败: {{error}}","loadToolsFailed":" ⚠️ {{name}}: 加载 MCP 工具失败","noToolsFound":"❌ 没有找到任何 MCP 工具","noToolsHint":" 提示: 确保已安装支持 MCP 的扩展,并导出 mcpService 或 getMcpTools\\n 如果工作目录不正确,请在 MCP 配置中设置环境变量:\\n \\"env\\": { \\"SPACEFLOW_CWD\\": \\"/path/to/your/project\\" }","toolsFound":"✅ 共发现 {{count}} 个 MCP 工具","resourcesFound":"📦 共发现 {{count}} 个 MCP 资源","ttyHint":"💡 MCP Server 需要由 MCP 客户端(如 Cursor、Claude Desktop)通过管道启动。\\n 请将以下配置添加到你的 MCP 客户端中:\\n\\n \\"spaceflow\\": {\\n \\"command\\": \\"npx\\",\\n \\"args\\": [\\"@spaceflow/cli\\", \\"mcp\\"],\\n \\"env\\": { \\"SPACEFLOW_CWD\\": \\"/path/to/your/project\\" }\\n }","serverStarted":"🚀 MCP Server 已启动,共 {{count}} 个工具"}')
5475
5466
  ;// CONCATENATED MODULE: ./src/locales/en/mcp.json
5476
- var en_mcp_namespaceObject = JSON.parse('{"description":"Start MCP Server with all installed extension tools","options.inspector":"Start MCP Inspector for interactive debugging","inspectorStarting":"🔍 Starting MCP Inspector...","inspectorDebugCmd":" Debug command: pnpm space mcp","inspectorFailed":"❌ Failed to start MCP Inspector: {{error}}","extensionDescription":"Start MCP Server with all installed extension tools","cwdInfo":"📂 Working directory: {{cwd}}","cwdEnvHint":" 💡 Set SPACEFLOW_CWD environment variable to specify workspace path","scanning":"🔍 Scanning installed extensions...","foundExtensions":" Found {{count}} extensions","checkingExport":" Checking {{key}}: __mcp_server__={{hasMcpServer}}","containerSuccess":" ✅ Got {{key}} instance from container","containerFailed":" ⚠️ Failed to get {{key}} from container: {{error}}","loadToolsFailed":" ⚠️ {{name}}: Failed to load MCP tools","noToolsFound":"❌ No MCP tools found","noToolsHint":" Hint: Make sure you have installed MCP-enabled extensions that export mcpService or getMcpTools\\n If the working directory is incorrect, set the environment variable in your MCP config:\\n \\"env\\": { \\"SPACEFLOW_CWD\\": \\"/path/to/your/project\\" }","toolsFound":"✅ Found {{count}} MCP tools","ttyHint":"💡 MCP Server must be started by an MCP client (e.g. Cursor, Claude Desktop) via pipe.\\n Add the following config to your MCP client:\\n\\n \\"spaceflow\\": {\\n \\"command\\": \\"npx\\",\\n \\"args\\": [\\"@spaceflow/cli\\", \\"mcp\\"],\\n \\"env\\": { \\"SPACEFLOW_CWD\\": \\"/path/to/your/project\\" }\\n }","serverStarted":"🚀 MCP Server started with {{count}} tools"}')
5467
+ var en_mcp_namespaceObject = JSON.parse('{"description":"Start MCP Server with all installed extension tools","options.inspector":"Start MCP Inspector for interactive debugging","inspectorStarting":"🔍 Starting MCP Inspector...","inspectorDebugCmd":" Debug command: pnpm space mcp","inspectorFailed":"❌ Failed to start MCP Inspector: {{error}}","extensionDescription":"Start MCP Server with all installed extension tools","cwdInfo":"📂 Working directory: {{cwd}}","cwdEnvHint":" 💡 Set SPACEFLOW_CWD environment variable to specify workspace path","scanning":"🔍 Scanning installed extensions...","foundExtensions":" Found {{count}} extensions","checkingExport":" Checking {{key}}: __mcp_server__={{hasMcpServer}}","containerSuccess":" ✅ Got {{key}} instance from container","containerFailed":" ⚠️ Failed to get {{key}} from container: {{error}}","loadToolsFailed":" ⚠️ {{name}}: Failed to load MCP tools","noToolsFound":"❌ No MCP tools found","noToolsHint":" Hint: Make sure you have installed MCP-enabled extensions that export mcpService or getMcpTools\\n If the working directory is incorrect, set the environment variable in your MCP config:\\n \\"env\\": { \\"SPACEFLOW_CWD\\": \\"/path/to/your/project\\" }","toolsFound":"✅ Found {{count}} MCP tools","resourcesFound":"📦 Found {{count}} MCP resources","ttyHint":"💡 MCP Server must be started by an MCP client (e.g. Cursor, Claude Desktop) via pipe.\\n Add the following config to your MCP client:\\n\\n \\"spaceflow\\": {\\n \\"command\\": \\"npx\\",\\n \\"args\\": [\\"@spaceflow/cli\\", \\"mcp\\"],\\n \\"env\\": { \\"SPACEFLOW_CWD\\": \\"/path/to/your/project\\" }\\n }","serverStarted":"🚀 MCP Server started with {{count}} tools"}')
5477
5468
  ;// CONCATENATED MODULE: ./src/locales/zh-cn/runx.json
5478
5469
  var runx_namespaceObject = JSON.parse('{"description":"全局安装依赖并运行命令","options.name":"指定命令名称(默认从 source 自动提取)","noSource":"❌ 请指定要运行的依赖源","usage":" 用法: spaceflow x <source> [args...]","runFailed":"❌ 运行失败: {{error}}","extensionDescription":"执行插件提供的脚本命令","runningCommand":"▶️ 运行命令: {{command}}","npxExitCode":"npx {{package}} 退出码: {{code}}","commandNotInstalled":"命令 {{name}} 未安装","commandNotBuilt":"命令 {{name}} 未构建,缺少 dist/index.js","pluginNoExport":"插件 {{name}} 没有默认导出"}')
5479
5470
  ;// CONCATENATED MODULE: ./src/locales/en/runx.json
@@ -6118,12 +6109,14 @@ registerPluginSchema({
6118
6109
  * 提供懒加载的依赖注入功能
6119
6110
  */ class ServiceContainer {
6120
6111
  registrations = new Map();
6112
+ _cwd;
6121
6113
  _config;
6122
6114
  _output;
6123
6115
  _storage;
6124
6116
  /**
6125
6117
  * 设置核心服务(config, output, storage)
6126
- */ setCoreServices(config, output, storage) {
6118
+ */ setCoreServices(config, output, storage, cwd) {
6119
+ this._cwd = cwd;
6127
6120
  this._config = config;
6128
6121
  this._output = output;
6129
6122
  this._storage = storage;
@@ -6175,6 +6168,9 @@ registerPluginSchema({
6175
6168
  return undefined;
6176
6169
  }
6177
6170
  }
6171
+ get cwd() {
6172
+ return this._cwd;
6173
+ }
6178
6174
  get config() {
6179
6175
  return this._config;
6180
6176
  }
@@ -6344,16 +6340,17 @@ registerPluginSchema({
6344
6340
 
6345
6341
 
6346
6342
 
6343
+
6347
6344
  /**
6348
6345
  * 初始化服务容器
6349
6346
  */ function initializeContainer(container, cwd) {
6350
- const workDir = cwd || process.cwd();
6347
+ const workDir = cwd || process.env.SPACEFLOW_CWD || findProjectRoot();
6351
6348
  // 初始化核心服务(.env 已在 CLI 壳子阶段加载)
6352
6349
  const config = new UnifiedConfigReader(workDir);
6353
6350
  const output = new OutputService();
6354
6351
  const storageDir = (0,external_path_.join)(workDir, ".spaceflow", "cache");
6355
6352
  const storage = new StorageService(new FileAdapter(storageDir));
6356
- container.setCoreServices(config, output, storage);
6353
+ container.setCoreServices(config, output, storage, workDir);
6357
6354
  // 注册服务工厂
6358
6355
  registerServiceFactories(container);
6359
6356
  }
@@ -6402,6 +6399,12 @@ registerPluginSchema({
6402
6399
  constructor(ctx){
6403
6400
  this.ctx = ctx;
6404
6401
  }
6402
+ /** 当前工作目录(项目根) */ get cwd() {
6403
+ return this.ctx.cwd;
6404
+ }
6405
+ /** 获取上下文(供内部命令使用) */ getContext() {
6406
+ return this.ctx;
6407
+ }
6405
6408
  /**
6406
6409
  * 注册扩展
6407
6410
  */ registerExtension(extension) {
@@ -6437,19 +6440,34 @@ registerPluginSchema({
6437
6440
  return Array.from(this.extensions.values());
6438
6441
  }
6439
6442
  /**
6440
- * 获取所有 MCP 服务
6441
- * 返回扩展中定义的 mcp 字段
6442
- */ getMcpServers() {
6443
- const mcpServers = [];
6443
+ * 获取所有 MCP 工具
6444
+ * 返回扩展中定义的 tools 字段
6445
+ */ getTools() {
6446
+ const result = [];
6447
+ for (const ext of this.extensions.values()){
6448
+ if (ext.tools && ext.tools.length > 0) {
6449
+ result.push({
6450
+ extensionName: ext.name,
6451
+ tools: ext.tools
6452
+ });
6453
+ }
6454
+ }
6455
+ return result;
6456
+ }
6457
+ /**
6458
+ * 获取所有 MCP 资源
6459
+ * 返回扩展中定义的 resources 字段
6460
+ */ getResources() {
6461
+ const result = [];
6444
6462
  for (const ext of this.extensions.values()){
6445
- if (ext.mcp) {
6446
- mcpServers.push({
6463
+ if (ext.resources && ext.resources.length > 0) {
6464
+ result.push({
6447
6465
  extensionName: ext.name,
6448
- mcp: ext.mcp
6466
+ resources: ext.resources
6449
6467
  });
6450
6468
  }
6451
6469
  }
6452
- return mcpServers;
6470
+ return result;
6453
6471
  }
6454
6472
  }
6455
6473
 
@@ -9891,6 +9909,7 @@ class ListService {
9891
9909
 
9892
9910
 
9893
9911
 
9912
+
9894
9913
  class McpService {
9895
9914
  extensionLoader;
9896
9915
  constructor(extensionLoader){
@@ -9906,28 +9925,25 @@ class McpService {
9906
9925
  return;
9907
9926
  }
9908
9927
  if (shouldLog(verbose, 1)) {
9909
- const cwd = process.env.SPACEFLOW_CWD || process.cwd();
9928
+ const cwd = this.extensionLoader.cwd;
9910
9929
  console.error(i18n_t("mcp:cwdInfo", {
9911
9930
  cwd
9912
9931
  }));
9913
- if (!process.env.SPACEFLOW_CWD) {
9914
- console.error(i18n_t("mcp:cwdEnvHint"));
9915
- }
9916
9932
  console.error(i18n_t("mcp:scanning"));
9917
9933
  }
9918
9934
  const extensions = this.extensionLoader.getExtensions();
9919
- const mcpServers = this.extensionLoader.getMcpServers();
9935
+ const extensionTools = this.extensionLoader.getTools();
9920
9936
  if (shouldLog(verbose, 2)) {
9921
9937
  console.error(i18n_t("mcp:foundExtensions", {
9922
9938
  count: extensions.length
9923
9939
  }));
9924
9940
  }
9925
9941
  const allTools = [];
9926
- for (const { extensionName, mcp } of mcpServers){
9942
+ for (const { extensionName, tools } of extensionTools){
9927
9943
  if (shouldLog(verbose, 2)) {
9928
- console.error(` 扩展 ${extensionName} 提供 ${mcp.tools.length} 个 MCP 工具`);
9944
+ console.error(` 扩展 ${extensionName} 提供 ${tools.length} 个 MCP 工具`);
9929
9945
  }
9930
- for (const tool of mcp.tools){
9946
+ for (const tool of tools){
9931
9947
  if (shouldLog(verbose, 3)) {
9932
9948
  console.error(` - ${tool.name}: ${tool.description}`);
9933
9949
  }
@@ -9939,21 +9955,33 @@ class McpService {
9939
9955
  methodName: "handler"
9940
9956
  },
9941
9957
  handler: tool.handler,
9942
- ctx: this.extensionLoader["ctx"]
9958
+ ctx: this.extensionLoader.getContext()
9943
9959
  });
9944
9960
  }
9945
9961
  }
9946
- if (allTools.length === 0) {
9962
+ // 收集扩展 resources + 内置 resources
9963
+ const allResources = this.collectResources(verbose);
9964
+ if (allTools.length === 0 && allResources.length === 0) {
9947
9965
  console.error(i18n_t("mcp:noToolsFound"));
9948
9966
  console.error(i18n_t("mcp:noToolsHint"));
9949
9967
  process.exit(1);
9950
9968
  }
9951
9969
  if (shouldLog(verbose, 1)) {
9952
- console.error(i18n_t("mcp:toolsFound", {
9953
- count: allTools.length
9954
- }));
9955
- for (const { tool } of allTools){
9956
- console.error(` - ${tool.name}`);
9970
+ if (allTools.length > 0) {
9971
+ console.error(i18n_t("mcp:toolsFound", {
9972
+ count: allTools.length
9973
+ }));
9974
+ for (const { tool } of allTools){
9975
+ console.error(` - ${tool.name}`);
9976
+ }
9977
+ }
9978
+ if (allResources.length > 0) {
9979
+ console.error(i18n_t("mcp:resourcesFound", {
9980
+ count: allResources.length
9981
+ }));
9982
+ for (const { resource } of allResources){
9983
+ console.error(` - ${resource.name} (${resource.uri})`);
9984
+ }
9957
9985
  }
9958
9986
  }
9959
9987
  // 如果 stdin 是 TTY(用户手动在终端运行),只打印信息不阻塞
@@ -9963,11 +9991,102 @@ class McpService {
9963
9991
  return;
9964
9992
  }
9965
9993
  // 被 MCP 客户端通过管道调用,正常启动 stdio server
9966
- await this.runServer(allTools, verbose);
9994
+ await this.runServer(allTools, allResources, verbose);
9995
+ }
9996
+ /**
9997
+ * 收集所有 MCP 资源(扩展 + 内置)
9998
+ */ collectResources(verbose) {
9999
+ const ctx = this.extensionLoader.getContext();
10000
+ const allResources = [];
10001
+ // 1. 收集扩展声明的 resources
10002
+ const extensionResources = this.extensionLoader.getResources();
10003
+ for (const { extensionName, resources } of extensionResources){
10004
+ if (shouldLog(verbose, 2)) {
10005
+ console.error(` 扩展 ${extensionName} 提供 ${resources.length} 个 MCP 资源`);
10006
+ }
10007
+ for (const resource of resources){
10008
+ allResources.push({
10009
+ resource,
10010
+ ctx
10011
+ });
10012
+ }
10013
+ }
10014
+ // 2. 内置资源:项目配置(过滤敏感字段)
10015
+ allResources.push({
10016
+ resource: {
10017
+ name: "spaceflow-config",
10018
+ uri: "spaceflow://config",
10019
+ title: "Spaceflow Configuration",
10020
+ description: "当前项目的 Spaceflow 配置(已过滤敏感字段)",
10021
+ mimeType: "application/json",
10022
+ handler: async (_uri, ctx)=>{
10023
+ const config = readConfigSync(ctx.cwd);
10024
+ return JSON.stringify(this.sanitizeConfig(config), null, 2);
10025
+ }
10026
+ },
10027
+ ctx
10028
+ });
10029
+ // 3. 内置资源:扩展列表
10030
+ allResources.push({
10031
+ resource: {
10032
+ name: "spaceflow-extensions",
10033
+ uri: "spaceflow://extensions",
10034
+ title: "Installed Extensions",
10035
+ description: "当前项目已安装的 Spaceflow 扩展及其工具/资源",
10036
+ mimeType: "application/json",
10037
+ handler: async ()=>{
10038
+ const extensions = this.extensionLoader.getExtensions();
10039
+ const summary = extensions.map((ext)=>({
10040
+ name: ext.name,
10041
+ version: ext.version,
10042
+ description: ext.description,
10043
+ commands: ext.commands.map((c)=>c.name),
10044
+ tools: (ext.tools || []).map((t)=>({
10045
+ name: t.name,
10046
+ description: t.description
10047
+ })),
10048
+ resources: (ext.resources || []).map((r)=>({
10049
+ name: r.name,
10050
+ uri: r.uri,
10051
+ description: r.description
10052
+ }))
10053
+ }));
10054
+ return JSON.stringify(summary, null, 2);
10055
+ }
10056
+ },
10057
+ ctx
10058
+ });
10059
+ return allResources;
10060
+ }
10061
+ /**
10062
+ * 过滤配置中的敏感字段
10063
+ */ sanitizeConfig(config) {
10064
+ const sensitiveKeys = [
10065
+ "token",
10066
+ "apiKey",
10067
+ "appSecret",
10068
+ "authToken",
10069
+ "apikey",
10070
+ "secret"
10071
+ ];
10072
+ const sanitize = (obj)=>{
10073
+ if (obj === null || obj === undefined || typeof obj !== "object") return obj;
10074
+ if (Array.isArray(obj)) return obj.map(sanitize);
10075
+ const result = {};
10076
+ for (const [key, value] of Object.entries(obj)){
10077
+ if (sensitiveKeys.some((sk)=>key.toLowerCase().includes(sk.toLowerCase()))) {
10078
+ result[key] = value ? "***" : "";
10079
+ } else {
10080
+ result[key] = sanitize(value);
10081
+ }
10082
+ }
10083
+ return result;
10084
+ };
10085
+ return sanitize(config);
9967
10086
  }
9968
10087
  /**
9969
10088
  * 运行 MCP Server
9970
- */ async runServer(allTools, verbose) {
10089
+ */ async runServer(allTools, allResources, verbose) {
9971
10090
  const server = new mcp_js_McpServer({
9972
10091
  name: "spaceflow",
9973
10092
  version: "1.0.0"
@@ -10003,6 +10122,37 @@ class McpService {
10003
10122
  }
10004
10123
  });
10005
10124
  }
10125
+ // 注册所有资源(使用 v2 API: server.registerResource)
10126
+ for (const { resource, ctx } of allResources){
10127
+ server.registerResource(resource.name, resource.uri, {
10128
+ title: resource.title,
10129
+ description: resource.description,
10130
+ mimeType: resource.mimeType || "application/json"
10131
+ }, async (uri)=>{
10132
+ try {
10133
+ const text = await resource.handler(uri.href, ctx);
10134
+ return {
10135
+ contents: [
10136
+ {
10137
+ uri: uri.href,
10138
+ mimeType: resource.mimeType || "application/json",
10139
+ text
10140
+ }
10141
+ ]
10142
+ };
10143
+ } catch (error) {
10144
+ return {
10145
+ contents: [
10146
+ {
10147
+ uri: uri.href,
10148
+ mimeType: "text/plain",
10149
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`
10150
+ }
10151
+ ]
10152
+ };
10153
+ }
10154
+ });
10155
+ }
10006
10156
  // 启动 stdio 传输
10007
10157
  const transport = new stdio_js_StdioServerTransport();
10008
10158
  await server.connect(transport);
@@ -11264,7 +11414,7 @@ async function exec(extensions = [], options = {}) {
11264
11414
  // 6. 创建 CLI 程序
11265
11415
  const program = new Command();
11266
11416
  const cliVersion = options.cliVersion || "0.0.0";
11267
- const coreVersion = true ? "0.14.0" : 0;
11417
+ const coreVersion = true ? "0.16.0" : 0;
11268
11418
  const versionOutput = `spaceflow/${cliVersion} core/${coreVersion}`;
11269
11419
  program.name("spaceflow").description("Spaceflow CLI").version(versionOutput, "-V, --version", "显示版本信息");
11270
11420
  // 定义全局 verbose 选项(支持计数:-v, -vv, -vvv)
@@ -11376,7 +11526,7 @@ async function exec(extensions = [], options = {}) {
11376
11526
  // Rspack Config - Rspack 配置工具
11377
11527
 
11378
11528
  // MCP - Model Context Protocol 支持
11379
- // 注意:McpServerDefinition 和 McpToolDefinition 已在 extension-system/types.ts 中定义
11529
+ // 注意:McpToolDefinition 已在 extension-system/types.ts 中定义(用于 defineExtension 的 tools 字段)
11380
11530
  // 这里只导出装饰器和工具函数,避免重复导出
11381
11531
 
11382
11532
  // I18n - 国际化
@@ -11452,7 +11602,6 @@ var __webpack_exports__createPluginConfig = __webpack_exports__.aU;
11452
11602
  var __webpack_exports__createStreamLoggerState = __webpack_exports__.mD;
11453
11603
  var __webpack_exports__deepMerge = __webpack_exports__.$N;
11454
11604
  var __webpack_exports__defineExtension = __webpack_exports__.vE;
11455
- var __webpack_exports__defineMcpServer = __webpack_exports__.jl;
11456
11605
  var __webpack_exports__detectLocale = __webpack_exports__.ED;
11457
11606
  var __webpack_exports__detectPackageManager = __webpack_exports__.Lv;
11458
11607
  var __webpack_exports__detectProvider = __webpack_exports__.F1;
@@ -11512,6 +11661,6 @@ var __webpack_exports__toLogLevel = __webpack_exports__.AZ;
11512
11661
  var __webpack_exports__updateDependency = __webpack_exports__.hq;
11513
11662
  var __webpack_exports__writeConfigSync = __webpack_exports__.$v;
11514
11663
  var __webpack_exports__z = __webpack_exports__.z;
11515
- export { __webpack_exports__CONFIG_FILE_NAME as CONFIG_FILE_NAME, __webpack_exports__ClaudeCodeAdapter as ClaudeCodeAdapter, __webpack_exports__ClaudeSetupService as ClaudeSetupService, __webpack_exports__DEFAULT_EDITOR as DEFAULT_EDITOR, __webpack_exports__DEFAULT_EXTERNALS as DEFAULT_EXTERNALS, __webpack_exports__DEFAULT_SUPPORT_EDITOR as DEFAULT_SUPPORT_EDITOR, __webpack_exports__DEFAULT_TS_RULE as DEFAULT_TS_RULE, __webpack_exports__DIFF_SIDE as DIFF_SIDE, __webpack_exports__EDITOR_DIR_MAPPING as EDITOR_DIR_MAPPING, __webpack_exports__ExtensionLoader as ExtensionLoader, __webpack_exports__FEISHU_CARD_ACTION_TRIGGER as FEISHU_CARD_ACTION_TRIGGER, __webpack_exports__FEISHU_MODULE_OPTIONS as FEISHU_MODULE_OPTIONS, __webpack_exports__FeishuCardService as FeishuCardService, __webpack_exports__FeishuSdkService as FeishuSdkService, __webpack_exports__FileAdapter as FileAdapter, __webpack_exports__GIT_PROVIDER_MODULE_OPTIONS as GIT_PROVIDER_MODULE_OPTIONS, __webpack_exports__GitProviderService as GitProviderService, __webpack_exports__GitSdkService as GitSdkService, __webpack_exports__GiteaAdapter as GiteaAdapter, __webpack_exports__GithubAdapter as GithubAdapter, __webpack_exports__GitlabAdapter as GitlabAdapter, __webpack_exports__LLM_ADAPTER as LLM_ADAPTER, __webpack_exports__LLM_PROXY_CONFIG as LLM_PROXY_CONFIG, __webpack_exports__LOG_LEVEL_PRIORITY as LOG_LEVEL_PRIORITY, __webpack_exports__LlmJsonPut as LlmJsonPut, __webpack_exports__LlmProxyService as LlmProxyService, __webpack_exports__LlmSessionImpl as LlmSessionImpl, __webpack_exports__Logger as Logger, __webpack_exports__MCP_SERVER_METADATA as MCP_SERVER_METADATA, __webpack_exports__MCP_TOOL_METADATA as MCP_TOOL_METADATA, __webpack_exports__McpServer as McpServer, __webpack_exports__McpTool as McpTool, __webpack_exports__MemoryAdapter as MemoryAdapter, __webpack_exports__OUTPUT_MARKER_END as OUTPUT_MARKER_END, __webpack_exports__OUTPUT_MARKER_START as OUTPUT_MARKER_START, __webpack_exports__OpenAIAdapter as OpenAIAdapter, __webpack_exports__OpenCodeAdapter as OpenCodeAdapter, __webpack_exports__OutputService as OutputService, __webpack_exports__PACKAGE_JSON as PACKAGE_JSON, __webpack_exports__ParallelExecutor as ParallelExecutor, __webpack_exports__RC_FILE_NAME as RC_FILE_NAME, __webpack_exports__REVIEW_STATE as REVIEW_STATE, __webpack_exports__SPACEFLOW_DIR as SPACEFLOW_DIR, __webpack_exports__SchemaGeneratorService as SchemaGeneratorService, __webpack_exports__ServiceContainer as ServiceContainer, __webpack_exports__StorageService as StorageService, __webpack_exports__addI18nextResources as addI18nextResources, __webpack_exports__addLocaleResources as addLocaleResources, __webpack_exports__addSpaceflowToDevDependencies as addSpaceflowToDevDependencies, __webpack_exports__buildGitPackageSpec as buildGitPackageSpec, __webpack_exports__calculateLineOffsets as calculateLineOffsets, __webpack_exports__calculateNewLineNumber as calculateNewLineNumber, __webpack_exports__coreEn as coreEn, __webpack_exports__coreZhCN as coreZhCN, __webpack_exports__createMultiEntryPluginConfig as createMultiEntryPluginConfig, __webpack_exports__createPluginConfig as createPluginConfig, __webpack_exports__createStreamLoggerState as createStreamLoggerState, __webpack_exports__deepMerge as deepMerge, __webpack_exports__defineExtension as defineExtension, __webpack_exports__defineMcpServer as defineMcpServer, __webpack_exports__detectLocale as detectLocale, __webpack_exports__detectPackageManager as detectPackageManager, __webpack_exports__detectProvider as detectProvider, __webpack_exports__dtoToJsonSchema as dtoToJsonSchema, __webpack_exports__ensureDependencies as ensureDependencies, __webpack_exports__ensureEditorGitignore as ensureEditorGitignore, __webpack_exports__ensureSpaceflowDir as ensureSpaceflowDir, __webpack_exports__ensureSpaceflowPackageJson as ensureSpaceflowPackageJson, __webpack_exports__exec as exec, __webpack_exports__extractName as extractName, __webpack_exports__extractNpmPackageName as extractNpmPackageName, __webpack_exports__findConfigFileWithField as findConfigFileWithField, __webpack_exports__getConfigPath as getConfigPath, __webpack_exports__getConfigPaths as getConfigPaths, __webpack_exports__getDependencies as getDependencies, __webpack_exports__getEditorDirName as getEditorDirName, __webpack_exports__getEnvFilePaths as getEnvFilePaths, __webpack_exports__getMcpServerMetadata as getMcpServerMetadata, __webpack_exports__getMcpTools as getMcpTools, __webpack_exports__getPackageManager as getPackageManager, __webpack_exports__getRegisteredSchemas as getRegisteredSchemas, __webpack_exports__getSourceType as getSourceType, __webpack_exports__getSpaceflowCoreVersion as getSpaceflowCoreVersion, __webpack_exports__getSpaceflowDir as getSpaceflowDir, __webpack_exports__getSupportedEditors as getSupportedEditors, __webpack_exports__initCliI18n as initCliI18n, __webpack_exports__internalExtensions as internalExtensions, __webpack_exports__isGitUrl as isGitUrl, __webpack_exports__isLocalPath as isLocalPath, __webpack_exports__isMcpServer as isMcpServer, __webpack_exports__isPnpmWorkspace as isPnpmWorkspace, __webpack_exports__loadEnvFiles as loadEnvFiles, __webpack_exports__loadExtensionsFromDir as loadExtensionsFromDir, __webpack_exports__loadSpaceflowConfig as loadSpaceflowConfig, __webpack_exports__logStreamEvent as logStreamEvent, __webpack_exports__mapGitStatus as mapGitStatus, __webpack_exports__normalizeSource as normalizeSource, __webpack_exports__normalizeVerbose as normalizeVerbose, __webpack_exports__parallel as parallel, __webpack_exports__parseChangedLinesFromPatch as parseChangedLinesFromPatch, __webpack_exports__parseDiffText as parseDiffText, __webpack_exports__parseHunksFromPatch as parseHunksFromPatch, __webpack_exports__parseRepoUrl as parseRepoUrl, __webpack_exports__parseVerbose as parseVerbose, __webpack_exports__readConfigSync as readConfigSync, __webpack_exports__registerPluginSchema as registerPluginSchema, __webpack_exports__removeDependency as removeDependency, __webpack_exports__resetI18n as resetI18n, __webpack_exports__resolveSpaceflowConfig as resolveSpaceflowConfig, __webpack_exports__runMcpServer as runMcpServer, __webpack_exports__setGlobalAddLocaleResources as setGlobalAddLocaleResources, __webpack_exports__setGlobalT as setGlobalT, __webpack_exports__shouldLog as shouldLog, __webpack_exports__spaceflowConfig as spaceflowConfig, __webpack_exports__t as t, __webpack_exports__toLogLevel as toLogLevel, __webpack_exports__updateDependency as updateDependency, __webpack_exports__writeConfigSync as writeConfigSync, __webpack_exports__z as z };
11664
+ export { __webpack_exports__CONFIG_FILE_NAME as CONFIG_FILE_NAME, __webpack_exports__ClaudeCodeAdapter as ClaudeCodeAdapter, __webpack_exports__ClaudeSetupService as ClaudeSetupService, __webpack_exports__DEFAULT_EDITOR as DEFAULT_EDITOR, __webpack_exports__DEFAULT_EXTERNALS as DEFAULT_EXTERNALS, __webpack_exports__DEFAULT_SUPPORT_EDITOR as DEFAULT_SUPPORT_EDITOR, __webpack_exports__DEFAULT_TS_RULE as DEFAULT_TS_RULE, __webpack_exports__DIFF_SIDE as DIFF_SIDE, __webpack_exports__EDITOR_DIR_MAPPING as EDITOR_DIR_MAPPING, __webpack_exports__ExtensionLoader as ExtensionLoader, __webpack_exports__FEISHU_CARD_ACTION_TRIGGER as FEISHU_CARD_ACTION_TRIGGER, __webpack_exports__FEISHU_MODULE_OPTIONS as FEISHU_MODULE_OPTIONS, __webpack_exports__FeishuCardService as FeishuCardService, __webpack_exports__FeishuSdkService as FeishuSdkService, __webpack_exports__FileAdapter as FileAdapter, __webpack_exports__GIT_PROVIDER_MODULE_OPTIONS as GIT_PROVIDER_MODULE_OPTIONS, __webpack_exports__GitProviderService as GitProviderService, __webpack_exports__GitSdkService as GitSdkService, __webpack_exports__GiteaAdapter as GiteaAdapter, __webpack_exports__GithubAdapter as GithubAdapter, __webpack_exports__GitlabAdapter as GitlabAdapter, __webpack_exports__LLM_ADAPTER as LLM_ADAPTER, __webpack_exports__LLM_PROXY_CONFIG as LLM_PROXY_CONFIG, __webpack_exports__LOG_LEVEL_PRIORITY as LOG_LEVEL_PRIORITY, __webpack_exports__LlmJsonPut as LlmJsonPut, __webpack_exports__LlmProxyService as LlmProxyService, __webpack_exports__LlmSessionImpl as LlmSessionImpl, __webpack_exports__Logger as Logger, __webpack_exports__MCP_SERVER_METADATA as MCP_SERVER_METADATA, __webpack_exports__MCP_TOOL_METADATA as MCP_TOOL_METADATA, __webpack_exports__McpServer as McpServer, __webpack_exports__McpTool as McpTool, __webpack_exports__MemoryAdapter as MemoryAdapter, __webpack_exports__OUTPUT_MARKER_END as OUTPUT_MARKER_END, __webpack_exports__OUTPUT_MARKER_START as OUTPUT_MARKER_START, __webpack_exports__OpenAIAdapter as OpenAIAdapter, __webpack_exports__OpenCodeAdapter as OpenCodeAdapter, __webpack_exports__OutputService as OutputService, __webpack_exports__PACKAGE_JSON as PACKAGE_JSON, __webpack_exports__ParallelExecutor as ParallelExecutor, __webpack_exports__RC_FILE_NAME as RC_FILE_NAME, __webpack_exports__REVIEW_STATE as REVIEW_STATE, __webpack_exports__SPACEFLOW_DIR as SPACEFLOW_DIR, __webpack_exports__SchemaGeneratorService as SchemaGeneratorService, __webpack_exports__ServiceContainer as ServiceContainer, __webpack_exports__StorageService as StorageService, __webpack_exports__addI18nextResources as addI18nextResources, __webpack_exports__addLocaleResources as addLocaleResources, __webpack_exports__addSpaceflowToDevDependencies as addSpaceflowToDevDependencies, __webpack_exports__buildGitPackageSpec as buildGitPackageSpec, __webpack_exports__calculateLineOffsets as calculateLineOffsets, __webpack_exports__calculateNewLineNumber as calculateNewLineNumber, __webpack_exports__coreEn as coreEn, __webpack_exports__coreZhCN as coreZhCN, __webpack_exports__createMultiEntryPluginConfig as createMultiEntryPluginConfig, __webpack_exports__createPluginConfig as createPluginConfig, __webpack_exports__createStreamLoggerState as createStreamLoggerState, __webpack_exports__deepMerge as deepMerge, __webpack_exports__defineExtension as defineExtension, __webpack_exports__detectLocale as detectLocale, __webpack_exports__detectPackageManager as detectPackageManager, __webpack_exports__detectProvider as detectProvider, __webpack_exports__dtoToJsonSchema as dtoToJsonSchema, __webpack_exports__ensureDependencies as ensureDependencies, __webpack_exports__ensureEditorGitignore as ensureEditorGitignore, __webpack_exports__ensureSpaceflowDir as ensureSpaceflowDir, __webpack_exports__ensureSpaceflowPackageJson as ensureSpaceflowPackageJson, __webpack_exports__exec as exec, __webpack_exports__extractName as extractName, __webpack_exports__extractNpmPackageName as extractNpmPackageName, __webpack_exports__findConfigFileWithField as findConfigFileWithField, __webpack_exports__getConfigPath as getConfigPath, __webpack_exports__getConfigPaths as getConfigPaths, __webpack_exports__getDependencies as getDependencies, __webpack_exports__getEditorDirName as getEditorDirName, __webpack_exports__getEnvFilePaths as getEnvFilePaths, __webpack_exports__getMcpServerMetadata as getMcpServerMetadata, __webpack_exports__getMcpTools as getMcpTools, __webpack_exports__getPackageManager as getPackageManager, __webpack_exports__getRegisteredSchemas as getRegisteredSchemas, __webpack_exports__getSourceType as getSourceType, __webpack_exports__getSpaceflowCoreVersion as getSpaceflowCoreVersion, __webpack_exports__getSpaceflowDir as getSpaceflowDir, __webpack_exports__getSupportedEditors as getSupportedEditors, __webpack_exports__initCliI18n as initCliI18n, __webpack_exports__internalExtensions as internalExtensions, __webpack_exports__isGitUrl as isGitUrl, __webpack_exports__isLocalPath as isLocalPath, __webpack_exports__isMcpServer as isMcpServer, __webpack_exports__isPnpmWorkspace as isPnpmWorkspace, __webpack_exports__loadEnvFiles as loadEnvFiles, __webpack_exports__loadExtensionsFromDir as loadExtensionsFromDir, __webpack_exports__loadSpaceflowConfig as loadSpaceflowConfig, __webpack_exports__logStreamEvent as logStreamEvent, __webpack_exports__mapGitStatus as mapGitStatus, __webpack_exports__normalizeSource as normalizeSource, __webpack_exports__normalizeVerbose as normalizeVerbose, __webpack_exports__parallel as parallel, __webpack_exports__parseChangedLinesFromPatch as parseChangedLinesFromPatch, __webpack_exports__parseDiffText as parseDiffText, __webpack_exports__parseHunksFromPatch as parseHunksFromPatch, __webpack_exports__parseRepoUrl as parseRepoUrl, __webpack_exports__parseVerbose as parseVerbose, __webpack_exports__readConfigSync as readConfigSync, __webpack_exports__registerPluginSchema as registerPluginSchema, __webpack_exports__removeDependency as removeDependency, __webpack_exports__resetI18n as resetI18n, __webpack_exports__resolveSpaceflowConfig as resolveSpaceflowConfig, __webpack_exports__runMcpServer as runMcpServer, __webpack_exports__setGlobalAddLocaleResources as setGlobalAddLocaleResources, __webpack_exports__setGlobalT as setGlobalT, __webpack_exports__shouldLog as shouldLog, __webpack_exports__spaceflowConfig as spaceflowConfig, __webpack_exports__t as t, __webpack_exports__toLogLevel as toLogLevel, __webpack_exports__updateDependency as updateDependency, __webpack_exports__writeConfigSync as writeConfigSync, __webpack_exports__z as z };
11516
11665
 
11517
11666
  //# sourceMappingURL=index.js.map