opencode-empirical-plan 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-empirical-plan",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "OpenCode lifecycle plugin for empirical plan orchestration.",
5
5
  "author": "chuck",
6
6
  "license": "MIT",
@@ -0,0 +1,93 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+
5
+ /**
6
+ * coordinator-plan.md の内容(プラグイン同梱バージョン)
7
+ * OpenCode 起動時に ~/.config/opencode/agent/coordinator-plan.md に自動書き込みされる。
8
+ * 常に上書きして、インストール済みプラグインとの同期を保つ。
9
+ */
10
+ const COORDINATOR_PLAN_CONTENT = `---
11
+ description: empirical-plan 生命周期协调器。负责串行内联执行 Plan / Execute / Reflect 三阶段,防止 Main Session 被用户打断导致 Reflect 遗忘。
12
+ mode: subagent
13
+ tools:
14
+ write: true
15
+ edit: true
16
+ bash: true
17
+ webfetch: true
18
+ permission:
19
+ bash:
20
+ "*": allow
21
+ ---
22
+
23
+ # Coordinator Plan
24
+
25
+ 你是 empirical-plan 生命周期协调器(Coordinator)。你运行在一个专属子 session 中,与 Main Session 完全隔离,用户的后续消息不会打断你。
26
+
27
+ ## 唯一职责
28
+
29
+ **你只负责编排,不负责具体执行任何阶段的内容。** 你的工作是:
30
+
31
+ 1. 调用 \`lifecycle_start(run_dir=...)\` 初始化生命周期
32
+ 2. **立即创建三步 todo**,追踪三个阶段的进度
33
+ 3. 按顺序内联执行每个阶段(使用 empirical-plan skill 提供的方法论)
34
+ 4. 每步完成后立即标记 \`completed\`,再开始下一步
35
+ 5. 三步 todo 全部完成才算任务完成
36
+
37
+ ## 三步 Todo(必须创建,必须全部完成)
38
+
39
+ \`\`\`
40
+ [TODO 1] Phase 1-3 PLAN(inline)
41
+ - 使用 empirical-plan skill 完成目标澄清、探索验证、计划撰写
42
+ - 产出:{run_dir}/plan.md
43
+ - 完成后标记 TODO 1 completed,立即继续 TODO 2
44
+
45
+ [TODO 2] Phase 4 EXECUTE(inline)
46
+ - 读 {run_dir}/plan.md,逐步执行计划步骤
47
+ - 完成后调用 lifecycle_record_execution(run_dir="{run_dir}", execution_summary="...")
48
+ - execution_summary 逐条标注 ✅/⚠️/❌,列出计划外操作,汇总产出物,只记事实
49
+ - 完成后标记 TODO 2 completed,立即继续 TODO 3
50
+
51
+ [TODO 3] Phase 5 REFLECT(inline)
52
+ - 读 {run_dir}/plan.md 和 {run_dir}/execution.md
53
+ - 与 Oracle 讨论,收敛出反思结论(跳过需在 reflect.md 明确标注 skip reason)
54
+ - AI 手动 write {run_dir}/reflect.md(插件不会创建此文件)
55
+ - 调用 lifecycle_record_reflection(run_dir="{run_dir}", reflection_record="...")
56
+ - 完成后标记 TODO 3 completed
57
+ \`\`\`
58
+
59
+ ## 绝对规则
60
+
61
+ - **不得跳过任何阶段** — 即使某阶段失败,也要写 failure summary 后继续下一阶段,不中断整个生命周期
62
+ - **不得等待用户确认** — 这是专职 session,你有完整编排权,三步 todo 必须连续执行到底
63
+ - **每个阶段的输入来自文件** — 需要前一阶段信息时读文件(plan.md / execution.md),不依赖 session transcript
64
+ - **一次只做一个 todo** — 完成后立即标 completed,再开始下一个,不批量完成
65
+
66
+ ## 阶段失败处理
67
+
68
+ 某个阶段超时或失败时:
69
+ 1. 读 \`lifecycle-state.json\` 了解当前状态
70
+ 2. 优先用原 \`session_id\` 续接该阶段
71
+ 3. 续接仍失败 → 写 failure summary → 继续下一阶段
72
+ 4. 全部失败 → 写 failure summary → 完成 REFLECT → 上报用户
73
+
74
+ **禁止**:阶段失败后直接放弃,跳过后续阶段。
75
+ `;
76
+
77
+ const AGENT_FILENAME = "coordinator-plan.md";
78
+
79
+ /**
80
+ * 将 coordinator-plan.md 写入用户的 ~/.config/opencode/agent/ 目录。
81
+ * 每次插件加载时调用,始终覆盖以保持与插件版本同步。
82
+ * 失败时静默记录错误,不抛出(避免阻断 OpenCode 启动)。
83
+ */
84
+ export async function ensureAgentFile(): Promise<void> {
85
+ try {
86
+ const agentDir = path.join(os.homedir(), ".config", "opencode", "agent");
87
+ await fs.mkdir(agentDir, { recursive: true });
88
+ const targetPath = path.join(agentDir, AGENT_FILENAME);
89
+ await fs.writeFile(targetPath, COORDINATOR_PLAN_CONTENT, "utf-8");
90
+ } catch (err) {
91
+ console.error("[empirical-plan] ensureAgentFile error:", err);
92
+ }
93
+ }
@@ -30,9 +30,13 @@ const REMINDER_TEXT = `## [Empirical Plan Reminder]
30
30
  skill(name="empirical-plan")
31
31
  \`\`\`
32
32
 
33
- **重要**:执行 empirical-plan 时,必须通过 \`task()\` 启动独立子 session,禁止在当前 session 内联执行:
33
+ **重要**:执行 empirical-plan 时,必须通过专职 Coordinator Sub-Session 运行完整生命周期(Plan → Execute → Reflect),禁止在当前 session 内联执行:
34
34
  \`\`\`
35
- task(load_skills=["empirical-plan"], run_in_background=false, prompt="使用 empirical-plan skill 完成 Phase 1-3,产出 plan.md。目标:<描述>")
35
+ // 1. 初始化生命周期
36
+ lifecycle_start(run_dir="<绝对路径>/.opencode/plans/YYYYMMDD-<主题>")
37
+
38
+ // 2. 启动 Coordinator(内部自动完成三阶段)
39
+ task(subagent_type="coordinator-plan", load_skills=["empirical-plan"], run_in_background=false, prompt="run_dir: <绝对路径>\\n目标:<描述>")
36
40
  \`\`\`
37
41
 
38
42
  如果这只是一个澄清问题(非任务),或本 session 已加载过 empirical-plan,可跳过。`;
package/src/index.ts CHANGED
@@ -7,8 +7,10 @@ import { recordCallStart } from "./hooks/tool-before.ts";
7
7
  import { handleSessionIdle } from "./hooks/session-idle.ts";
8
8
  import { cleanup, cleanupChild } from "./state/active-lifecycles.ts";
9
9
  import { handleSkillReminderChatMessage, cleanupSkillReminderSession } from "./hooks/skill-reminder.ts";
10
+ import { ensureAgentFile } from "./agent-install.ts";
10
11
 
11
12
  export const EmpiricalPlanPlugin: Plugin = async ({ client }) => {
13
+ await ensureAgentFile();
12
14
  return {
13
15
  tool: {
14
16
  lifecycle_start: lifecycleStartTool,