@devcxl/opencode-cabbage 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/assets/agents/dev-lifecycle.md +23 -19
  2. package/assets/agents/team/architect.md +14 -0
  3. package/assets/agents/team/backend.md +14 -0
  4. package/assets/agents/team/frontend.md +14 -0
  5. package/assets/agents/team/goal-verify.md +54 -0
  6. package/assets/agents/team/reviewer.md +10 -0
  7. package/assets/skills/flow-code/SKILL.md +13 -0
  8. package/assets/skills/flow-review/SKILL.md +7 -0
  9. package/assets/skills/flow-tasks/SKILL.md +42 -0
  10. package/assets/skills/flow-tdd/SKILL.md +208 -0
  11. package/dist/flowrun/adapter.d.ts +49 -0
  12. package/dist/flowrun/adapter.js +293 -0
  13. package/dist/flowrun/adapter.js.map +1 -0
  14. package/dist/flowrun/ci.d.ts +64 -0
  15. package/dist/flowrun/ci.js +184 -0
  16. package/dist/flowrun/ci.js.map +1 -0
  17. package/dist/flowrun/coverage.d.ts +70 -0
  18. package/dist/flowrun/coverage.js +207 -0
  19. package/dist/flowrun/coverage.js.map +1 -0
  20. package/dist/flowrun/digest.d.ts +17 -0
  21. package/dist/flowrun/digest.js +301 -0
  22. package/dist/flowrun/digest.js.map +1 -0
  23. package/dist/flowrun/evaluator.d.ts +38 -0
  24. package/dist/flowrun/evaluator.js +185 -0
  25. package/dist/flowrun/evaluator.js.map +1 -0
  26. package/dist/flowrun/gate.d.ts +10 -0
  27. package/dist/flowrun/gate.js +12 -3
  28. package/dist/flowrun/gate.js.map +1 -1
  29. package/dist/flowrun/github.d.ts +13 -9
  30. package/dist/flowrun/github.js +46 -26
  31. package/dist/flowrun/github.js.map +1 -1
  32. package/dist/flowrun/index.d.ts +10 -3
  33. package/dist/flowrun/index.js +9 -2
  34. package/dist/flowrun/index.js.map +1 -1
  35. package/dist/flowrun/merge.d.ts +35 -2
  36. package/dist/flowrun/merge.js +72 -8
  37. package/dist/flowrun/merge.js.map +1 -1
  38. package/dist/flowrun/migration.d.ts +11 -0
  39. package/dist/flowrun/migration.js +276 -0
  40. package/dist/flowrun/migration.js.map +1 -0
  41. package/dist/flowrun/state.d.ts +79 -0
  42. package/dist/flowrun/state.js +363 -0
  43. package/dist/flowrun/state.js.map +1 -0
  44. package/dist/flowrun/transitions.d.ts +66 -0
  45. package/dist/flowrun/transitions.js +168 -0
  46. package/dist/flowrun/transitions.js.map +1 -0
  47. package/dist/flowrun/types.d.ts +279 -4
  48. package/dist/flowrun/types.js +2 -1
  49. package/dist/flowrun/types.js.map +1 -1
  50. package/dist/flowrun/validator.d.ts +15 -5
  51. package/dist/flowrun/validator.js +117 -5
  52. package/dist/flowrun/validator.js.map +1 -1
  53. package/dist/plugin/agents.d.ts +4 -0
  54. package/dist/plugin/agents.js +19 -0
  55. package/dist/plugin/agents.js.map +1 -1
  56. package/dist/plugin/broker.d.ts +73 -0
  57. package/dist/plugin/broker.js +140 -0
  58. package/dist/plugin/broker.js.map +1 -0
  59. package/dist/plugin/goal.d.ts +39 -1
  60. package/dist/plugin/goal.js +80 -1
  61. package/dist/plugin/goal.js.map +1 -1
  62. package/dist/plugin/prompt-lint.js +129 -0
  63. package/dist/plugin/prompt-lint.js.map +1 -1
  64. package/dist/plugin/server.js +241 -11
  65. package/dist/plugin/server.js.map +1 -1
  66. package/dist/plugin/shell.d.ts +37 -0
  67. package/dist/plugin/shell.js +144 -0
  68. package/dist/plugin/shell.js.map +1 -0
  69. package/dist/plugin/tdd-tool.d.ts +62 -0
  70. package/dist/plugin/tdd-tool.js +336 -0
  71. package/dist/plugin/tdd-tool.js.map +1 -0
  72. package/dist/util/gh.d.ts +8 -1
  73. package/dist/util/gh.js +10 -2
  74. package/dist/util/gh.js.map +1 -1
  75. package/package.json +2 -1
@@ -0,0 +1,73 @@
1
+ import type { FlowRun } from "../flowrun/types.js";
2
+ export interface BrokerCredentials {
3
+ /** 独立 GitHub API token(不传入 Agent shell) */
4
+ token: string;
5
+ }
6
+ export interface MutateResult<R> {
7
+ flowRun: FlowRun;
8
+ result: R;
9
+ shouldPersist: boolean;
10
+ }
11
+ export type WriteResult<R> = {
12
+ ok: true;
13
+ flowRun: FlowRun;
14
+ result: R;
15
+ persisted: boolean;
16
+ } | {
17
+ ok: false;
18
+ code: "PERSIST_CONFLICT" | "READ_FAILED";
19
+ message: string;
20
+ };
21
+ /**
22
+ * 单进程 broker,负责:
23
+ * 1. 按 parentIssueNumber 的 keyed mutex 串行所有 FlowRun 写入
24
+ * 2. read-modify-write 循环(乐观锁)
25
+ * 3. 检测外部 body 变化 → PERSIST_CONFLICT
26
+ * 4. 持有独立 GitHub API 凭证,Agent shell 不可访问
27
+ *
28
+ * 所有 FlowRun/Task/Evidence 写入必须经过 broker,不直接暴露 GitHub API。
29
+ *
30
+ * 凭证安全:credentials 存储在闭包变量中,不挂载在 this 上,
31
+ * JSON.stringify / Object.keys 无法访问。
32
+ */
33
+ export declare class FlowBroker {
34
+ #private;
35
+ private mutex;
36
+ /**
37
+ * @param credentials 可选。独立 GitHub API 凭证。
38
+ * 传入时:所有 gh 操作使用该 token,而非 ambient 环境。
39
+ * 不传时:降级使用 ambient 环境变量(GH_TOKEN etc.)。
40
+ */
41
+ constructor(credentials?: BrokerCredentials);
42
+ /**
43
+ * 获取凭证对应的环境变量覆盖(仅内部使用)。
44
+ * 返回 undefined 表示无独立凭证,应使用 ambient 环境。
45
+ */
46
+ private get ghEnv();
47
+ /**
48
+ * 验证 broker 持有的 GitHub 凭证是否有效。
49
+ *
50
+ * 调用 `gh auth status` 检查 token 可用性。
51
+ * 无凭证时返回 ok: false。
52
+ */
53
+ verifyCredentials(): Promise<{
54
+ ok: boolean;
55
+ message: string;
56
+ }>;
57
+ /**
58
+ * 将操作加入 keyed mutex 队列。
59
+ *
60
+ * 用于需要串行化但对 FlowRun 无影响的通用操作。
61
+ */
62
+ enqueue<T>(parentIssueNumber: number, op: () => Promise<T>): Promise<T>;
63
+ /**
64
+ * read-modify-write 循环:读取 FlowRun → 应用 handler 变更 → 乐观锁写回。
65
+ *
66
+ * - handler 返回 { flowRun, result, shouldPersist }
67
+ * - shouldPersist=false 时跳过写入(如校验失败)
68
+ * - 自动增加 revision 和时间戳
69
+ * - body 不匹配时返回 PERSIST_CONFLICT
70
+ * - 使用 broker 独立凭证执行 gh 操作
71
+ */
72
+ writeFlowRunWithLock<R>(issueNumber: number, handler: (flowRun: FlowRun) => MutateResult<R>): Promise<WriteResult<R>>;
73
+ }
@@ -0,0 +1,140 @@
1
+ import { readFlowRunWithLock, writeFlowRunWithLock as ghWriteFlowRunWithLock } from "../flowrun/github.js";
2
+ // ─── Keyed Mutex ───
3
+ /**
4
+ * 按 key 隔离的互斥锁,用于单进程内串行化并发操作。
5
+ *
6
+ * 每个 key(parentIssueNumber)维护独立的 promise 链,
7
+ * 相同 key 的操作依次执行,不同 key 的操作可以并行。
8
+ */
9
+ class KeyedMutex {
10
+ locks = new Map();
11
+ async runExclusive(key, fn) {
12
+ const prev = this.locks.get(key) ?? Promise.resolve();
13
+ let release;
14
+ const next = new Promise(r => {
15
+ release = r;
16
+ });
17
+ this.locks.set(key, next);
18
+ await prev;
19
+ try {
20
+ return await fn();
21
+ }
22
+ finally {
23
+ release();
24
+ }
25
+ }
26
+ }
27
+ // ─── FlowBroker ───
28
+ /**
29
+ * 单进程 broker,负责:
30
+ * 1. 按 parentIssueNumber 的 keyed mutex 串行所有 FlowRun 写入
31
+ * 2. read-modify-write 循环(乐观锁)
32
+ * 3. 检测外部 body 变化 → PERSIST_CONFLICT
33
+ * 4. 持有独立 GitHub API 凭证,Agent shell 不可访问
34
+ *
35
+ * 所有 FlowRun/Task/Evidence 写入必须经过 broker,不直接暴露 GitHub API。
36
+ *
37
+ * 凭证安全:credentials 存储在闭包变量中,不挂载在 this 上,
38
+ * JSON.stringify / Object.keys 无法访问。
39
+ */
40
+ export class FlowBroker {
41
+ mutex = new KeyedMutex();
42
+ #credentials;
43
+ /**
44
+ * @param credentials 可选。独立 GitHub API 凭证。
45
+ * 传入时:所有 gh 操作使用该 token,而非 ambient 环境。
46
+ * 不传时:降级使用 ambient 环境变量(GH_TOKEN etc.)。
47
+ */
48
+ constructor(credentials) {
49
+ this.#credentials = credentials ?? null;
50
+ }
51
+ /**
52
+ * 获取凭证对应的环境变量覆盖(仅内部使用)。
53
+ * 返回 undefined 表示无独立凭证,应使用 ambient 环境。
54
+ */
55
+ get ghEnv() {
56
+ if (!this.#credentials)
57
+ return undefined;
58
+ return {
59
+ GH_TOKEN: this.#credentials.token,
60
+ GITHUB_TOKEN: this.#credentials.token,
61
+ };
62
+ }
63
+ /**
64
+ * 验证 broker 持有的 GitHub 凭证是否有效。
65
+ *
66
+ * 调用 `gh auth status` 检查 token 可用性。
67
+ * 无凭证时返回 ok: false。
68
+ */
69
+ async verifyCredentials() {
70
+ if (!this.#credentials) {
71
+ return { ok: false, message: "No broker credentials configured" };
72
+ }
73
+ try {
74
+ const { gh } = await import("../util/gh.js");
75
+ await gh("auth status", 15_000, this.ghEnv);
76
+ return { ok: true, message: "Broker credentials are valid" };
77
+ }
78
+ catch (err) {
79
+ return { ok: false, message: `Broker credentials verification failed: ${String(err)}` };
80
+ }
81
+ }
82
+ /**
83
+ * 将操作加入 keyed mutex 队列。
84
+ *
85
+ * 用于需要串行化但对 FlowRun 无影响的通用操作。
86
+ */
87
+ async enqueue(parentIssueNumber, op) {
88
+ return this.mutex.runExclusive(parentIssueNumber, op);
89
+ }
90
+ /**
91
+ * read-modify-write 循环:读取 FlowRun → 应用 handler 变更 → 乐观锁写回。
92
+ *
93
+ * - handler 返回 { flowRun, result, shouldPersist }
94
+ * - shouldPersist=false 时跳过写入(如校验失败)
95
+ * - 自动增加 revision 和时间戳
96
+ * - body 不匹配时返回 PERSIST_CONFLICT
97
+ * - 使用 broker 独立凭证执行 gh 操作
98
+ */
99
+ async writeFlowRunWithLock(issueNumber, handler) {
100
+ return this.mutex.runExclusive(issueNumber, async () => {
101
+ // ── 读取(broker 凭证) ──
102
+ const { flowRunResult, currentBody } = await readFlowRunWithLock(issueNumber, this.ghEnv);
103
+ if (!flowRunResult.ok || currentBody === null) {
104
+ return {
105
+ ok: false,
106
+ code: "READ_FAILED",
107
+ message: `Failed to read FlowRun from issue #${issueNumber}: ${flowRunResult.ok ? "missing body" : flowRunResult.code}`,
108
+ };
109
+ }
110
+ // ── 修改 ──
111
+ const { flowRun: updated, result, shouldPersist } = handler(flowRunResult.data);
112
+ if (!shouldPersist) {
113
+ return {
114
+ ok: true,
115
+ flowRun: flowRunResult.data,
116
+ result,
117
+ persisted: false,
118
+ };
119
+ }
120
+ // ── 写入(乐观锁,broker 凭证) ──
121
+ updated.revision += 1;
122
+ updated.lastTickAt = new Date().toISOString();
123
+ const writeResult = await ghWriteFlowRunWithLock(issueNumber, updated, currentBody, this.ghEnv);
124
+ if (!writeResult.success) {
125
+ return {
126
+ ok: false,
127
+ code: "PERSIST_CONFLICT",
128
+ message: writeResult.error ?? "Issue body changed since last read — external modification detected",
129
+ };
130
+ }
131
+ return {
132
+ ok: true,
133
+ flowRun: updated,
134
+ result,
135
+ persisted: true,
136
+ };
137
+ });
138
+ }
139
+ }
140
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/plugin/broker.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { ToolContext, ToolResult } from "@opencode-ai/plugin";
2
2
  import { createOpencodeClient } from "@opencode-ai/sdk/v2";
3
3
  import type { Session } from "@opencode-ai/sdk/v2";
4
+ import type { GoalFlowRunRef } from "../flowrun/types.js";
4
5
  export type GoalStatus = "active" | "paused" | "complete";
5
6
  export interface GoalData {
6
7
  objective: string;
@@ -19,7 +20,44 @@ export declare function readGoal(client: ReturnType<typeof createOpencodeClient>
19
20
  session: Session | null;
20
21
  }>;
21
22
  export declare function writeGoal(client: ReturnType<typeof createOpencodeClient>, sessionID: string, goal: GoalData | null, existingSession?: Session | null): Promise<void>;
22
- export declare function createGoalTool(client: ReturnType<typeof createOpencodeClient>): {
23
+ /**
24
+ * 读取 session metadata 中的 GoalFlowRunRef。
25
+ * 返回 null 表示尚未绑定。
26
+ */
27
+ export declare function readFlowRunRef(client: ReturnType<typeof createOpencodeClient>, sessionID: string): Promise<GoalFlowRunRef | null>;
28
+ /**
29
+ * Goal → FlowRun 绑定结果。
30
+ */
31
+ export type BindFlowRunResult = {
32
+ ok: true;
33
+ } | {
34
+ ok: false;
35
+ code: "GOAL_FLOW_CONFLICT";
36
+ message: string;
37
+ };
38
+ /**
39
+ * 原子绑定 Goal → FlowRun。
40
+ *
41
+ * 规则:
42
+ * - 未绑定 → 写入 flowRunRef,返回 ok
43
+ * - 已绑定同一 FlowRun(repo + parentIssueNumber + flowRunId 相同)→ 幂等,返回 ok
44
+ * - 已绑定不同 FlowRun → 返回 GOAL_FLOW_CONFLICT
45
+ */
46
+ export declare function bindFlowRunRef(client: ReturnType<typeof createOpencodeClient>, sessionID: string, ref: GoalFlowRunRef): Promise<BindFlowRunResult>;
47
+ /**
48
+ * 解析 GoalFlowRunRef 的显示名称。
49
+ */
50
+ export declare function formatFlowRunRef(ref: GoalFlowRunRef): string;
51
+ /**
52
+ * 验证 FlowRun 终态 — 检查是否满足 Goal complete 的前提条件。
53
+ *
54
+ * 返回 null 表示允许完成;
55
+ * 返回错误信息字符串表示阻止完成。
56
+ *
57
+ * @param flowRunStatus FlowRun 当前状态,null 表示无绑定的 FlowRun
58
+ */
59
+ export declare function checkFlowRunBlockers(flowRunStatus: string | null): string | null;
60
+ export declare function createGoalTool(client: ReturnType<typeof createOpencodeClient>, onBeforeComplete?: (parentSessionID: string) => Promise<string | null>): {
23
61
  description: string;
24
62
  args: {
25
63
  op: import("zod").ZodEnum<{
@@ -98,7 +98,79 @@ export async function writeGoal(client, sessionID, goal, existingSession) {
98
98
  : { ...existing, goal };
99
99
  await client.session.update({ sessionID, metadata });
100
100
  }
101
- export function createGoalTool(client) {
101
+ // ─── GoalFlowRunRef 绑定 ───
102
+ /**
103
+ * 读取 session metadata 中的 GoalFlowRunRef。
104
+ * 返回 null 表示尚未绑定。
105
+ */
106
+ export async function readFlowRunRef(client, sessionID) {
107
+ try {
108
+ const result = await client.session.get({ sessionID });
109
+ const session = result?.data ?? null;
110
+ const ref = session?.metadata?.flowRunRef;
111
+ return ref ?? null;
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ /**
118
+ * 原子绑定 Goal → FlowRun。
119
+ *
120
+ * 规则:
121
+ * - 未绑定 → 写入 flowRunRef,返回 ok
122
+ * - 已绑定同一 FlowRun(repo + parentIssueNumber + flowRunId 相同)→ 幂等,返回 ok
123
+ * - 已绑定不同 FlowRun → 返回 GOAL_FLOW_CONFLICT
124
+ */
125
+ export async function bindFlowRunRef(client, sessionID, ref) {
126
+ const result = await client.session.get({ sessionID });
127
+ const session = result?.data ?? null;
128
+ if (!session)
129
+ return { ok: false, code: "GOAL_FLOW_CONFLICT", message: "Session not found" };
130
+ const existingRef = session.metadata?.flowRunRef;
131
+ if (existingRef) {
132
+ const isSame = existingRef.repo === ref.repo &&
133
+ existingRef.parentIssueNumber === ref.parentIssueNumber &&
134
+ existingRef.flowRunId === ref.flowRunId;
135
+ if (!isSame) {
136
+ return {
137
+ ok: false,
138
+ code: "GOAL_FLOW_CONFLICT",
139
+ message: `Goal is already bound to FlowRun "${existingRef.flowRunId}", cannot bind to "${ref.flowRunId}"`,
140
+ };
141
+ }
142
+ // 同一 FlowRun → 幂等
143
+ return { ok: true };
144
+ }
145
+ // 未绑定 → 写入
146
+ const existing = session.metadata ?? {};
147
+ const metadata = { ...existing, flowRunRef: ref };
148
+ await client.session.update({ sessionID, metadata });
149
+ return { ok: true };
150
+ }
151
+ /**
152
+ * 解析 GoalFlowRunRef 的显示名称。
153
+ */
154
+ export function formatFlowRunRef(ref) {
155
+ return `${ref.repo}#${ref.parentIssueNumber} (${ref.flowRunId})`;
156
+ }
157
+ /**
158
+ * 验证 FlowRun 终态 — 检查是否满足 Goal complete 的前提条件。
159
+ *
160
+ * 返回 null 表示允许完成;
161
+ * 返回错误信息字符串表示阻止完成。
162
+ *
163
+ * @param flowRunStatus FlowRun 当前状态,null 表示无绑定的 FlowRun
164
+ */
165
+ export function checkFlowRunBlockers(flowRunStatus) {
166
+ if (flowRunStatus === null)
167
+ return null; // 无 FlowRun 绑定,允许完成
168
+ if (flowRunStatus !== "completed" && flowRunStatus !== "cancelled") {
169
+ return `FlowRun is not in terminal state (status: ${flowRunStatus}). Run flow_control({op:"run-finalize"}) to finalize first.`;
170
+ }
171
+ return null;
172
+ }
173
+ export function createGoalTool(client, onBeforeComplete) {
102
174
  return tool({
103
175
  description: `Manage the active goal-mode objective.
104
176
 
@@ -133,6 +205,13 @@ Use a single op field:
133
205
  if (parent.goal.status !== "active") {
134
206
  return `Parent session goal is not active (status: ${parent.goal.status}).`;
135
207
  }
208
+ // 验证 FlowRun 终态(如绑定了 FlowRunRef)
209
+ if (onBeforeComplete) {
210
+ const blockReason = await onBeforeComplete(targetSessionID);
211
+ if (blockReason !== null) {
212
+ return `Goal completion blocked: ${blockReason}`;
213
+ }
214
+ }
136
215
  parent.goal.status = "complete";
137
216
  await writeGoal(client, targetSessionID, parent.goal, parent.session);
138
217
  return `Goal completed and verified: "${parent.goal.objective}"`;
@@ -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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"}
@@ -1,6 +1,7 @@
1
1
  import { globSync } from "node:fs";
2
2
  import { readFileSync, existsSync } from "node:fs";
3
3
  import path from "node:path";
4
+ import { parse as parseYaml } from "yaml";
4
5
  const CONTRACT_SECTIONS = [
5
6
  "Trigger", "Inputs", "Preconditions", "Procedure",
6
7
  "Outputs", "Failure", "Idempotency", "Prohibited Actions",
@@ -135,6 +136,133 @@ function checkAgentCapabilityConsistency(content, filePath) {
135
136
  }
136
137
  return findings;
137
138
  }
139
+ function isWorkerAgent(filePath) {
140
+ return filePath.includes("backend") || filePath.includes("frontend");
141
+ }
142
+ function isReviewerAgent(filePath) {
143
+ return filePath.includes("reviewer");
144
+ }
145
+ function permissionKeyMatchesCommand(key, command) {
146
+ if (key === "*")
147
+ return false;
148
+ if (key === command)
149
+ return true;
150
+ if (key.endsWith("*")) {
151
+ const prefix = key.slice(0, -1).trim();
152
+ if (prefix.length === 0)
153
+ return false;
154
+ return command === prefix || command.startsWith(prefix + " ");
155
+ }
156
+ return false;
157
+ }
158
+ function permissionValueAllowsCommand(permValue, commandPattern) {
159
+ if (typeof permValue === "string") {
160
+ return permValue !== "deny" && permValue.includes(commandPattern);
161
+ }
162
+ if (permValue && typeof permValue === "object") {
163
+ const rules = permValue;
164
+ return Object.entries(rules).some(([key, action]) => {
165
+ if (action === "deny")
166
+ return false;
167
+ return permissionKeyMatchesCommand(key, commandPattern);
168
+ });
169
+ }
170
+ return false;
171
+ }
172
+ function permissionValueAllowsAny(permValue) {
173
+ if (!permValue || permValue === "deny")
174
+ return false;
175
+ if (typeof permValue === "string")
176
+ return true;
177
+ if (typeof permValue === "object") {
178
+ return Object.entries(permValue).some(([key, v]) => {
179
+ if (key === "*")
180
+ return false;
181
+ return v !== "deny";
182
+ });
183
+ }
184
+ return false;
185
+ }
186
+ function checkAgentPermission(content, filePath) {
187
+ const findings = [];
188
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
189
+ if (!frontmatterMatch)
190
+ return findings;
191
+ const fm = frontmatterMatch[1];
192
+ const hasPermission = /^permission:/m.test(fm);
193
+ if (!hasPermission) {
194
+ findings.push({
195
+ severity: "warn",
196
+ file: filePath,
197
+ rule: "missing-permission",
198
+ message: "agent frontmatter is missing 'permission' field",
199
+ });
200
+ return findings;
201
+ }
202
+ let permissionParsed = null;
203
+ try {
204
+ const parsed = parseYaml(fm);
205
+ permissionParsed = parsed?.permission ?? null;
206
+ }
207
+ catch { }
208
+ // Rule: Worker must not have gh pr create|merge in permission.bash
209
+ if (isWorkerAgent(filePath)) {
210
+ const bashPerm = permissionParsed?.bash;
211
+ if (permissionValueAllowsCommand(bashPerm, "gh pr create") ||
212
+ permissionValueAllowsCommand(bashPerm, "gh pr merge")) {
213
+ findings.push({
214
+ severity: "error",
215
+ file: filePath,
216
+ rule: "worker-gh-write-permission",
217
+ message: "worker agent declares gh pr create/merge in permission.bash",
218
+ });
219
+ }
220
+ }
221
+ // Rule: Reviewer must have edit: deny
222
+ if (isReviewerAgent(filePath)) {
223
+ const editPerm = permissionParsed?.edit;
224
+ const isEditDenied = editPerm === "deny" ||
225
+ (typeof editPerm === "object" && editPerm !== null &&
226
+ Object.values(editPerm).every(v => v === "deny"));
227
+ if (!isEditDenied) {
228
+ findings.push({
229
+ severity: "error",
230
+ file: filePath,
231
+ rule: "reviewer-write-permission",
232
+ message: `reviewer agent must have edit: "deny"`,
233
+ });
234
+ }
235
+ }
236
+ // Rule: capabilities vs permission consistency
237
+ const modifyFiles = fm.match(/^\s+modify_files:\s*(true|false)/m);
238
+ const runTests = fm.match(/^\s+run_tests:\s*(true|false)/m);
239
+ const pushBranch = fm.match(/^\s+push_branch:\s*(true|false)/m);
240
+ if (modifyFiles?.[1] === "true" && permissionParsed?.edit === "deny") {
241
+ findings.push({
242
+ severity: "warn",
243
+ file: filePath,
244
+ rule: "capability-permission-mismatch",
245
+ message: "capabilities.modify_files is true but permission.edit is deny",
246
+ });
247
+ }
248
+ if (runTests?.[1] === "true" && !permissionValueAllowsAny(permissionParsed?.bash)) {
249
+ findings.push({
250
+ severity: "warn",
251
+ file: filePath,
252
+ rule: "capability-permission-mismatch",
253
+ message: "capabilities.run_tests is true but permission.bash is not declared or is deny",
254
+ });
255
+ }
256
+ if (pushBranch?.[1] === "true" && !permissionValueAllowsCommand(permissionParsed?.bash, "git push")) {
257
+ findings.push({
258
+ severity: "warn",
259
+ file: filePath,
260
+ rule: "capability-permission-mismatch",
261
+ message: "capabilities.push_branch is true but permission.bash does not include 'git push'",
262
+ });
263
+ }
264
+ return findings;
265
+ }
138
266
  export function lintAll(projectRoot) {
139
267
  const assetDirs = ["assets/agents", "assets/skills", "assets/commands", "assets/prompts"];
140
268
  const files = findMdFiles(projectRoot, assetDirs);
@@ -148,6 +276,7 @@ export function lintAll(projectRoot) {
148
276
  allFindings.push(...checkRelativeRefs(content, file));
149
277
  if (file.includes("agents/")) {
150
278
  allFindings.push(...checkAgentCapabilityConsistency(content, file));
279
+ allFindings.push(...checkAgentPermission(content, file));
151
280
  }
152
281
  }
153
282
  const errors = allFindings.filter(f => f.severity === "error");
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-lint.js","sourceRoot":"","sources":["../../src/plugin/prompt-lint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-lint.js","sourceRoot":"","sources":["../../src/plugin/prompt-lint.ts"],"names":[],"mappings":"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"}