@microi.net/cli 6.1.3 → 6.1.4

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.
Files changed (106) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/assets/build-meta.json +3 -3
  8. package/cordis.patch.yml +1 -1
  9. package/package.json +1 -1
  10. package/scripts/codex-marketplace.json +20 -20
  11. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  12. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  13. package/scripts/microi-cli-mcp.js +7 -7
  14. package/scripts/microi-skills.meta.json +293 -293
  15. package/skills/.microi-skills-version.json +2 -2
  16. package/skills/.progressive-disclosure-manifest.json +1 -1
  17. package/skills/ai-engine/SKILL.md +8 -1
  18. package/skills/ai-engine/references/ai-employees.md +48 -48
  19. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  20. package/skills/app-store/SKILL.md +11 -0
  21. package/skills/business-blueprint/SKILL.md +193 -193
  22. package/skills/datasource-engine/SKILL.md +93 -93
  23. package/skills/dos-orm/SKILL.md +105 -105
  24. package/skills/dos-orm/references/api-reference.md +229 -229
  25. package/skills/email-engine/SKILL.md +81 -81
  26. package/skills/email-engine/references/v8-email.md +34 -34
  27. package/skills/job-engine/SKILL.md +179 -176
  28. package/skills/message-notification/SKILL.md +156 -156
  29. package/skills/message-notification/references/contracts.md +102 -102
  30. package/skills/microi/SKILL.md +14 -14
  31. package/skills/microi-ai-application/SKILL.md +115 -115
  32. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  33. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +10 -10
  34. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +10 -10
  35. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +10 -10
  36. package/skills/microi-codex/SKILL.md +130 -130
  37. package/skills/microi-datasource-mapping/SKILL.md +131 -131
  38. package/skills/microi-db-schema/SKILL.md +182 -175
  39. package/skills/microi-db-schema/references/core-tables.md +695 -695
  40. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  41. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  42. package/skills/microi-db-schema/references/schema.md +646 -646
  43. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  44. package/skills/microi-deployment/SKILL.md +262 -260
  45. package/skills/microi-deployment/references/deployment-matrix.md +112 -112
  46. package/skills/microi-docs-coverage/SKILL.md +133 -133
  47. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  48. package/skills/microi-form-engine/SKILL.md +338 -338
  49. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  50. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  51. package/skills/microi-left-right-layout/SKILL.md +141 -141
  52. package/skills/microi-microservice/SKILL.md +354 -354
  53. package/skills/microi-microservice/references/runtime-delivery.md +282 -282
  54. package/skills/microi-solution-quotation/SKILL.md +79 -78
  55. package/skills/microi-sso/SKILL.md +102 -102
  56. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  57. package/skills/microi-sso/references/inbound.md +53 -53
  58. package/skills/microi-sso/references/outbound.md +43 -43
  59. package/skills/microi-system-delivery/references/context-quality.md +3 -3
  60. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +11 -11
  61. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +12 -12
  62. package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +8 -8
  63. package/skills/module-engine/SKILL.md +297 -297
  64. package/skills/module-engine/references/module-config.md +204 -204
  65. package/skills/ocr-engine/SKILL.md +113 -113
  66. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +10 -10
  67. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +12 -12
  68. package/skills/performance-testing/SKILL.md +227 -227
  69. package/skills/print-engine/SKILL.md +259 -259
  70. package/skills/production-readonly-audit/SKILL.md +41 -41
  71. package/skills/report-engine/SKILL.md +83 -83
  72. package/skills/search-engine/SKILL.md +75 -75
  73. package/skills/spider-engine/SKILL.md +190 -190
  74. package/skills/system-observability/SKILL.md +264 -264
  75. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  76. package/skills/translate-engine/SKILL.md +140 -140
  77. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  78. package/skills/ui-design/references/design-pattern-library.md +184 -184
  79. package/skills/ui-design/references/mci-design-contract.md +163 -163
  80. package/skills/ui-design/references/motion-and-media.md +78 -78
  81. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  82. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  83. package/skills/unity-integration/SKILL.md +178 -178
  84. package/skills/unity-integration/references/sdk-api.md +82 -82
  85. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  86. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  87. package/skills/v8-cache-pattern/SKILL.md +320 -320
  88. package/skills/v8-debugging/SKILL.md +284 -284
  89. package/skills/v8-explorer-tree/SKILL.md +228 -228
  90. package/skills/v8-file-upload/references/cdn-alias-repair.md +13 -13
  91. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  92. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  93. package/skills/v8-image-processing/SKILL.md +190 -190
  94. package/skills/v8-image-processing/references/api-reference.md +623 -623
  95. package/skills/v8-mongodb/SKILL.md +241 -201
  96. package/skills/v8-mq-mqtt/references/mqtt-production.md +352 -352
  97. package/skills/v8-saas-multi-tenant/SKILL.md +315 -315
  98. package/skills/v8-sql-query/SKILL.md +302 -302
  99. package/skills/v8-template-engine/SKILL.md +167 -167
  100. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  101. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  102. package/skills/vision-engine/SKILL.md +160 -160
  103. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  104. package/skills/workspace-conventions/SKILL.md +40 -40
  105. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +34 -34
  106. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +6 -6
@@ -5,13 +5,13 @@
5
5
  "url": "https://microi.net"
6
6
  },
7
7
  "description": "Microi吾码官方 AI 插件市场",
8
- "version": "6.1.3",
8
+ "version": "6.1.4",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "microi",
12
12
  "source": ".",
13
13
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
14
- "version": "6.1.3",
14
+ "version": "6.1.4",
15
15
  "strict": true
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "6.1.3",
3
+ "version": "6.1.4",
4
4
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
5
5
  "author": {
6
6
  "name": "Microi.Net",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "6.1.3",
3
+ "version": "6.1.4",
4
4
  "description": "Microi吾码低代码平台的 Codex 开发插件,共享 VS Code/CLI 的连接、同步、MCP、V8 与交付能力。",
5
5
  "author": {
6
6
  "name": "Microi.Net",
package/.mcp.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "command": "node",
5
5
  "args": [
6
6
  "-e",
7
- "/*\r\n * Codex CLI 仍不会把 plugin .mcp.json 的相对路径定位到插件根。\r\n * 本脚本作为 `node -e` 内容运行:CodeBuddy/WorkBuddy 优先使用宿主注入的\r\n * plugin root;Codex 则回退到官方 plugin cache,并统一执行双清单校验。\r\n */\r\nconst fs = require('node:fs');\r\nconst os = require('node:os');\r\nconst path = require('node:path');\r\nconst primaryPackageName = '@microi.net/cli';\r\nconst legacyPackageName = '@microi.net/codex-plugin';\r\n\r\nfunction readJson(filePath) {\r\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\r\n catch { return undefined; }\r\n}\r\nfunction validPluginRoot(root) {\r\n const manifest = readJson(path.join(root, '.codex-plugin', 'plugin.json'));\r\n const pkg = readJson(path.join(root, 'package.json'));\r\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\r\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\r\n if (manifest?.name !== 'microi' || ![primaryPackageName, legacyPackageName].includes(pkg?.name)) return undefined;\r\n if (!manifest.version || manifest.version !== pkg.version) return undefined;\r\n if (!fs.existsSync(adapter) || !fs.existsSync(router)) return undefined;\r\n return {\r\n root,\r\n adapter,\r\n router,\r\n packagePriority: pkg.name === primaryPackageName ? 1 : 0,\r\n modifiedAt: Math.max(fs.statSync(adapter).mtimeMs, fs.statSync(router).mtimeMs),\r\n };\r\n}\r\n\r\nfunction findPluginRoot() {\r\n const explicitRoots = [\r\n ['MICROI_CODEX_PLUGIN_ROOT', process.env.MICROI_CODEX_PLUGIN_ROOT],\r\n ['CODEBUDDY_PLUGIN_ROOT', process.env.CODEBUDDY_PLUGIN_ROOT],\r\n ['WORKBUDDY_PLUGIN_ROOT', process.env.WORKBUDDY_PLUGIN_ROOT],\r\n ['CLAUDE_PLUGIN_ROOT', process.env.CLAUDE_PLUGIN_ROOT],\r\n ];\r\n for (const [source, value] of explicitRoots) {\r\n const explicit = String(value || '').trim();\r\n if (!explicit) continue;\r\n const validated = validPluginRoot(path.resolve(explicit));\r\n if (!validated) throw new Error(`${source} 不是有效的 Microi Plugin:${explicit}`);\r\n return validated;\r\n }\r\n\r\n const codexHome = path.resolve(process.env.CODEX_HOME || path.join(os.homedir(), '.codex'));\r\n const cacheRoot = path.join(codexHome, 'plugins', 'cache');\r\n const candidates = [];\r\n if (fs.existsSync(cacheRoot)) {\r\n for (const marketplace of fs.readdirSync(cacheRoot, { withFileTypes: true }).filter(entry => entry.isDirectory())) {\r\n const pluginDir = path.join(cacheRoot, marketplace.name, 'microi');\r\n if (!fs.existsSync(pluginDir)) continue;\r\n for (const version of fs.readdirSync(pluginDir, { withFileTypes: true }).filter(entry => entry.isDirectory())) {\r\n const candidateRoot = path.resolve(pluginDir, version.name);\r\n const relative = path.relative(cacheRoot, candidateRoot);\r\n if (relative.startsWith('..') || path.isAbsolute(relative)) continue;\r\n const validated = validPluginRoot(candidateRoot);\r\n if (validated) candidates.push(validated);\r\n }\r\n }\r\n }\r\n candidates.sort((left, right) => right.packagePriority - left.packagePriority || right.modifiedAt - left.modifiedAt);\r\n if (!candidates[0]) {\r\n throw new Error(`未在 Codex plugin cache 找到有效的 Microi Agentx Plugin:${cacheRoot}`);\r\n }\r\n return candidates[0];\r\n}\r\n\r\ntry {\r\n const plugin = findPluginRoot();\r\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\r\n process.argv[2] = plugin.router;\r\n require(plugin.adapter);\r\n} catch (error) {\r\n console.error(`[microi-codex-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\r\n process.exit(1);\r\n}\r\n"
7
+ "/*\n * Codex CLI 仍不会把 plugin .mcp.json 的相对路径定位到插件根。\n * 本脚本作为 `node -e` 内容运行:CodeBuddy/WorkBuddy 优先使用宿主注入的\n * plugin root;Codex 则回退到官方 plugin cache,并统一执行双清单校验。\n */\nconst fs = require('node:fs');\nconst os = require('node:os');\nconst path = require('node:path');\nconst primaryPackageName = '@microi.net/cli';\nconst legacyPackageName = '@microi.net/codex-plugin';\n\nfunction readJson(filePath) {\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\n catch { return undefined; }\n}\nfunction validPluginRoot(root) {\n const manifest = readJson(path.join(root, '.codex-plugin', 'plugin.json'));\n const pkg = readJson(path.join(root, 'package.json'));\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\n if (manifest?.name !== 'microi' || ![primaryPackageName, legacyPackageName].includes(pkg?.name)) return undefined;\n if (!manifest.version || manifest.version !== pkg.version) return undefined;\n if (!fs.existsSync(adapter) || !fs.existsSync(router)) return undefined;\n return {\n root,\n adapter,\n router,\n packagePriority: pkg.name === primaryPackageName ? 1 : 0,\n modifiedAt: Math.max(fs.statSync(adapter).mtimeMs, fs.statSync(router).mtimeMs),\n };\n}\n\nfunction findPluginRoot() {\n const explicitRoots = [\n ['MICROI_CODEX_PLUGIN_ROOT', process.env.MICROI_CODEX_PLUGIN_ROOT],\n ['CODEBUDDY_PLUGIN_ROOT', process.env.CODEBUDDY_PLUGIN_ROOT],\n ['WORKBUDDY_PLUGIN_ROOT', process.env.WORKBUDDY_PLUGIN_ROOT],\n ['CLAUDE_PLUGIN_ROOT', process.env.CLAUDE_PLUGIN_ROOT],\n ];\n for (const [source, value] of explicitRoots) {\n const explicit = String(value || '').trim();\n if (!explicit) continue;\n const validated = validPluginRoot(path.resolve(explicit));\n if (!validated) throw new Error(`${source} 不是有效的 Microi Plugin:${explicit}`);\n return validated;\n }\n\n const codexHome = path.resolve(process.env.CODEX_HOME || path.join(os.homedir(), '.codex'));\n const cacheRoot = path.join(codexHome, 'plugins', 'cache');\n const candidates = [];\n if (fs.existsSync(cacheRoot)) {\n for (const marketplace of fs.readdirSync(cacheRoot, { withFileTypes: true }).filter(entry => entry.isDirectory())) {\n const pluginDir = path.join(cacheRoot, marketplace.name, 'microi');\n if (!fs.existsSync(pluginDir)) continue;\n for (const version of fs.readdirSync(pluginDir, { withFileTypes: true }).filter(entry => entry.isDirectory())) {\n const candidateRoot = path.resolve(pluginDir, version.name);\n const relative = path.relative(cacheRoot, candidateRoot);\n if (relative.startsWith('..') || path.isAbsolute(relative)) continue;\n const validated = validPluginRoot(candidateRoot);\n if (validated) candidates.push(validated);\n }\n }\n }\n candidates.sort((left, right) => right.packagePriority - left.packagePriority || right.modifiedAt - left.modifiedAt);\n if (!candidates[0]) {\n throw new Error(`未在 Codex plugin cache 找到有效的 Microi Agentx Plugin:${cacheRoot}`);\n }\n return candidates[0];\n}\n\ntry {\n const plugin = findPluginRoot();\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\n process.argv[2] = plugin.router;\n require(plugin.adapter);\n} catch (error) {\n console.error(`[microi-codex-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n"
8
8
  ]
9
9
  }
10
10
  }
@@ -5,13 +5,13 @@
5
5
  "url": "https://microi.net"
6
6
  },
7
7
  "description": "Microi吾码官方 AI 插件市场",
8
- "version": "6.1.3",
8
+ "version": "6.1.4",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "microi",
12
12
  "source": ".",
13
13
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
14
- "version": "6.1.3",
14
+ "version": "6.1.4",
15
15
  "strict": true
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "6.1.3",
3
+ "version": "6.1.4",
4
4
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
5
5
  "author": {
6
6
  "name": "Microi.Net",
@@ -1,6 +1,6 @@
1
1
  {
2
- "builtAt": "2026-10-22T13:19:45.875Z",
3
- "version": "6.1.3",
2
+ "builtAt": "2026-10-22T14:31:45.963Z",
3
+ "version": "6.1.4",
4
4
  "sourceProducts": [
5
5
  "vscode-extension",
6
6
  "microi-cli",
@@ -14,6 +14,6 @@
14
14
  "cli": "4aea8e9c7f4b6bda4c16e7eaf995e8ae3398cce0cbcbc20b59b1849febda91ad",
15
15
  "router": "a65a0a9466c4bcfc1cee2a7182c77e4e73ae3221198abd0a0670f1d847fa2938",
16
16
  "broker": "ed04bbcc5bc7d62e447d82946889d1f72af653a9016675f81a01ef6cd88051b0",
17
- "dshBundle": "316132c10ce05801a2b039ff0e3721c46f57a4130d723e171defdbecbc8fe39c"
17
+ "dshBundle": "02444aea80eb63819f29094bb731d7cb57b5346c572bd44ebe7f67ea7af70985"
18
18
  }
19
19
  }
package/cordis.patch.yml CHANGED
@@ -7,7 +7,7 @@
7
7
  serverName: microi
8
8
  transport: stdio
9
9
  command: !!js process.execPath
10
- args: ["-e","/*\r\n * DeepSeek Harness 通过 profile bundle 加载此 `node -e` 引导脚本。\r\n * DSH 不保证 MCP 子进程 cwd 位于 npm 包根,因此按 DSH_HOME/profile 定位\r\n * 当前版本的 @microi.net/cli,再复用 Codex 同源适配器与多连接路由器。\r\n */\r\nconst fs = require('node:fs');\r\nconst os = require('node:os');\r\nconst path = require('node:path');\r\nconst packageName = '@microi.net/cli';\r\nconst expectedVersion = '6.1.3';\r\n\r\nfunction readJson(filePath) {\r\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\r\n catch { return undefined; }\r\n}\r\n\r\nfunction expandHome(value) {\r\n if (value === '~') return os.homedir();\r\n if (value.startsWith('~/') || value.startsWith('~\\\\')) return path.join(os.homedir(), value.slice(2));\r\n return value;\r\n}\r\n\r\nfunction validRoot(value) {\r\n const root = path.resolve(value);\r\n const pkg = readJson(path.join(root, 'package.json'));\r\n const patch = path.join(root, 'cordis.patch.yml');\r\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\r\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\r\n if (pkg?.name !== packageName || pkg?.version !== expectedVersion) return undefined;\r\n if (pkg?.dsh?.bundle?.patch !== './cordis.patch.yml') return undefined;\r\n if (![patch, adapter, router].every(filePath => fs.existsSync(filePath))) return undefined;\r\n return { root: fs.realpathSync(root), adapter, router, modifiedAt: fs.statSync(router).mtimeMs };\r\n}\r\n\r\nfunction findPlugin() {\r\n const explicit = String(process.env.MICROI_DSH_PLUGIN_ROOT || '').trim();\r\n if (explicit) {\r\n const plugin = validRoot(explicit);\r\n if (!plugin) throw new Error(`MICROI_DSH_PLUGIN_ROOT 不是版本 ${expectedVersion} 的有效 Microi DSH bundle:${explicit}`);\r\n return plugin;\r\n }\r\n const configuredHome = String(process.env.DSH_HOME || '').trim();\r\n const dshHome = path.resolve(expandHome(configuredHome || path.join(os.homedir(), '.dsh')));\r\n const profilesRoot = path.join(dshHome, 'profiles');\r\n const candidates = [];\r\n if (fs.existsSync(profilesRoot)) {\r\n for (const entry of fs.readdirSync(profilesRoot, { withFileTypes: true })) {\r\n if (!entry.isDirectory() || entry.name === 'node_modules') continue;\r\n const root = path.join(profilesRoot, entry.name, 'node_modules', '@microi.net', 'cli');\r\n const plugin = validRoot(root);\r\n if (plugin) candidates.push(plugin);\r\n }\r\n }\r\n candidates.sort((left, right) => right.modifiedAt - left.modifiedAt);\r\n if (!candidates[0]) throw new Error(`未在 ${profilesRoot} 找到版本 ${expectedVersion} 的 ${packageName}`);\r\n return candidates[0];\r\n}\r\n\r\ntry {\r\n const plugin = findPlugin();\r\n process.env.MICROI_DSH_PLUGIN_ROOT = plugin.root;\r\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\r\n process.env.MICROI_TOOL_SOURCE = 'dsh';\r\n process.env.MICROI_TOOL_VERSION = expectedVersion;\r\n process.env.MICROI_WORKSPACE_ROOT = process.env.MICROI_WORKSPACE_ROOT || process.cwd();\r\n process.argv[2] = plugin.router;\r\n require(plugin.adapter);\r\n} catch (error) {\r\n console.error(`[microi-dsh-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\r\n process.exit(1);\r\n}\r\n"]
10
+ args: ["-e","/*\n * DeepSeek Harness 通过 profile bundle 加载此 `node -e` 引导脚本。\n * DSH 不保证 MCP 子进程 cwd 位于 npm 包根,因此按 DSH_HOME/profile 定位\n * 当前版本的 @microi.net/cli,再复用 Codex 同源适配器与多连接路由器。\n */\nconst fs = require('node:fs');\nconst os = require('node:os');\nconst path = require('node:path');\nconst packageName = '@microi.net/cli';\nconst expectedVersion = '6.1.4';\n\nfunction readJson(filePath) {\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\n catch { return undefined; }\n}\n\nfunction expandHome(value) {\n if (value === '~') return os.homedir();\n if (value.startsWith('~/') || value.startsWith('~\\\\')) return path.join(os.homedir(), value.slice(2));\n return value;\n}\n\nfunction validRoot(value) {\n const root = path.resolve(value);\n const pkg = readJson(path.join(root, 'package.json'));\n const patch = path.join(root, 'cordis.patch.yml');\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\n if (pkg?.name !== packageName || pkg?.version !== expectedVersion) return undefined;\n if (pkg?.dsh?.bundle?.patch !== './cordis.patch.yml') return undefined;\n if (![patch, adapter, router].every(filePath => fs.existsSync(filePath))) return undefined;\n return { root: fs.realpathSync(root), adapter, router, modifiedAt: fs.statSync(router).mtimeMs };\n}\n\nfunction findPlugin() {\n const explicit = String(process.env.MICROI_DSH_PLUGIN_ROOT || '').trim();\n if (explicit) {\n const plugin = validRoot(explicit);\n if (!plugin) throw new Error(`MICROI_DSH_PLUGIN_ROOT 不是版本 ${expectedVersion} 的有效 Microi DSH bundle:${explicit}`);\n return plugin;\n }\n const configuredHome = String(process.env.DSH_HOME || '').trim();\n const dshHome = path.resolve(expandHome(configuredHome || path.join(os.homedir(), '.dsh')));\n const profilesRoot = path.join(dshHome, 'profiles');\n const candidates = [];\n if (fs.existsSync(profilesRoot)) {\n for (const entry of fs.readdirSync(profilesRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name === 'node_modules') continue;\n const root = path.join(profilesRoot, entry.name, 'node_modules', '@microi.net', 'cli');\n const plugin = validRoot(root);\n if (plugin) candidates.push(plugin);\n }\n }\n candidates.sort((left, right) => right.modifiedAt - left.modifiedAt);\n if (!candidates[0]) throw new Error(`未在 ${profilesRoot} 找到版本 ${expectedVersion} 的 ${packageName}`);\n return candidates[0];\n}\n\ntry {\n const plugin = findPlugin();\n process.env.MICROI_DSH_PLUGIN_ROOT = plugin.root;\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\n process.env.MICROI_TOOL_SOURCE = 'dsh';\n process.env.MICROI_TOOL_VERSION = expectedVersion;\n process.env.MICROI_WORKSPACE_ROOT = process.env.MICROI_WORKSPACE_ROOT || process.cwd();\n process.argv[2] = plugin.router;\n require(plugin.adapter);\n} catch (error) {\n console.error(`[microi-dsh-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n"]
11
11
  env:
12
12
  MICROI_TOOL_SOURCE: dsh
13
13
  cwd: !!js process.cwd()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microi.net/cli",
3
- "version": "6.1.3",
3
+ "version": "6.1.4",
4
4
  "description": "Microi吾码 AI 开发 CLI 与多宿主 Plugin:服务器连接、Skills、MCP、V8 同步和低代码交付",
5
5
  "license": "MIT",
6
6
  "homepage": "https://microi.net/doc/v8-engine/vs-code-plugin.html",
@@ -1,20 +1,20 @@
1
- {
2
- "name": "microi-net",
3
- "interface": {
4
- "displayName": "Microi.Net"
5
- },
6
- "plugins": [
7
- {
8
- "name": "microi",
9
- "source": {
10
- "source": "local",
11
- "path": "./plugins/microi"
12
- },
13
- "policy": {
14
- "installation": "AVAILABLE",
15
- "authentication": "ON_USE"
16
- },
17
- "category": "developer-tools"
18
- }
19
- ]
20
- }
1
+ {
2
+ "name": "microi-net",
3
+ "interface": {
4
+ "displayName": "Microi.Net"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "microi",
9
+ "source": {
10
+ "source": "local",
11
+ "path": "./plugins/microi"
12
+ },
13
+ "policy": {
14
+ "installation": "AVAILABLE",
15
+ "authentication": "ON_USE"
16
+ },
17
+ "category": "developer-tools"
18
+ }
19
+ ]
20
+ }
@@ -1,189 +1,189 @@
1
- #!/usr/bin/env node
2
- /*
3
- * Codex MCP stdio adapter for the bundled Microi MCP server.
4
- *
5
- * The MCP SDK version used by Microi currently speaks newline-delimited
6
- * JSON-RPC over stdio. Some Codex runtimes send and expect Content-Length
7
- * framed JSON-RPC. This adapter bridges both formats without changing the
8
- * normal VS Code/Cursor/Trae/Claude MCP configuration.
9
- */
10
-
11
- const childProcess = require('node:child_process');
12
- const path = require('node:path');
13
-
14
- const target = process.argv[2];
15
- if (!target) {
16
- console.error('[microi-mcp-adapter] Missing target MCP server path.');
17
- process.exit(1);
18
- }
19
-
20
- const child = childProcess.spawn(process.execPath, [target, ...process.argv.slice(3)], {
21
- cwd: process.cwd(),
22
- env: process.env,
23
- stdio: ['pipe', 'pipe', 'pipe'],
24
- windowsHide: true,
25
- });
26
-
27
- let inputBuffer = Buffer.alloc(0);
28
- let outputBuffer = Buffer.alloc(0);
29
- let clientFraming = null; // 'content-length' | 'line'
30
- let shutdownRequested = false;
31
- let requestedExitCode = 0;
32
- let forceExitTimer = null;
33
-
34
- function stopChildAndExit(exitCode = 0) {
35
- if (shutdownRequested) return;
36
- shutdownRequested = true;
37
- requestedExitCode = exitCode;
38
-
39
- if (!child.stdin.destroyed) {
40
- child.stdin.end();
41
- }
42
-
43
- if (child.exitCode !== null) {
44
- process.exit(requestedExitCode);
45
- }
46
-
47
- try {
48
- child.kill('SIGTERM');
49
- } catch {
50
- process.exit(requestedExitCode);
51
- }
52
-
53
- forceExitTimer = setTimeout(() => {
54
- try {
55
- child.kill('SIGKILL');
56
- } catch {
57
- // 子进程可能已在超时边界退出。
58
- }
59
- process.exit(requestedExitCode);
60
- }, 2000);
61
- }
62
-
63
- // Codex 会为每个 MCP 连接启动一个适配器。客户端退出、重载或异常断开时,
64
- // 必须同步终止其子 MCP 服务,否则孤儿进程会持续累积并挤占前端构建内存。
65
- process.stdin.on('end', () => stopChildAndExit(0));
66
- process.stdin.on('error', () => stopChildAndExit(1));
67
- process.stdout.on('error', error => {
68
- stopChildAndExit(error && error.code === 'EPIPE' ? 0 : 1);
69
- });
70
- process.on('disconnect', () => stopChildAndExit(0));
71
- for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
72
- process.on(signal, () => stopChildAndExit(0));
73
- }
74
-
75
- const parentPid = process.ppid;
76
- if (parentPid > 1) {
77
- const parentWatchTimer = setInterval(() => {
78
- try {
79
- process.kill(parentPid, 0);
80
- } catch (error) {
81
- if (error && error.code === 'ESRCH') {
82
- stopChildAndExit(0);
83
- }
84
- }
85
- }, 5000);
86
- parentWatchTimer.unref();
87
- }
88
-
89
- process.on('exit', () => {
90
- if (child.exitCode === null) {
91
- try {
92
- child.kill('SIGKILL');
93
- } catch {
94
- // 退出阶段只做尽力清理。
95
- }
96
- }
97
- });
98
-
99
- function writeLineToChild(jsonText) {
100
- if (!child.stdin.destroyed) {
101
- child.stdin.write(jsonText.trimEnd() + '\n');
102
- }
103
- }
104
-
105
- function writeToClient(jsonText) {
106
- const text = jsonText.trim();
107
- if (!text) return;
108
-
109
- if (clientFraming === 'line') {
110
- process.stdout.write(text + '\n');
111
- return;
112
- }
113
-
114
- const bytes = Buffer.byteLength(text, 'utf8');
115
- process.stdout.write(`Content-Length: ${bytes}\r\n\r\n${text}`);
116
- }
117
-
118
- function processInputBuffer() {
119
- while (inputBuffer.length > 0) {
120
- const asText = inputBuffer.toString('utf8');
121
-
122
- if (/^Content-Length:/i.test(asText)) {
123
- clientFraming = 'content-length';
124
- const headerEnd = asText.indexOf('\r\n\r\n');
125
- if (headerEnd < 0) return;
126
-
127
- const header = asText.slice(0, headerEnd);
128
- const match = header.match(/Content-Length:\s*(\d+)/i);
129
- if (!match) {
130
- console.error('[microi-mcp-adapter] Invalid Content-Length header.');
131
- stopChildAndExit(1);
132
- return;
133
- }
134
-
135
- const length = Number(match[1]);
136
- const bodyStart = Buffer.byteLength(asText.slice(0, headerEnd + 4), 'utf8');
137
- if (inputBuffer.length < bodyStart + length) return;
138
-
139
- const body = inputBuffer.slice(bodyStart, bodyStart + length).toString('utf8');
140
- writeLineToChild(body);
141
- inputBuffer = inputBuffer.slice(bodyStart + length);
142
- continue;
143
- }
144
-
145
- clientFraming = clientFraming || 'line';
146
- const newline = inputBuffer.indexOf(0x0a);
147
- if (newline < 0) return;
148
-
149
- const line = inputBuffer.slice(0, newline + 1).toString('utf8').trim();
150
- inputBuffer = inputBuffer.slice(newline + 1);
151
- if (line) {
152
- writeLineToChild(line);
153
- }
154
- }
155
- }
156
-
157
- process.stdin.on('data', chunk => {
158
- inputBuffer = Buffer.concat([inputBuffer, chunk]);
159
- processInputBuffer();
160
- });
161
-
162
- child.stdout.on('data', chunk => {
163
- outputBuffer = Buffer.concat([outputBuffer, chunk]);
164
- let newlineIndex;
165
- while ((newlineIndex = outputBuffer.indexOf(0x0a)) >= 0) {
166
- const line = outputBuffer.slice(0, newlineIndex).toString('utf8').trim();
167
- outputBuffer = outputBuffer.slice(newlineIndex + 1);
168
- if (line) writeToClient(line);
169
- }
170
- });
171
-
172
- child.stderr.on('data', chunk => {
173
- process.stderr.write(chunk);
174
- });
175
-
176
- child.on('exit', code => {
177
- if (forceExitTimer) {
178
- clearTimeout(forceExitTimer);
179
- }
180
- if (outputBuffer.length > 0) {
181
- writeToClient(outputBuffer.toString('utf8'));
182
- }
183
- process.exit(shutdownRequested ? requestedExitCode : (code || 0));
184
- });
185
-
186
- child.on('error', err => {
187
- console.error(`[microi-mcp-adapter] Failed to start ${path.basename(target)}: ${err.message}`);
188
- stopChildAndExit(1);
189
- });
1
+ #!/usr/bin/env node
2
+ /*
3
+ * Codex MCP stdio adapter for the bundled Microi MCP server.
4
+ *
5
+ * The MCP SDK version used by Microi currently speaks newline-delimited
6
+ * JSON-RPC over stdio. Some Codex runtimes send and expect Content-Length
7
+ * framed JSON-RPC. This adapter bridges both formats without changing the
8
+ * normal VS Code/Cursor/Trae/Claude MCP configuration.
9
+ */
10
+
11
+ const childProcess = require('node:child_process');
12
+ const path = require('node:path');
13
+
14
+ const target = process.argv[2];
15
+ if (!target) {
16
+ console.error('[microi-mcp-adapter] Missing target MCP server path.');
17
+ process.exit(1);
18
+ }
19
+
20
+ const child = childProcess.spawn(process.execPath, [target, ...process.argv.slice(3)], {
21
+ cwd: process.cwd(),
22
+ env: process.env,
23
+ stdio: ['pipe', 'pipe', 'pipe'],
24
+ windowsHide: true,
25
+ });
26
+
27
+ let inputBuffer = Buffer.alloc(0);
28
+ let outputBuffer = Buffer.alloc(0);
29
+ let clientFraming = null; // 'content-length' | 'line'
30
+ let shutdownRequested = false;
31
+ let requestedExitCode = 0;
32
+ let forceExitTimer = null;
33
+
34
+ function stopChildAndExit(exitCode = 0) {
35
+ if (shutdownRequested) return;
36
+ shutdownRequested = true;
37
+ requestedExitCode = exitCode;
38
+
39
+ if (!child.stdin.destroyed) {
40
+ child.stdin.end();
41
+ }
42
+
43
+ if (child.exitCode !== null) {
44
+ process.exit(requestedExitCode);
45
+ }
46
+
47
+ try {
48
+ child.kill('SIGTERM');
49
+ } catch {
50
+ process.exit(requestedExitCode);
51
+ }
52
+
53
+ forceExitTimer = setTimeout(() => {
54
+ try {
55
+ child.kill('SIGKILL');
56
+ } catch {
57
+ // 子进程可能已在超时边界退出。
58
+ }
59
+ process.exit(requestedExitCode);
60
+ }, 2000);
61
+ }
62
+
63
+ // Codex 会为每个 MCP 连接启动一个适配器。客户端退出、重载或异常断开时,
64
+ // 必须同步终止其子 MCP 服务,否则孤儿进程会持续累积并挤占前端构建内存。
65
+ process.stdin.on('end', () => stopChildAndExit(0));
66
+ process.stdin.on('error', () => stopChildAndExit(1));
67
+ process.stdout.on('error', error => {
68
+ stopChildAndExit(error && error.code === 'EPIPE' ? 0 : 1);
69
+ });
70
+ process.on('disconnect', () => stopChildAndExit(0));
71
+ for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
72
+ process.on(signal, () => stopChildAndExit(0));
73
+ }
74
+
75
+ const parentPid = process.ppid;
76
+ if (parentPid > 1) {
77
+ const parentWatchTimer = setInterval(() => {
78
+ try {
79
+ process.kill(parentPid, 0);
80
+ } catch (error) {
81
+ if (error && error.code === 'ESRCH') {
82
+ stopChildAndExit(0);
83
+ }
84
+ }
85
+ }, 5000);
86
+ parentWatchTimer.unref();
87
+ }
88
+
89
+ process.on('exit', () => {
90
+ if (child.exitCode === null) {
91
+ try {
92
+ child.kill('SIGKILL');
93
+ } catch {
94
+ // 退出阶段只做尽力清理。
95
+ }
96
+ }
97
+ });
98
+
99
+ function writeLineToChild(jsonText) {
100
+ if (!child.stdin.destroyed) {
101
+ child.stdin.write(jsonText.trimEnd() + '\n');
102
+ }
103
+ }
104
+
105
+ function writeToClient(jsonText) {
106
+ const text = jsonText.trim();
107
+ if (!text) return;
108
+
109
+ if (clientFraming === 'line') {
110
+ process.stdout.write(text + '\n');
111
+ return;
112
+ }
113
+
114
+ const bytes = Buffer.byteLength(text, 'utf8');
115
+ process.stdout.write(`Content-Length: ${bytes}\r\n\r\n${text}`);
116
+ }
117
+
118
+ function processInputBuffer() {
119
+ while (inputBuffer.length > 0) {
120
+ const asText = inputBuffer.toString('utf8');
121
+
122
+ if (/^Content-Length:/i.test(asText)) {
123
+ clientFraming = 'content-length';
124
+ const headerEnd = asText.indexOf('\r\n\r\n');
125
+ if (headerEnd < 0) return;
126
+
127
+ const header = asText.slice(0, headerEnd);
128
+ const match = header.match(/Content-Length:\s*(\d+)/i);
129
+ if (!match) {
130
+ console.error('[microi-mcp-adapter] Invalid Content-Length header.');
131
+ stopChildAndExit(1);
132
+ return;
133
+ }
134
+
135
+ const length = Number(match[1]);
136
+ const bodyStart = Buffer.byteLength(asText.slice(0, headerEnd + 4), 'utf8');
137
+ if (inputBuffer.length < bodyStart + length) return;
138
+
139
+ const body = inputBuffer.slice(bodyStart, bodyStart + length).toString('utf8');
140
+ writeLineToChild(body);
141
+ inputBuffer = inputBuffer.slice(bodyStart + length);
142
+ continue;
143
+ }
144
+
145
+ clientFraming = clientFraming || 'line';
146
+ const newline = inputBuffer.indexOf(0x0a);
147
+ if (newline < 0) return;
148
+
149
+ const line = inputBuffer.slice(0, newline + 1).toString('utf8').trim();
150
+ inputBuffer = inputBuffer.slice(newline + 1);
151
+ if (line) {
152
+ writeLineToChild(line);
153
+ }
154
+ }
155
+ }
156
+
157
+ process.stdin.on('data', chunk => {
158
+ inputBuffer = Buffer.concat([inputBuffer, chunk]);
159
+ processInputBuffer();
160
+ });
161
+
162
+ child.stdout.on('data', chunk => {
163
+ outputBuffer = Buffer.concat([outputBuffer, chunk]);
164
+ let newlineIndex;
165
+ while ((newlineIndex = outputBuffer.indexOf(0x0a)) >= 0) {
166
+ const line = outputBuffer.slice(0, newlineIndex).toString('utf8').trim();
167
+ outputBuffer = outputBuffer.slice(newlineIndex + 1);
168
+ if (line) writeToClient(line);
169
+ }
170
+ });
171
+
172
+ child.stderr.on('data', chunk => {
173
+ process.stderr.write(chunk);
174
+ });
175
+
176
+ child.on('exit', code => {
177
+ if (forceExitTimer) {
178
+ clearTimeout(forceExitTimer);
179
+ }
180
+ if (outputBuffer.length > 0) {
181
+ writeToClient(outputBuffer.toString('utf8'));
182
+ }
183
+ process.exit(shutdownRequested ? requestedExitCode : (code || 0));
184
+ });
185
+
186
+ child.on('error', err => {
187
+ console.error(`[microi-mcp-adapter] Failed to start ${path.basename(target)}: ${err.message}`);
188
+ stopChildAndExit(1);
189
+ });
@@ -1,21 +1,21 @@
1
- @echo off
2
- setlocal
3
-
4
- if "%~1"=="" (
5
- >&2 echo [microi-trae-mcp] Missing Node or Electron runtime path.
6
- exit /b 2
7
- )
8
-
9
- if "%~2"=="" (
10
- >&2 echo [microi-trae-mcp] Missing MCP adapter path.
11
- exit /b 2
12
- )
13
-
14
- if "%~3"=="" (
15
- >&2 echo [microi-trae-mcp] Missing MCP server path.
16
- exit /b 2
17
- )
18
-
19
- call "%~1" "%~2" "%~3"
20
- set "MICROI_MCP_EXIT_CODE=%ERRORLEVEL%"
21
- endlocal & exit /b %MICROI_MCP_EXIT_CODE%
1
+ @echo off
2
+ setlocal
3
+
4
+ if "%~1"=="" (
5
+ >&2 echo [microi-trae-mcp] Missing Node or Electron runtime path.
6
+ exit /b 2
7
+ )
8
+
9
+ if "%~2"=="" (
10
+ >&2 echo [microi-trae-mcp] Missing MCP adapter path.
11
+ exit /b 2
12
+ )
13
+
14
+ if "%~3"=="" (
15
+ >&2 echo [microi-trae-mcp] Missing MCP server path.
16
+ exit /b 2
17
+ )
18
+
19
+ call "%~1" "%~2" "%~3"
20
+ set "MICROI_MCP_EXIT_CODE=%ERRORLEVEL%"
21
+ endlocal & exit /b %MICROI_MCP_EXIT_CODE%
@@ -1,7 +1,7 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- // Keep the configured entry name stable and independent from mcp-server.js.
5
- // Historical VS Code extensions scanned arguments containing that basename
6
- // and rewrote them to their own extension directory during activation.
7
- require('./mcp-server.js');
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // Keep the configured entry name stable and independent from mcp-server.js.
5
+ // Historical VS Code extensions scanned arguments containing that basename
6
+ // and rewrote them to their own extension directory during activation.
7
+ require('./mcp-server.js');