@devcxl/opencode-cabbage 1.3.0 → 2.0.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 (89) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/README.md +35 -23
  3. package/README.zh.md +22 -15
  4. package/assets/agents/dev-lifecycle.md +6 -0
  5. package/assets/prompts/bootstrap.md +4 -0
  6. package/assets/skills/flow-change/SKILL.md +109 -0
  7. package/assets/skills/flow-design/SKILL.md +15 -0
  8. package/assets/skills/flow-docs/SKILL.md +112 -0
  9. package/assets/skills/flow-incident/SKILL.md +98 -0
  10. package/assets/skills/flow-research/SKILL.md +9 -0
  11. package/assets/skills/flow-setup/SKILL.md +13 -0
  12. package/codex-skills/agent-dev-lifecycle/SKILL.md +2 -0
  13. package/codex-skills/flow-change/SKILL.md +109 -0
  14. package/codex-skills/flow-design/SKILL.md +18 -3
  15. package/codex-skills/flow-docs/SKILL.md +112 -0
  16. package/codex-skills/flow-incident/SKILL.md +98 -0
  17. package/codex-skills/flow-research/SKILL.md +12 -3
  18. package/codex-skills/flow-setup/SKILL.md +13 -0
  19. package/dist/index.d.ts +2 -5
  20. package/dist/index.js +1 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/plugin/agents.d.ts +20 -0
  23. package/dist/plugin/agents.js +79 -0
  24. package/dist/plugin/agents.js.map +1 -1
  25. package/dist/plugin/cabbage-cli.d.ts +28 -0
  26. package/dist/plugin/cabbage-cli.js +92 -0
  27. package/dist/plugin/cabbage-cli.js.map +1 -0
  28. package/dist/plugin/cabbage-tool.d.ts +103 -0
  29. package/dist/plugin/cabbage-tool.js +169 -0
  30. package/dist/plugin/cabbage-tool.js.map +1 -0
  31. package/dist/plugin/commands.d.ts +10 -0
  32. package/dist/plugin/commands.js +1 -1
  33. package/dist/plugin/commands.js.map +1 -1
  34. package/dist/plugin/continuation.d.ts +22 -0
  35. package/dist/plugin/continuation.js +233 -0
  36. package/dist/plugin/continuation.js.map +1 -0
  37. package/dist/plugin/goal-store.d.ts +42 -49
  38. package/dist/plugin/goal-store.js +35 -32
  39. package/dist/plugin/goal-store.js.map +1 -1
  40. package/dist/plugin/goal.d.ts +92 -28
  41. package/dist/plugin/goal.js +201 -158
  42. package/dist/plugin/goal.js.map +1 -1
  43. package/dist/plugin/install-dir.d.ts +13 -0
  44. package/dist/plugin/install-dir.js +46 -0
  45. package/dist/plugin/install-dir.js.map +1 -0
  46. package/dist/plugin/server.d.ts +4 -13
  47. package/dist/plugin/server.js +278 -423
  48. package/dist/plugin/server.js.map +1 -1
  49. package/dist/plugin/session-abort.d.ts +5 -0
  50. package/dist/plugin/session-abort.js +26 -0
  51. package/dist/plugin/session-abort.js.map +1 -0
  52. package/dist/plugin/skills.d.ts +15 -0
  53. package/dist/plugin/skills.js +47 -50
  54. package/dist/plugin/skills.js.map +1 -1
  55. package/dist/plugin.d.ts +2 -2
  56. package/dist/plugin.js +6 -2
  57. package/dist/plugin.js.map +1 -1
  58. package/dist/util/paths.d.ts +0 -6
  59. package/dist/util/paths.js +0 -15
  60. package/dist/util/paths.js.map +1 -1
  61. package/package.json +4 -7
  62. package/vendor/cabbage/MANIFEST.json +8 -0
  63. package/vendor/cabbage/cabbage_cli/__init__.py +1 -0
  64. package/vendor/cabbage/cabbage_cli/__main__.py +2 -0
  65. package/vendor/cabbage/cabbage_cli/assets/docs-site/.vitepress/config.ts +78 -0
  66. package/vendor/cabbage/cabbage_cli/assets/docs-site/README.md +31 -0
  67. package/vendor/cabbage/cabbage_cli/assets/docs-site/package.json +16 -0
  68. package/vendor/cabbage/cabbage_cli/assets/docs-site/pnpm-lock.yaml +2504 -0
  69. package/vendor/cabbage/cabbage_cli/assets/integrations/cabbage.yml +127 -0
  70. package/vendor/cabbage/cabbage_cli/assets/templates/adr.md +47 -0
  71. package/vendor/cabbage/cabbage_cli/assets/templates/api-design.md +45 -0
  72. package/vendor/cabbage/cabbage_cli/assets/templates/change-record.md +21 -0
  73. package/vendor/cabbage/cabbage_cli/assets/templates/database-design.md +37 -0
  74. package/vendor/cabbage/cabbage_cli/assets/templates/generic.md +20 -0
  75. package/vendor/cabbage/cabbage_cli/assets/templates/impact.md +41 -0
  76. package/vendor/cabbage/cabbage_cli/assets/templates/incident.md +48 -0
  77. package/vendor/cabbage/cabbage_cli/assets/templates/postmortem.md +43 -0
  78. package/vendor/cabbage/cabbage_cli/assets/templates/prd.md +71 -0
  79. package/vendor/cabbage/cabbage_cli/assets/templates/release-plan.md +45 -0
  80. package/vendor/cabbage/cabbage_cli/assets/templates/rfc.md +44 -0
  81. package/vendor/cabbage/cabbage_cli/assets/templates/security-review.md +35 -0
  82. package/vendor/cabbage/cabbage_cli/assets/templates/tasks.md +62 -0
  83. package/vendor/cabbage/cabbage_cli/assets/templates/tech-spec.md +87 -0
  84. package/vendor/cabbage/cabbage_cli/assets/templates/test-plan.md +44 -0
  85. package/vendor/cabbage/cabbage_cli/assets/workflows/change.yaml +11 -0
  86. package/vendor/cabbage/cabbage_cli/assets/workflows/incident.yaml +4 -0
  87. package/vendor/cabbage/cabbage_cli/cli.py +283 -0
  88. package/vendor/cabbage/cabbage_cli/core.py +606 -0
  89. package/vendor/cabbage/cabbage_cli/scaffold.py +313 -0
@@ -1,7 +1,6 @@
1
- import { tool } from "@opencode-ai/plugin/tool";
2
1
  import { bindSession, updateFlowSession, removeFlowSession } from "../kernel/session-index.js";
3
2
  import { KeyedMutex } from "../kernel/mutex.js";
4
- import { resolveProjectDir } from "../util/paths.js";
3
+ import { clearAborted } from "./session-abort.js";
5
4
  /** goal 会话级串行锁:所有读改写统一经 mutateGoal 走该锁,防并发丢失更新 */
6
5
  const goalMutex = new KeyedMutex();
7
6
  export function createGoal(parentIssueNumber, sessionProfile, tokenBudget) {
@@ -36,11 +35,20 @@ export function formatGoal(goal) {
36
35
  `Objective/acceptance: read from Flow Record (Parent Issue #${goal.parentIssueNumber})`,
37
36
  ].filter(Boolean).join("\n");
38
37
  }
38
+ /** 把存储的 profile.model(V1/V2 两种形状)归一为 V2 的 ModelRef;无法识别时返回 null */
39
+ export function normalizeProfileModel(model) {
40
+ if (!model?.providerID)
41
+ return null;
42
+ const id = model.id ?? model.modelID;
43
+ if (!id)
44
+ return null;
45
+ return { providerID: model.providerID, id, ...(model.variant ? { variant: model.variant } : {}) };
46
+ }
39
47
  export const MAX_CONTINUATIONS = 50;
40
48
  /**
41
- * 单条消息的 token 快照 = input + reasoning + cache.read + output。
42
- * 与 OpenChamber 记账同源:OpenCode 每轮的 cache.read 已含此前所有轮次付费 token,
43
- * 最新完成轮的快照即整段成本,无需跨消息求和。reasoning 也计费,护栏方向偏严。
49
+ * token 快照 = input + reasoning + cache.read + output。
50
+ * OpenCode 每轮的 cache.read 已含此前所有轮次付费 token,
51
+ * 最新快照即整段成本,无需跨消息求和。reasoning 也计费,护栏方向偏严。
44
52
  */
45
53
  export function snapshotTokenTotal(tokens) {
46
54
  if (!tokens || typeof tokens !== "object")
@@ -112,11 +120,33 @@ export async function mutateGoal(store, sessionID, fn) {
112
120
  return value;
113
121
  });
114
122
  }
115
- export function createGoalTool(store, projectDirFallback) {
116
- /** 会话级项目目录:优先 ToolContext.directory,退化到插件级 projectDir(异常会话下避免写入根目录) */
117
- const sessionProjectDir = (ctxDirectory) => resolveProjectDir(ctxDirectory, projectDirFallback ?? "");
118
- return tool({
119
- description: `Manage the active goal-mode objective (minimal: parentIssueNumber/status/continuationCount).
123
+ /**
124
+ * goal 工具的允许名单(与权限规则层一致)。
125
+ * 规则层通过 agent permissions 隐藏/放行工具;此处的检查是工具级兜底,
126
+ * 覆盖规则层未覆盖的 agent(例如后续新注册的 agent)。
127
+ */
128
+ export const GOAL_ALLOWED_AGENTS = new Set(["dev-lifecycle", "goal-verify"]);
129
+ export const GOAL_TOOL_INPUT_SCHEMA = {
130
+ type: "object",
131
+ properties: {
132
+ op: {
133
+ type: "string",
134
+ enum: ["create", "get", "complete", "resume", "cancel", "pause", "edit"],
135
+ description: "Goal operation",
136
+ },
137
+ parent_issue_number: {
138
+ type: "number",
139
+ description: "Parent GitHub Issue number of the Flow Record (required for create; editable via edit)",
140
+ },
141
+ token_budget: {
142
+ type: "number",
143
+ description: "Optional token budget guardrail; goal auto-pauses when tokensUsed reaches it. Pass 0 via edit to remove the budget",
144
+ },
145
+ },
146
+ required: ["op"],
147
+ additionalProperties: false,
148
+ };
149
+ export const GOAL_TOOL_DESCRIPTION = `Manage the active goal-mode objective (minimal: parentIssueNumber/status/continuationCount).
120
150
 
121
151
  Use a single op field:
122
152
  - create: starts a goal bound to a Flow Record. Requires parent_issue_number.
@@ -124,186 +154,199 @@ Use a single op field:
124
154
  - resume: re-activates a paused goal.
125
155
  - cancel: discards the current goal.
126
156
  - pause: pauses the active goal.
127
- - complete: marks the goal as completed. Follow the returned instructions.`,
128
- args: {
129
- op: tool.schema.enum(["create", "get", "complete", "resume", "cancel", "pause", "edit"]).describe("Goal operation"),
130
- parent_issue_number: tool.schema.number().optional().describe("Parent GitHub Issue number of the Flow Record (required for create; editable via edit)"),
131
- token_budget: tool.schema.number().optional().describe("Optional token budget guardrail; goal auto-pauses when tokensUsed reaches it. Pass 0 via edit to remove the budget"),
132
- },
133
- async execute(args, ctx) {
134
- const sessionID = ctx.sessionID;
157
+ - complete: marks the goal as completed. Follow the returned instructions.`;
158
+ /**
159
+ * 构建 goal 工具描述符:{name, description, input(JSON Schema), options, execute}。
160
+ * execute 返回 {content}(V2 Tool.Result 形状);授权在工具内自检(见 GOAL_ALLOWED_AGENTS)。
161
+ */
162
+ export function buildGoalTool(store, projectDir) {
163
+ return {
164
+ name: "goal",
165
+ description: GOAL_TOOL_DESCRIPTION,
166
+ input: GOAL_TOOL_INPUT_SCHEMA,
167
+ options: { permission: "goal" },
168
+ async execute(args, context) {
169
+ if (!context.agent || !GOAL_ALLOWED_AGENTS.has(context.agent)) {
170
+ return {
171
+ content: `Error: the goal tool is restricted to the cabbage flow agents (dev-lifecycle, goal-verify). Agent "${context.agent ?? "unknown"}" is not authorized.`,
172
+ };
173
+ }
174
+ const sessionID = context.sessionID;
135
175
  // 只读判断:当前会话是否为子 agent、目标会话(父会话)ID
136
176
  const { session } = await store.read(sessionID);
137
177
  const isSubAgent = !!session?.parentID;
138
178
  const targetSessionID = session?.parentID ?? sessionID;
139
179
  if (isSubAgent && ["create", "pause", "resume", "cancel", "edit"].includes(args.op)) {
140
- return `Error: sub-agents cannot call goal({op:"${args.op}"}). Goal lifecycle operations are restricted to the main session.`;
180
+ return { content: `Error: sub-agents cannot call goal({op:"${args.op}"}). Goal lifecycle operations are restricted to the main session.` };
141
181
  }
142
182
  if (isSubAgent && args.op === "complete") {
143
- const agentName = ctx.agent;
183
+ const agentName = context.agent;
144
184
  if (agentName !== "goal-verify") {
145
- return `Error: only the goal-verify agent can complete the goal. Agent "${agentName}" is not authorized.`;
185
+ return { content: `Error: only the goal-verify agent can complete the goal. Agent "${agentName}" is not authorized.` };
146
186
  }
147
- return mutateGoal(store, targetSessionID, async (goal) => {
148
- if (!goal)
149
- return { goal, value: "No goal to complete in the parent session." };
150
- if (goal.status !== "active") {
151
- return { goal, value: `Parent session goal is not active (status: ${goal.status}).` };
152
- }
153
- goal.status = "complete";
154
- // flow 级持久化:complete-flow 可跨会话识别验证完成(不依赖 index 会话一致性)
155
- try {
156
- await updateFlowSession(sessionProjectDir(ctx.directory), goal.parentIssueNumber, { goalComplete: true });
157
- }
158
- catch {
159
- // 索引写入失败不阻塞 goal 完成(goal 本身已持久化)
160
- }
161
- return { goal, value: `Goal completed and verified: Flow #${goal.parentIssueNumber}` };
162
- });
163
- }
164
- switch (args.op) {
165
- case "create":
166
- return mutateGoal(store, sessionID, async (goal) => {
167
- if (goal?.status === "active") {
168
- // 必须返回原 goal(不能返回 null):mutateGoal 在 next===null 且 current 非 null
169
- // 时会删除现有 goal,错误分支返回 null 等于把活动 goal 取消了
170
- return { goal, value: `Error: an active goal already exists for Flow #${goal.parentIssueNumber}` };
171
- }
172
- const parentIssue = Number(args.parent_issue_number);
173
- if (!Number.isInteger(parentIssue) || parentIssue <= 0) {
174
- const got = args.parent_issue_number === undefined ? "" : ` (got: ${args.parent_issue_number})`;
175
- return { goal, value: `Error: parent_issue_number is required (positive integer)${got}` };
176
- }
177
- // 快照创建时的 agent(模型由 message.updated 用户消息事件补充)
178
- const created = createGoal(parentIssue, { agent: ctx.agent }, typeof args.token_budget === "number" && Number.isFinite(args.token_budget) && args.token_budget > 0
179
- ? Math.floor(args.token_budget)
180
- : undefined);
181
- // 记账基线:create 时点的最新完成 assistant 轮快照(快照法排除 goal 前历史消耗)。
182
- // 拉取失败/无历史 → baseline 0(护栏方向保守:把可见历史计入)。
183
- try {
184
- const messages = await store.messages(sessionID, 40);
185
- let baseline = 0;
186
- for (const message of messages ?? []) {
187
- const info = message?.info;
188
- if (info?.role !== "assistant")
189
- continue;
190
- if (!(info.time?.completed && info.time.completed > 0) || info.time.completed > created.createdAt)
191
- continue;
192
- baseline = Math.max(baseline, snapshotTokenTotal(info.tokens));
193
- }
194
- created.tokensBaseline = baseline;
195
- }
196
- catch {
197
- created.tokensBaseline = 0;
187
+ return { content: await mutateGoal(store, targetSessionID, async (goal) => {
188
+ if (!goal)
189
+ return { goal, value: "No goal to complete in the parent session." };
190
+ if (goal.status !== "active") {
191
+ return { goal, value: `Parent session goal is not active (status: ${goal.status}).` };
198
192
  }
199
- // flow 级绑定:供插件重启后的 autoResume 恢复 active goal
193
+ goal.status = "complete";
194
+ // flow 级持久化:complete-flow 可跨会话识别验证完成(不依赖 index 会话一致性)
200
195
  try {
201
- await bindSession(sessionProjectDir(ctx.directory), created.parentIssueNumber, sessionID);
196
+ await updateFlowSession(projectDir, goal.parentIssueNumber, { goalComplete: true, status: "completed" });
202
197
  }
203
198
  catch {
204
- // 索引写入失败不阻塞 goal 创建(goal 本身已持久化在 session metadata)
199
+ // 索引写入失败不阻塞 goal 完成(goal 本身已持久化)
205
200
  }
206
- return { goal: created, value: `Goal created: Flow #${created.parentIssueNumber}\nStatus: active` };
207
- });
201
+ return { goal, value: `Goal completed and verified: Flow #${goal.parentIssueNumber}` };
202
+ }) };
203
+ }
204
+ switch (args.op) {
205
+ case "create":
206
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
207
+ if (goal?.status === "active") {
208
+ // 必须返回原 goal(不能返回 null):mutateGoal 在 next===null 且 current 非 null
209
+ // 时会删除现有 goal,错误分支返回 null 等于把活动 goal 取消了
210
+ return { goal, value: `Error: an active goal already exists for Flow #${goal.parentIssueNumber}` };
211
+ }
212
+ const parentIssue = Number(args.parent_issue_number);
213
+ if (!Number.isInteger(parentIssue) || parentIssue <= 0) {
214
+ const got = args.parent_issue_number === undefined ? "" : ` (got: ${args.parent_issue_number})`;
215
+ return { goal, value: `Error: parent_issue_number is required (positive integer)${got}` };
216
+ }
217
+ // 快照创建时的 agent/模型(模型来自会话当前选择;此后由 selection 事件刷新)
218
+ const sessionModel = session?.model;
219
+ const createdProfile = {
220
+ agent: context.agent,
221
+ ...(sessionModel && sessionModel.providerID && sessionModel.id
222
+ ? { model: { providerID: sessionModel.providerID, id: sessionModel.id, ...(sessionModel.variant ? { variant: sessionModel.variant } : {}) } }
223
+ : {}),
224
+ };
225
+ const created = createGoal(parentIssue, createdProfile, typeof args.token_budget === "number" && Number.isFinite(args.token_budget) && args.token_budget > 0
226
+ ? Math.floor(args.token_budget)
227
+ : undefined);
228
+ // 记账基线:create 时点的会话累计 token 快照(后续 used = 当前累计 − baseline)。
229
+ // 拉取失败 → baseline 0(护栏方向保守:把全部可见消耗计入)。
230
+ try {
231
+ created.tokensBaseline = snapshotTokenTotal(await store.sessionTokens(sessionID));
232
+ }
233
+ catch {
234
+ created.tokensBaseline = 0;
235
+ }
236
+ // flow 级绑定:供插件重启后的 autoResume 恢复 active goal
237
+ try {
238
+ await bindSession(projectDir, created.parentIssueNumber, sessionID);
239
+ }
240
+ catch {
241
+ // 索引写入失败不阻塞 goal 创建(goal 本身已持久化在 session metadata)
242
+ }
243
+ return { goal: created, value: `Goal created: Flow #${created.parentIssueNumber}\nStatus: active` };
244
+ }) };
208
245
  case "get": {
209
246
  const { goal } = await store.read(targetSessionID);
210
- return goal ? formatGoal(goal) : "No active goal.";
247
+ return { content: goal ? formatGoal(goal) : "No active goal." };
211
248
  }
212
249
  case "complete": {
213
250
  const { goal } = await store.read(sessionID);
214
251
  if (!goal)
215
- return "No active goal.";
252
+ return { content: "No active goal." };
216
253
  if (goal.status !== "active")
217
- return `Goal is not active (status: ${goal.status}).`;
218
- return `BLOCKED: Call the goal-verify sub-agent via the Task tool. Only the sub-agent can complete verification.`;
254
+ return { content: `Goal is not active (status: ${goal.status}).` };
255
+ return { content: `BLOCKED: Call the goal-verify sub-agent via the Task tool. Only the sub-agent can complete verification.` };
219
256
  }
220
257
  case "resume":
221
- return mutateGoal(store, sessionID, async (goal) => {
222
- if (!goal)
223
- return { goal, value: "No goal to resume." };
224
- if (!canTransitionTo(goal, "active"))
225
- return { goal, value: `Goal cannot be resumed (status: ${goal.status}).` };
226
- goal.status = "active";
227
- goal.continuationCount = 0;
228
- // kickoff 信号:resume 后首次 tick 豁免 [BLOCKED:] 检测,防止被旧报告立即再次暂停
229
- goal.statusReason = "resumed";
230
- return { goal, value: `Goal resumed: Flow #${goal.parentIssueNumber}\nStatus: active` };
231
- });
258
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
259
+ if (!goal)
260
+ return { goal, value: "No goal to resume." };
261
+ if (!canTransitionTo(goal, "active"))
262
+ return { goal, value: `Goal cannot be resumed (status: ${goal.status}).` };
263
+ // 用户显式恢复:清除用户中断标记,避免恢复后被残留标记立即再次暂停
264
+ clearAborted(sessionID);
265
+ goal.status = "active";
266
+ goal.continuationCount = 0;
267
+ // kickoff 信号:resume 后首次 tick 豁免 [BLOCKED:] 检测,防止被旧报告立即再次暂停
268
+ goal.statusReason = "resumed";
269
+ return { goal, value: `Goal resumed: Flow #${goal.parentIssueNumber}\nStatus: active` };
270
+ }) };
232
271
  case "pause":
233
- return mutateGoal(store, sessionID, async (goal) => {
234
- if (!goal)
235
- return { goal, value: "No goal to pause." };
236
- if (!canTransitionTo(goal, "paused"))
237
- return { goal, value: `Goal cannot be paused (status: ${goal.status}).` };
238
- goal.status = "paused";
239
- return { goal, value: `Goal paused: Flow #${goal.parentIssueNumber}\nStatus: paused` };
240
- });
272
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
273
+ if (!goal)
274
+ return { goal, value: "No goal to pause." };
275
+ if (!canTransitionTo(goal, "paused"))
276
+ return { goal, value: `Goal cannot be paused (status: ${goal.status}).` };
277
+ goal.status = "paused";
278
+ return { goal, value: `Goal paused: Flow #${goal.parentIssueNumber}\nStatus: paused` };
279
+ }) };
241
280
  case "cancel":
242
- return mutateGoal(store, sessionID, async (goal) => {
243
- if (!goal)
244
- return { goal, value: "No goal to cancel." };
245
- // 同步清除 session-index entry,避免重启 autoResume 恢复已取消 goal
246
- try {
247
- await removeFlowSession(sessionProjectDir(ctx.directory), goal.parentIssueNumber);
248
- }
249
- catch {
250
- // 索引清理失败不阻塞取消(goal 本身已移除)
251
- }
252
- return { goal: null, value: `Goal cancelled: Flow #${goal.parentIssueNumber}` };
253
- });
254
- case "edit":
255
- return mutateGoal(store, sessionID, async (goal) => {
256
- if (!goal)
257
- return { goal, value: "No goal to edit." };
258
- if (goal.status === "complete") {
259
- return { goal, value: "Error: completed goals are read-only. Remove the goal and create a new one." };
260
- }
261
- const budgetGiven = typeof args.token_budget === "number"
262
- && Number.isFinite(args.token_budget)
263
- && args.token_budget > 0;
264
- const budgetRemoved = args.token_budget === 0;
265
- const nextParent = typeof args.parent_issue_number === "number"
266
- && Number.isFinite(args.parent_issue_number)
267
- && args.parent_issue_number > 0
268
- ? Math.floor(args.parent_issue_number)
269
- : null;
270
- if (!budgetGiven && !budgetRemoved && nextParent === null) {
271
- return { goal, value: "Error: nothing to edit — pass parent_issue_number and/or token_budget" };
272
- }
273
- if (budgetGiven)
274
- goal.tokenBudget = Math.floor(args.token_budget);
275
- if (budgetRemoved)
276
- delete goal.tokenBudget;
277
- if (nextParent !== null && nextParent !== goal.parentIssueNumber) {
278
- const oldParent = goal.parentIssueNumber;
279
- goal.parentIssueNumber = nextParent;
280
- // 换 Flow:旧目标的记账/基线/创建时刻全部重置(新目标从 edit 时点起算)。
281
- // createdAt 必须更新——否则下一 tick 用旧 createdAt 重新初始化 baseline 时,
282
- // 会把旧 Flow 期间的消息(completed > 旧 createdAt)计入新 Flow 预算。
283
- goal.tokensUsed = 0;
284
- delete goal.tokensBaseline;
285
- goal.createdAt = Date.now();
281
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
282
+ if (!goal)
283
+ return { goal, value: "No goal to cancel." };
284
+ // 同步清除 session-index entry,避免重启 autoResume 恢复已取消 goal
286
285
  try {
287
- await bindSession(sessionProjectDir(ctx.directory), goal.parentIssueNumber, sessionID);
286
+ await removeFlowSession(projectDir, goal.parentIssueNumber);
288
287
  }
289
- catch (error) {
290
- // 新 Flow 索引绑定失败:新 entry 缺失,重启 autoResume 无法恢复新 goal
291
- console.warn(`[cabbage] goal edit: bindSession #${goal.parentIssueNumber} failed:`, error?.message ?? error);
288
+ catch {
289
+ // 索引清理失败不阻塞取消(goal 本身已移除)
292
290
  }
293
- try {
294
- await removeFlowSession(sessionProjectDir(ctx.directory), oldParent);
291
+ return { goal: null, value: `Goal cancelled: Flow #${goal.parentIssueNumber}` };
292
+ }) };
293
+ case "edit":
294
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
295
+ if (!goal)
296
+ return { goal, value: "No goal to edit." };
297
+ if (goal.status === "complete") {
298
+ return { goal, value: "Error: completed goals are read-only. Remove the goal and create a new one." };
295
299
  }
296
- catch (error) {
297
- // 旧 entry 清理失败:残留 active entry 会在重启时被 autoResume 一致性自愈清理
298
- console.warn(`[cabbage] goal edit: removeFlowSession #${oldParent} failed:`, error?.message ?? error);
300
+ const budgetGiven = typeof args.token_budget === "number"
301
+ && Number.isFinite(args.token_budget)
302
+ && args.token_budget > 0;
303
+ const budgetRemoved = args.token_budget === 0;
304
+ const nextParent = typeof args.parent_issue_number === "number"
305
+ && Number.isFinite(args.parent_issue_number)
306
+ && args.parent_issue_number > 0
307
+ ? Math.floor(args.parent_issue_number)
308
+ : null;
309
+ if (!budgetGiven && !budgetRemoved && nextParent === null) {
310
+ return { goal, value: "Error: nothing to edit — pass parent_issue_number and/or token_budget" };
299
311
  }
300
- }
301
- return { goal, value: `Goal updated: Flow #${goal.parentIssueNumber}\nStatus: ${goal.status}` };
302
- });
312
+ if (budgetGiven)
313
+ goal.tokenBudget = Math.floor(args.token_budget);
314
+ if (budgetRemoved)
315
+ delete goal.tokenBudget;
316
+ if (nextParent !== null && nextParent !== goal.parentIssueNumber) {
317
+ const oldParent = goal.parentIssueNumber;
318
+ goal.parentIssueNumber = nextParent;
319
+ // 换 Flow:旧目标的记账/基线/创建时刻全部重置(新目标从 edit 时点起算)。
320
+ goal.tokensUsed = 0;
321
+ delete goal.tokensBaseline;
322
+ goal.createdAt = Date.now();
323
+ try {
324
+ goal.tokensBaseline = snapshotTokenTotal(await store.sessionTokens(sessionID));
325
+ }
326
+ catch {
327
+ goal.tokensBaseline = 0;
328
+ }
329
+ try {
330
+ await bindSession(projectDir, goal.parentIssueNumber, sessionID);
331
+ }
332
+ catch (error) {
333
+ // 新 Flow 索引绑定失败:新 entry 缺失,重启 autoResume 无法恢复新 goal
334
+ console.warn(`[cabbage] goal edit: bindSession #${goal.parentIssueNumber} failed:`, error?.message ?? error);
335
+ }
336
+ try {
337
+ await removeFlowSession(projectDir, oldParent);
338
+ }
339
+ catch (error) {
340
+ // 旧 entry 清理失败:残留 active entry 会在重启时被 autoResume 一致性自愈清理
341
+ console.warn(`[cabbage] goal edit: removeFlowSession #${oldParent} failed:`, error?.message ?? error);
342
+ }
343
+ }
344
+ return { goal, value: `Goal updated: Flow #${goal.parentIssueNumber}\nStatus: ${goal.status}` };
345
+ }) };
303
346
  default:
304
- return `Error: unknown operation "${args.op}"`;
347
+ return { content: `Error: unknown operation "${args.op}"` };
305
348
  }
306
349
  },
307
- });
350
+ };
308
351
  }
309
352
  //# sourceMappingURL=goal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** 安装锁:mkdir 原子性互斥,防多实例并发 rm+cp 踩踏(超时放弃而非死等) */
2
+ export declare function acquireLock(lockPath: string, timeoutMs?: number): Promise<() => Promise<void>>;
3
+ export interface EnsureInstalledOptions {
4
+ sourceDir: string;
5
+ destDir: string;
6
+ /** 判定目标目录已完整可用(目录缺失/不完整时返回 false) */
7
+ isComplete: (destDir: string) => Promise<boolean>;
8
+ }
9
+ /**
10
+ * 版本化目录安装:完整则跳过;否则在锁内 rm+cp(锁内二次检查防重复重建)。
11
+ * 调用方可依赖返回后 destDir 完整可用。排除 __pycache__/*.pyc(Python 资产复用)。
12
+ */
13
+ export declare function ensureInstalledDir({ sourceDir, destDir, isComplete }: EnsureInstalledOptions): Promise<void>;
@@ -0,0 +1,46 @@
1
+ import { cp, mkdir, rm } from "node:fs/promises";
2
+ import path from "node:path";
3
+ /** 安装锁:mkdir 原子性互斥,防多实例并发 rm+cp 踩踏(超时放弃而非死等) */
4
+ export async function acquireLock(lockPath, timeoutMs = 10_000) {
5
+ await mkdir(path.dirname(lockPath), { recursive: true });
6
+ const start = Date.now();
7
+ for (;;) {
8
+ try {
9
+ await mkdir(lockPath);
10
+ return async () => {
11
+ await rm(lockPath, { recursive: true, force: true }).catch(() => undefined);
12
+ };
13
+ }
14
+ catch (err) {
15
+ if (err.code !== "EEXIST")
16
+ throw err;
17
+ if (Date.now() - start > timeoutMs) {
18
+ throw new Error(`[cabbage] timed out waiting for install lock: ${lockPath}`);
19
+ }
20
+ await new Promise(r => setTimeout(r, 100));
21
+ }
22
+ }
23
+ }
24
+ /**
25
+ * 版本化目录安装:完整则跳过;否则在锁内 rm+cp(锁内二次检查防重复重建)。
26
+ * 调用方可依赖返回后 destDir 完整可用。排除 __pycache__/*.pyc(Python 资产复用)。
27
+ */
28
+ export async function ensureInstalledDir({ sourceDir, destDir, isComplete }) {
29
+ if (await isComplete(destDir))
30
+ return;
31
+ const release = await acquireLock(`${destDir}.lock`);
32
+ try {
33
+ if (await isComplete(destDir))
34
+ return;
35
+ await rm(destDir, { recursive: true, force: true });
36
+ await mkdir(destDir, { recursive: true });
37
+ await cp(sourceDir, destDir, {
38
+ recursive: true,
39
+ filter: (src) => !src.split(path.sep).includes("__pycache__") && !src.endsWith(".pyc"),
40
+ });
41
+ }
42
+ finally {
43
+ await release();
44
+ }
45
+ }
46
+ //# sourceMappingURL=install-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-dir.js","sourceRoot":"","sources":["../../src/plugin/install-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAS,GAAG,MAAM;IACpE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;YACrB,OAAO,KAAK,IAAI,EAAE;gBAChB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YAC7E,CAAC,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAA;YAC/D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,iDAAiD,QAAQ,EAAE,CAAC,CAAA;YAC9E,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAA0B;IACjG,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC;QAAE,OAAM;IACrC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,OAAO,OAAO,CAAC,CAAA;IACpD,IAAI,CAAC;QACH,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC;YAAE,OAAM;QACrC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACnD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE;YAC3B,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;SACvF,CAAC,CAAA;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
- import type { Plugin } from "@opencode-ai/plugin";
2
- import { type GoalStore } from "./goal-store.js";
1
+ import type { Plugin } from "@opencode/plugin";
3
2
  import type { ContextBlock } from "../kernel/context.js";
3
+ type Context = Plugin.Context;
4
4
  export interface FirstUserInjectionInput {
5
5
  hasGoal: boolean;
6
6
  isSubAgent: boolean;
@@ -8,20 +8,11 @@ export interface FirstUserInjectionInput {
8
8
  bootstrap: string;
9
9
  }
10
10
  /**
11
- * 决定首条 user 消息注入内容:
11
+ * 决定系统上下文注入内容:
12
12
  * - Primary(goal 激活)→ bootstrap + Project Context 块
13
13
  * - 子 agent → 仅 Project Context 块
14
14
  * - 其他 → 不注入
15
15
  */
16
16
  export declare function buildFirstUserInjection(input: FirstUserInjectionInput): string | null;
17
- interface AgentToolConfig {
18
- tools?: Record<string, boolean>;
19
- }
20
- interface GoalToolConfig extends AgentToolConfig {
21
- agent?: Record<string, unknown>;
22
- }
23
- export declare function configureGoalTools(config: GoalToolConfig): void;
24
- export declare function queueContinuation(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, store: GoalStore, sessionID: string, projectDir?: string): Promise<void>;
25
- export declare function autoResume(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, store: GoalStore, projectDir: string): Promise<void>;
26
- export declare function createOpencodeCabbage(packageRoot: string): Plugin;
17
+ export declare function setupCabbage(ctx: Context, packageRoot: string): Promise<() => void>;
27
18
  export {};