@shgroup/opencode-serenity-plugin 0.2.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.
Files changed (151) hide show
  1. package/README.md +199 -0
  2. package/bin/opencode-serenity-plugin.js +316 -0
  3. package/dist/activation.d.ts +40 -0
  4. package/dist/activation.d.ts.map +1 -0
  5. package/dist/activation.js +133 -0
  6. package/dist/activation.js.map +1 -0
  7. package/dist/bash-override.d.ts +10 -0
  8. package/dist/bash-override.d.ts.map +1 -0
  9. package/dist/bash-override.js +24 -0
  10. package/dist/bash-override.js.map +1 -0
  11. package/dist/bash-toggle.d.ts +17 -0
  12. package/dist/bash-toggle.d.ts.map +1 -0
  13. package/dist/bash-toggle.js +42 -0
  14. package/dist/bash-toggle.js.map +1 -0
  15. package/dist/config-schema.d.ts +300 -0
  16. package/dist/config-schema.d.ts.map +1 -0
  17. package/dist/config-schema.js +185 -0
  18. package/dist/config-schema.js.map +1 -0
  19. package/dist/errors.d.ts +90 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +151 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/fs/file-system-tool.d.ts +25 -0
  24. package/dist/fs/file-system-tool.d.ts.map +1 -0
  25. package/dist/fs/file-system-tool.js +318 -0
  26. package/dist/fs/file-system-tool.js.map +1 -0
  27. package/dist/fs/resolve-path.d.ts +53 -0
  28. package/dist/fs/resolve-path.d.ts.map +1 -0
  29. package/dist/fs/resolve-path.js +100 -0
  30. package/dist/fs/resolve-path.js.map +1 -0
  31. package/dist/hooks/compacting.d.ts +23 -0
  32. package/dist/hooks/compacting.d.ts.map +1 -0
  33. package/dist/hooks/compacting.js +90 -0
  34. package/dist/hooks/compacting.js.map +1 -0
  35. package/dist/hooks/permission-auto-reply.d.ts +91 -0
  36. package/dist/hooks/permission-auto-reply.d.ts.map +1 -0
  37. package/dist/hooks/permission-auto-reply.js +158 -0
  38. package/dist/hooks/permission-auto-reply.js.map +1 -0
  39. package/dist/hooks/permission-guards.d.ts +41 -0
  40. package/dist/hooks/permission-guards.d.ts.map +1 -0
  41. package/dist/hooks/permission-guards.js +153 -0
  42. package/dist/hooks/permission-guards.js.map +1 -0
  43. package/dist/hooks/shell-env.d.ts +20 -0
  44. package/dist/hooks/shell-env.d.ts.map +1 -0
  45. package/dist/hooks/shell-env.js +38 -0
  46. package/dist/hooks/shell-env.js.map +1 -0
  47. package/dist/hooks/util.d.ts +81 -0
  48. package/dist/hooks/util.d.ts.map +1 -0
  49. package/dist/hooks/util.js +172 -0
  50. package/dist/hooks/util.js.map +1 -0
  51. package/dist/index.d.ts +26 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +63 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/init/init-wizard.d.ts +39 -0
  56. package/dist/init/init-wizard.d.ts.map +1 -0
  57. package/dist/init/init-wizard.js +297 -0
  58. package/dist/init/init-wizard.js.map +1 -0
  59. package/dist/install.d.ts +117 -0
  60. package/dist/install.d.ts.map +1 -0
  61. package/dist/install.js +255 -0
  62. package/dist/install.js.map +1 -0
  63. package/dist/msm-schema.d.ts +76 -0
  64. package/dist/msm-schema.d.ts.map +1 -0
  65. package/dist/msm-schema.js +207 -0
  66. package/dist/msm-schema.js.map +1 -0
  67. package/dist/msm.d.ts +25 -0
  68. package/dist/msm.d.ts.map +1 -0
  69. package/dist/msm.js +317 -0
  70. package/dist/msm.js.map +1 -0
  71. package/dist/session/lib.d.ts +33 -0
  72. package/dist/session/lib.d.ts.map +1 -0
  73. package/dist/session/lib.js +475 -0
  74. package/dist/session/lib.js.map +1 -0
  75. package/dist/session/session-tool.d.ts +17 -0
  76. package/dist/session/session-tool.d.ts.map +1 -0
  77. package/dist/session/session-tool.js +109 -0
  78. package/dist/session/session-tool.js.map +1 -0
  79. package/dist/skills/install-skill.d.ts +36 -0
  80. package/dist/skills/install-skill.d.ts.map +1 -0
  81. package/dist/skills/install-skill.js +91 -0
  82. package/dist/skills/install-skill.js.map +1 -0
  83. package/dist/skills/template-loader.d.ts +79 -0
  84. package/dist/skills/template-loader.d.ts.map +1 -0
  85. package/dist/skills/template-loader.js +170 -0
  86. package/dist/skills/template-loader.js.map +1 -0
  87. package/dist/state.d.ts +35 -0
  88. package/dist/state.d.ts.map +1 -0
  89. package/dist/state.js +62 -0
  90. package/dist/state.js.map +1 -0
  91. package/dist/tui.d.ts +61 -0
  92. package/dist/tui.d.ts.map +1 -0
  93. package/dist/tui.js +279 -0
  94. package/dist/tui.js.map +1 -0
  95. package/dist/types/index.d.ts +30 -0
  96. package/dist/types/index.d.ts.map +1 -0
  97. package/dist/types/index.js +17 -0
  98. package/dist/types/index.js.map +1 -0
  99. package/dist/util/config-patch.d.ts +58 -0
  100. package/dist/util/config-patch.d.ts.map +1 -0
  101. package/dist/util/config-patch.js +117 -0
  102. package/dist/util/config-patch.js.map +1 -0
  103. package/dist/util/git.d.ts +29 -0
  104. package/dist/util/git.d.ts.map +1 -0
  105. package/dist/util/git.js +74 -0
  106. package/dist/util/git.js.map +1 -0
  107. package/dist/util/init-check.d.ts +22 -0
  108. package/dist/util/init-check.d.ts.map +1 -0
  109. package/dist/util/init-check.js +76 -0
  110. package/dist/util/init-check.js.map +1 -0
  111. package/dist/util/init.d.ts +54 -0
  112. package/dist/util/init.d.ts.map +1 -0
  113. package/dist/util/init.js +87 -0
  114. package/dist/util/init.js.map +1 -0
  115. package/dist/util/log.d.ts +25 -0
  116. package/dist/util/log.d.ts.map +1 -0
  117. package/dist/util/log.js +28 -0
  118. package/dist/util/log.js.map +1 -0
  119. package/dist/util/msm-call.d.ts +48 -0
  120. package/dist/util/msm-call.d.ts.map +1 -0
  121. package/dist/util/msm-call.js +86 -0
  122. package/dist/util/msm-call.js.map +1 -0
  123. package/dist/util/msm-exec-runtime.d.ts +123 -0
  124. package/dist/util/msm-exec-runtime.d.ts.map +1 -0
  125. package/dist/util/msm-exec-runtime.js +532 -0
  126. package/dist/util/msm-exec-runtime.js.map +1 -0
  127. package/dist/util/path.d.ts +10 -0
  128. package/dist/util/path.d.ts.map +1 -0
  129. package/dist/util/path.js +21 -0
  130. package/dist/util/path.js.map +1 -0
  131. package/dist/util/ready-state.d.ts +43 -0
  132. package/dist/util/ready-state.d.ts.map +1 -0
  133. package/dist/util/ready-state.js +104 -0
  134. package/dist/util/ready-state.js.map +1 -0
  135. package/dist/util/serenity-file.d.ts +30 -0
  136. package/dist/util/serenity-file.d.ts.map +1 -0
  137. package/dist/util/serenity-file.js +69 -0
  138. package/dist/util/serenity-file.js.map +1 -0
  139. package/dist/util/tui-install.d.ts +61 -0
  140. package/dist/util/tui-install.d.ts.map +1 -0
  141. package/dist/util/tui-install.js +94 -0
  142. package/dist/util/tui-install.js.map +1 -0
  143. package/docs/architecture-v0.md +294 -0
  144. package/docs/contract-v0.md +417 -0
  145. package/docs/plugin-self-contained-msm-v1.md +182 -0
  146. package/docs/refactor-direction-v1.11.md +78 -0
  147. package/docs/requirements-v0-scope.md +104 -0
  148. package/docs/requirements-v0-summary.md +108 -0
  149. package/docs/rr7-init-design.md +304 -0
  150. package/docs/v0.1-candidates.md +132 -0
  151. package/package.json +54 -0
@@ -0,0 +1,532 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * msm-exec-runtime.ts — opencode-serenity-plugin 端 msm_exec 协议 runtime
4
+ *
5
+ * 角色:msm_exec 协议层 in-process runtime (S028 反转 S024/D26)。Plugin 端
6
+ * msm_exec tool 调本文件 export 的 runMsmExec(),解析 6 必含 flag 后调
7
+ * 业务 MSM,按 --format/--log 包装输出。零 spawn(除业务 msm 本身),
8
+ * plugin 端 3 msm tool 完全自包含。
9
+ *
10
+ * 源:本文件 90% 移植自 serenity 仓 msm-exec.ts
11
+ * (S024 v1.14 产物, 2026-06-07 by commit 725a9e7)
12
+ *
13
+ * 移植变更(S028):
14
+ * - resolveRegistryPath 改 plugin 仓根 mech-registry.json
15
+ * + D6 bootstrap (缺失则创建空 {version:1, entries:[]})
16
+ * - route() 重构为 routeWithArgv(argv, opts?) 返回 MsmExecResult
17
+ * 不再直接写 stdout/stderr (改 in-process 调用栈)
18
+ * - runBusinessMsm 增加 cwd 参数, timeout 30s → 600s (D11 统一)
19
+ * - 新增 runMsmExec() 导出 (msm-call 调用入口)
20
+ * - emitText/emitJson 移除 (由 msm-call 层负责格式化)
21
+ *
22
+ * 协议契约 (S022 RFC §2):
23
+ * - 协议 flag 只能出现在 args 前缀段(紧邻 msm-name 之前)
24
+ * - 6 个必含 flag:
25
+ * --format=<text|json> 输出格式 (默认 text)
26
+ * --log <path> JSON Lines 日志
27
+ * --help / -h 自身或某 msm 的帮助
28
+ * --version 打印 msm_exec 版本
29
+ * --list 列出所有 msm
30
+ * --schema <name> 打印某 msm 的 JSON schema
31
+ * - 输出契约:
32
+ * - text 模式:业务 msm stdout/stderr/exit 透传
33
+ * - json 模式:包装为 6 字段 schema (success: ok/exit/data; failure: ok/exit/error)
34
+ * - log 模式:JSON Lines (ts/level/msm/exit/error_code/error_message)
35
+ *
36
+ * 退出码:
37
+ * 0 — 成功
38
+ * 1 — user (参数错误 / 未知 msm / 拒绝协议 flag)
39
+ * 2 — system (注册表缺失 / 子进程启动失败)
40
+ * 3 — operator (业务 msm 自身非 0 exit,由 --format=json 时透传)
41
+ *
42
+ * 用法 (CLI 模式, 主要用于 plugin 仓内调试):
43
+ * npx tsx msm-exec-runtime.ts <msm-name> [args...]
44
+ * npx tsx msm-exec-runtime.ts --format=json <msm-name> [args...]
45
+ * npx tsx msm-exec-runtime.ts --log /tmp/x.log --format=json <msm-name> [args...]
46
+ * npx tsx msm-exec-runtime.ts --list
47
+ * npx tsx msm-exec-runtime.ts --schema <msm-name>
48
+ * npx tsx msm-exec-runtime.ts --help [msm-name]
49
+ * npx tsx msm-exec-runtime.ts --version
50
+ *
51
+ * 用法 (in-process 模式, plugin 端 msm-call 调用):
52
+ * import { runMsmExec } from "./msm-exec-runtime";
53
+ * const result = await runMsmExec(["--list"]);
54
+ * const result = await runMsmExec(["--format=json", "msm-name", "arg1"]);
55
+ * const result = await runMsmExec(["msm-name", "arg1"], { cwd: "/path/to/cwd" });
56
+ *
57
+ * 不接受:缩写 (--json 替代 --format=json), 短别名 (--ls 替代 --list)
58
+ * — 严格遵循 §10.4 业务 msm 零协议 flag + §2.1 flag 必须在 prefix
59
+ */
60
+ import { readFileSync, appendFileSync, existsSync, writeFileSync, mkdirSync } from "node:fs";
61
+ import { spawn } from "node:child_process";
62
+ import { resolve, dirname } from "node:path";
63
+ import { fileURLToPath, pathToFileURL } from "node:url";
64
+ const __filename = fileURLToPath(import.meta.url);
65
+ const __dirname = dirname(__filename);
66
+ // ── 版本 ──
67
+ const MSM_EXEC_VERSION = "1.0.0";
68
+ // ── 错误类 (6 字段 schema per msm-writing-standards §5.5) ──
69
+ export class MsmExecError extends Error {
70
+ code;
71
+ category;
72
+ message;
73
+ context;
74
+ remediation;
75
+ cause;
76
+ constructor(code, category, message, context = {}, remediation, cause) {
77
+ super(message);
78
+ this.code = code;
79
+ this.category = category;
80
+ this.message = message;
81
+ this.context = context;
82
+ this.remediation = remediation;
83
+ this.cause = cause;
84
+ this.name = "MsmExecError";
85
+ }
86
+ toStderr() {
87
+ const lines = [
88
+ `[${this.code}]`,
89
+ ` category: ${this.category}`,
90
+ ` message: ${this.message}`,
91
+ ];
92
+ if (this.cause !== undefined) {
93
+ const c = this.cause instanceof Error ? this.cause.message : String(this.cause);
94
+ if (c)
95
+ lines.push(` cause: ${c}`);
96
+ }
97
+ if (this.remediation)
98
+ lines.push(` remediation: ${this.remediation}`);
99
+ if (Object.keys(this.context).length > 0) {
100
+ lines.push(` context: ${JSON.stringify(this.context)}`);
101
+ }
102
+ return lines.join("\n");
103
+ }
104
+ exitCode() {
105
+ return { user: 1, system: 2, operator: 3, internal: 4 }[this.category];
106
+ }
107
+ }
108
+ /**
109
+ * 解析 plugin 仓 mech-registry.json 路径
110
+ *
111
+ * S028 D9: 优先 plugin 仓根 `mech-registry.json` (D9 决策 = `__dirname/../../`)
112
+ * D6 bootstrap: 不存在则创建空 `{version:1, entries:[]}`
113
+ *
114
+ * S028 v0.0.3 收口: caller 可通过 opts.registryPath 显式指定路径
115
+ * (msm-call 传入 cwdRoot 的注册表路径,与 msm.ts loadMechRegistry 同一份).
116
+ * 该参数让 msm-exec-runtime 不再依赖 plugin 仓内置的 plugin-root 注册表
117
+ * (该注册表仅供 CLI 调试用,业务流实际写读均走 cwdRoot 注册表).
118
+ */
119
+ function resolveRegistryPath(registryPath) {
120
+ if (registryPath)
121
+ return registryPath;
122
+ // msm-exec-runtime.ts 位于 <plugin-root>/src/util/
123
+ // 注册表位于 <plugin-root>/mech-registry.json
124
+ const candidate = resolve(__dirname, "..", "..", "mech-registry.json");
125
+ return candidate;
126
+ }
127
+ /** D6 bootstrap: 确保 plugin 仓 mech-registry.json 存在 (不存在则创建空) */
128
+ function ensureRegistryFile(path) {
129
+ if (existsSync(path))
130
+ return;
131
+ // 确保父目录存在
132
+ mkdirSync(dirname(path), { recursive: true });
133
+ const empty = {
134
+ version: 1,
135
+ description: "opencode-serenity-plugin 内部 msm 注册表(plugin 仓独立 — 不依赖 serenity 仓)",
136
+ entries: [],
137
+ };
138
+ writeFileSync(path, JSON.stringify(empty, null, 2) + "\n", "utf8");
139
+ }
140
+ function loadRegistry(opts = {}) {
141
+ const path = resolveRegistryPath(opts.registryPath);
142
+ // D6 bootstrap 行为分流 (S028 v0.0.3 收口):
143
+ // - 无 registryPath (CLI 模式): ensureRegistryFile 不存在则创建空, 让 --list 等元命令在冷启动可用
144
+ // - 有 registryPath (in-process 模式): 不 bootstrap, 文件不存在 → 抛 MSM_REGISTRY_NOT_FOUND
145
+ // (避免覆盖 msm_admin 已写的注册表; msm.ts loadMechRegistry 也会兜底返回 [])
146
+ if (!opts.registryPath) {
147
+ ensureRegistryFile(path);
148
+ }
149
+ else if (!existsSync(path)) {
150
+ throw new MsmExecError("MSM_REGISTRY_NOT_FOUND", "system", `caller-supplied registry path 不存在: ${path}`, { path }, "确认 msm_admin register 已创建该文件, 或检查 cwdRoot/.opencode/skills/<inst>/ 是否正确");
151
+ }
152
+ try {
153
+ const raw = readFileSync(path, "utf8");
154
+ const parsed = JSON.parse(raw);
155
+ if (Array.isArray(parsed)) {
156
+ return { entries: parsed };
157
+ }
158
+ if (parsed && typeof parsed === "object" && Array.isArray(parsed.entries)) {
159
+ return parsed;
160
+ }
161
+ throw new MsmExecError("MSM_REGISTRY_INVALID", "system", "mech-registry.json 顶层既不是数组也无 entries 字段", { path }, "修复注册表顶层结构为 { version, description, entries: [...] }");
162
+ }
163
+ catch (err) {
164
+ if (err instanceof MsmExecError)
165
+ throw err;
166
+ const detail = err instanceof Error ? err.message : String(err);
167
+ throw new MsmExecError("MSM_REGISTRY_PARSE_FAILED", "system", `mech-registry.json 解析失败: ${detail}`, { path }, "检查 JSON 语法", err);
168
+ }
169
+ }
170
+ function findEntry(registry, name) {
171
+ const entry = registry.entries.find((e) => e.name === name);
172
+ if (!entry) {
173
+ throw new MsmExecError("MSM_NOT_FOUND", "user", `MSM "${name}" 不在 mech-registry.json 中`, { msmName: name, availableCount: registry.entries.length }, "运行 msm-exec.ts --list 查看所有可用 msm");
174
+ }
175
+ return entry;
176
+ }
177
+ // ── 协议 flag 解析 (§2.1) ──
178
+ function parseArgs(argv) {
179
+ const protocol = {
180
+ format: "text",
181
+ log: null,
182
+ help: null,
183
+ version: false,
184
+ list: false,
185
+ schema: null,
186
+ };
187
+ let i = 0;
188
+ while (i < argv.length) {
189
+ const arg = argv[i];
190
+ if (!arg.startsWith("--") && arg !== "-h")
191
+ break;
192
+ const [key, value] = arg.includes("=") ? arg.slice(2).split("=", 2) : [arg === "-h" ? "help" : arg.slice(2), "true"];
193
+ if (key === "format") {
194
+ if (value !== "text" && value !== "json") {
195
+ throw new MsmExecError("PARAMETER_INVALID_VALUE", "user", `--format 必须是 text 或 json, 收到: ${value}`, { received: value }, "使用 --format=text 或 --format=json");
196
+ }
197
+ protocol.format = value;
198
+ i++;
199
+ }
200
+ else if (key === "log") {
201
+ if (value === "true" || value === undefined) {
202
+ // --log <path> 形式: 取下一个 token
203
+ const next = argv[i + 1];
204
+ if (!next || next.startsWith("--")) {
205
+ throw new MsmExecError("PARAMETER_MISSING", "user", "--log 需要 1 个位置参数 <path>", { received: next ?? null }, "用法: --log <path>");
206
+ }
207
+ protocol.log = next;
208
+ i += 2;
209
+ }
210
+ else {
211
+ protocol.log = value;
212
+ i++;
213
+ }
214
+ }
215
+ else if (key === "help" || arg === "-h") {
216
+ // --help [name] 形式: 可选 name
217
+ const next = argv[i + 1];
218
+ if (next && !next.startsWith("--")) {
219
+ protocol.help = next;
220
+ i += 2;
221
+ }
222
+ else {
223
+ protocol.help = "__self__"; // 自帮助
224
+ i++;
225
+ }
226
+ }
227
+ else if (key === "version") {
228
+ protocol.version = true;
229
+ i++;
230
+ }
231
+ else if (key === "list") {
232
+ protocol.list = true;
233
+ i++;
234
+ }
235
+ else if (key === "schema") {
236
+ if (value === "true" || value === undefined) {
237
+ const next = argv[i + 1];
238
+ if (!next || next.startsWith("--")) {
239
+ throw new MsmExecError("PARAMETER_MISSING", "user", "--schema 需要 1 个位置参数 <name>", { received: next ?? null }, "用法: --schema <msm-name>");
240
+ }
241
+ protocol.schema = next;
242
+ i += 2;
243
+ }
244
+ else {
245
+ protocol.schema = value;
246
+ i++;
247
+ }
248
+ }
249
+ else {
250
+ throw new MsmExecError("PARAMETER_INVALID_VALUE", "user", `未知协议 flag: --${key}`, { flag: key, validFlags: ["format", "log", "help", "version", "list", "schema"] }, "msm-exec 只接受 6 个协议 flag (参见 S022 RFC §2.2)");
251
+ }
252
+ }
253
+ const [msmName, ...businessArgs] = argv.slice(i);
254
+ return { protocol, msmName: msmName ?? null, businessArgs };
255
+ }
256
+ // ── 业务 msm 执行 (S028: 接受 cwd 参数, timeout 30s → 600s) ──
257
+ function runBusinessMsm(entry, businessArgs, cwd) {
258
+ return new Promise((resolveRun, rejectRun) => {
259
+ // 路径必须解析到 cwd 内(防路径逃逸)
260
+ const absPath = resolve(cwd, entry.path);
261
+ // 注:path.escape 校验由 plugin 端的 v0.1-2 path-arg guard 负责
262
+ // msm-exec-runtime 这里只 spawn,不再做二次校验(避免重复)
263
+ const child = spawn("npx", ["tsx", absPath, ...businessArgs], {
264
+ cwd,
265
+ stdio: ["ignore", "pipe", "pipe"],
266
+ timeout: 600_000, // S028 D11: 30s → 600s 统一
267
+ });
268
+ let stdout = "";
269
+ let stderr = "";
270
+ child.stdout.on("data", (d) => { stdout += d.toString(); });
271
+ child.stderr.on("data", (d) => { stderr += d.toString(); });
272
+ child.on("close", (code) => {
273
+ resolveRun({ stdout, stderr, exitCode: code ?? 0 });
274
+ });
275
+ child.on("error", (err) => {
276
+ rejectRun(err);
277
+ });
278
+ });
279
+ }
280
+ // ── stderr 6 字段 schema 解析 (§2.3) ──
281
+ function parseStderrError(stderr) {
282
+ const codeMatch = stderr.match(/^\s*code:\s*(\S+)/m);
283
+ const categoryMatch = stderr.match(/^\s*category:\s*(\S+)/m);
284
+ const messageMatch = stderr.match(/^\s*message:\s*(.+)$/m);
285
+ const causeMatch = stderr.match(/^\s*cause:\s*(.+)$/m);
286
+ const remediationMatch = stderr.match(/^\s*remediation:\s*(.+)$/m);
287
+ const contextMatch = stderr.match(/^\s*context:\s*(\{[\s\S]*?\})/m);
288
+ // 6 字段必须全部命中
289
+ if (codeMatch && categoryMatch && messageMatch && causeMatch && remediationMatch && contextMatch) {
290
+ let ctx = null;
291
+ try {
292
+ ctx = JSON.parse(contextMatch[1]);
293
+ }
294
+ catch {
295
+ ctx = null;
296
+ }
297
+ return {
298
+ code: codeMatch[1],
299
+ category: categoryMatch[1],
300
+ message: messageMatch[1].trim(),
301
+ cause: causeMatch[1].trim(),
302
+ remediation: remediationMatch[1].trim(),
303
+ context: ctx,
304
+ };
305
+ }
306
+ // 部分命中或未命中:fallback
307
+ return {
308
+ code: "INTERNAL_PARSE_FAILED",
309
+ category: "internal",
310
+ message: "msm-exec 无法从业务 msm stderr 解析 6 字段错误 schema",
311
+ cause: stderr.trim() || "(empty stderr)",
312
+ remediation: "业务 msm 应输出 msm-writing-standards §5.5 6 字段 stderr schema",
313
+ context: null,
314
+ };
315
+ }
316
+ // ── JSON Lines 日志写入 ──
317
+ function writeLogLine(logPath, event) {
318
+ try {
319
+ appendFileSync(logPath, JSON.stringify(event) + "\n", "utf8");
320
+ }
321
+ catch (err) {
322
+ // log 写失败不阻断主流程;走 stderr 提示
323
+ const detail = err instanceof Error ? err.message : String(err);
324
+ process.stderr.write(`[msm-exec] warning: failed to write log line to "${logPath}": ${detail}\n`);
325
+ }
326
+ }
327
+ function nowIso() {
328
+ return new Date().toISOString();
329
+ }
330
+ // ── Meta-command 处理 ──
331
+ function doList(registry) {
332
+ return registry.entries
333
+ .map((e) => `${e.name} | ${e.skill} | ${e.category} | ${e.description}`)
334
+ .join("\n");
335
+ }
336
+ function doSchema(registry, name) {
337
+ const entry = findEntry(registry, name);
338
+ return JSON.stringify(entry, null, 2);
339
+ }
340
+ function doHelp(registry, name) {
341
+ if (!name || name === "__self__") {
342
+ return `msm-exec v${MSM_EXEC_VERSION} — 宁静号 msm_exec 协议层 (plugin in-process runtime)
343
+
344
+ 用法:
345
+ msm-exec [协议-flag...] <msm-name> [业务-args...]
346
+ └─ 协议段 ─┘ └── 业务段 ──┘
347
+
348
+ 协议 flag (必须出现在 args 前缀):
349
+ --format=<text|json> 输出格式 (默认 text)
350
+ --log <path> JSON Lines 日志
351
+ --help, -h [name] 自身帮助 或 某 msm 的帮助
352
+ --version 打印版本
353
+ --list 列出所有 msm
354
+ --schema <name> 打印某 msm 的 JSON schema
355
+
356
+ 示例:
357
+ msm-exec --list
358
+ msm-exec --schema ssh-connect
359
+ msm-exec ssh-connect check ubuntu
360
+ msm-exec --format=json --log /tmp/x.log ssh-connect exec ubuntu "ls -la"
361
+
362
+ 退出码:
363
+ 0 成功
364
+ 1 user (参数错 / 未知 msm)
365
+ 2 system (注册表缺失 / 子进程启动失败)
366
+ 3 operator (业务 msm 自身非 0 exit, --format=json 时透传)
367
+ `;
368
+ }
369
+ if (!registry) {
370
+ throw new MsmExecError("MSM_REGISTRY_NOT_FOUND", "system", "无法定位 mech-registry.json", { scriptDir: __dirname }, "msm-exec --help <name> 需要注册表可访问");
371
+ }
372
+ const entry = findEntry(registry, name);
373
+ return `${entry.name} — ${entry.description}
374
+
375
+ 用法: msm-exec ${entry.name} ${entry.usage}
376
+
377
+ ${entry.subcommands && entry.subcommands.length > 0 ? `子命令:\n${entry.subcommands.map((s) => ` ${s.name.padEnd(15)} ${s.description}`).join("\n")}` : ""}
378
+ ${entry.flags && entry.flags.length > 0 ? `\nflag:\n${entry.flags.map((f) => ` ${f.name.padEnd(15)} ${f.description ?? ""} (type=${f.type}${f.default !== undefined ? `, default=${JSON.stringify(f.default)}` : ""})`).join("\n")}` : ""}
379
+
380
+ 退出码: ${entry.exit_codes ? Object.entries(entry.exit_codes).map(([k, v]) => `\n ${k} ${v}`).join("") : "见 msm-writing-standards §5.3"}
381
+ 错误码: ${entry.error_codes?.join(", ") ?? "(无)"}
382
+ `;
383
+ }
384
+ function doVersion() {
385
+ return `msm-exec v${MSM_EXEC_VERSION}`;
386
+ }
387
+ // ── 业务 msm 调用 (主路径, S028: 返回 MsmExecResult) ──
388
+ async function runBusiness(registry, msmName, businessArgs, protocol, cwd) {
389
+ const entry = findEntry(registry, msmName);
390
+ // 写 start log
391
+ if (protocol.log) {
392
+ writeLogLine(protocol.log, {
393
+ ts: nowIso(),
394
+ level: "info",
395
+ msm: msmName,
396
+ msm_exec: MSM_EXEC_VERSION,
397
+ protocol: { format: protocol.format, log: protocol.log },
398
+ args: businessArgs,
399
+ });
400
+ }
401
+ const { stdout, stderr, exitCode } = await runBusinessMsm(entry, businessArgs, cwd);
402
+ let result;
403
+ if (exitCode === 0) {
404
+ result = { ok: true, exit: 0, data: stdout };
405
+ }
406
+ else {
407
+ const error = parseStderrError(stderr);
408
+ result = { ok: false, exit: exitCode, error };
409
+ }
410
+ // 写 end log
411
+ if (protocol.log) {
412
+ const logEvent = {
413
+ ts: nowIso(),
414
+ level: exitCode === 0 ? "info" : "error",
415
+ msm: msmName,
416
+ msm_exec: MSM_EXEC_VERSION,
417
+ protocol: { format: protocol.format, log: protocol.log },
418
+ args: businessArgs,
419
+ exit: exitCode,
420
+ };
421
+ if (exitCode !== 0 && !result.ok) {
422
+ logEvent.error_code = result.error.code;
423
+ logEvent.error_message = result.error.message;
424
+ }
425
+ writeLogLine(protocol.log, logEvent);
426
+ }
427
+ // S028: 改为返回 MsmExecResult (不再 emitText/emitJson)
428
+ if (protocol.format === "json") {
429
+ return {
430
+ stdout: JSON.stringify(result) + "\n",
431
+ stderr: "",
432
+ exitCode,
433
+ jsonResult: result,
434
+ };
435
+ }
436
+ return {
437
+ stdout,
438
+ stderr,
439
+ exitCode,
440
+ jsonResult: null,
441
+ };
442
+ }
443
+ // ── 路由 (S028 重构: routeWithArgv 返回 MsmExecResult) ──
444
+ async function routeWithArgv(argv, opts = {}) {
445
+ const cwd = opts.cwd ?? process.cwd();
446
+ const { protocol, msmName, businessArgs } = parseArgs(argv);
447
+ // 元命令 (不需要 msmName)
448
+ if (protocol.version) {
449
+ return { stdout: doVersion(), stderr: "", exitCode: 0, jsonResult: null };
450
+ }
451
+ // --list/--schema/--help 需要 registry
452
+ let registry = null;
453
+ if (protocol.list || protocol.schema || protocol.help) {
454
+ registry = loadRegistry(opts);
455
+ }
456
+ if (protocol.list) {
457
+ return { stdout: doList(registry), stderr: "", exitCode: 0, jsonResult: null };
458
+ }
459
+ if (protocol.schema) {
460
+ return { stdout: doSchema(registry, protocol.schema), stderr: "", exitCode: 0, jsonResult: null };
461
+ }
462
+ if (protocol.help !== null) {
463
+ return {
464
+ stdout: doHelp(registry, protocol.help === "__self__" ? null : protocol.help),
465
+ stderr: "",
466
+ exitCode: 0,
467
+ jsonResult: null,
468
+ };
469
+ }
470
+ // 业务路径 (需要 registry + msmName)
471
+ if (!msmName) {
472
+ throw new MsmExecError("PARAMETER_MISSING", "user", "缺少 msm-name (非元命令必须指定)", { received: argv }, "用法: msm-exec [协议-flag...] <msm-name> [业务-args...]");
473
+ }
474
+ if (!registry) {
475
+ registry = loadRegistry(opts);
476
+ }
477
+ return await runBusiness(registry, msmName, businessArgs, protocol, cwd);
478
+ }
479
+ // ── 公开入口 (S028 新增) ──
480
+ /**
481
+ * in-process 调 msm_exec 协议 runtime (S028 msm-call.ts 唯一调用点)
482
+ *
483
+ * @param argv 完整 args (协议 flag 可选 + msm-name 必需 + 业务 args)
484
+ * 例: ["--list"], ["--format=json", "session-tool", "list"], ["ssh-connect", "check", "ubuntu"]
485
+ * @param opts.cwd 业务 msm spawn 时的 cwd (默认 process.cwd())
486
+ * @returns MsmExecResult {stdout, stderr, exitCode, jsonResult}
487
+ * @throws MsmExecError 协议错误 (参数错 / 未知 msm / 注册表解析失败等)
488
+ */
489
+ export async function runMsmExec(argv, opts = {}) {
490
+ return await routeWithArgv(argv, opts);
491
+ }
492
+ // ── CLI 入口 (plugin 仓内调试用) ──
493
+ async function main() {
494
+ const argv = process.argv.slice(2);
495
+ let result;
496
+ try {
497
+ result = await runMsmExec(argv);
498
+ }
499
+ catch (err) {
500
+ if (err instanceof MsmExecError) {
501
+ process.stderr.write(err.toStderr() + "\n");
502
+ return err.exitCode();
503
+ }
504
+ // 未预期错误
505
+ const e = err instanceof Error ? err : new Error(String(err));
506
+ const fallback = new MsmExecError("INTERNAL_UNHANDLED_STATE", "internal", `未预期异常: ${e.message}`, { stack: e.stack }, "请向 Agent 报告此 bug", e);
507
+ process.stderr.write(fallback.toStderr() + "\n");
508
+ return fallback.exitCode();
509
+ }
510
+ // 写 result
511
+ if (result.stdout)
512
+ process.stdout.write(result.stdout);
513
+ if (result.stderr)
514
+ process.stderr.write(result.stderr);
515
+ return result.exitCode;
516
+ }
517
+ // CLI 守卫:仅当本文件被当 CLI 跑(process.argv[1] === 本文件)才执行 main
518
+ // 否则作为库 import 时(如 vitest 跑测试、plugin 端 in-process 调),main 会被静默触发
519
+ // 并读取 import 时的 process.argv 触发意外行为(S028 v0.0.3 修复 — 移植 v0.0.2 守卫)
520
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
521
+ main().then((code) => process.exit(code), (err) => {
522
+ if (err instanceof MsmExecError) {
523
+ process.stderr.write(err.toStderr() + "\n");
524
+ process.exit(err.exitCode());
525
+ }
526
+ const e = err instanceof Error ? err : new Error(String(err));
527
+ const fallback = new MsmExecError("INTERNAL_UNHANDLED_STATE", "internal", `未预期异常: ${e.message}`, { stack: e.stack }, "请向 Agent 报告此 bug", e);
528
+ process.stderr.write(fallback.toStderr() + "\n");
529
+ process.exit(fallback.exitCode());
530
+ });
531
+ }
532
+ //# sourceMappingURL=msm-exec-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msm-exec-runtime.js","sourceRoot":"","sources":["../../src/util/msm-exec-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 路径工具
3
+ */
4
+ /** 拼出 SKILL.md 绝对路径 */
5
+ export declare function buildSkillPath(cwdRoot: string, instanceName: string): string;
6
+ /** 验证 SKILL.md 存在(RR2) */
7
+ export declare function validateSkillExists(skillPath: string, cwdRoot: string, instanceName: string): void;
8
+ /** kebab-case 校验(实例名只允许小写字母+数字+连字符) */
9
+ export declare function isValidInstanceName(name: string): boolean;
10
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,uBAAuB;AACvB,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,0BAA0B;AAC1B,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAIlG;AAED,uCAAuC;AACvC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 路径工具
3
+ */
4
+ import { existsSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { SkillNotFoundError } from '../errors.js';
7
+ /** 拼出 SKILL.md 绝对路径 */
8
+ export function buildSkillPath(cwdRoot, instanceName) {
9
+ return join(cwdRoot, '.opencode', 'skills', instanceName, 'SKILL.md');
10
+ }
11
+ /** 验证 SKILL.md 存在(RR2) */
12
+ export function validateSkillExists(skillPath, cwdRoot, instanceName) {
13
+ if (!existsSync(skillPath)) {
14
+ throw new SkillNotFoundError(cwdRoot, instanceName);
15
+ }
16
+ }
17
+ /** kebab-case 校验(实例名只允许小写字母+数字+连字符) */
18
+ export function isValidInstanceName(name) {
19
+ return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name);
20
+ }
21
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,uBAAuB;AACvB,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,YAAoB;IAClE,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AACxE,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,OAAe,EAAE,YAAoB;IAC1F,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ReadyStateMachine — 两阶段 init 的状态机
3
+ *
4
+ * 参考 skillful 的 ReadyStateMachine.ts(91 行)。
5
+ *
6
+ * 阶段 1(同步):plugin 入口立即返回 hooks;tools 立即可调用
7
+ * 阶段 2(异步):后台做 IO 验证(RR1+RR2);验证完成前 tool execute 阻塞等待
8
+ *
9
+ * 状态流转:
10
+ * idle → loading → ready (成功)
11
+ * → error (IO 失败)
12
+ * → disabled (条件不满足)
13
+ *
14
+ * 一次性 Promise:`whenReady()` 多次调用返回同一 Promise(不重复创建)。
15
+ */
16
+ export type State = "idle" | "loading" | "ready" | "error" | "disabled";
17
+ export declare class ReadyStateMachine {
18
+ private current;
19
+ private promise;
20
+ private resolveFn;
21
+ private rejectFn;
22
+ private errorValue;
23
+ /** 当前状态(同步读)*/
24
+ get state(): State;
25
+ /** 状态对应的 reason(error/disabled 时)*/
26
+ get reason(): Error | null;
27
+ /**
28
+ * 启动后台验证。
29
+ * 多次调用安全:只有第一次会真正启动(之后的调用复用同一 Promise)。
30
+ */
31
+ start(loader: () => Promise<void>): Promise<void>;
32
+ /** 工具执行前的阻塞等待 */
33
+ whenReady(): Promise<void>;
34
+ /** 同步状态查询(不阻塞) */
35
+ isReady(): boolean;
36
+ /** 强制标记 disabled(不依赖 loader 完成;用于 plugin 入口短路 RR6 失败场景) */
37
+ markDisabled(reason: string): void;
38
+ /** 外部显式标记 ready(v0 同步激活完成后用;保留 start() 的 Promise 兼容性) */
39
+ markAsReady(): void;
40
+ /** 重置(仅测试用) */
41
+ reset(): void;
42
+ }
43
+ //# sourceMappingURL=ready-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ready-state.d.ts","sourceRoot":"","sources":["../../src/util/ready-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAExE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,UAAU,CAAsB;IAExC,eAAe;IACf,IAAI,KAAK,IAAI,KAAK,CAEjB;IAED,oCAAoC;IACpC,IAAI,MAAM,IAAI,KAAK,GAAG,IAAI,CAEzB;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCjD,iBAAiB;IACjB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB1B,kBAAkB;IAClB,OAAO,IAAI,OAAO;IAIlB,2DAA2D;IAC3D,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOlC,yDAAyD;IACzD,WAAW,IAAI,IAAI;IAMnB,eAAe;IACf,KAAK,IAAI,IAAI;CAOd"}