@mickorz/opencode-agentic-workflow 0.4.0 → 0.5.1

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 (127) hide show
  1. package/README.md +306 -5
  2. package/dist/cli/config.d.ts +121 -0
  3. package/dist/cli/config.js +331 -0
  4. package/dist/cli/config.js.map +1 -0
  5. package/dist/cli/doctor.d.ts +5 -0
  6. package/dist/cli/doctor.js +141 -0
  7. package/dist/cli/doctor.js.map +1 -0
  8. package/dist/cli/index.d.ts +18 -0
  9. package/dist/cli/index.js +120 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/install.d.ts +19 -0
  12. package/dist/cli/install.js +135 -0
  13. package/dist/cli/install.js.map +1 -0
  14. package/dist/cli/uninstall.d.ts +16 -0
  15. package/dist/cli/uninstall.js +110 -0
  16. package/dist/cli/uninstall.js.map +1 -0
  17. package/dist/cli/update.d.ts +15 -0
  18. package/dist/cli/update.js +86 -0
  19. package/dist/cli/update.js.map +1 -0
  20. package/dist/core/index.d.ts +39 -0
  21. package/dist/core/index.js +38 -0
  22. package/dist/core/index.js.map +1 -0
  23. package/dist/observability/events.d.ts +43 -0
  24. package/dist/observability/events.js.map +1 -1
  25. package/dist/plugin/checkpoint-override.d.ts +7 -9
  26. package/dist/plugin/checkpoint-override.js +8 -14
  27. package/dist/plugin/checkpoint-override.js.map +1 -1
  28. package/dist/plugin/define-workflow.d.ts +33 -0
  29. package/dist/plugin/define-workflow.js +103 -0
  30. package/dist/plugin/define-workflow.js.map +1 -0
  31. package/dist/plugin/index.js +406 -26
  32. package/dist/plugin/index.js.map +1 -1
  33. package/dist/plugin/opencode-v2-executor.js +58 -46
  34. package/dist/plugin/opencode-v2-executor.js.map +1 -1
  35. package/dist/plugin/progress-board.d.ts +64 -0
  36. package/dist/plugin/progress-board.js +150 -0
  37. package/dist/plugin/progress-board.js.map +1 -0
  38. package/dist/plugin/progress-rpc.d.ts +390 -0
  39. package/dist/plugin/progress-rpc.js +318 -0
  40. package/dist/plugin/progress-rpc.js.map +1 -0
  41. package/dist/plugin/progress-view.d.ts +82 -0
  42. package/dist/plugin/progress-view.js +244 -0
  43. package/dist/plugin/progress-view.js.map +1 -0
  44. package/dist/plugin/run-sessions.d.ts +28 -0
  45. package/dist/plugin/run-sessions.js +46 -0
  46. package/dist/plugin/run-sessions.js.map +1 -0
  47. package/dist/plugin/tool-args.d.ts +15 -0
  48. package/dist/plugin/tool-args.js +28 -0
  49. package/dist/plugin/tool-args.js.map +1 -0
  50. package/dist/plugin/tui.d.ts +11 -4
  51. package/dist/plugin/tui.js +160 -5
  52. package/dist/plugin/tui.js.map +1 -1
  53. package/dist/plugin/workflow-control.d.ts +16 -0
  54. package/dist/plugin/workflow-control.js +85 -0
  55. package/dist/plugin/workflow-control.js.map +1 -0
  56. package/dist/plugin/workflow-schedule.d.ts +24 -0
  57. package/dist/plugin/workflow-schedule.js +97 -0
  58. package/dist/plugin/workflow-schedule.js.map +1 -0
  59. package/dist/quality/checkpoint.d.ts +5 -2
  60. package/dist/quality/checkpoint.js +11 -6
  61. package/dist/quality/checkpoint.js.map +1 -1
  62. package/dist/quality/verify.d.ts +21 -2
  63. package/dist/quality/verify.js +36 -14
  64. package/dist/quality/verify.js.map +1 -1
  65. package/dist/registry/definition.d.ts +12 -0
  66. package/dist/registry/definition.js.map +1 -1
  67. package/dist/registry/registry.d.ts +4 -0
  68. package/dist/registry/registry.js +20 -1
  69. package/dist/registry/registry.js.map +1 -1
  70. package/dist/registry/run-control.d.ts +27 -0
  71. package/dist/registry/run-control.js +51 -0
  72. package/dist/registry/run-control.js.map +1 -0
  73. package/dist/registry/runner.d.ts +29 -6
  74. package/dist/registry/runner.js +153 -35
  75. package/dist/registry/runner.js.map +1 -1
  76. package/dist/runtime/errors.d.ts +26 -0
  77. package/dist/runtime/errors.js +30 -0
  78. package/dist/runtime/errors.js.map +1 -1
  79. package/dist/runtime/executor.d.ts +22 -0
  80. package/dist/runtime/executor.js.map +1 -1
  81. package/dist/runtime/run-context.d.ts +44 -0
  82. package/dist/runtime/run-context.js +32 -0
  83. package/dist/runtime/run-context.js.map +1 -0
  84. package/dist/scheduler/cron.d.ts +29 -0
  85. package/dist/scheduler/cron.js +171 -0
  86. package/dist/scheduler/cron.js.map +1 -0
  87. package/dist/scheduler/service.d.ts +78 -0
  88. package/dist/scheduler/service.js +215 -0
  89. package/dist/scheduler/service.js.map +1 -0
  90. package/dist/scheduler/store.d.ts +26 -0
  91. package/dist/scheduler/store.js +94 -0
  92. package/dist/scheduler/store.js.map +1 -0
  93. package/dist/scheduler/types.d.ts +53 -0
  94. package/dist/scheduler/types.js +12 -0
  95. package/dist/scheduler/types.js.map +1 -0
  96. package/dist/state/journal.d.ts +23 -0
  97. package/dist/state/journal.js +2 -0
  98. package/dist/state/journal.js.map +1 -1
  99. package/dist/state/recorder.d.ts +67 -0
  100. package/dist/state/recorder.js +148 -2
  101. package/dist/state/recorder.js.map +1 -1
  102. package/dist/workflow/agent.d.ts +42 -1
  103. package/dist/workflow/agent.js +116 -6
  104. package/dist/workflow/agent.js.map +1 -1
  105. package/dist/workflow/judge-panel.d.ts +37 -0
  106. package/dist/workflow/judge-panel.js +66 -0
  107. package/dist/workflow/judge-panel.js.map +1 -0
  108. package/dist/workflow/pipeline.d.ts +21 -0
  109. package/dist/workflow/pipeline.js +71 -0
  110. package/dist/workflow/pipeline.js.map +1 -0
  111. package/dist/workflow/race.d.ts +16 -0
  112. package/dist/workflow/race.js +46 -0
  113. package/dist/workflow/race.js.map +1 -0
  114. package/dist/workflow/sequence.js +6 -0
  115. package/dist/workflow/sequence.js.map +1 -1
  116. package/dist/workflows/loader.d.ts +124 -0
  117. package/dist/workflows/loader.js +500 -0
  118. package/dist/workflows/loader.js.map +1 -0
  119. package/dist/workspace/ambient.d.ts +6 -4
  120. package/dist/workspace/ambient.js +10 -4
  121. package/dist/workspace/ambient.js.map +1 -1
  122. package/package.json +21 -6
  123. package/skills/workflow-authoring/SKILL.md +111 -0
  124. package/skills/workflow-optimize/SKILL.md +70 -0
  125. package/dist/workflows/index.d.ts +0 -19
  126. package/dist/workflows/index.js +0 -40
  127. package/dist/workflows/index.js.map +0 -1
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Installer CLI 配置与检测工具(install / update / uninstall / doctor 共用)
3
+ *
4
+ * P2-10(详见 dev-docs/planning/P2-10-installer-cli.md)。
5
+ * v2 形态与 v1 安装器的差异:
6
+ * - plugins 数组元素是对象 { package, options }(v1 是字符串 plugin 数组)
7
+ * - 无 tui.json 二次注册(v2 TUI 面板走同一插件)
8
+ * - skills 两形态:零拷贝 config `skills: ["node_modules/<pkg>/skills"]`(locked)
9
+ * 或拷贝进原生扫描目录(global: ~/.config/opencode/skills;project: .opencode/skills)
10
+ *
11
+ * 纪律:JSONC 增量合并保留注释;写前 .bak;modify 传 undefined = 删键;
12
+ * 数组整体替换(jsonc-parser 逐下标删除语义不可靠)。
13
+ */
14
+ import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
15
+ import { homedir } from "node:os";
16
+ import { dirname, isAbsolute, join } from "node:path";
17
+ import { fileURLToPath } from "node:url";
18
+ import { applyEdits, modify, parse } from "jsonc-parser";
19
+ /** npm 包名(plugins 条目的包名形式) */
20
+ export const PKG_NAME = "@mickorz/opencode-agentic-workflow";
21
+ /** 包在 node_modules 下的相对路径(正斜杠形式;匹配时统一替换反斜杠) */
22
+ export const PKG_IN_NODE_MODULES = `node_modules/${PKG_NAME}`;
23
+ /** 锁定模式的 plugins.package(相对项目根,指向编译产物目录) */
24
+ export const PLUGIN_LOCAL_SPEC = `./${PKG_IN_NODE_MODULES}/dist/plugin`;
25
+ /** 零拷贝 skills 数组条目(相对项目根) */
26
+ export const SKILLS_LOCAL_SPEC = `${PKG_IN_NODE_MODULES}/skills`;
27
+ /** 包内 skills/ 目录下的 skill 名 */
28
+ export const SKILL_NAMES = ["workflow-authoring", "workflow-optimize"];
29
+ /** 安装器写入的 journal 目录(相对项目根;v2 相对路径以项目目录解析) */
30
+ export const DEFAULT_JOURNAL_DIR = ".agentic-workflow/journal";
31
+ // ---------------------------------------------------------------------------
32
+ // 路径解析
33
+ // ---------------------------------------------------------------------------
34
+ /** 全局配置目录:优先 ~/.config/opencode,Windows 回退 %APPDATA%/opencode */
35
+ export function globalConfigDir() {
36
+ const preferred = join(homedir(), ".config", "opencode");
37
+ if (existsSync(preferred))
38
+ return preferred;
39
+ const appData = process.env.APPDATA;
40
+ if (appData)
41
+ return join(appData, "opencode");
42
+ return preferred;
43
+ }
44
+ export function globalOpenCodeJsonPath() {
45
+ return join(globalConfigDir(), "opencode.json");
46
+ }
47
+ export function projectOpenCodeJsonPath(cwd) {
48
+ return join(cwd, "opencode.json");
49
+ }
50
+ /** v2 项目级 skill 原生扫描目录(.opencode/skills/<name>/SKILL.md) */
51
+ export function projectSkillsTargetDir(cwd) {
52
+ return join(cwd, ".opencode", "skills");
53
+ }
54
+ /** 全局 skill 原生扫描目录 */
55
+ export function globalSkillsTargetDir() {
56
+ return join(globalConfigDir(), "skills");
57
+ }
58
+ /** 项目 node_modules 中包本体的位置 */
59
+ export function projectPackageDir(cwd) {
60
+ return join(cwd, PKG_IN_NODE_MODULES);
61
+ }
62
+ /**
63
+ * OpenCode 插件缓存中本包的候选目录(update 清缓存 best-effort 用)。
64
+ * v1 1.18.x 实测为 bun wrapper 结构;v2 未官方化——目录不存在不算错误。
65
+ */
66
+ export function pluginCacheDir() {
67
+ const [scope, name] = PKG_NAME.split("/");
68
+ return join(homedir(), ".cache", "opencode", "packages", scope, name);
69
+ }
70
+ /** CLI 自身包根(npx 运行时位于 npx 缓存;skill 拷贝源取此处) */
71
+ export function cliPackageRoot() {
72
+ // 编译后位于 dist/cli/config.js,包根为其上两级;源码运行(tsx)时为仓库根
73
+ return join(dirname(fileURLToPath(import.meta.url)), "..", "..");
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // 插件条目构造与匹配
77
+ // ---------------------------------------------------------------------------
78
+ /** 模型引用("providerID/modelId")解析;不合法返回 null */
79
+ export function parseModelRef(ref) {
80
+ const match = ref.trim().match(/^([A-Za-z0-9_-]+)\/([A-Za-z0-9._-]+)$/);
81
+ return match ? { providerID: match[1], id: match[2] } : null;
82
+ }
83
+ /** 构造 plugins 数组条目对象(package 字段按安装方式取包名或本地路径) */
84
+ export function makePluginEntry(options, locked) {
85
+ return {
86
+ package: locked ? PLUGIN_LOCAL_SPEC : PKG_NAME,
87
+ options: {
88
+ model: options.model,
89
+ agent: options.agent,
90
+ ...(options.journalDir !== undefined ? { journalDir: options.journalDir } : {}),
91
+ },
92
+ };
93
+ }
94
+ /** plugins 数组条目(对象)是否为本插件的:看 package 字段(包名 / 本地路径结尾匹配) */
95
+ export function isPluginEntry(entry) {
96
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry))
97
+ return false;
98
+ const pkg = entry.package;
99
+ if (typeof pkg !== "string")
100
+ return false;
101
+ const norm = pkg.replaceAll("\\", "/");
102
+ return (pkg === PKG_NAME ||
103
+ norm === PLUGIN_LOCAL_SPEC ||
104
+ norm.endsWith(`${PKG_IN_NODE_MODULES}/dist/plugin`));
105
+ }
106
+ /** skills 数组条目(字符串)是否为本插件零拷贝路径 */
107
+ export function isSkillPathEntry(entry) {
108
+ if (typeof entry !== "string")
109
+ return false;
110
+ return entry.replaceAll("\\", "/").endsWith(SKILLS_LOCAL_SPEC);
111
+ }
112
+ /** 读取已配置条目的 options(doctor 检查 model/agent 用);未安装返回 null */
113
+ export function installedEntryOptions(path) {
114
+ const loaded = readJsonc(path);
115
+ if (!loaded)
116
+ return null;
117
+ const plugins = loaded.data.plugins;
118
+ if (!Array.isArray(plugins))
119
+ return null;
120
+ const entry = plugins.find((item) => isPluginEntry(item));
121
+ const options = entry?.options;
122
+ if (typeof options !== "object" || options === null)
123
+ return null;
124
+ return options;
125
+ }
126
+ /** 读 JSONC 文件;不存在或顶层不是对象返回 null */
127
+ export function readJsonc(path) {
128
+ if (!existsSync(path))
129
+ return null;
130
+ const text = readFileSync(path, "utf8");
131
+ const data = parse(text);
132
+ if (data === undefined || data === null || typeof data !== "object" || Array.isArray(data))
133
+ return null;
134
+ return { path, text, data };
135
+ }
136
+ const FORMAT = { tabSize: 2, insertSpaces: true };
137
+ /**
138
+ * 向 plugins 数组增量写入条目对象(已有本插件条目则跳过,幂等)。
139
+ * 数组不存在时创建;写回前备份 .bak;返回是否发生了修改。
140
+ */
141
+ export function mergePluginEntry(path, entry) {
142
+ const loaded = ensureLoaded(path);
143
+ const original = loaded.text;
144
+ const plugins = loaded.data.plugins ?? [];
145
+ if (plugins.some((item) => isPluginEntry(item)))
146
+ return false;
147
+ const text = applyEdits(original, modify(original, ["plugins"], [...plugins, entry], { formattingOptions: FORMAT }));
148
+ return writeWithBackup(path, original, text);
149
+ }
150
+ /**
151
+ * 向 skills 数组增量写入零拷贝路径(locked 模式;已存在则跳过)。
152
+ * 返回是否发生了修改。
153
+ */
154
+ export function mergeSkillsEntry(path, skillsPath) {
155
+ const loaded = ensureLoaded(path);
156
+ const original = loaded.text;
157
+ const skills = loaded.data.skills ?? [];
158
+ if (skills.some((item) => item === skillsPath || isSkillPathEntry(item)))
159
+ return false;
160
+ const text = applyEdits(original, modify(original, ["skills"], [...skills, skillsPath], { formattingOptions: FORMAT }));
161
+ return writeWithBackup(path, original, text);
162
+ }
163
+ /**
164
+ * 从配置移除本插件相关条目:plugins 中匹配 isPluginEntry 的对象、
165
+ * skills 中匹配 isSkillPathEntry 的字符串。数组清空后连键删除(不留空壳)。
166
+ * 返回是否发生了修改。
167
+ */
168
+ export function removePluginEntries(path) {
169
+ const loaded = readJsonc(path);
170
+ if (!loaded)
171
+ return false;
172
+ const original = loaded.text;
173
+ let text = original;
174
+ let changed = false;
175
+ const plugins = loaded.data.plugins;
176
+ if (Array.isArray(plugins)) {
177
+ const next = plugins.filter((item) => !isPluginEntry(item));
178
+ if (next.length !== plugins.length) {
179
+ // modify 传 undefined 即删除该属性
180
+ text = applyEdits(text, modify(text, ["plugins"], next.length > 0 ? next : undefined, { formattingOptions: FORMAT }));
181
+ changed = true;
182
+ }
183
+ }
184
+ const skills = loaded.data.skills;
185
+ if (Array.isArray(skills)) {
186
+ const next = skills.filter((item) => !isSkillPathEntry(item));
187
+ if (next.length !== skills.length) {
188
+ text = applyEdits(text, modify(text, ["skills"], next.length > 0 ? next : undefined, { formattingOptions: FORMAT }));
189
+ changed = true;
190
+ }
191
+ }
192
+ if (!changed)
193
+ return false;
194
+ return writeWithBackup(path, original, text);
195
+ }
196
+ /** 配置移除条目后是否只剩空壳($schema 与空数组/空对象)——卸载时整文件删除 */
197
+ export function isShellConfig(path) {
198
+ const loaded = readJsonc(path);
199
+ if (!loaded)
200
+ return false;
201
+ return Object.keys(loaded.data).every((key) => {
202
+ if (key === "$schema")
203
+ return true;
204
+ const value = loaded.data[key];
205
+ if (Array.isArray(value))
206
+ return value.length === 0;
207
+ if (value !== null && typeof value === "object")
208
+ return Object.keys(value).length === 0;
209
+ return false;
210
+ });
211
+ }
212
+ /** 整体删除配置文件与其 .bak(不存在则静默跳过) */
213
+ export function removeConfigWithBackup(path) {
214
+ rmSync(path, { force: true });
215
+ rmSync(`${path}.bak`, { force: true });
216
+ }
217
+ function ensureLoaded(path) {
218
+ const loaded = readJsonc(path);
219
+ if (loaded)
220
+ return loaded;
221
+ // 不存在则写带 $schema 的最小骨架(创建场景),父目录自动创建
222
+ const text = `{\n "$schema": "https://opencode.ai/config.json"\n}\n`;
223
+ mkdirSync(dirname(path), { recursive: true });
224
+ writeFileSync(path, text, "utf8");
225
+ return { path, text, data: parse(text) };
226
+ }
227
+ function writeWithBackup(path, originalText, nextText) {
228
+ if (originalText.trim() === nextText.trim())
229
+ return false;
230
+ try {
231
+ writeFileSync(`${path}.bak`, originalText, "utf8");
232
+ }
233
+ catch {
234
+ // 备份失败不阻塞写入(只读目录等),主流程继续
235
+ }
236
+ mkdirSync(dirname(path), { recursive: true });
237
+ writeFileSync(path, nextText, "utf8");
238
+ return true;
239
+ }
240
+ /**
241
+ * 收窄 @clack 交互返回值:用户取消(ctrl+c)直接退出进程。
242
+ * (isCancel 的 type guard 指向 unique symbol,泛型联合无法负向收窄,
243
+ * 因此签名收 unknown、调用方以显式类型参声明期望类型。)
244
+ */
245
+ export function unwrap(value) {
246
+ if (typeof value === "symbol")
247
+ process.exit(0);
248
+ return value;
249
+ }
250
+ function fileHitsPlugin(path) {
251
+ const loaded = readJsonc(path);
252
+ const plugins = loaded?.data.plugins;
253
+ return Array.isArray(plugins) && plugins.some((item) => isPluginEntry(item));
254
+ }
255
+ /** 检测三种安装方式的存在性(globalDir 供测试注入) */
256
+ export function detectInstalled(cwd, globalDir = globalConfigDir()) {
257
+ const results = [];
258
+ const globalJson = join(globalDir, "opencode.json");
259
+ if (fileHitsPlugin(globalJson)) {
260
+ results.push({ kind: "global", evidence: globalJson });
261
+ }
262
+ const projectJson = projectOpenCodeJsonPath(cwd);
263
+ if (fileHitsPlugin(projectJson)) {
264
+ const loaded = readJsonc(projectJson);
265
+ const plugins = loaded?.data.plugins;
266
+ // 分类只看条目形态:路径形式 = locked;包名形式 = project。
267
+ // (node_modules 存在性不参与分类——npm 装了包但配置走包名是合法组合,
268
+ // 归为 project;node_modules 残留单独走下面的 else-if 分支)
269
+ const lockedByPath = Array.isArray(plugins) && plugins.some((item) => {
270
+ if (!isPluginEntry(item))
271
+ return false;
272
+ const pkg = item.package;
273
+ return typeof pkg === "string" && pkg !== PKG_NAME;
274
+ });
275
+ results.push({
276
+ kind: lockedByPath ? "locked" : "project",
277
+ evidence: projectJson,
278
+ });
279
+ }
280
+ else if (existsSync(projectPackageDir(cwd))) {
281
+ // 无配置条目但包在 node_modules:locked 残留(半装 / 手动 npm install 未配置)
282
+ results.push({ kind: "locked", evidence: projectPackageDir(cwd) });
283
+ }
284
+ return results;
285
+ }
286
+ /** 读取已安装包版本:优先项目 node_modules,其次全局插件缓存;都没有返回 null */
287
+ export function readInstalledVersion(cwd) {
288
+ for (const dir of [projectPackageDir(cwd), pluginCacheDir()]) {
289
+ const pkgPath = join(dir, "package.json");
290
+ if (existsSync(pkgPath)) {
291
+ try {
292
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
293
+ return pkg.version ?? null;
294
+ }
295
+ catch {
296
+ return null;
297
+ }
298
+ }
299
+ }
300
+ return null;
301
+ }
302
+ /** skill 拷贝目标列表:global 到 ~/.config/opencode/skills,其余到 .opencode/skills */
303
+ export function skillTargets(cwd, mode) {
304
+ const base = mode === "global" ? globalSkillsTargetDir() : projectSkillsTargetDir(cwd);
305
+ return SKILL_NAMES.map((name) => ({ name, destDir: join(base, name) }));
306
+ }
307
+ /** 递归拷贝单个 skill 目录(目标已存在时整体替换) */
308
+ export function copySkill(sourceBaseDir, target) {
309
+ const src = join(sourceBaseDir, target.name);
310
+ if (!existsSync(src)) {
311
+ throw new Error(`skill 源目录不存在:${src}`);
312
+ }
313
+ mkdirSync(target.destDir, { recursive: true });
314
+ rmSync(target.destDir, { recursive: true, force: true });
315
+ cpSync(src, target.destDir, { recursive: true });
316
+ }
317
+ /** 删除已拷贝的 skill 目录(不存在则静默跳过) */
318
+ export function removeSkillTarget(target) {
319
+ rmSync(target.destDir, { recursive: true, force: true });
320
+ }
321
+ /** 供 doctor / uninstall 判断 skill 目录是否已拷贝 */
322
+ export function skillTargetExists(target) {
323
+ return existsSync(join(target.destDir, "SKILL.md"));
324
+ }
325
+ /** 解析用户输入的 ~ 前缀路径(提示文案用) */
326
+ export function expandHome(p) {
327
+ if (!isAbsolute(p) && p.startsWith("~"))
328
+ return join(homedir(), p.slice(1));
329
+ return p;
330
+ }
331
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 只读环境排查(P2-10)—— [OK]/[WARN]/[FAIL]/[INFO] 清单,绝不修改任何东西。
3
+ * 退出码:有 FAIL = 1,否则 0。
4
+ */
5
+ export declare function runDoctor(): Promise<void>;
@@ -0,0 +1,141 @@
1
+ /**
2
+ * 只读环境排查(P2-10)—— [OK]/[WARN]/[FAIL]/[INFO] 清单,绝不修改任何东西。
3
+ * 退出码:有 FAIL = 1,否则 0。
4
+ */
5
+ import { spawnSync } from "node:child_process";
6
+ import { existsSync, accessSync, constants } from "node:fs";
7
+ import { join } from "node:path";
8
+ import * as p from "@clack/prompts";
9
+ import { globalOpenCodeJsonPath, installedEntryOptions, detectInstalled, isSkillPathEntry, pluginCacheDir, projectOpenCodeJsonPath, readInstalledVersion, readJsonc, skillTargetExists, skillTargets, } from "./config.js";
10
+ import { latestVersionOnNpm } from "./update.js";
11
+ const icon = { OK: "[OK]", WARN: "[WARN]", FAIL: "[FAIL]", INFO: "[INFO]" };
12
+ function shellOut(cmd) {
13
+ const res = spawnSync(cmd, { encoding: "utf8", shell: true, timeout: 15_000 });
14
+ return { ok: res.status === 0, out: `${res.stdout ?? ""}${res.stderr ?? ""}`.trim() };
15
+ }
16
+ export async function runDoctor() {
17
+ p.intro("opencode-agentic-workflow 环境排查(只读)");
18
+ const lines = [];
19
+ const fail = (text) => lines.push({ level: "FAIL", text });
20
+ const warn = (text) => lines.push({ level: "WARN", text });
21
+ const ok = (text) => lines.push({ level: "OK", text });
22
+ const info = (text) => lines.push({ level: "INFO", text });
23
+ // Node 版本
24
+ const nodeMajor = Number(process.versions.node.split(".")[0]);
25
+ if (nodeMajor >= 20)
26
+ ok(`Node ${process.versions.node}(>= 20)`);
27
+ else
28
+ fail(`Node ${process.versions.node} 低于 20(插件要求 >= 20)`);
29
+ // opencode CLI 与大版本(本插件针对 v2)
30
+ const oc = shellOut("opencode --version");
31
+ if (!oc.ok) {
32
+ warn("未检测到 opencode 命令(可能仅装了桌面版),无法核对本插件要求的 V2 平台");
33
+ }
34
+ else {
35
+ const ver = oc.out.match(/(\d+)\.\d+\.\d+/);
36
+ const major = ver ? Number(ver[1]) : null;
37
+ if (major === 2)
38
+ ok(`OpenCode ${oc.out}(V2)`);
39
+ else
40
+ warn(`OpenCode ${oc.out}——本插件针对 OpenCode V2,大版本不匹配`);
41
+ }
42
+ // 安装方式存在性 + 条目健康
43
+ const cwd = process.cwd();
44
+ const detected = detectInstalled(cwd);
45
+ if (detected.length === 0) {
46
+ warn("未检测到安装(全局 / 项目 / 锁定均无)——npx " + "@mickorz/opencode-agentic-workflow install");
47
+ }
48
+ for (const d of detected) {
49
+ info(`安装方式 ${d.kind}:${d.evidence}`);
50
+ const configPath = d.kind === "global" ? globalOpenCodeJsonPath() : projectOpenCodeJsonPath(cwd);
51
+ if (!existsSync(configPath)) {
52
+ warn(`${d.kind} 证据来自 node_modules 残留(配置无本插件条目)——重跑 install 补配置,或 uninstall --locked 移除依赖`);
53
+ continue;
54
+ }
55
+ const options = installedEntryOptions(configPath);
56
+ if (options === null) {
57
+ warn(`${configPath} 里找不到可解析的 options(配置可能手改过)`);
58
+ continue;
59
+ }
60
+ if (options.model)
61
+ ok(`options.model = ${options.model.providerID}/${options.model.id}`);
62
+ else
63
+ warn("条目缺 options.model——子会话没有模型,agent 步会失败");
64
+ if (options.agent)
65
+ ok(`options.agent = ${options.agent}`);
66
+ else
67
+ warn("条目缺 options.agent——子会话默认无 agent(通常需要 build)");
68
+ if (options.journalDir) {
69
+ const journalPath = join(cwd, options.journalDir);
70
+ try {
71
+ if (existsSync(journalPath))
72
+ accessSync(journalPath, constants.W_OK);
73
+ else
74
+ accessSync(join(cwd, "."), constants.W_OK);
75
+ ok(`journalDir = ${options.journalDir}(${existsSync(journalPath) ? "存在且可写" : "将在首次运行时创建,父目录可写"})`);
76
+ }
77
+ catch {
78
+ fail(`journalDir 不可写:${journalPath}`);
79
+ }
80
+ }
81
+ else {
82
+ info("未配置 journalDir——不持久化、不可恢复(如需 resume 请配置)");
83
+ }
84
+ }
85
+ // git(worktree 隔离可选能力)
86
+ if (shellOut("git --version").ok)
87
+ ok("git 可用(worktree 隔离可用)");
88
+ else
89
+ warn("git 不可用——isolation: git-worktree 无法使用");
90
+ // skills 状态
91
+ for (const kind of ["global", "project"]) {
92
+ for (const target of skillTargets(cwd, kind)) {
93
+ if (skillTargetExists(target))
94
+ info(`skill 已拷贝(${kind}):${target.destDir}`);
95
+ }
96
+ }
97
+ for (const configPath of [projectOpenCodeJsonPath(cwd), globalOpenCodeJsonPath()]) {
98
+ const loaded = readJsonc(configPath);
99
+ const skills = loaded?.data.skills;
100
+ if (Array.isArray(skills) && skills.some((item) => isSkillPathEntry(item))) {
101
+ const entry = skills.find((item) => isSkillPathEntry(item));
102
+ info(`skills 零拷贝条目(${configPath}):${String(entry)}`);
103
+ const resolved = join(cwd, String(entry));
104
+ if (existsSync(resolved))
105
+ ok(`零拷贝 skills 目录存在:${resolved}`);
106
+ else
107
+ fail(`零拷贝 skills 目录不存在:${resolved}(先 npm install ${"@mickorz/opencode-agentic-workflow"})`);
108
+ }
109
+ }
110
+ // 版本对比
111
+ const installed = readInstalledVersion(cwd);
112
+ if (installed !== null) {
113
+ const latest = latestVersionOnNpm();
114
+ if (latest === null)
115
+ warn(`已装 ${installed},npm 最新版本查询失败(网络 / registry)`);
116
+ else if (latest === installed)
117
+ ok(`已装 ${installed}(npm 最新)`);
118
+ else
119
+ warn(`已装 ${installed},npm 最新 ${latest}——npx @mickorz/opencode-agentic-workflow update`);
120
+ info(`插件缓存目录(供参考):${pluginCacheDir()}`);
121
+ }
122
+ else {
123
+ info("未发现本地可读的已装版本(全局模式由宿主缓存管理,属正常)");
124
+ }
125
+ for (const line of lines) {
126
+ const text = `${icon[line.level]} ${line.text}`;
127
+ if (line.level === "FAIL")
128
+ p.log.error(text);
129
+ else if (line.level === "WARN")
130
+ p.log.warn(text);
131
+ else if (line.level === "INFO")
132
+ p.log.info(text);
133
+ else
134
+ p.log.step(text);
135
+ }
136
+ const hasFail = lines.some((l) => l.level === "FAIL");
137
+ p.outro(hasFail ? "存在 FAIL 项,请先处理再使用" : "排查完成");
138
+ if (hasFail)
139
+ process.exitCode = 1;
140
+ }
141
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * opencode-agentic-workflow 安装器 CLI 入口(P2-10)
4
+ *
5
+ * npx @mickorz/opencode-agentic-workflow <命令> [flags]
6
+ *
7
+ * ├─> install(默认) 交互式安装;flags 指齐 + --yes 转无头
8
+ * ├─> update 升级(locked: npm update;其余: 清宿主缓存)
9
+ * ├─> uninstall 对称卸载(配置条目 + skills + locked 依赖)
10
+ * ├─> doctor 只读环境排查([OK]/[WARN]/[FAIL] 清单)
11
+ * └─> help 帮助
12
+ *
13
+ * flags(install):--global / --project / --locked、--model <providerID/modelId>、
14
+ * --agent <id>、--no-journal、--no-skills、--yes
15
+ * flags(uninstall):--global / --project / --locked(可组合)、--yes
16
+ * flags(update):--yes
17
+ */
18
+ export {};
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * opencode-agentic-workflow 安装器 CLI 入口(P2-10)
4
+ *
5
+ * npx @mickorz/opencode-agentic-workflow <命令> [flags]
6
+ *
7
+ * ├─> install(默认) 交互式安装;flags 指齐 + --yes 转无头
8
+ * ├─> update 升级(locked: npm update;其余: 清宿主缓存)
9
+ * ├─> uninstall 对称卸载(配置条目 + skills + locked 依赖)
10
+ * ├─> doctor 只读环境排查([OK]/[WARN]/[FAIL] 清单)
11
+ * └─> help 帮助
12
+ *
13
+ * flags(install):--global / --project / --locked、--model <providerID/modelId>、
14
+ * --agent <id>、--no-journal、--no-skills、--yes
15
+ * flags(uninstall):--global / --project / --locked(可组合)、--yes
16
+ * flags(update):--yes
17
+ */
18
+ import { runInstall } from "./install.js";
19
+ import { runUpdate } from "./update.js";
20
+ import { runUninstall } from "./uninstall.js";
21
+ import { runDoctor } from "./doctor.js";
22
+ const HELP = `
23
+ opencode-agentic-workflow 安装器
24
+
25
+ 用法:npx @mickorz/opencode-agentic-workflow <命令> [flags]
26
+
27
+ 命令:
28
+ install 交互式安装(默认)
29
+ update 升级插件本体与 skills
30
+ uninstall 卸载(与安装对称)
31
+ doctor 环境排查(只读)
32
+ help 显示本帮助
33
+
34
+ install flags:
35
+ --global / --project / --locked 安装方式(无头必填)
36
+ --model <providerID/modelId> 子会话模型(无头必填)
37
+ --agent <id> 子会话 agent(缺省 build)
38
+ --no-journal 不启用 journal 持久化
39
+ --no-skills 不安装 skills
40
+ --yes 跳过确认(无头模式)
41
+
42
+ uninstall flags:
43
+ --global / --project / --locked 要卸载的方式(可组合)
44
+ --yes 跳过确认
45
+ `;
46
+ function parseArgs(argv) {
47
+ const command = argv[0]?.toLowerCase() ?? "install";
48
+ const out = {
49
+ command,
50
+ flags: { kinds: [] },
51
+ };
52
+ const args = argv.slice(1);
53
+ for (let i = 0; i < args.length; i++) {
54
+ const arg = args[i];
55
+ switch (arg) {
56
+ case "--global":
57
+ out.flags.mode = "global";
58
+ out.flags.kinds.push("global");
59
+ break;
60
+ case "--project":
61
+ out.flags.mode = "project";
62
+ out.flags.kinds.push("project");
63
+ break;
64
+ case "--locked":
65
+ out.flags.mode = "locked";
66
+ out.flags.kinds.push("locked");
67
+ break;
68
+ case "--model":
69
+ out.flags.model = args[++i];
70
+ break;
71
+ case "--agent":
72
+ out.flags.agent = args[++i];
73
+ break;
74
+ case "--no-journal":
75
+ out.flags.journal = false;
76
+ break;
77
+ case "--no-skills":
78
+ out.flags.skills = false;
79
+ break;
80
+ case "--yes":
81
+ case "-y":
82
+ out.flags.yes = true;
83
+ break;
84
+ default:
85
+ throw new Error(`未知参数:${arg}\n${HELP}`);
86
+ }
87
+ }
88
+ return out;
89
+ }
90
+ async function main() {
91
+ const { command, flags } = parseArgs(process.argv.slice(2));
92
+ switch (command) {
93
+ case "install":
94
+ await runInstall(flags);
95
+ break;
96
+ case "update":
97
+ await runUpdate({ yes: flags.yes });
98
+ break;
99
+ case "uninstall":
100
+ await runUninstall({ kinds: flags.kinds, yes: flags.yes });
101
+ break;
102
+ case "doctor":
103
+ await runDoctor();
104
+ break;
105
+ case "help":
106
+ case "--help":
107
+ case "-h":
108
+ console.log(HELP);
109
+ break;
110
+ default:
111
+ console.log(`未知命令:${command}`);
112
+ console.log(HELP);
113
+ process.exitCode = 1;
114
+ }
115
+ }
116
+ main().catch((error) => {
117
+ console.error(`CLI 执行出错:${error instanceof Error ? error.message : String(error)}`);
118
+ process.exitCode = 1;
119
+ });
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}