@devcxl/opencode-cabbage 1.2.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 (104) hide show
  1. package/.codex-plugin/plugin.json +36 -0
  2. package/README.md +67 -21
  3. package/README.zh.md +26 -13
  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-architect/SKILL.md +79 -0
  13. package/codex-skills/agent-dev-lifecycle/SKILL.md +311 -0
  14. package/codex-skills/agent-developer/SKILL.md +51 -0
  15. package/codex-skills/agent-goal-verify/SKILL.md +45 -0
  16. package/codex-skills/agent-researcher/SKILL.md +32 -0
  17. package/codex-skills/agent-reviewer/SKILL.md +109 -0
  18. package/codex-skills/flow-change/SKILL.md +109 -0
  19. package/codex-skills/flow-code/SKILL.md +71 -0
  20. package/codex-skills/flow-design/SKILL.md +161 -0
  21. package/codex-skills/flow-docs/SKILL.md +112 -0
  22. package/codex-skills/flow-incident/SKILL.md +98 -0
  23. package/codex-skills/flow-release/SKILL.md +90 -0
  24. package/codex-skills/flow-requirements/SKILL.md +90 -0
  25. package/codex-skills/flow-research/SKILL.md +86 -0
  26. package/codex-skills/flow-review/SKILL.md +110 -0
  27. package/codex-skills/flow-setup/SKILL.md +88 -0
  28. package/codex-skills/flow-tasks/SKILL.md +220 -0
  29. package/codex-skills/flow-tdd/SKILL.md +235 -0
  30. package/dist/hooks/session-start.d.ts +1 -0
  31. package/dist/hooks/session-start.js +72 -0
  32. package/dist/hooks/session-start.js.map +1 -0
  33. package/dist/index.d.ts +2 -5
  34. package/dist/index.js +1 -4
  35. package/dist/index.js.map +1 -1
  36. package/dist/plugin/agents.d.ts +20 -0
  37. package/dist/plugin/agents.js +79 -0
  38. package/dist/plugin/agents.js.map +1 -1
  39. package/dist/plugin/cabbage-cli.d.ts +28 -0
  40. package/dist/plugin/cabbage-cli.js +92 -0
  41. package/dist/plugin/cabbage-cli.js.map +1 -0
  42. package/dist/plugin/cabbage-tool.d.ts +103 -0
  43. package/dist/plugin/cabbage-tool.js +169 -0
  44. package/dist/plugin/cabbage-tool.js.map +1 -0
  45. package/dist/plugin/commands.d.ts +10 -0
  46. package/dist/plugin/commands.js +1 -1
  47. package/dist/plugin/commands.js.map +1 -1
  48. package/dist/plugin/continuation.d.ts +22 -0
  49. package/dist/plugin/continuation.js +233 -0
  50. package/dist/plugin/continuation.js.map +1 -0
  51. package/dist/plugin/goal-store.d.ts +64 -0
  52. package/dist/plugin/goal-store.js +57 -0
  53. package/dist/plugin/goal-store.js.map +1 -0
  54. package/dist/plugin/goal.d.ts +95 -38
  55. package/dist/plugin/goal.js +208 -199
  56. package/dist/plugin/goal.js.map +1 -1
  57. package/dist/plugin/install-dir.d.ts +13 -0
  58. package/dist/plugin/install-dir.js +46 -0
  59. package/dist/plugin/install-dir.js.map +1 -0
  60. package/dist/plugin/server.d.ts +4 -12
  61. package/dist/plugin/server.js +279 -423
  62. package/dist/plugin/server.js.map +1 -1
  63. package/dist/plugin/session-abort.d.ts +5 -0
  64. package/dist/plugin/session-abort.js +26 -0
  65. package/dist/plugin/session-abort.js.map +1 -0
  66. package/dist/plugin/skills.d.ts +15 -0
  67. package/dist/plugin/skills.js +47 -50
  68. package/dist/plugin/skills.js.map +1 -1
  69. package/dist/plugin.d.ts +2 -2
  70. package/dist/plugin.js +6 -2
  71. package/dist/plugin.js.map +1 -1
  72. package/dist/util/paths.d.ts +0 -6
  73. package/dist/util/paths.js +0 -15
  74. package/dist/util/paths.js.map +1 -1
  75. package/hooks/hooks.json +17 -0
  76. package/package.json +13 -8
  77. package/vendor/cabbage/MANIFEST.json +8 -0
  78. package/vendor/cabbage/cabbage_cli/__init__.py +1 -0
  79. package/vendor/cabbage/cabbage_cli/__main__.py +2 -0
  80. package/vendor/cabbage/cabbage_cli/assets/docs-site/.vitepress/config.ts +78 -0
  81. package/vendor/cabbage/cabbage_cli/assets/docs-site/README.md +31 -0
  82. package/vendor/cabbage/cabbage_cli/assets/docs-site/package.json +16 -0
  83. package/vendor/cabbage/cabbage_cli/assets/docs-site/pnpm-lock.yaml +2504 -0
  84. package/vendor/cabbage/cabbage_cli/assets/integrations/cabbage.yml +127 -0
  85. package/vendor/cabbage/cabbage_cli/assets/templates/adr.md +47 -0
  86. package/vendor/cabbage/cabbage_cli/assets/templates/api-design.md +45 -0
  87. package/vendor/cabbage/cabbage_cli/assets/templates/change-record.md +21 -0
  88. package/vendor/cabbage/cabbage_cli/assets/templates/database-design.md +37 -0
  89. package/vendor/cabbage/cabbage_cli/assets/templates/generic.md +20 -0
  90. package/vendor/cabbage/cabbage_cli/assets/templates/impact.md +41 -0
  91. package/vendor/cabbage/cabbage_cli/assets/templates/incident.md +48 -0
  92. package/vendor/cabbage/cabbage_cli/assets/templates/postmortem.md +43 -0
  93. package/vendor/cabbage/cabbage_cli/assets/templates/prd.md +71 -0
  94. package/vendor/cabbage/cabbage_cli/assets/templates/release-plan.md +45 -0
  95. package/vendor/cabbage/cabbage_cli/assets/templates/rfc.md +44 -0
  96. package/vendor/cabbage/cabbage_cli/assets/templates/security-review.md +35 -0
  97. package/vendor/cabbage/cabbage_cli/assets/templates/tasks.md +62 -0
  98. package/vendor/cabbage/cabbage_cli/assets/templates/tech-spec.md +87 -0
  99. package/vendor/cabbage/cabbage_cli/assets/templates/test-plan.md +44 -0
  100. package/vendor/cabbage/cabbage_cli/assets/workflows/change.yaml +11 -0
  101. package/vendor/cabbage/cabbage_cli/assets/workflows/incident.yaml +4 -0
  102. package/vendor/cabbage/cabbage_cli/cli.py +283 -0
  103. package/vendor/cabbage/cabbage_cli/core.py +606 -0
  104. package/vendor/cabbage/cabbage_cli/scaffold.py +313 -0
@@ -0,0 +1,64 @@
1
+ import type { GoalData } from "./goal.js";
2
+ /**
3
+ * goal 存储抽象(OpenCode V2)。
4
+ *
5
+ * V2 实现 = 会话 metadata(ctx.session.get/update);
6
+ * 消息面用 session.context 投影;记账快照用会话累计 tokens。
7
+ * read 的 fail-closed 语义(异常 → null)由实现保证,调用方依赖此兜底。
8
+ */
9
+ /** goal 宿主会话的最小面(V2 SessionInfo 子集) */
10
+ export interface GoalSession {
11
+ parentID: string | null;
12
+ metadata: Record<string, unknown>;
13
+ agent?: string | null;
14
+ model?: {
15
+ providerID?: string;
16
+ id?: string;
17
+ variant?: string;
18
+ } | null;
19
+ tokens?: unknown;
20
+ }
21
+ /** V2 消息投影的最小形状(session.context 返回值的子集) */
22
+ export interface GoalContextMessage {
23
+ type?: string;
24
+ time?: {
25
+ completed?: number;
26
+ created?: number;
27
+ } | null;
28
+ content?: Array<{
29
+ type?: string;
30
+ text?: string;
31
+ }>;
32
+ }
33
+ /**
34
+ * GoalStore V2 实现所需的 session 域最小面(ctx.session 的子集)。
35
+ * 参数/返回值放宽为 any:该接口是插件到存储的唯一适配边界,
36
+ * 内部做运行时形状校验后以强类型 GoalStore 暴露(避免把平台品牌类型渗入内核)。
37
+ */
38
+ export interface GoalStoreSessionApi {
39
+ get(args: {
40
+ sessionID: string;
41
+ }): Promise<any>;
42
+ update(args: {
43
+ sessionID: string;
44
+ metadata: any;
45
+ }): Promise<any>;
46
+ context(args: {
47
+ sessionID: string;
48
+ }): Promise<any>;
49
+ }
50
+ /** goal 状态存储。read 的 fail-closed 语义(异常 → null)由实现保证,调用方依赖此兜底。 */
51
+ export interface GoalStore {
52
+ read(sessionID: string): Promise<{
53
+ goal: GoalData | null;
54
+ session: GoalSession | null;
55
+ }>;
56
+ /** 写 goal;null 表示删除。existingSession 复用 read 结果避免二次读取。 */
57
+ write(sessionID: string, goal: GoalData | null, existingSession?: GoalSession | null): Promise<void>;
58
+ /** 会话消息投影(续接尾部检查与信号检测用)。异常/非数组时返回 null。 */
59
+ context(sessionID: string): Promise<GoalContextMessage[] | null>;
60
+ /** 会话累计 token 快照(预算护栏记账用)。异常时返回 null。 */
61
+ sessionTokens(sessionID: string): Promise<unknown | null>;
62
+ }
63
+ /** V2 实现:goal 持久化在 session metadata 的 goal 键;消息/tokens 走 session 域读取。 */
64
+ export declare function createSessionGoalStore(session: GoalStoreSessionApi): GoalStore;
@@ -0,0 +1,57 @@
1
+ function toGoalSession(session) {
2
+ return {
3
+ parentID: session?.parentID ?? null,
4
+ metadata: session?.metadata ?? {},
5
+ agent: session?.agent ?? null,
6
+ model: session?.model ?? null,
7
+ tokens: session?.tokens,
8
+ };
9
+ }
10
+ /** V2 实现:goal 持久化在 session metadata 的 goal 键;消息/tokens 走 session 域读取。 */
11
+ export function createSessionGoalStore(session) {
12
+ return {
13
+ async read(sessionID) {
14
+ try {
15
+ const result = await session.get({ sessionID });
16
+ if (!result)
17
+ return { goal: null, session: null };
18
+ const goalSession = toGoalSession(result);
19
+ if (!goalSession.metadata.goal)
20
+ return { goal: null, session: goalSession };
21
+ return { goal: goalSession.metadata.goal, session: goalSession };
22
+ }
23
+ catch {
24
+ return { goal: null, session: null };
25
+ }
26
+ },
27
+ async write(sessionID, goal, existingSession) {
28
+ const current = existingSession ?? (await this.read(sessionID)).session;
29
+ if (!current)
30
+ throw new Error("Failed to get session");
31
+ const existing = current.metadata ?? {};
32
+ const metadata = goal === null
33
+ ? Object.fromEntries(Object.entries(existing).filter(([k]) => k !== "goal"))
34
+ : { ...existing, goal };
35
+ await session.update({ sessionID, metadata });
36
+ },
37
+ async context(sessionID) {
38
+ try {
39
+ const result = await session.context({ sessionID });
40
+ return Array.isArray(result) ? result : null;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ },
46
+ async sessionTokens(sessionID) {
47
+ try {
48
+ const result = await session.get({ sessionID });
49
+ return result?.tokens ?? null;
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ },
55
+ };
56
+ }
57
+ //# sourceMappingURL=goal-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-store.js","sourceRoot":"","sources":["../../src/plugin/goal-store.ts"],"names":[],"mappings":"AAgDA,SAAS,aAAa,CAAC,OAMH;IAClB,OAAO;QACL,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;QACnC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE;QACjC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;QAC7B,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;QAC7B,MAAM,EAAE,OAAO,EAAE,MAAM;KACxB,CAAA;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,sBAAsB,CAAC,OAA4B;IACjE,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,SAAS;YAClB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC/C,IAAI,CAAC,MAAM;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;gBACjD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;gBACzC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;gBAC3E,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,IAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;YAC9E,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;YACtC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,eAAe;YAC1C,MAAM,OAAO,GAAG,eAAe,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAA;YACvE,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;YAEtD,MAAM,QAAQ,GAA4B,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;YAChE,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI;gBAC5B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;gBAC5E,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAA;YAEzB,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC/C,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,SAAS;YACrB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;gBACnD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,SAAS;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC/C,OAAO,MAAM,EAAE,MAAM,IAAI,IAAI,CAAA;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,13 +1,14 @@
1
- import type { ToolContext, ToolResult } from "@opencode-ai/plugin";
2
- import { createOpencodeClient } from "@opencode-ai/sdk/v2";
3
- import type { Session } from "@opencode-ai/sdk/v2";
1
+ import type { GoalSession, GoalStore } from "./goal-store.js";
4
2
  export type GoalStatus = "active" | "paused" | "complete";
5
- /** 用户最后使用的会话配置快照:续接注入时显式传回,防止 idle 后回落/切换默认 agent 与模型 */
3
+ /** 用户最后使用的会话配置快照:续接注入时显式传回,防止回落/切换默认 agent 与模型 */
6
4
  export interface GoalSessionProfile {
7
5
  agent: string;
6
+ /** V1 存量语义:{providerID, modelID};V2 新写入为 {providerID, id, variant?},读取时两种都接受 */
8
7
  model?: {
9
8
  providerID: string;
10
- modelID: string;
9
+ modelID?: string;
10
+ id?: string;
11
+ variant?: string;
11
12
  };
12
13
  }
13
14
  /** 最小化 goal(§10.2):目标与验收条件从 Flow Record(Parent Issue body)读取 */
@@ -15,15 +16,15 @@ export interface GoalData {
15
16
  parentIssueNumber: number;
16
17
  status: GoalStatus;
17
18
  continuationCount: number;
18
- /** 用户最后使用的 agent/模型(create 或用户消息时快照) */
19
+ /** 用户最后使用的 agent/模型(create 或用户切换时快照) */
19
20
  sessionProfile?: GoalSessionProfile;
20
21
  /** 可选 token 预算(护栏):tokensUsed 达限后自动 pause,防止长跑成本失控 */
21
22
  tokenBudget?: number;
22
- /** 已用 token(快照法:最新完成 assistant 轮 input+cache.read+output − baseline,单调不减) */
23
+ /** 已用 token(会话累计快照 − baseline,单调不减;护栏非账单) */
23
24
  tokensUsed?: number;
24
- /** 记账基线:create 时点最新完成 assistant 轮的快照(compaction 不做分段,护栏非账单) */
25
+ /** 记账基线:create 时点的会话累计 token 快照 */
25
26
  tokensBaseline?: number;
26
- /** goal 创建时刻(ms):记账基线初始化与诊断用 */
27
+ /** goal 创建时刻(ms):记账基线与诊断用 */
27
28
  createdAt?: number;
28
29
  /** 状态原因:'resumed' 是 UI/resume 的 kickoff 信号(首次 tick 豁免 blocked 检测后消费清除) */
29
30
  statusReason?: string;
@@ -31,11 +32,22 @@ export interface GoalData {
31
32
  export declare function createGoal(parentIssueNumber: number, sessionProfile?: GoalSessionProfile, tokenBudget?: number): GoalData;
32
33
  export declare function canTransitionTo(goal: GoalData, target: GoalStatus): boolean;
33
34
  export declare function formatGoal(goal: GoalData): string;
35
+ /** 把存储的 profile.model(V1/V2 两种形状)归一为 V2 的 ModelRef;无法识别时返回 null */
36
+ export declare function normalizeProfileModel(model: {
37
+ providerID?: string;
38
+ modelID?: string;
39
+ id?: string;
40
+ variant?: string;
41
+ } | undefined): {
42
+ providerID: string;
43
+ id: string;
44
+ variant?: string;
45
+ } | null;
34
46
  export declare const MAX_CONTINUATIONS = 50;
35
47
  /**
36
- * 单条消息的 token 快照 = input + reasoning + cache.read + output。
37
- * 与 OpenChamber 记账同源:OpenCode 每轮的 cache.read 已含此前所有轮次付费 token,
38
- * 最新完成轮的快照即整段成本,无需跨消息求和。reasoning 也计费,护栏方向偏严。
48
+ * token 快照 = input + reasoning + cache.read + output。
49
+ * OpenCode 每轮的 cache.read 已含此前所有轮次付费 token,
50
+ * 最新快照即整段成本,无需跨消息求和。reasoning 也计费,护栏方向偏严。
39
51
  */
40
52
  export declare function snapshotTokenTotal(tokens: unknown): number;
41
53
  /** token 预算护栏:达到或超过预算即应暂停(null 表示未设预算) */
@@ -53,39 +65,84 @@ export declare function isBlockedReport(text: string): boolean;
53
65
  export declare const DONE_REPORT_RE: RegExp;
54
66
  export declare function isDoneReport(text: string): boolean;
55
67
  export declare function continuationPrompt(parentIssueNumber: number): string;
56
- export declare function createGoalClient(serverUrl: URL, v1Client: any): import("@opencode-ai/sdk/v2").OpencodeClient;
57
- export declare function readGoal(client: ReturnType<typeof createOpencodeClient>, sessionID: string): Promise<{
58
- goal: GoalData | null;
59
- session: Session | null;
60
- }>;
61
- export declare function writeGoal(client: ReturnType<typeof createOpencodeClient>, sessionID: string, goal: GoalData | null, existingSession?: Session | null): Promise<void>;
62
68
  /**
63
69
  * 带锁的 goal 读-改-写单一入口:同一 sessionID 的操作串行,杜绝并发丢失更新。
64
- * fn 接收当前 goal 与 session,返回写回的 goal(null 表示删除)与调用方结果 value。
70
+ * fn 接收当前 goal 与宿主会话,返回写回的 goal(null 表示删除)与调用方结果 value。
65
71
  * 当前无 goal 且 fn 也返回 null 时跳过写回(避免对不存在 goal 的无谓删除/写入)。
66
72
  */
67
- export declare function mutateGoal<T>(client: ReturnType<typeof createOpencodeClient>, sessionID: string, fn: (goal: GoalData | null, session: Session | null) => Promise<{
73
+ export declare function mutateGoal<T>(store: GoalStore, sessionID: string, fn: (goal: GoalData | null, session: GoalSession | null) => Promise<{
68
74
  goal: GoalData | null;
69
75
  value: T;
70
76
  }>): Promise<T>;
71
- export declare function createGoalTool(client: ReturnType<typeof createOpencodeClient>, projectDirFallback?: string): {
77
+ /** goal 工具执行时可见的 context 最小面(V2 ToolContext 子集) */
78
+ export interface GoalToolContext {
79
+ sessionID: string;
80
+ agent?: string;
81
+ }
82
+ export interface GoalToolInput {
83
+ op: "create" | "get" | "complete" | "resume" | "cancel" | "pause" | "edit";
84
+ parent_issue_number?: number;
85
+ token_budget?: number;
86
+ }
87
+ export interface GoalToolResult {
88
+ content: string;
89
+ }
90
+ /**
91
+ * goal 工具的允许名单(与权限规则层一致)。
92
+ * 规则层通过 agent permissions 隐藏/放行工具;此处的检查是工具级兜底,
93
+ * 覆盖规则层未覆盖的 agent(例如后续新注册的 agent)。
94
+ */
95
+ export declare const GOAL_ALLOWED_AGENTS: Set<string>;
96
+ export declare const GOAL_TOOL_INPUT_SCHEMA: {
97
+ readonly type: "object";
98
+ readonly properties: {
99
+ readonly op: {
100
+ readonly type: "string";
101
+ readonly enum: readonly ["create", "get", "complete", "resume", "cancel", "pause", "edit"];
102
+ readonly description: "Goal operation";
103
+ };
104
+ readonly parent_issue_number: {
105
+ readonly type: "number";
106
+ readonly description: "Parent GitHub Issue number of the Flow Record (required for create; editable via edit)";
107
+ };
108
+ readonly token_budget: {
109
+ readonly type: "number";
110
+ readonly description: "Optional token budget guardrail; goal auto-pauses when tokensUsed reaches it. Pass 0 via edit to remove the budget";
111
+ };
112
+ };
113
+ readonly required: readonly ["op"];
114
+ readonly additionalProperties: false;
115
+ };
116
+ export declare const GOAL_TOOL_DESCRIPTION = "Manage the active goal-mode objective (minimal: parentIssueNumber/status/continuationCount).\n\nUse a single op field:\n- create: starts a goal bound to a Flow Record. Requires parent_issue_number.\n- get: returns the current goal.\n- resume: re-activates a paused goal.\n- cancel: discards the current goal.\n- pause: pauses the active goal.\n- complete: marks the goal as completed. Follow the returned instructions.";
117
+ /**
118
+ * 构建 goal 工具描述符:{name, description, input(JSON Schema), options, execute}。
119
+ * execute 返回 {content}(V2 Tool.Result 形状);授权在工具内自检(见 GOAL_ALLOWED_AGENTS)。
120
+ */
121
+ export declare function buildGoalTool(store: GoalStore, projectDir: string): {
122
+ name: string;
72
123
  description: string;
73
- args: {
74
- op: import("zod").ZodEnum<{
75
- complete: "complete";
76
- create: "create";
77
- get: "get";
78
- resume: "resume";
79
- cancel: "cancel";
80
- pause: "pause";
81
- edit: "edit";
82
- }>;
83
- parent_issue_number: import("zod").ZodOptional<import("zod").ZodNumber>;
84
- token_budget: import("zod").ZodOptional<import("zod").ZodNumber>;
124
+ input: {
125
+ readonly type: "object";
126
+ readonly properties: {
127
+ readonly op: {
128
+ readonly type: "string";
129
+ readonly enum: readonly ["create", "get", "complete", "resume", "cancel", "pause", "edit"];
130
+ readonly description: "Goal operation";
131
+ };
132
+ readonly parent_issue_number: {
133
+ readonly type: "number";
134
+ readonly description: "Parent GitHub Issue number of the Flow Record (required for create; editable via edit)";
135
+ };
136
+ readonly token_budget: {
137
+ readonly type: "number";
138
+ readonly description: "Optional token budget guardrail; goal auto-pauses when tokensUsed reaches it. Pass 0 via edit to remove the budget";
139
+ };
140
+ };
141
+ readonly required: readonly ["op"];
142
+ readonly additionalProperties: false;
143
+ };
144
+ options: {
145
+ permission: string;
85
146
  };
86
- execute(args: {
87
- op: "complete" | "create" | "get" | "resume" | "cancel" | "pause" | "edit";
88
- parent_issue_number?: number | undefined;
89
- token_budget?: number | undefined;
90
- }, context: ToolContext): Promise<ToolResult>;
147
+ execute(args: GoalToolInput, context: GoalToolContext): Promise<GoalToolResult>;
91
148
  };