@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
@@ -26,6 +26,208 @@ export interface StageState {
26
26
  completedAt: string | null;
27
27
  evidence: EvidenceEntry[];
28
28
  }
29
+ export interface AcceptanceCriterion {
30
+ id: string;
31
+ description: string;
32
+ verification: "tdd" | "regression" | "manual";
33
+ }
34
+ export type TddMode = "strict" | "relaxed" | "bypass";
35
+ export type TddEnforcement = "advisory" | "runtime";
36
+ export interface TddRunnerPolicy {
37
+ adapter: "vitest";
38
+ baseCommand: string;
39
+ timeoutMs: number;
40
+ executionInputPatterns: string[];
41
+ }
42
+ export interface VersionedDigest {
43
+ algorithm: "sha256-content-v1" | "sha256-output-v1" | "git-tree-v1";
44
+ value: string;
45
+ }
46
+ export type TddApproval = {
47
+ kind: "planning-pr";
48
+ repo: string;
49
+ prNumber: number;
50
+ reviewId: number;
51
+ approver: string;
52
+ mergedCommitSha: string;
53
+ policyDigest: string;
54
+ } | {
55
+ kind: "issue-comment";
56
+ repo: string;
57
+ issueNumber: number;
58
+ commentId: number;
59
+ approver: string;
60
+ commentBodyDigest: VersionedDigest;
61
+ policyDigest: string;
62
+ } | {
63
+ kind: "legacy-migration";
64
+ fromSchemaVersion: 1;
65
+ };
66
+ export interface TaskCommand {
67
+ command: string;
68
+ cwd: string;
69
+ timeoutMs: number;
70
+ env: Record<string, string>;
71
+ }
72
+ export type AlternativeValidation = {
73
+ validationId: string;
74
+ kind: "command";
75
+ command: TaskCommand;
76
+ } | {
77
+ validationId: string;
78
+ kind: "manual";
79
+ description: string;
80
+ };
81
+ export interface TddException {
82
+ reason: string;
83
+ alternativeValidation: AlternativeValidation[];
84
+ approval: TddApproval;
85
+ }
86
+ export interface TddPolicy {
87
+ mode: TddMode;
88
+ enforcement: TddEnforcement;
89
+ runner: TddRunnerPolicy | null;
90
+ testFilePatterns: string[];
91
+ implementationFilePatterns: string[];
92
+ generatedArtifactPatterns: string[];
93
+ exception: TddException | null;
94
+ source: {
95
+ manifestPath: string;
96
+ revisionSha: string;
97
+ };
98
+ }
99
+ export type TddFailureKind = "assertion" | "missing-behavior" | "infrastructure" | "timeout" | "unknown";
100
+ export interface TddCommandEvidence {
101
+ command: string;
102
+ testSelector: string | null;
103
+ exitCode: number | null;
104
+ failureKind: TddFailureKind | null;
105
+ testsCollected: number | null;
106
+ testsFailed: number | null;
107
+ startedAt: string;
108
+ finishedAt: string;
109
+ durationMs: number;
110
+ changedFiles: string[];
111
+ outputDigest: VersionedDigest;
112
+ workspaceDigest: VersionedDigest;
113
+ executionInputDigest: VersionedDigest;
114
+ summary: string;
115
+ }
116
+ export interface TddTaskStartEvidence {
117
+ status: "pending" | "pass" | "fail";
118
+ headSha: string | null;
119
+ treeSha: string | null;
120
+ startedAt: string | null;
121
+ }
122
+ export interface TaskExecutionBinding {
123
+ branch: string;
124
+ baseSha: string;
125
+ startHeadSha: string;
126
+ worktreeId: string;
127
+ sessionId: string;
128
+ }
129
+ export interface TddCycleEvidence {
130
+ cycleId: string;
131
+ criterionId: string;
132
+ reworkRevision: number;
133
+ status: "started" | "red" | "pass" | "failed" | "abandoned";
134
+ startWorkspaceDigest: VersionedDigest;
135
+ testFiles: string[];
136
+ redTestDigest: VersionedDigest | null;
137
+ redAttempts: TddCommandEvidence[];
138
+ greenAttempts: TddCommandEvidence[];
139
+ }
140
+ export interface TddRegressionEvidence {
141
+ status: "pending" | "pass" | "fail" | "skipped";
142
+ headSha: string | null;
143
+ treeSha: string | null;
144
+ reworkRevision: number;
145
+ runs: TddCommandEvidence[];
146
+ }
147
+ export interface FinalVerificationEvidence {
148
+ status: "pending" | "pass" | "fail";
149
+ headSha: string | null;
150
+ treeSha: string | null;
151
+ runs: TddCommandEvidence[];
152
+ }
153
+ export type AlternativeValidationEvidence = {
154
+ validationId: string;
155
+ kind: "command";
156
+ status: "pass" | "fail";
157
+ headSha: string;
158
+ treeSha: string;
159
+ reworkRevision: number;
160
+ evidence: TddCommandEvidence;
161
+ } | {
162
+ validationId: string;
163
+ kind: "manual";
164
+ status: "pass" | "fail";
165
+ headSha: string;
166
+ treeSha: string;
167
+ reworkRevision: number;
168
+ reviewRef: string;
169
+ reviewer: string;
170
+ contentDigest: VersionedDigest;
171
+ policyDigest: string;
172
+ summary: string;
173
+ };
174
+ export interface ReworkApproval {
175
+ reworkRevision: number;
176
+ kind: "refactor";
177
+ headSha: string;
178
+ treeSha: string;
179
+ reviewerSessionId: string;
180
+ reviewerMessageId: string;
181
+ contentDigest: VersionedDigest;
182
+ policyDigest: string;
183
+ }
184
+ export interface TddReworkEvidence {
185
+ reworkRevision: number;
186
+ kind: "behavior" | "refactor";
187
+ affectedCriterionIds: string[];
188
+ status: "started" | "evidence-ready" | "pass" | "fail";
189
+ startHeadSha: string;
190
+ approval: ReworkApproval | null;
191
+ }
192
+ export interface TddEvidence {
193
+ revision: number;
194
+ reworkRevision: number;
195
+ status: "not-recorded" | "pending" | "in-progress" | "pass" | "fail" | "waived";
196
+ taskStart: TddTaskStartEvidence;
197
+ cycles: TddCycleEvidence[];
198
+ regression: TddRegressionEvidence;
199
+ verification: FinalVerificationEvidence;
200
+ alternativeValidation: AlternativeValidationEvidence[];
201
+ reworks: TddReworkEvidence[];
202
+ warnings: string[];
203
+ updatedAt: string | null;
204
+ }
205
+ export interface CoveragePolicy {
206
+ command: string;
207
+ threshold: number;
208
+ report: {
209
+ format: "istanbul-json-summary";
210
+ path: string;
211
+ metric: "lines";
212
+ };
213
+ }
214
+ export interface CoverageEvidence {
215
+ status: "pending" | "pass" | "fail";
216
+ headSha: string;
217
+ actual: number | null;
218
+ threshold: number;
219
+ metric: "lines";
220
+ reportDigest: string | null;
221
+ summary: string;
222
+ }
223
+ export interface TddComplianceCheckpoint {
224
+ status: "pending" | "pass" | "fail" | "waived";
225
+ evidenceRevision: number;
226
+ reworkRevision: number;
227
+ headSha: string;
228
+ treeSha: string;
229
+ summary: string;
230
+ }
29
231
  export interface PRCheckpoints {
30
232
  prNumber: number;
31
233
  localChecks: Checkpoint;
@@ -34,6 +236,10 @@ export interface PRCheckpoints {
34
236
  goalVerification: Checkpoint;
35
237
  branchProtection: Checkpoint;
36
238
  mergeResult: Checkpoint;
239
+ tddCompliance: TddComplianceCheckpoint | null;
240
+ verification: FinalVerificationEvidence | null;
241
+ coverage: CoverageEvidence | null;
242
+ qualityContractDigest: string | null;
37
243
  }
38
244
  export interface TaskState {
39
245
  id: string;
@@ -42,16 +248,29 @@ export interface TaskState {
42
248
  dependsOn: string[];
43
249
  area: string;
44
250
  expectedFiles: string[];
45
- testCommands: string[];
46
- acceptance: string;
47
251
  parallelSafe: boolean;
48
252
  prNumber: number | null;
49
253
  prCheckpoints: PRCheckpoints | null;
50
254
  blockedReason: string | null;
51
255
  startedAt: string | null;
256
+ acceptanceCriteria: AcceptanceCriterion[];
257
+ testCommands: TaskCommand[];
258
+ verifyCommands: TaskCommand[];
259
+ executionBinding: TaskExecutionBinding | null;
260
+ tddPolicy: TddPolicy;
261
+ tddEvidence: TddEvidence;
262
+ coveragePolicy: CoveragePolicy | null;
263
+ }
264
+ export interface RepositoryQualityPolicy {
265
+ mode: "off" | "required";
266
+ requiredChecks: Array<{
267
+ context: string;
268
+ appId: number;
269
+ workflowPath: string;
270
+ workflowRef: string;
271
+ workflowBlobSha: string;
272
+ }>;
52
273
  }
53
- export declare const CURRENT_SCHEMA_VERSION = 1;
54
- export declare const DEFAULT_MAX_RUNTIME_MS = 86400000;
55
274
  export interface FlowRun {
56
275
  flowRunId: string;
57
276
  repo: string;
@@ -66,7 +285,63 @@ export interface FlowRun {
66
285
  nextTickAfter: string | null;
67
286
  maxRuntime: number;
68
287
  completedAt: string | null;
288
+ repositoryQualityPolicy: RepositoryQualityPolicy;
289
+ }
290
+ export interface GoalFlowRunRef {
291
+ repo: string;
292
+ parentIssueNumber: number;
293
+ flowRunId: string;
69
294
  }
295
+ export type FlowControlOp = "run-start" | "stage-start" | "stage-complete" | "task-start" | "pr-create" | "run-finalize";
296
+ export interface FlowControlRequest {
297
+ op: FlowControlOp;
298
+ parentIssueNumber: number;
299
+ stage?: FlowStage;
300
+ taskId?: string;
301
+ executionBinding?: TaskExecutionBinding;
302
+ tddPolicy?: TddPolicy;
303
+ currentHeadSha?: string;
304
+ prTitle?: string;
305
+ prBody?: string;
306
+ baseBranch?: string;
307
+ }
308
+ export interface FlowControlResponse {
309
+ ok: boolean;
310
+ error?: {
311
+ code: string;
312
+ message: string;
313
+ };
314
+ flowRunStatus?: FlowRunStatus;
315
+ stage?: {
316
+ name: FlowStage;
317
+ status: StageStatus;
318
+ };
319
+ task?: {
320
+ taskId: string;
321
+ status: TaskStatus;
322
+ executionBinding?: TaskExecutionBinding | null;
323
+ };
324
+ pr?: {
325
+ prNumber: number;
326
+ prUrl: string;
327
+ created: boolean;
328
+ };
329
+ }
330
+ export interface ValidationError {
331
+ path: string;
332
+ message: string;
333
+ }
334
+ export type FlowRunReadResult = {
335
+ ok: true;
336
+ data: FlowRun;
337
+ migrated: boolean;
338
+ } | {
339
+ ok: false;
340
+ code: "NOT_FOUND" | "INVALID_JSON" | "UNSUPPORTED_SCHEMA" | "MIGRATION_FAILED" | "VALIDATION_FAILED";
341
+ errors: ValidationError[];
342
+ };
343
+ export declare const CURRENT_SCHEMA_VERSION = 2;
344
+ export declare const DEFAULT_MAX_RUNTIME_MS = 86400000;
70
345
  export declare const CABINET_START_MARKER = "<!-- cabbage-flow-run:start -->";
71
346
  export declare const CABINET_END_MARKER = "<!-- cabbage-flow-run:end -->";
72
347
  export declare const LABEL_PREFIX = "cabbage:";
@@ -3,7 +3,8 @@ export const FLOW_RUN_STATUSES = ["planned", "running", "blocked", "merging", "c
3
3
  export const TASK_STATUSES = ["pending", "ready", "running", "blocked", "reviewing", "merged", "cancelled"];
4
4
  export const STAGE_STATUSES = ["pending", "running", "pass", "failed", "blocked"];
5
5
  export const CHECKPOINT_STATUSES = ["pending", "pass", "fail"];
6
- export const CURRENT_SCHEMA_VERSION = 1;
6
+ // ─── 常量 ───
7
+ export const CURRENT_SCHEMA_VERSION = 2;
7
8
  export const DEFAULT_MAX_RUNTIME_MS = 86_400_000;
8
9
  export const CABINET_START_MARKER = "<!-- cabbage-flow-run:start -->";
9
10
  export const CABINET_END_MARKER = "<!-- cabbage-flow-run:end -->";
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/flowrun/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAG9G,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAU,CAAA;AAGhH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAA;AAGpH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAA;AAG1F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAU,CAAA;AAkDvE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAA;AACvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAA;AAkBhD,MAAM,CAAC,MAAM,oBAAoB,GAAG,iCAAiC,CAAA;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAA+B,CAAA;AAEjE,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAA;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,GAAG,YAAY,MAAM;IAC3B,OAAO,EAAE,GAAG,YAAY,SAAS;IACjC,OAAO,EAAE,GAAG,YAAY,SAAS;IACjC,OAAO,EAAE,GAAG,YAAY,SAAS;IACjC,SAAS,EAAE,GAAG,YAAY,WAAW;IACrC,SAAS,EAAE,GAAG,YAAY,WAAW;IACrC,MAAM,EAAE,GAAG,YAAY,QAAQ;CACvB,CAAA"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/flowrun/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAG9G,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAU,CAAA;AAGhH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAA;AAGpH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAA;AAG1F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAU,CAAA;AAoZvE,aAAa;AAEb,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAA;AACvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAA;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAAG,iCAAiC,CAAA;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAA+B,CAAA;AAEjE,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAA;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,GAAG,YAAY,MAAM;IAC3B,OAAO,EAAE,GAAG,YAAY,SAAS;IACjC,OAAO,EAAE,GAAG,YAAY,SAAS;IACjC,OAAO,EAAE,GAAG,YAAY,SAAS;IACjC,SAAS,EAAE,GAAG,YAAY,WAAW;IACrC,SAAS,EAAE,GAAG,YAAY,WAAW;IACrC,MAAM,EAAE,GAAG,YAAY,QAAQ;CACvB,CAAA"}
@@ -1,9 +1,19 @@
1
- import { type FlowRun } from "./types.js";
2
- export interface ValidationError {
3
- path: string;
4
- message: string;
5
- }
1
+ import { type FlowRun, type TaskState, type ValidationError } from "./types.js";
2
+ export type { ValidationError } from "./types.js";
6
3
  export declare function validateFlowRun(raw: unknown): {
7
4
  data: FlowRun | null;
8
5
  errors: ValidationError[];
9
6
  };
7
+ export interface DagValidationError {
8
+ path: string;
9
+ message: string;
10
+ }
11
+ /**
12
+ * 验证 Task DAG:
13
+ * - Task ID 唯一
14
+ * - record key 与 Task.id 一致
15
+ * - 所有依赖存在
16
+ * - 禁止自依赖
17
+ * - 检测环路
18
+ */
19
+ export declare function validateFlowRunDag(tasks: Record<string, TaskState>): DagValidationError[];
@@ -1,4 +1,4 @@
1
- import { FLOW_RUN_STAGES, FLOW_RUN_STATUSES, TASK_STATUSES, STAGE_STATUSES, CHECKPOINT_STATUSES, CURRENT_SCHEMA_VERSION, } from "./types.js";
1
+ import { FLOW_RUN_STAGES, FLOW_RUN_STATUSES, TASK_STATUSES, STAGE_STATUSES, CHECKPOINT_STATUSES, } from "./types.js";
2
2
  export function validateFlowRun(raw) {
3
3
  const errors = [];
4
4
  if (!raw || typeof raw !== "object") {
@@ -24,8 +24,21 @@ export function validateFlowRun(raw) {
24
24
  if (typeof obj.revision !== "number" || obj.revision < 0) {
25
25
  errors.push({ path: "revision", message: "Required non-negative number" });
26
26
  }
27
- const stageValidation = validateStages(obj.stages, errors);
28
- const taskValidation = validateTasks(obj.tasks, errors);
27
+ // v2: FlowRun 级 repositoryQualityPolicy
28
+ if (!obj.repositoryQualityPolicy || typeof obj.repositoryQualityPolicy !== "object") {
29
+ errors.push({ path: "repositoryQualityPolicy", message: "Required object" });
30
+ }
31
+ else {
32
+ const rqp = obj.repositoryQualityPolicy;
33
+ if (typeof rqp.mode !== "string" || !["off", "required"].includes(rqp.mode)) {
34
+ errors.push({ path: "repositoryQualityPolicy.mode", message: 'Must be "off" or "required"' });
35
+ }
36
+ if (!Array.isArray(rqp.requiredChecks)) {
37
+ errors.push({ path: "repositoryQualityPolicy.requiredChecks", message: "Required array" });
38
+ }
39
+ }
40
+ validateStages(obj.stages, errors);
41
+ validateTasks(obj.tasks, errors);
29
42
  const data = errors.length === 0 ? raw : null;
30
43
  return { data, errors };
31
44
  }
@@ -47,7 +60,7 @@ function validateStages(stages, errors) {
47
60
  }
48
61
  function validateStage(stageKey, stage, errors) {
49
62
  if (!STAGE_STATUSES.includes(stage.status)) {
50
- errors.push({ path: `stages.${stageKey}.status`, message: `Invalid stage status` });
63
+ errors.push({ path: `stages.${stageKey}.status`, message: "Invalid stage status" });
51
64
  }
52
65
  if (!Array.isArray(stage.requiredArtifacts)) {
53
66
  errors.push({ path: `stages.${stageKey}.requiredArtifacts`, message: "Required array" });
@@ -82,7 +95,7 @@ function validateTask(taskKey, task, errors) {
82
95
  errors.push({ path: `tasks.${taskKey}.id`, message: "Required string" });
83
96
  }
84
97
  if (!TASK_STATUSES.includes(task.status)) {
85
- errors.push({ path: `tasks.${taskKey}.status`, message: `Invalid task status` });
98
+ errors.push({ path: `tasks.${taskKey}.status`, message: "Invalid task status" });
86
99
  }
87
100
  if (!Array.isArray(task.dependsOn)) {
88
101
  errors.push({ path: `tasks.${taskKey}.dependsOn`, message: "Required array" });
@@ -93,5 +106,104 @@ function validateTask(taskKey, task, errors) {
93
106
  if (!Array.isArray(task.testCommands)) {
94
107
  errors.push({ path: `tasks.${taskKey}.testCommands`, message: "Required array" });
95
108
  }
109
+ // v2: acceptanceCriteria
110
+ if (!Array.isArray(task.acceptanceCriteria)) {
111
+ errors.push({ path: `tasks.${taskKey}.acceptanceCriteria`, message: "Required array" });
112
+ }
113
+ // v2: verifyCommands
114
+ if (!Array.isArray(task.verifyCommands)) {
115
+ errors.push({ path: `tasks.${taskKey}.verifyCommands`, message: "Required array" });
116
+ }
117
+ // v2: tddPolicy
118
+ if (!task.tddPolicy || typeof task.tddPolicy !== "object") {
119
+ errors.push({ path: `tasks.${taskKey}.tddPolicy`, message: "Required object" });
120
+ }
121
+ // v2: tddEvidence
122
+ if (!task.tddEvidence || typeof task.tddEvidence !== "object") {
123
+ errors.push({ path: `tasks.${taskKey}.tddEvidence`, message: "Required object" });
124
+ }
125
+ }
126
+ /**
127
+ * 验证 Task DAG:
128
+ * - Task ID 唯一
129
+ * - record key 与 Task.id 一致
130
+ * - 所有依赖存在
131
+ * - 禁止自依赖
132
+ * - 检测环路
133
+ */
134
+ export function validateFlowRunDag(tasks) {
135
+ const errors = [];
136
+ // Task ID 唯一(Record key 天然唯一,检查 key 与 id 是否一致)
137
+ const seenIds = new Set();
138
+ for (const [key, task] of Object.entries(tasks)) {
139
+ if (key !== task.id) {
140
+ errors.push({ path: `tasks.${key}`, message: `Record key "${key}" does not match task.id "${task.id}"` });
141
+ }
142
+ if (seenIds.has(task.id)) {
143
+ errors.push({ path: `tasks.${key}`, message: `Duplicate task id "${task.id}"` });
144
+ }
145
+ seenIds.add(task.id);
146
+ }
147
+ // 禁止自依赖 + 依赖存在
148
+ for (const [key, task] of Object.entries(tasks)) {
149
+ for (const dep of task.dependsOn) {
150
+ if (dep === task.id) {
151
+ errors.push({ path: `tasks.${key}.dependsOn`, message: `Task "${task.id}" depends on itself` });
152
+ }
153
+ if (!seenIds.has(dep)) {
154
+ errors.push({ path: `tasks.${key}.dependsOn`, message: `Dependency "${dep}" not found in tasks` });
155
+ }
156
+ }
157
+ }
158
+ // 环路检测(拓扑排序)
159
+ if (errors.length === 0) {
160
+ const cycleError = detectCycle(tasks, seenIds);
161
+ if (cycleError) {
162
+ errors.push(cycleError);
163
+ }
164
+ }
165
+ return errors;
166
+ }
167
+ /**
168
+ * 拓扑排序检测环路,返回发现环路时的错误
169
+ */
170
+ function detectCycle(tasks, allIds) {
171
+ const inDegree = new Map();
172
+ const adjacency = new Map();
173
+ for (const id of allIds) {
174
+ inDegree.set(id, 0);
175
+ adjacency.set(id, []);
176
+ }
177
+ for (const task of Object.values(tasks)) {
178
+ for (const dep of task.dependsOn) {
179
+ adjacency.get(dep).push(task.id);
180
+ inDegree.set(task.id, (inDegree.get(task.id) ?? 0) + 1);
181
+ }
182
+ }
183
+ const queue = [];
184
+ for (const [id, degree] of inDegree) {
185
+ if (degree === 0)
186
+ queue.push(id);
187
+ }
188
+ let visitedCount = 0;
189
+ while (queue.length > 0) {
190
+ const current = queue.shift();
191
+ visitedCount++;
192
+ for (const neighbor of adjacency.get(current) ?? []) {
193
+ const newDegree = (inDegree.get(neighbor) ?? 1) - 1;
194
+ inDegree.set(neighbor, newDegree);
195
+ if (newDegree === 0)
196
+ queue.push(neighbor);
197
+ }
198
+ }
199
+ if (visitedCount !== allIds.size) {
200
+ // 找出环路中的节点
201
+ const cycleNodes = [...allIds].filter(id => (inDegree.get(id) ?? 0) > 0);
202
+ return {
203
+ path: "tasks",
204
+ message: `Circular dependency detected involving: ${cycleNodes.join(", ")}`,
205
+ };
206
+ }
207
+ return null;
96
208
  }
97
209
  //# sourceMappingURL=validator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/flowrun/validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/flowrun/validator.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,9 @@ export interface AgentCapabilities {
13
13
  approve_review: boolean;
14
14
  complete_goal: boolean;
15
15
  }
16
+ export interface AgentPermission {
17
+ [key: string]: string | Record<string, string> | undefined;
18
+ }
16
19
  export interface AgentEntry {
17
20
  key: string;
18
21
  description?: string;
@@ -20,6 +23,7 @@ export interface AgentEntry {
20
23
  color?: string;
21
24
  tools?: AgentTools;
22
25
  capabilities?: AgentCapabilities;
26
+ permission?: AgentPermission;
23
27
  prompt: string;
24
28
  }
25
29
  export declare function loadAgents(agentsDir: string): AgentEntry[];
@@ -41,6 +41,24 @@ function parseAgentFile(filePath) {
41
41
  complete_goal: Boolean(capabilitiesRaw.complete_goal),
42
42
  }
43
43
  : undefined;
44
+ const permissionRaw = parsed.permission;
45
+ const permission = permissionRaw && typeof permissionRaw === "object" && !Array.isArray(permissionRaw)
46
+ ? Object.fromEntries(Object.entries(permissionRaw)
47
+ .map(([key, value]) => {
48
+ if (typeof value === "string")
49
+ return [key, value];
50
+ if (value && typeof value === "object" && !Array.isArray(value)) {
51
+ const rules = {};
52
+ for (const [pattern, action] of Object.entries(value)) {
53
+ if (typeof action === "string")
54
+ rules[pattern] = action;
55
+ }
56
+ return [key, rules];
57
+ }
58
+ return [key, undefined];
59
+ })
60
+ .filter(([, v]) => v !== undefined))
61
+ : undefined;
44
62
  return {
45
63
  key: name,
46
64
  description: parsed.description,
@@ -48,6 +66,7 @@ function parseAgentFile(filePath) {
48
66
  color: parsed.color,
49
67
  tools,
50
68
  capabilities,
69
+ permission,
51
70
  prompt: body,
52
71
  };
53
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/plugin/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/plugin/agents.ts"],"names":[],"mappings":"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"}