@mickorz/opencode-agentic-workflow 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +306 -5
- package/dist/cli/config.d.ts +121 -0
- package/dist/cli/config.js +331 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/doctor.d.ts +5 -0
- package/dist/cli/doctor.js +141 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +18 -0
- package/dist/cli/index.js +120 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +19 -0
- package/dist/cli/install.js +135 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/uninstall.d.ts +16 -0
- package/dist/cli/uninstall.js +110 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/update.d.ts +15 -0
- package/dist/cli/update.js +86 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/core/index.d.ts +39 -0
- package/dist/core/index.js +38 -0
- package/dist/core/index.js.map +1 -0
- package/dist/observability/events.d.ts +43 -0
- package/dist/observability/events.js.map +1 -1
- package/dist/plugin/checkpoint-override.d.ts +7 -9
- package/dist/plugin/checkpoint-override.js +8 -14
- package/dist/plugin/checkpoint-override.js.map +1 -1
- package/dist/plugin/define-workflow.d.ts +33 -0
- package/dist/plugin/define-workflow.js +103 -0
- package/dist/plugin/define-workflow.js.map +1 -0
- package/dist/plugin/index.js +406 -26
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/opencode-v2-executor.js +58 -46
- package/dist/plugin/opencode-v2-executor.js.map +1 -1
- package/dist/plugin/progress-board.d.ts +64 -0
- package/dist/plugin/progress-board.js +150 -0
- package/dist/plugin/progress-board.js.map +1 -0
- package/dist/plugin/progress-rpc.d.ts +390 -0
- package/dist/plugin/progress-rpc.js +318 -0
- package/dist/plugin/progress-rpc.js.map +1 -0
- package/dist/plugin/progress-view.d.ts +82 -0
- package/dist/plugin/progress-view.js +244 -0
- package/dist/plugin/progress-view.js.map +1 -0
- package/dist/plugin/run-sessions.d.ts +28 -0
- package/dist/plugin/run-sessions.js +46 -0
- package/dist/plugin/run-sessions.js.map +1 -0
- package/dist/plugin/tool-args.d.ts +15 -0
- package/dist/plugin/tool-args.js +28 -0
- package/dist/plugin/tool-args.js.map +1 -0
- package/dist/plugin/tui.d.ts +11 -4
- package/dist/plugin/tui.js +149 -5
- package/dist/plugin/tui.js.map +1 -1
- package/dist/plugin/workflow-control.d.ts +16 -0
- package/dist/plugin/workflow-control.js +85 -0
- package/dist/plugin/workflow-control.js.map +1 -0
- package/dist/plugin/workflow-schedule.d.ts +24 -0
- package/dist/plugin/workflow-schedule.js +97 -0
- package/dist/plugin/workflow-schedule.js.map +1 -0
- package/dist/quality/checkpoint.d.ts +5 -2
- package/dist/quality/checkpoint.js +11 -6
- package/dist/quality/checkpoint.js.map +1 -1
- package/dist/quality/verify.d.ts +21 -2
- package/dist/quality/verify.js +36 -14
- package/dist/quality/verify.js.map +1 -1
- package/dist/registry/definition.d.ts +12 -0
- package/dist/registry/definition.js.map +1 -1
- package/dist/registry/registry.d.ts +4 -0
- package/dist/registry/registry.js +20 -1
- package/dist/registry/registry.js.map +1 -1
- package/dist/registry/run-control.d.ts +27 -0
- package/dist/registry/run-control.js +51 -0
- package/dist/registry/run-control.js.map +1 -0
- package/dist/registry/runner.d.ts +29 -6
- package/dist/registry/runner.js +153 -35
- package/dist/registry/runner.js.map +1 -1
- package/dist/runtime/errors.d.ts +26 -0
- package/dist/runtime/errors.js +30 -0
- package/dist/runtime/errors.js.map +1 -1
- package/dist/runtime/executor.d.ts +22 -0
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/run-context.d.ts +44 -0
- package/dist/runtime/run-context.js +32 -0
- package/dist/runtime/run-context.js.map +1 -0
- package/dist/scheduler/cron.d.ts +29 -0
- package/dist/scheduler/cron.js +171 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/scheduler/service.d.ts +78 -0
- package/dist/scheduler/service.js +210 -0
- package/dist/scheduler/service.js.map +1 -0
- package/dist/scheduler/store.d.ts +26 -0
- package/dist/scheduler/store.js +94 -0
- package/dist/scheduler/store.js.map +1 -0
- package/dist/scheduler/types.d.ts +53 -0
- package/dist/scheduler/types.js +12 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/state/journal.d.ts +23 -0
- package/dist/state/journal.js +2 -0
- package/dist/state/journal.js.map +1 -1
- package/dist/state/recorder.d.ts +67 -0
- package/dist/state/recorder.js +148 -2
- package/dist/state/recorder.js.map +1 -1
- package/dist/workflow/agent.d.ts +42 -1
- package/dist/workflow/agent.js +116 -6
- package/dist/workflow/agent.js.map +1 -1
- package/dist/workflow/judge-panel.d.ts +37 -0
- package/dist/workflow/judge-panel.js +66 -0
- package/dist/workflow/judge-panel.js.map +1 -0
- package/dist/workflow/pipeline.d.ts +21 -0
- package/dist/workflow/pipeline.js +71 -0
- package/dist/workflow/pipeline.js.map +1 -0
- package/dist/workflow/race.d.ts +16 -0
- package/dist/workflow/race.js +46 -0
- package/dist/workflow/race.js.map +1 -0
- package/dist/workflow/sequence.js +6 -0
- package/dist/workflow/sequence.js.map +1 -1
- package/dist/workflows/loader.d.ts +124 -0
- package/dist/workflows/loader.js +500 -0
- package/dist/workflows/loader.js.map +1 -0
- package/dist/workspace/ambient.d.ts +6 -4
- package/dist/workspace/ambient.js +10 -4
- package/dist/workspace/ambient.js.map +1 -1
- package/package.json +16 -6
- package/skills/workflow-authoring/SKILL.md +111 -0
- package/skills/workflow-optimize/SKILL.md +70 -0
- package/dist/workflows/index.d.ts +0 -19
- package/dist/workflows/index.js +0 -40
- package/dist/workflows/index.js.map +0 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 交互式 / 无头安装流程(P2-10)
|
|
3
|
+
*
|
|
4
|
+
* 交互:安装方式 → 模型引用 → journal 开关 → skills 开关 → 变更清单确认。
|
|
5
|
+
* 无头:flags 指齐必答项 + --yes 即跳过全部交互(可脚本化);
|
|
6
|
+
* 非 TTY 且缺必答 → 报错列出缺项(绝不挂起)。
|
|
7
|
+
*/
|
|
8
|
+
import { type InstallKind } from "./config.js";
|
|
9
|
+
export interface InstallFlags {
|
|
10
|
+
mode?: InstallKind;
|
|
11
|
+
/** 模型引用 "providerID/modelId" */
|
|
12
|
+
model?: string;
|
|
13
|
+
agent?: string;
|
|
14
|
+
journal?: boolean;
|
|
15
|
+
skills?: boolean;
|
|
16
|
+
/** 跳过确认(无头模式的必答项齐备检查同时启用) */
|
|
17
|
+
yes?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function runInstall(flags: InstallFlags): Promise<void>;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 交互式 / 无头安装流程(P2-10)
|
|
3
|
+
*
|
|
4
|
+
* 交互:安装方式 → 模型引用 → journal 开关 → skills 开关 → 变更清单确认。
|
|
5
|
+
* 无头:flags 指齐必答项 + --yes 即跳过全部交互(可脚本化);
|
|
6
|
+
* 非 TTY 且缺必答 → 报错列出缺项(绝不挂起)。
|
|
7
|
+
*/
|
|
8
|
+
import { spawnSync } from "node:child_process";
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import * as p from "@clack/prompts";
|
|
12
|
+
import { DEFAULT_JOURNAL_DIR, PKG_NAME, SKILL_NAMES, SKILLS_LOCAL_SPEC, cliPackageRoot, copySkill, detectInstalled, globalOpenCodeJsonPath, makePluginEntry, mergePluginEntry, mergeSkillsEntry, parseModelRef, projectOpenCodeJsonPath, skillTargets, unwrap, } from "./config.js";
|
|
13
|
+
export async function runInstall(flags) {
|
|
14
|
+
p.intro("opencode-agentic-workflow 安装器");
|
|
15
|
+
const interactive = process.stdout.isTTY === true;
|
|
16
|
+
// ---- 必答项补齐:交互逐项问;无头缺项即报错 ----
|
|
17
|
+
const answers = {
|
|
18
|
+
mode: flags.mode,
|
|
19
|
+
model: flags.model,
|
|
20
|
+
agent: flags.agent ?? "build",
|
|
21
|
+
journal: flags.journal ?? true,
|
|
22
|
+
skills: flags.skills ?? true,
|
|
23
|
+
};
|
|
24
|
+
// fill 内部已 unwrap(泛型联合吸收 unique symbol,收窄只能在具体联合处做)
|
|
25
|
+
const ask = async (fill, name) => {
|
|
26
|
+
if (interactive && !flags.yes)
|
|
27
|
+
return await fill();
|
|
28
|
+
throw new Error(`缺少必答项 ${name}(无头模式请用 flags 指齐,或去掉 --yes 走交互)`);
|
|
29
|
+
};
|
|
30
|
+
if (answers.mode === undefined) {
|
|
31
|
+
answers.mode = await ask(async () => unwrap(await p.select({
|
|
32
|
+
message: "请选择安装方式",
|
|
33
|
+
options: [
|
|
34
|
+
{ value: "global", label: "全局安装", hint: "所有 OpenCode 项目生效" },
|
|
35
|
+
{ value: "project", label: "当前项目", hint: "仅当前项目生效(推荐)" },
|
|
36
|
+
{ value: "locked", label: "当前项目 + 锁定版本", hint: "npm 装进 node_modules,适合团队协作" },
|
|
37
|
+
],
|
|
38
|
+
})), "--global / --project / --locked");
|
|
39
|
+
}
|
|
40
|
+
if (answers.model === undefined) {
|
|
41
|
+
answers.model = await ask(async () => unwrap(await p.text({
|
|
42
|
+
message: "子会话模型(providerID/modelId,如 glm/glm-5.3-flash)",
|
|
43
|
+
validate: (value) => (parseModelRef(value ?? "") === null ? "格式应为 providerID/modelId" : undefined),
|
|
44
|
+
})), "--model <providerID/modelId>");
|
|
45
|
+
}
|
|
46
|
+
const model = parseModelRef(answers.model);
|
|
47
|
+
if (model === null) {
|
|
48
|
+
throw new Error(`模型引用不合法:${answers.model}(应形如 providerID/modelId)`);
|
|
49
|
+
}
|
|
50
|
+
const mode = answers.mode; // 上面分支保证已填
|
|
51
|
+
// 可选开关(journal/skills):交互才问;无头保持缺省(只有 mode/model 必答)
|
|
52
|
+
if (flags.journal === undefined && interactive && !flags.yes) {
|
|
53
|
+
answers.journal = await ask(async () => unwrap(await p.confirm({ message: "启用 journal 持久化(resume / 后台 run / 调度都依赖)", initialValue: true })), "--no-journal");
|
|
54
|
+
}
|
|
55
|
+
if (flags.skills === undefined && interactive && !flags.yes) {
|
|
56
|
+
answers.skills = await ask(async () => unwrap(await p.confirm({ message: `安装 skills(${SKILL_NAMES.join(" / ")})`, initialValue: true })), "--no-skills");
|
|
57
|
+
}
|
|
58
|
+
// ---- 计划 ----
|
|
59
|
+
const cwd = process.cwd();
|
|
60
|
+
const locked = mode === "locked";
|
|
61
|
+
const configPath = mode === "global" ? globalOpenCodeJsonPath() : projectOpenCodeJsonPath(cwd);
|
|
62
|
+
const entry = makePluginEntry({
|
|
63
|
+
model,
|
|
64
|
+
agent: answers.agent,
|
|
65
|
+
...(answers.journal ? { journalDir: DEFAULT_JOURNAL_DIR } : {}),
|
|
66
|
+
}, locked);
|
|
67
|
+
const existing = detectInstalled(cwd).find((item) => item.kind === mode);
|
|
68
|
+
if (existing) {
|
|
69
|
+
p.log.info(`该方式似乎已安装(命中 ${existing.evidence}),继续将做增量合并`);
|
|
70
|
+
}
|
|
71
|
+
const lines = [`修改 ${configPath}(plugins += ${String(entry.package)})`];
|
|
72
|
+
if (locked) {
|
|
73
|
+
lines.unshift(`执行 npm install ${PKG_NAME}(在 ${cwd})`);
|
|
74
|
+
if (answers.skills)
|
|
75
|
+
lines.push(`写入 skills 数组 += ${SKILLS_LOCAL_SPEC}(零拷贝)`);
|
|
76
|
+
}
|
|
77
|
+
else if (answers.skills) {
|
|
78
|
+
const base = skillTargets(cwd, mode)[0].destDir;
|
|
79
|
+
lines.push(`拷贝 ${join(cliPackageRoot(), "skills")}/ 下 ${SKILL_NAMES.length} 个 skill 到 ${base}/`);
|
|
80
|
+
}
|
|
81
|
+
if (answers.journal) {
|
|
82
|
+
lines.push(`创建 ${DEFAULT_JOURNAL_DIR}/(首次运行时落盘 journal)`);
|
|
83
|
+
}
|
|
84
|
+
p.note(lines.join("\n"), "将修改以下内容(已存在的配置会留 .bak 备份)");
|
|
85
|
+
const go = flags.yes ?? unwrap(await p.confirm({ message: "开始安装", initialValue: true }));
|
|
86
|
+
if (!go) {
|
|
87
|
+
p.outro("已取消");
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// ---- 执行 ----
|
|
91
|
+
const s = p.spinner();
|
|
92
|
+
try {
|
|
93
|
+
if (locked) {
|
|
94
|
+
s.start("安装 npm 包到当前项目");
|
|
95
|
+
const res = spawnSync(`npm install ${PKG_NAME}`, { cwd, stdio: "inherit", shell: true });
|
|
96
|
+
if (res.status !== 0)
|
|
97
|
+
throw new Error("npm install 失败,请检查网络 / registry 后重试");
|
|
98
|
+
s.stop(`npm 包已安装到 ${join(cwd, "node_modules")}`);
|
|
99
|
+
}
|
|
100
|
+
s.start("合并 opencode.json");
|
|
101
|
+
mergePluginEntry(configPath, entry);
|
|
102
|
+
s.stop(`已更新 ${configPath}`);
|
|
103
|
+
if (locked && answers.skills) {
|
|
104
|
+
s.start("写入 skills 零拷贝路径");
|
|
105
|
+
mergeSkillsEntry(configPath, SKILLS_LOCAL_SPEC);
|
|
106
|
+
s.stop(`skills 数组已包含 ${SKILLS_LOCAL_SPEC}`);
|
|
107
|
+
}
|
|
108
|
+
else if (answers.skills) {
|
|
109
|
+
const targets = skillTargets(cwd, mode);
|
|
110
|
+
for (const target of targets) {
|
|
111
|
+
if (existsSync(target.destDir)) {
|
|
112
|
+
const overwrite = flags.yes ??
|
|
113
|
+
unwrap(await p.confirm({ message: `skill 目录已存在,覆盖吗:${target.destDir}`, initialValue: true }));
|
|
114
|
+
if (!overwrite) {
|
|
115
|
+
p.log.info(`跳过 ${target.name}`);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
s.start(`拷贝 skill ${target.name}`);
|
|
120
|
+
copySkill(join(cliPackageRoot(), "skills"), target);
|
|
121
|
+
s.stop(`已拷贝 ${target.name} → ${target.destDir}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
s.stop("安装失败");
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
p.outro([
|
|
130
|
+
"安装完成。请重启 OpenCode 使配置生效。",
|
|
131
|
+
locked ? `升级:npm update ${PKG_NAME}` : "升级:npx " + PKG_NAME + " update",
|
|
132
|
+
`排查:npx ${PKG_NAME} doctor`,
|
|
133
|
+
].join("\n"));
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAA;AAEnC,OAAO,EACL,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,YAAY,EACZ,MAAM,GAEP,MAAM,aAAa,CAAA;AAapB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAmB;IAClD,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAExC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAA;IAEjD,gCAAgC;IAChC,MAAM,OAAO,GAMT;QACF,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;KAC7B,CAAA;IAED,oDAAoD;IACpD,MAAM,GAAG,GAAG,KAAK,EAAK,IAAsB,EAAE,IAAY,EAAc,EAAE;QACxE,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG;YAAE,OAAO,MAAM,IAAI,EAAE,CAAA;QAClD,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,iCAAiC,CAAC,CAAA;IACjE,CAAC,CAAA;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,CACtB,KAAK,IAAI,EAAE,CACT,MAAM,CACJ,MAAM,CAAC,CAAC,MAAM,CAAc;YAC1B,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE;gBAC5D,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;gBACxD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,4BAA4B,EAAE;aAC9E;SACF,CAAC,CACH,EACH,iCAAiC,CAClC,CAAA;IACH,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,CACvB,KAAK,IAAI,EAAE,CACT,MAAM,CACJ,MAAM,CAAC,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,+CAA+C;YACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC;SACnG,CAAC,CACH,EACH,8BAA8B,CAC/B,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,KAAK,0BAA0B,CAAC,CAAA;IACrE,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA,CAAE,WAAW;IAEtC,qDAAqD;IACrD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7D,OAAO,CAAC,OAAO,GAAG,MAAM,GAAG,CACzB,KAAK,IAAI,EAAE,CACT,MAAM,CAAU,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,yCAAyC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAC9G,cAAc,CACf,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5D,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,CACxB,KAAK,IAAI,EAAE,CAAC,MAAM,CAAU,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EACtH,aAAa,CACd,CAAA;IACH,CAAC;IAED,eAAe;IACf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ,CAAA;IAChC,MAAM,UAAU,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAA;IAC9F,MAAM,KAAK,GAAG,eAAe,CAC3B;QACE,KAAK;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,EACD,MAAM,CACP,CAAA;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACxE,IAAI,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,QAAQ,YAAY,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,OAAO,UAAU,eAAe,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxE,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,OAAO,CAAC,mBAAmB,QAAQ,MAAM,GAAG,GAAG,CAAC,CAAA;QACtD,IAAI,OAAO,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,iBAAiB,OAAO,CAAC,CAAA;IAC9E,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAA;QAChD,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,CAAC,OAAO,WAAW,CAAC,MAAM,cAAc,IAAI,GAAG,CAAC,CAAA;IACnG,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,OAAO,mBAAmB,oBAAoB,CAAC,CAAA;IAC5D,CAAC;IACD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,2BAA2B,CAAC,CAAA;IAErD,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,MAAM,CAAU,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACjG,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACd,OAAM;IACR,CAAC;IAED,eAAe;IACf,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IACrB,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC;YACX,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YACxB,MAAM,GAAG,GAAG,SAAS,CAAC,eAAe,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACxF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;YAC5E,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAC3B,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QACnC,CAAC,CAAC,IAAI,CAAC,OAAO,UAAU,EAAE,CAAC,CAAA;QAE3B,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC7B,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;YAC1B,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;YAC/C,CAAC,CAAC,IAAI,CAAC,gBAAgB,iBAAiB,EAAE,CAAC,CAAA;QAC7C,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/B,MAAM,SAAS,GACb,KAAK,CAAC,GAAG;wBACT,MAAM,CAAU,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,mBAAmB,MAAM,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;oBACxG,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;wBAC/B,SAAQ;oBACV,CAAC;gBACH,CAAC;gBACD,CAAC,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;gBAClC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAA;gBACnD,CAAC,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACd,MAAM,KAAK,CAAA;IACb,CAAC;IAED,CAAC,CAAC,KAAK,CACL;QACE,0BAA0B;QAC1B,MAAM,CAAC,CAAC,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,QAAQ,GAAG,SAAS;QACvE,UAAU,QAAQ,SAAS;KAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 交互式 / 无头卸载(P2-10)
|
|
3
|
+
*
|
|
4
|
+
* 对称原则(v1 0.2.0 实测教训):locked 安装无条件 npm install,卸载就
|
|
5
|
+
* 无条件 npm uninstall;配置条目清空的数组连键删除;只剩 $schema 空壳的
|
|
6
|
+
* 配置整文件删除(含 .bak);**本轮**改动产生的 .bak 一并清理。
|
|
7
|
+
* 含用户数据的删除(拷贝的 skill 目录、journal 运行记录)不自动删:
|
|
8
|
+
* 交互逐个确认,无头模式打印手动清理命令。
|
|
9
|
+
*/
|
|
10
|
+
import { type InstallKind } from "./config.js";
|
|
11
|
+
export interface UninstallFlags {
|
|
12
|
+
/** 勾选要卸载的方式(无头必填;交互模式为 multiselect) */
|
|
13
|
+
kinds?: InstallKind[];
|
|
14
|
+
yes?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function runUninstall(flags: UninstallFlags): Promise<void>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 交互式 / 无头卸载(P2-10)
|
|
3
|
+
*
|
|
4
|
+
* 对称原则(v1 0.2.0 实测教训):locked 安装无条件 npm install,卸载就
|
|
5
|
+
* 无条件 npm uninstall;配置条目清空的数组连键删除;只剩 $schema 空壳的
|
|
6
|
+
* 配置整文件删除(含 .bak);**本轮**改动产生的 .bak 一并清理。
|
|
7
|
+
* 含用户数据的删除(拷贝的 skill 目录、journal 运行记录)不自动删:
|
|
8
|
+
* 交互逐个确认,无头模式打印手动清理命令。
|
|
9
|
+
*/
|
|
10
|
+
import { spawnSync } from "node:child_process";
|
|
11
|
+
import { existsSync, rmSync } from "node:fs";
|
|
12
|
+
import * as p from "@clack/prompts";
|
|
13
|
+
import { DEFAULT_JOURNAL_DIR, PKG_NAME, detectInstalled, globalOpenCodeJsonPath, isShellConfig, projectOpenCodeJsonPath, removeConfigWithBackup, removePluginEntries, removeSkillTarget, skillTargetExists, skillTargets, unwrap, } from "./config.js";
|
|
14
|
+
export async function runUninstall(flags) {
|
|
15
|
+
p.intro("opencode-agentic-workflow 卸载");
|
|
16
|
+
const cwd = process.cwd();
|
|
17
|
+
const detected = detectInstalled(cwd);
|
|
18
|
+
if (detected.length === 0) {
|
|
19
|
+
p.outro("未检测到任何安装痕迹(全局 / 项目 / 锁定均无)");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
p.log.info(`检测到:${detected.map((d) => `${d.kind}(${d.evidence})`).join("、")}`);
|
|
23
|
+
// 选择要卸载的方式
|
|
24
|
+
let kinds;
|
|
25
|
+
if (flags.kinds !== undefined && flags.kinds.length > 0) {
|
|
26
|
+
kinds = flags.kinds;
|
|
27
|
+
}
|
|
28
|
+
else if (flags.yes || process.stdout.isTTY !== true) {
|
|
29
|
+
throw new Error("无头卸载请用 --global / --project / --locked 指明要卸载的方式(可组合)");
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
kinds = unwrap(await p.multiselect({
|
|
33
|
+
message: "选择要卸载的安装方式",
|
|
34
|
+
options: detected.map((d) => ({ value: d.kind, label: d.kind, hint: d.evidence })),
|
|
35
|
+
required: true,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
const unknown = kinds.filter((k) => !detected.some((d) => d.kind === k));
|
|
39
|
+
if (unknown.length > 0) {
|
|
40
|
+
p.log.warn(`未检测到 ${unknown.join("、")} 的安装痕迹,跳过`);
|
|
41
|
+
kinds = kinds.filter((k) => detected.some((d) => d.kind === k));
|
|
42
|
+
}
|
|
43
|
+
if (kinds.length === 0) {
|
|
44
|
+
p.outro("无可卸载项");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const confirmed = flags.yes ?? unwrap(await p.confirm({ message: `确认卸载 ${kinds.join("、")}`, initialValue: true }));
|
|
48
|
+
if (!confirmed) {
|
|
49
|
+
p.outro("已取消");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const s = p.spinner();
|
|
53
|
+
const manualCleanups = [];
|
|
54
|
+
for (const kind of kinds) {
|
|
55
|
+
const configPath = kind === "global" ? globalOpenCodeJsonPath() : projectOpenCodeJsonPath(cwd);
|
|
56
|
+
// 1) 配置条目移除(plugins 对象 + skills 零拷贝路径)
|
|
57
|
+
s.start(`移除配置条目 ${configPath}`);
|
|
58
|
+
const changed = removePluginEntries(configPath);
|
|
59
|
+
if (changed) {
|
|
60
|
+
// 空壳整文件删;否则清掉本轮产生的 .bak(还原到本次卸载前即用户预期)
|
|
61
|
+
if (isShellConfig(configPath)) {
|
|
62
|
+
removeConfigWithBackup(configPath);
|
|
63
|
+
s.stop(`配置已清空,整文件删除 ${configPath}`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
rmSync(`${configPath}.bak`, { force: true });
|
|
67
|
+
s.stop(`已更新 ${configPath}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
s.stop(`${configPath} 无本插件条目`);
|
|
72
|
+
}
|
|
73
|
+
// 2) 拷贝的 skill 目录(可能含用户改动:交互逐个确认,无头不自动删)
|
|
74
|
+
if (kind !== "locked") {
|
|
75
|
+
for (const target of skillTargets(cwd, kind)) {
|
|
76
|
+
if (!skillTargetExists(target))
|
|
77
|
+
continue;
|
|
78
|
+
if (flags.yes || process.stdout.isTTY !== true) {
|
|
79
|
+
manualCleanups.push(`rm -rf ${target.destDir}`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const del = unwrap(await p.confirm({ message: `删除 skill 目录:${target.destDir}`, initialValue: false }));
|
|
83
|
+
if (del)
|
|
84
|
+
removeSkillTarget(target);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// 3) locked:对称无条件 npm uninstall
|
|
88
|
+
if (kind === "locked") {
|
|
89
|
+
s.start(`npm uninstall ${PKG_NAME}`);
|
|
90
|
+
const res = spawnSync(`npm uninstall ${PKG_NAME}`, { cwd, stdio: "inherit", shell: true });
|
|
91
|
+
if (res.status !== 0) {
|
|
92
|
+
p.log.warn("npm uninstall 失败(可能本来就不是依赖),请手动核对 package.json");
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
s.stop("npm 依赖已移除");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// 4) journal 运行记录(用户数据,永不自动删)
|
|
100
|
+
const journalPath = `${cwd}/${DEFAULT_JOURNAL_DIR}`;
|
|
101
|
+
if (existsSync(journalPath)) {
|
|
102
|
+
manualCleanups.push(`rm -rf ${journalPath} # 运行记录(resume 数据),确认不再需要再删`);
|
|
103
|
+
}
|
|
104
|
+
const outro = ["卸载完成。请重启 OpenCode 使配置生效。"];
|
|
105
|
+
if (manualCleanups.length > 0) {
|
|
106
|
+
outro.push("以下内容含你的数据,未自动删除,需要时手动清理:", ...manualCleanups.map((c) => ` ${c}`));
|
|
107
|
+
}
|
|
108
|
+
p.outro(outro.join("\n"));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 升级流程(P2-10)
|
|
3
|
+
*
|
|
4
|
+
* locked:npm update(升级本体,skills 零拷贝随包更新)。
|
|
5
|
+
* global / project:删 OpenCode 插件缓存目录让宿主下次启动重新拉最新
|
|
6
|
+
* (v2 缓存路径未官方化——best-effort,目录不存在仅 WARN)。
|
|
7
|
+
* 拷贝型 skills(global/project):无条件从 CLI 包根重新拷贝(安装器
|
|
8
|
+
* 自有内容,非用户数据)。
|
|
9
|
+
* 版本对比只读提示,失败不阻塞。
|
|
10
|
+
*/
|
|
11
|
+
/** `npm view <pkg> version`(官方源);失败返回 null */
|
|
12
|
+
export declare function latestVersionOnNpm(): string | null;
|
|
13
|
+
export declare function runUpdate(flags: {
|
|
14
|
+
yes?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 升级流程(P2-10)
|
|
3
|
+
*
|
|
4
|
+
* locked:npm update(升级本体,skills 零拷贝随包更新)。
|
|
5
|
+
* global / project:删 OpenCode 插件缓存目录让宿主下次启动重新拉最新
|
|
6
|
+
* (v2 缓存路径未官方化——best-effort,目录不存在仅 WARN)。
|
|
7
|
+
* 拷贝型 skills(global/project):无条件从 CLI 包根重新拷贝(安装器
|
|
8
|
+
* 自有内容,非用户数据)。
|
|
9
|
+
* 版本对比只读提示,失败不阻塞。
|
|
10
|
+
*/
|
|
11
|
+
import { spawnSync } from "node:child_process";
|
|
12
|
+
import { rmSync } from "node:fs";
|
|
13
|
+
import * as p from "@clack/prompts";
|
|
14
|
+
import { PKG_NAME, cliPackageRoot, copySkill, detectInstalled, pluginCacheDir, readInstalledVersion, skillTargets, unwrap, } from "./config.js";
|
|
15
|
+
/** `npm view <pkg> version`(官方源);失败返回 null */
|
|
16
|
+
export function latestVersionOnNpm() {
|
|
17
|
+
const res = spawnSync(`npm view ${PKG_NAME} version --registry=https://registry.npmjs.org/`, {
|
|
18
|
+
encoding: "utf8",
|
|
19
|
+
shell: true,
|
|
20
|
+
timeout: 30_000,
|
|
21
|
+
});
|
|
22
|
+
const out = `${res.stdout ?? ""}`.trim();
|
|
23
|
+
return res.status === 0 && /^\d+\.\d+\.\d+/.test(out) ? out.split("\n").at(-1) : null;
|
|
24
|
+
}
|
|
25
|
+
export async function runUpdate(flags) {
|
|
26
|
+
p.intro("opencode-agentic-workflow 升级");
|
|
27
|
+
const cwd = process.cwd();
|
|
28
|
+
const detected = detectInstalled(cwd);
|
|
29
|
+
if (detected.length === 0) {
|
|
30
|
+
p.outro("未检测到安装(先 npx " + PKG_NAME + " install)");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
p.log.info(`检测到:${detected.map((d) => d.kind).join("、")}`);
|
|
34
|
+
const installed = readInstalledVersion(cwd);
|
|
35
|
+
if (installed) {
|
|
36
|
+
const latest = latestVersionOnNpm();
|
|
37
|
+
if (latest === null) {
|
|
38
|
+
p.log.warn("npm view 查询最新版本失败(网络 / registry),跳过版本对比");
|
|
39
|
+
}
|
|
40
|
+
else if (latest === installed) {
|
|
41
|
+
p.log.step(`当前 ${installed} 已是 npm 最新`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
p.log.step(`当前 ${installed},npm 最新 ${latest}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const confirmed = flags.yes ?? unwrap(await p.confirm({ message: "继续升级", initialValue: true }));
|
|
48
|
+
if (!confirmed) {
|
|
49
|
+
p.outro("已取消");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const s = p.spinner();
|
|
53
|
+
// 插件本体
|
|
54
|
+
if (detected.some((d) => d.kind === "locked")) {
|
|
55
|
+
s.start(`npm update ${PKG_NAME}`);
|
|
56
|
+
const res = spawnSync(`npm update ${PKG_NAME}`, { cwd, stdio: "inherit", shell: true });
|
|
57
|
+
if (res.status !== 0) {
|
|
58
|
+
p.log.warn("npm update 失败,请检查网络 / registry 后重试");
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
s.stop("npm 依赖已更新");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (detected.some((d) => d.kind === "global" || d.kind === "project")) {
|
|
65
|
+
const cache = pluginCacheDir();
|
|
66
|
+
try {
|
|
67
|
+
rmSync(cache, { recursive: true, force: true });
|
|
68
|
+
s.stop(`已清插件缓存 ${cache}(宿主下次启动重新拉取最新)`);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
p.log.warn(`插件缓存清理失败:${cache}——可手动删除;宿主可能仍用缓存版本直到缓存过期`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// 拷贝型 skills 刷新(locked 零拷贝,npm update 已覆盖)
|
|
75
|
+
for (const kind of ["global", "project"]) {
|
|
76
|
+
if (!detected.some((d) => d.kind === kind))
|
|
77
|
+
continue;
|
|
78
|
+
for (const target of skillTargets(cwd, kind)) {
|
|
79
|
+
s.start(`刷新 skill ${target.name}(${kind})`);
|
|
80
|
+
copySkill(`${cliPackageRoot()}/skills`, target);
|
|
81
|
+
s.stop(`已刷新 ${target.destDir}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
p.outro("升级完成。请重启 OpenCode 使其重新加载插件。");
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码流程 API(P2-14:自定义 JS 逻辑的对外导出面)
|
|
3
|
+
*
|
|
4
|
+
* 面向在 flows 目录放 .js/.mjs/.cjs 模块的用户代码流程:
|
|
5
|
+
*
|
|
6
|
+
* import { defineWorkflow, agent, sequence } from "<pkg>/core"
|
|
7
|
+
*
|
|
8
|
+
* export default defineWorkflow({
|
|
9
|
+
* id: "my-flow", version: "1.0.0",
|
|
10
|
+
* stepNames: ["a", "b"],
|
|
11
|
+
* async run(args, ctx) {
|
|
12
|
+
* const slug = slugify(args.topic) // ← 自定义变量/方法回归
|
|
13
|
+
* return ctx.runSteps([...])
|
|
14
|
+
* },
|
|
15
|
+
* })
|
|
16
|
+
*
|
|
17
|
+
* 与声明式 JSON 流程在 registry 眼里完全同权(id@version 资产):
|
|
18
|
+
* journal / resume / 版本解析 / metrics / 面板详情回放全部一致。
|
|
19
|
+
*
|
|
20
|
+
* 纪律:本 barrel 及其依赖禁止 import OpenCode API(架构不变量,
|
|
21
|
+
* 与 define-workflow.ts 同款约束)——保持可在任意 Node 进程复用。
|
|
22
|
+
*/
|
|
23
|
+
export { defineWorkflow, type ArgsSchema, type StepFn, type WorkflowContext, type RunStepsOptions, type WorkflowDefinition, } from "../registry/definition.js";
|
|
24
|
+
export { agent, type AgentCallOptions, } from "../workflow/agent.js";
|
|
25
|
+
export type { AgentResult, TokenUsage } from "../runtime/executor.js";
|
|
26
|
+
export { sequence, resumeSequence } from "../workflow/sequence.js";
|
|
27
|
+
export { parallel } from "../workflow/parallel.js";
|
|
28
|
+
export { pipeline } from "../workflow/pipeline.js";
|
|
29
|
+
export { race } from "../workflow/race.js";
|
|
30
|
+
export { fallback } from "../workflow/fallback.js";
|
|
31
|
+
export { retry } from "../workflow/retry.js";
|
|
32
|
+
export { phase } from "../workflow/phase.js";
|
|
33
|
+
export { assert } from "../quality/check.js";
|
|
34
|
+
export { checkpoint } from "../quality/checkpoint.js";
|
|
35
|
+
export { verify, assertVerify } from "../quality/verify.js";
|
|
36
|
+
export type { ReviewVerdict } from "../quality/verify.js";
|
|
37
|
+
export { commandSuccess, fileExists, isFile, isDirectory } from "../quality/predicates.js";
|
|
38
|
+
export { withConcurrencyLimit } from "../runtime/semaphore.js";
|
|
39
|
+
export { getCommandRunner } from "../runtime/command.js";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码流程 API(P2-14:自定义 JS 逻辑的对外导出面)
|
|
3
|
+
*
|
|
4
|
+
* 面向在 flows 目录放 .js/.mjs/.cjs 模块的用户代码流程:
|
|
5
|
+
*
|
|
6
|
+
* import { defineWorkflow, agent, sequence } from "<pkg>/core"
|
|
7
|
+
*
|
|
8
|
+
* export default defineWorkflow({
|
|
9
|
+
* id: "my-flow", version: "1.0.0",
|
|
10
|
+
* stepNames: ["a", "b"],
|
|
11
|
+
* async run(args, ctx) {
|
|
12
|
+
* const slug = slugify(args.topic) // ← 自定义变量/方法回归
|
|
13
|
+
* return ctx.runSteps([...])
|
|
14
|
+
* },
|
|
15
|
+
* })
|
|
16
|
+
*
|
|
17
|
+
* 与声明式 JSON 流程在 registry 眼里完全同权(id@version 资产):
|
|
18
|
+
* journal / resume / 版本解析 / metrics / 面板详情回放全部一致。
|
|
19
|
+
*
|
|
20
|
+
* 纪律:本 barrel 及其依赖禁止 import OpenCode API(架构不变量,
|
|
21
|
+
* 与 define-workflow.ts 同款约束)——保持可在任意 Node 进程复用。
|
|
22
|
+
*/
|
|
23
|
+
export { defineWorkflow, } from "../registry/definition.js";
|
|
24
|
+
export { agent, } from "../workflow/agent.js";
|
|
25
|
+
export { sequence, resumeSequence } from "../workflow/sequence.js";
|
|
26
|
+
export { parallel } from "../workflow/parallel.js";
|
|
27
|
+
export { pipeline } from "../workflow/pipeline.js";
|
|
28
|
+
export { race } from "../workflow/race.js";
|
|
29
|
+
export { fallback } from "../workflow/fallback.js";
|
|
30
|
+
export { retry } from "../workflow/retry.js";
|
|
31
|
+
export { phase } from "../workflow/phase.js";
|
|
32
|
+
export { assert } from "../quality/check.js";
|
|
33
|
+
export { checkpoint } from "../quality/checkpoint.js";
|
|
34
|
+
export { verify, assertVerify } from "../quality/verify.js";
|
|
35
|
+
export { commandSuccess, fileExists, isFile, isDirectory } from "../quality/predicates.js";
|
|
36
|
+
export { withConcurrencyLimit } from "../runtime/semaphore.js";
|
|
37
|
+
export { getCommandRunner } from "../runtime/command.js";
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,cAAc,GAMf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,KAAK,GAEN,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAE3D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -33,6 +33,8 @@ export type WorkflowEvent = WorkflowEventBase & ({
|
|
|
33
33
|
} | {
|
|
34
34
|
type: "agent.started";
|
|
35
35
|
promptPreview: string;
|
|
36
|
+
/** 发出调用的 run(P2-8b 步骤元数据;run 作用域外省略) */
|
|
37
|
+
runId?: string;
|
|
36
38
|
} | {
|
|
37
39
|
type: "agent.completed";
|
|
38
40
|
durationMs: number;
|
|
@@ -43,10 +45,16 @@ export type WorkflowEvent = WorkflowEventBase & ({
|
|
|
43
45
|
costUSD?: number;
|
|
44
46
|
/** 实际使用的模型 "providerID/id" */
|
|
45
47
|
model?: string;
|
|
48
|
+
/** 完成调用的 run(journal 侧聚合到 currentStep) */
|
|
49
|
+
runId?: string;
|
|
50
|
+
/** 执行调用的宿主会话 ID(Open Session 回放;journal 侧聚合到步骤) */
|
|
51
|
+
sessionID?: string;
|
|
46
52
|
} | {
|
|
47
53
|
type: "agent.failed";
|
|
48
54
|
durationMs: number;
|
|
49
55
|
error: string;
|
|
56
|
+
/** 失败调用的 run(trace 按 run 过滤用) */
|
|
57
|
+
runId?: string;
|
|
50
58
|
} | {
|
|
51
59
|
type: "check.completed";
|
|
52
60
|
label: string;
|
|
@@ -57,6 +65,8 @@ export type WorkflowEvent = WorkflowEventBase & ({
|
|
|
57
65
|
passed: boolean;
|
|
58
66
|
passedCount: number;
|
|
59
67
|
totalCount: number;
|
|
68
|
+
/** P2-11:投票阈值 < 1 时携带(默认全票不附) */
|
|
69
|
+
threshold?: number;
|
|
60
70
|
} | {
|
|
61
71
|
/** v0.3.1 坑 3:reviewer 协议失败(解析重试耗尽)——非语义否决 */
|
|
62
72
|
type: "verify.protocol_failed";
|
|
@@ -83,7 +93,40 @@ export type WorkflowEvent = WorkflowEventBase & ({
|
|
|
83
93
|
type: "step.failed";
|
|
84
94
|
index: number;
|
|
85
95
|
error: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* P2-8 进度树数据源:journal 每次状态转换发射完整 run 快照
|
|
99
|
+
* (步级 started/completed/failed + run 级 complete/fail/abort + 创建时)。
|
|
100
|
+
* 消费方(进度 board / TUI 面板)无需增量对账——单飞语义下顺序天然一致。
|
|
101
|
+
*/
|
|
102
|
+
| {
|
|
103
|
+
type: "run.progress";
|
|
104
|
+
run: RunProgressSnapshot;
|
|
86
105
|
});
|
|
106
|
+
/** run 进度快照(RPC 传输形状;不含步骤 output——详情看 journal) */
|
|
107
|
+
export interface RunProgressSnapshot {
|
|
108
|
+
runId: string;
|
|
109
|
+
workflow: {
|
|
110
|
+
id: string;
|
|
111
|
+
version: string;
|
|
112
|
+
};
|
|
113
|
+
status: string;
|
|
114
|
+
startedAt: number;
|
|
115
|
+
completedAt?: number;
|
|
116
|
+
/** run 级失败摘要(截断 200 字符) */
|
|
117
|
+
failure?: string;
|
|
118
|
+
/** P2-9 lineage:subflow 子 run 指回父 run;顶层 run 无 */
|
|
119
|
+
parentRunId?: string;
|
|
120
|
+
/** P2-9 嵌套深度:顶层 0,subflow 子 run = 父 + 1 */
|
|
121
|
+
depth?: number;
|
|
122
|
+
steps: Array<{
|
|
123
|
+
index: number;
|
|
124
|
+
name?: string;
|
|
125
|
+
status: string;
|
|
126
|
+
startedAt?: number;
|
|
127
|
+
completedAt?: number;
|
|
128
|
+
}>;
|
|
129
|
+
}
|
|
87
130
|
/** 派发用入参(无需填 time,emitEvent 自动补) */
|
|
88
131
|
type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
|
|
89
132
|
export type EventInput = DistributiveOmit<WorkflowEvent, "time">;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/observability/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/observability/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA4GH,+BAA+B;AAC/B,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAA;IACxC,OAAO;QACL,QAAQ,CAAC,KAAoB;YAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,OAAO,CAAC,KAAK,CAAC,CAAA;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,4BAA4B;oBAC5B,OAAO,CAAC,GAAG,CACT,8CAA8C,KAAK,CAAC,IAAI,IAAI;wBAC1D,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9D,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,SAAS,CAAC,OAAqB;YAC7B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,GAAG,EAAE;gBACV,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAC1B,CAAC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,IAAI,UAAU,GAAa,cAAc,EAAE,CAAA;AAE3C,wBAAwB;AACxB,MAAM,UAAU,WAAW,CAAC,GAAa;IACvC,UAAU,GAAG,GAAG,CAAA;AAClB,CAAC;AAED,eAAe;AACf,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,UAAU,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAmB,CAAC,CAAA;AACtE,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,GAAG,GAAG,EAAE;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAClD,OAAO,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAA;AAC5E,CAAC"}
|
|
@@ -7,22 +7,20 @@
|
|
|
7
7
|
* 交互门(5 分钟超时假失败)+ 观测数据写进别的项目。
|
|
8
8
|
*
|
|
9
9
|
* 修复策略:**运行时显式 > 环境隐式**。workflow 工具新增保留参数
|
|
10
|
-
* `checkpointMode
|
|
11
|
-
*
|
|
10
|
+
* `checkpointMode`,调用时为**本次 run** 构建策略门,经 P2-9 的
|
|
11
|
+
* run 级上下文(RunLaunchOptions.gate)注入——不再换装全局门,
|
|
12
|
+
* 无恢复交叠竞态,对守护进程宿主与并发调用天然免疫。
|
|
12
13
|
*
|
|
13
14
|
* 范围收敛(v0.4.0):只支持策略门(auto-approve / auto-reject)——
|
|
14
15
|
* interactive 门需要 RPC 域 + bind() 注册,按调用创建会累积 RPC
|
|
15
16
|
* 注册且无 unbind 通道,保持「仅限插件配置」。
|
|
16
|
-
*
|
|
17
|
-
* 已知限制:全局 gate 仍是单例,两个并发调用携带不同覆盖值时存在
|
|
18
|
-
* 竞态(restore 交叠)。per-run gate 线程化是后续 L 范围工作;
|
|
19
|
-
* 单会话 `opencode run` / TUI 串行场景不受影响。
|
|
20
17
|
*/
|
|
18
|
+
import { PolicyCheckpointGate } from "./policy-checkpoint-gate.js";
|
|
21
19
|
/** 可作为调用级覆盖的审批模式(策略门子集) */
|
|
22
20
|
export type CheckpointModeOverride = "auto-approve" | "auto-reject";
|
|
23
21
|
export declare function parseCheckpointModeOverride(value: unknown): CheckpointModeOverride | undefined;
|
|
24
22
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* 为本次调用构建覆盖门(无覆盖返回 undefined——run 走默认 gate 链:
|
|
24
|
+
* run 上下文继承 / 全局绑定)。
|
|
27
25
|
*/
|
|
28
|
-
export declare function
|
|
26
|
+
export declare function buildCheckpointGate(mode: CheckpointModeOverride | undefined): PolicyCheckpointGate | undefined;
|