yet-another-agentic-workflow 0.2.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 (61) hide show
  1. package/README.md +125 -0
  2. package/dist/adapters.d.ts +43 -0
  3. package/dist/adapters.js +191 -0
  4. package/dist/adapters.js.map +1 -0
  5. package/dist/architect.d.ts +38 -0
  6. package/dist/architect.js +275 -0
  7. package/dist/architect.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +580 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/feature.d.ts +30 -0
  12. package/dist/feature.js +344 -0
  13. package/dist/feature.js.map +1 -0
  14. package/dist/index.d.ts +22 -0
  15. package/dist/index.js +12 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/init.d.ts +26 -0
  18. package/dist/init.js +255 -0
  19. package/dist/init.js.map +1 -0
  20. package/dist/installer.d.ts +64 -0
  21. package/dist/installer.js +365 -0
  22. package/dist/installer.js.map +1 -0
  23. package/dist/observability.d.ts +37 -0
  24. package/dist/observability.js +200 -0
  25. package/dist/observability.js.map +1 -0
  26. package/dist/parser.d.ts +6 -0
  27. package/dist/parser.js +166 -0
  28. package/dist/parser.js.map +1 -0
  29. package/dist/persistence.d.ts +83 -0
  30. package/dist/persistence.js +279 -0
  31. package/dist/persistence.js.map +1 -0
  32. package/dist/providers.d.ts +14 -0
  33. package/dist/providers.js +27 -0
  34. package/dist/providers.js.map +1 -0
  35. package/dist/review.d.ts +29 -0
  36. package/dist/review.js +66 -0
  37. package/dist/review.js.map +1 -0
  38. package/dist/schema.d.ts +2 -0
  39. package/dist/schema.js +44 -0
  40. package/dist/schema.js.map +1 -0
  41. package/dist/skills.d.ts +24 -0
  42. package/dist/skills.js +210 -0
  43. package/dist/skills.js.map +1 -0
  44. package/dist/types.d.ts +86 -0
  45. package/dist/types.js +2 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +48 -0
  48. package/schemas/agent.schema.json +37 -0
  49. package/schemas/context.schema.json +13 -0
  50. package/schemas/eval.schema.json +26 -0
  51. package/schemas/hook.schema.json +29 -0
  52. package/schemas/skill.schema.json +23 -0
  53. package/schemas/state.schema.json +14 -0
  54. package/schemas/workflow.schema.json +34 -0
  55. package/schemas/yaaw.schema.json +58 -0
  56. package/skills/clarify/SKILL.md +14 -0
  57. package/skills/code-review/SKILL.md +29 -0
  58. package/skills/slice-work/SKILL.md +15 -0
  59. package/skills/spec/SKILL.md +21 -0
  60. package/skills/tdd/SKILL.md +25 -0
  61. package/templates/instructions/managed-block.md +17 -0
@@ -0,0 +1,6 @@
1
+ import type { ValidationResult } from "./types.js";
2
+ export type DefinitionFormat = "yaml" | "json";
3
+ export declare function parseProjectDefinition(source: string, format?: DefinitionFormat): unknown;
4
+ export declare function validateProjectDefinition(value: unknown): ValidationResult;
5
+ export declare function parseAndValidateProjectDefinition(source: string, format?: DefinitionFormat): ValidationResult;
6
+ export declare function loadAndValidateProjectDefinition(filePath: string): Promise<ValidationResult>;
package/dist/parser.js ADDED
@@ -0,0 +1,166 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { extname } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { validateAgainstSchema } from "./schema.js";
5
+ function inferFormat(filePath) {
6
+ return filePath && extname(filePath).toLowerCase() === ".json" ? "json" : "yaml";
7
+ }
8
+ export function parseProjectDefinition(source, format = "yaml") {
9
+ return format === "json" ? JSON.parse(source) : parseYaml(source);
10
+ }
11
+ function duplicateNameIssues(definition) {
12
+ const issues = [];
13
+ const collections = [
14
+ ["skills", definition.skills],
15
+ ["agents", definition.agents],
16
+ ["hooks", definition.hooks],
17
+ ["evals", definition.evals],
18
+ ["workflows", definition.workflows],
19
+ ["context", definition.context],
20
+ ["state", definition.state]
21
+ ];
22
+ for (const [collectionName, values] of collections) {
23
+ const seen = new Set();
24
+ values.forEach((value, index) => {
25
+ if (seen.has(value.name)) {
26
+ issues.push({
27
+ path: `$.${collectionName}[${index}].name`,
28
+ message: `duplicate ${collectionName} name '${value.name}'`,
29
+ keyword: "semantic"
30
+ });
31
+ }
32
+ seen.add(value.name);
33
+ });
34
+ }
35
+ return issues;
36
+ }
37
+ function referenceIssues(definition) {
38
+ const issues = [];
39
+ const names = {
40
+ skill: new Set(definition.skills.map(({ name }) => name)),
41
+ agent: new Set(definition.agents.map(({ name }) => name)),
42
+ hook: new Set(definition.hooks.map(({ name }) => name)),
43
+ eval: new Set(definition.evals.map(({ name }) => name)),
44
+ workflow: new Set(definition.workflows.map(({ name }) => name)),
45
+ context: new Set(definition.context.map(({ name }) => name)),
46
+ state: new Set(definition.state.map(({ name }) => name))
47
+ };
48
+ definition.skills.forEach((skill, skillIndex) => {
49
+ for (const [dependencyIndex, dependency] of (skill.dependencies ?? []).entries()) {
50
+ if (!names.skill.has(dependency)) {
51
+ issues.push({
52
+ path: `$.skills[${skillIndex}].dependencies[${dependencyIndex}]`,
53
+ message: `unknown skill '${dependency}'`,
54
+ keyword: "semantic"
55
+ });
56
+ }
57
+ }
58
+ });
59
+ definition.agents.forEach((agent, agentIndex) => {
60
+ for (const [skillIndex, skill] of (agent.skills ?? []).entries()) {
61
+ if (!names.skill.has(skill)) {
62
+ issues.push({
63
+ path: `$.agents[${agentIndex}].skills[${skillIndex}]`,
64
+ message: `unknown skill '${skill}'`,
65
+ keyword: "semantic"
66
+ });
67
+ }
68
+ }
69
+ for (const [contextIndex, context] of (agent.context ?? []).entries()) {
70
+ if (!names.context.has(context)) {
71
+ issues.push({
72
+ path: `$.agents[${agentIndex}].context[${contextIndex}]`,
73
+ message: `unknown context '${context}'`,
74
+ keyword: "semantic"
75
+ });
76
+ }
77
+ }
78
+ });
79
+ definition.workflows.forEach((workflow, workflowIndex) => {
80
+ const stepIds = new Set();
81
+ workflow.steps.forEach((step, stepIndex) => {
82
+ if (stepIds.has(step.id)) {
83
+ issues.push({
84
+ path: `$.workflows[${workflowIndex}].steps[${stepIndex}].id`,
85
+ message: `duplicate workflow step id '${step.id}'`,
86
+ keyword: "semantic"
87
+ });
88
+ }
89
+ stepIds.add(step.id);
90
+ });
91
+ workflow.steps.forEach((step, stepIndex) => {
92
+ const [kind, name] = step.uses.split(":", 2);
93
+ if (!names[kind].has(name)) {
94
+ issues.push({
95
+ path: `$.workflows[${workflowIndex}].steps[${stepIndex}].uses`,
96
+ message: `unknown ${kind} '${name}'`,
97
+ keyword: "semantic"
98
+ });
99
+ }
100
+ for (const [needIndex, need] of (step.needs ?? []).entries()) {
101
+ if (!stepIds.has(need)) {
102
+ issues.push({
103
+ path: `$.workflows[${workflowIndex}].steps[${stepIndex}].needs[${needIndex}]`,
104
+ message: `unknown workflow step '${need}'`,
105
+ keyword: "semantic"
106
+ });
107
+ }
108
+ else if (need === step.id) {
109
+ issues.push({
110
+ path: `$.workflows[${workflowIndex}].steps[${stepIndex}].needs[${needIndex}]`,
111
+ message: "a workflow step cannot depend on itself",
112
+ keyword: "semantic"
113
+ });
114
+ }
115
+ }
116
+ });
117
+ });
118
+ return issues;
119
+ }
120
+ export function validateProjectDefinition(value) {
121
+ const schemaIssues = validateAgainstSchema(value);
122
+ if (schemaIssues.length > 0) {
123
+ return { ok: false, issues: schemaIssues };
124
+ }
125
+ const definition = value;
126
+ const issues = [...duplicateNameIssues(definition), ...referenceIssues(definition)];
127
+ return issues.length === 0
128
+ ? { ok: true, value: definition, issues: [] }
129
+ : { ok: false, issues };
130
+ }
131
+ export function parseAndValidateProjectDefinition(source, format = "yaml") {
132
+ try {
133
+ return validateProjectDefinition(parseProjectDefinition(source, format));
134
+ }
135
+ catch (error) {
136
+ return {
137
+ ok: false,
138
+ issues: [
139
+ {
140
+ path: "$",
141
+ message: error instanceof Error ? error.message : String(error),
142
+ keyword: "parse"
143
+ }
144
+ ]
145
+ };
146
+ }
147
+ }
148
+ export async function loadAndValidateProjectDefinition(filePath) {
149
+ try {
150
+ const source = await readFile(filePath, "utf8");
151
+ return parseAndValidateProjectDefinition(source, inferFormat(filePath));
152
+ }
153
+ catch (error) {
154
+ return {
155
+ ok: false,
156
+ issues: [
157
+ {
158
+ path: filePath,
159
+ message: error instanceof Error ? error.message : String(error),
160
+ keyword: "parse"
161
+ }
162
+ ]
163
+ };
164
+ }
165
+ }
166
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { FeatureInvocation } from "./feature.js";
2
+ import type { IndependentReviews, ReviewAxis, ReviewSubmission } from "./review.js";
3
+ export type WorkflowStatus = "active" | "completed";
4
+ export interface PersistedSlice {
5
+ id: string;
6
+ title: string;
7
+ status: "pending" | "in-progress" | "completed";
8
+ acceptanceCriteria?: string[];
9
+ }
10
+ export interface VerificationRecord {
11
+ command: string;
12
+ output: string;
13
+ exitCode: number;
14
+ recordedAt: string;
15
+ }
16
+ export interface DecisionRecord {
17
+ decision: string;
18
+ rationale?: string;
19
+ recordedAt: string;
20
+ }
21
+ export interface HandoffRecord {
22
+ summary: string;
23
+ next: string | null;
24
+ updatedAt: string;
25
+ }
26
+ export interface WorkflowState {
27
+ version: 1;
28
+ workflow: string;
29
+ runId: string | null;
30
+ status: WorkflowStatus;
31
+ task: {
32
+ request: string;
33
+ startedAt: string;
34
+ updatedAt: string;
35
+ };
36
+ spec: string | null;
37
+ slices: PersistedSlice[];
38
+ dependencies: Record<string, string[]>;
39
+ progress: {
40
+ current: string | null;
41
+ completed: string[];
42
+ remaining: string[];
43
+ };
44
+ verification: VerificationRecord[];
45
+ reviews: IndependentReviews;
46
+ decisions: DecisionRecord[];
47
+ handoff: HandoffRecord | null;
48
+ }
49
+ export interface CheckpointUpdate {
50
+ spec?: string | null;
51
+ slices?: PersistedSlice[];
52
+ dependencies?: Record<string, string[]>;
53
+ verification?: Array<Omit<VerificationRecord, "recordedAt"> & {
54
+ recordedAt?: string;
55
+ }>;
56
+ reviews?: ReviewSubmission[];
57
+ decisions?: Array<Omit<DecisionRecord, "recordedAt"> & {
58
+ recordedAt?: string;
59
+ }>;
60
+ handoff?: Omit<HandoffRecord, "updatedAt"> & {
61
+ updatedAt?: string;
62
+ } | null;
63
+ }
64
+ export interface PersistedFeatureInvocation extends FeatureInvocation {
65
+ statePath: string;
66
+ state: WorkflowState;
67
+ resumed: boolean;
68
+ }
69
+ export declare class PersistenceError extends Error {
70
+ constructor(message: string);
71
+ }
72
+ export declare function loadWorkflowState(projectDirectory?: string): Promise<{
73
+ path: string;
74
+ state: WorkflowState;
75
+ }>;
76
+ /** Start the official workflow and atomically persist all resumable fields. */
77
+ export declare function startFeatureWorkflow(request: string, projectDirectory?: string): Promise<PersistedFeatureInvocation>;
78
+ /** Rebuild an invocation from durable state without relying on conversation history. */
79
+ export declare function resumeFeatureWorkflow(projectDirectory?: string): Promise<PersistedFeatureInvocation>;
80
+ /** Merge durable stage outputs and advance the workflow checkpoint atomically. */
81
+ export declare function checkpointFeatureWorkflow(completedStage: string, update?: CheckpointUpdate, projectDirectory?: string): Promise<WorkflowState>;
82
+ /** Record one independent reviewer result through its axis-specific checkpoint. */
83
+ export declare function submitIndependentReview(axis: ReviewAxis, report: ReviewSubmission, projectDirectory?: string): Promise<WorkflowState>;
@@ -0,0 +1,279 @@
1
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { createFeatureInvocation } from "./feature.js";
4
+ import { loadAndValidateProjectDefinition } from "./parser.js";
5
+ import { finishWorkflowRun, recordWorkflowRunEvent, startWorkflowRun } from "./observability.js";
6
+ import { assertIndependentReviewGate, createReviewRecord, ReviewError } from "./review.js";
7
+ export class PersistenceError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "PersistenceError";
11
+ }
12
+ }
13
+ function now() {
14
+ return new Date().toISOString();
15
+ }
16
+ function isRecord(value) {
17
+ return typeof value === "object" && value !== null && !Array.isArray(value);
18
+ }
19
+ function strings(value) {
20
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
21
+ }
22
+ function validateState(value, path) {
23
+ if (!isRecord(value) || value.version !== 1 || typeof value.workflow !== "string") {
24
+ throw new PersistenceError(`${path} is not a YAAW workflow state file`);
25
+ }
26
+ if (value.status !== "active" && value.status !== "completed") {
27
+ throw new PersistenceError(`${path}: status must be 'active' or 'completed'`);
28
+ }
29
+ const task = value.task;
30
+ const progress = value.progress;
31
+ if (!isRecord(task) || typeof task.request !== "string" || typeof task.startedAt !== "string" || typeof task.updatedAt !== "string") {
32
+ throw new PersistenceError(`${path}: task is invalid`);
33
+ }
34
+ if (!isRecord(progress) || (progress.current !== null && typeof progress.current !== "string") || !strings(progress.completed) || !strings(progress.remaining)) {
35
+ throw new PersistenceError(`${path}: progress is invalid`);
36
+ }
37
+ const reviews = value.reviews === undefined
38
+ ? { spec: null, standards: null }
39
+ : value.reviews;
40
+ if (!(value.spec === null || typeof value.spec === "string") || !Array.isArray(value.slices) || !isRecord(value.dependencies) || !Array.isArray(value.verification) || !isRecord(reviews) || !(reviews.spec === null || isRecord(reviews.spec)) || !(reviews.standards === null || isRecord(reviews.standards)) || !Array.isArray(value.decisions) || !(value.handoff === null || isRecord(value.handoff))) {
41
+ throw new PersistenceError(`${path}: durable workflow fields are invalid`);
42
+ }
43
+ const runId = value.runId === undefined ? null : value.runId;
44
+ if (!(runId === null || typeof runId === "string")) {
45
+ throw new PersistenceError(`${path}: runId must be a string or null`);
46
+ }
47
+ return { ...value, runId, reviews };
48
+ }
49
+ async function statePathFor(root) {
50
+ const configPath = join(root, ".yaaw", "yaaw.yaml");
51
+ const validation = await loadAndValidateProjectDefinition(configPath);
52
+ if (!validation.ok) {
53
+ const details = validation.issues.map((issue) => `${issue.path}: ${issue.message}`).join("; ");
54
+ throw new PersistenceError(`${configPath} is invalid: ${details}`);
55
+ }
56
+ const state = validation.value.state.find(({ name }) => name === "workflow") ?? validation.value.state[0];
57
+ if (!state)
58
+ throw new PersistenceError("the project does not define durable workflow state");
59
+ return resolve(root, state.path);
60
+ }
61
+ async function writeState(path, state) {
62
+ await mkdir(dirname(path), { recursive: true });
63
+ const temporary = `${path}.${process.pid}.tmp`;
64
+ await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, "utf8");
65
+ await rename(temporary, path);
66
+ }
67
+ export async function loadWorkflowState(projectDirectory = ".") {
68
+ const root = resolve(projectDirectory);
69
+ const path = await statePathFor(root);
70
+ let source;
71
+ try {
72
+ source = await readFile(path, "utf8");
73
+ }
74
+ catch (error) {
75
+ const code = isRecord(error) ? error.code : undefined;
76
+ if (code === "ENOENT")
77
+ throw new PersistenceError(`no interrupted workflow exists at ${path}; start one with 'yaaw feature <request>'`);
78
+ throw error;
79
+ }
80
+ try {
81
+ return { path, state: validateState(JSON.parse(source), path) };
82
+ }
83
+ catch (error) {
84
+ if (error instanceof PersistenceError)
85
+ throw error;
86
+ throw new PersistenceError(`${path} contains invalid JSON`);
87
+ }
88
+ }
89
+ function initialState(invocation, timestamp, runId) {
90
+ return {
91
+ version: 1,
92
+ workflow: invocation.workflow,
93
+ runId,
94
+ status: "active",
95
+ task: { request: invocation.request, startedAt: timestamp, updatedAt: timestamp },
96
+ spec: null,
97
+ slices: [],
98
+ dependencies: Object.fromEntries(invocation.stages.map((stage) => [stage.id, [...stage.needs]])),
99
+ progress: {
100
+ current: invocation.order[0] ?? null,
101
+ completed: [],
102
+ remaining: [...invocation.order]
103
+ },
104
+ verification: [],
105
+ reviews: { spec: null, standards: null },
106
+ decisions: [],
107
+ handoff: null
108
+ };
109
+ }
110
+ /** Start the official workflow and atomically persist all resumable fields. */
111
+ export async function startFeatureWorkflow(request, projectDirectory = ".") {
112
+ const root = resolve(projectDirectory);
113
+ const invocation = await createFeatureInvocation(request, root);
114
+ const statePath = await statePathFor(root);
115
+ const timestamp = now();
116
+ const run = await startWorkflowRun(invocation.workflow, request, root, { timestamp });
117
+ const state = initialState(invocation, timestamp, run.runId);
118
+ await writeState(statePath, state);
119
+ return { ...invocation, statePath, state, resumed: false };
120
+ }
121
+ function resumePrompt(invocation, state, stages) {
122
+ const persisted = JSON.stringify({
123
+ task: state.task,
124
+ spec: state.spec,
125
+ slices: state.slices,
126
+ dependencies: state.dependencies,
127
+ progress: state.progress,
128
+ verification: state.verification,
129
+ reviews: state.reviews,
130
+ decisions: state.decisions,
131
+ handoff: state.handoff
132
+ }, null, 2);
133
+ const stageText = stages.map((stage) => `## ${stage.id} (${stage.uses})\n\n${stage.instructions}`).join("\n\n");
134
+ return [
135
+ "# YAAW resumed feature workflow",
136
+ "",
137
+ `Request: ${invocation.request}`,
138
+ "",
139
+ "Continue from the durable record below. Preserve completed work, begin at progress.current, and execute only remaining stages. Update the state after every completed stage.",
140
+ "",
141
+ "## Durable record",
142
+ "",
143
+ "```json",
144
+ persisted,
145
+ "```",
146
+ "",
147
+ "## Remaining work",
148
+ "",
149
+ stageText || "No stages remain. The workflow is complete."
150
+ ].join("\n");
151
+ }
152
+ /** Rebuild an invocation from durable state without relying on conversation history. */
153
+ export async function resumeFeatureWorkflow(projectDirectory = ".") {
154
+ const root = resolve(projectDirectory);
155
+ const { path, state } = await loadWorkflowState(root);
156
+ const invocation = await createFeatureInvocation(state.task.request, root);
157
+ if (state.workflow !== invocation.workflow) {
158
+ throw new PersistenceError(`state workflow '${state.workflow}' does not match '${invocation.workflow}'`);
159
+ }
160
+ const known = new Set(invocation.order);
161
+ if (state.progress.completed.some((stage) => !known.has(stage)) || state.progress.remaining.some((stage) => !known.has(stage))) {
162
+ throw new PersistenceError(`${path}: progress references a stage not present in the current workflow`);
163
+ }
164
+ const remainingSet = new Set(state.progress.remaining);
165
+ const stages = invocation.stages.filter(({ id }) => remainingSet.has(id));
166
+ return {
167
+ ...invocation,
168
+ order: stages.map(({ id }) => id),
169
+ parallelGroups: invocation.parallelGroups
170
+ .map((group) => group.filter((id) => remainingSet.has(id)))
171
+ .filter((group) => group.length > 1),
172
+ stages,
173
+ prompt: resumePrompt(invocation, state, stages),
174
+ statePath: path,
175
+ state,
176
+ resumed: true
177
+ };
178
+ }
179
+ /** Merge durable stage outputs and advance the workflow checkpoint atomically. */
180
+ export async function checkpointFeatureWorkflow(completedStage, update = {}, projectDirectory = ".") {
181
+ const root = resolve(projectDirectory);
182
+ const { path, state } = await loadWorkflowState(root);
183
+ const invocation = await createFeatureInvocation(state.task.request, root);
184
+ if (!invocation.order.includes(completedStage))
185
+ throw new PersistenceError(`unknown workflow stage '${completedStage}'`);
186
+ const completed = new Set(state.progress.completed);
187
+ const retry = completed.has(completedStage);
188
+ const stage = invocation.stages.find(({ id }) => id === completedStage);
189
+ const unmet = stage.needs.filter((need) => !completed.has(need));
190
+ if (unmet.length)
191
+ throw new PersistenceError(`stage '${completedStage}' is blocked by: ${unmet.join(", ")}`);
192
+ completed.add(completedStage);
193
+ const completedInOrder = invocation.order.filter((id) => completed.has(id));
194
+ const remaining = invocation.order.filter((id) => !completed.has(id));
195
+ const timestamp = now();
196
+ const verification = update.verification?.map((record) => ({ ...record, recordedAt: record.recordedAt ?? timestamp }));
197
+ const reviewRecords = update.reviews?.map((report) => {
198
+ const axis = report.axis;
199
+ if (axis !== "spec" && axis !== "standards")
200
+ throw new ReviewError("review axis must be spec or standards");
201
+ return createReviewRecord(axis, report, timestamp);
202
+ });
203
+ const expectedAxis = completedStage === "review-spec"
204
+ ? "spec"
205
+ : completedStage === "review-standards"
206
+ ? "standards"
207
+ : null;
208
+ if (expectedAxis && !reviewRecords?.some(({ axis }) => axis === expectedAxis)) {
209
+ throw new PersistenceError(`stage '${completedStage}' requires a ${expectedAxis} review report`);
210
+ }
211
+ if (reviewRecords?.some(({ axis }) => expectedAxis !== axis)) {
212
+ throw new PersistenceError(`stage '${completedStage}' cannot record another review axis`);
213
+ }
214
+ const reviews = { ...state.reviews };
215
+ for (const review of reviewRecords ?? [])
216
+ reviews[review.axis] = review;
217
+ if (completedStage === "complete") {
218
+ if (state.verification.at(-1)?.exitCode !== 0) {
219
+ throw new PersistenceError("completion blocked: successful verification evidence is missing");
220
+ }
221
+ assertIndependentReviewGate(reviews);
222
+ }
223
+ const decisions = update.decisions?.map((record) => ({ ...record, recordedAt: record.recordedAt ?? timestamp }));
224
+ const next = {
225
+ ...state,
226
+ status: remaining.length ? "active" : "completed",
227
+ task: { ...state.task, updatedAt: timestamp },
228
+ spec: update.spec === undefined ? state.spec : update.spec,
229
+ slices: update.slices ?? state.slices,
230
+ dependencies: update.dependencies ?? state.dependencies,
231
+ progress: { current: remaining[0] ?? null, completed: completedInOrder, remaining },
232
+ verification: verification ? [...state.verification, ...verification] : state.verification,
233
+ reviews,
234
+ decisions: decisions ? [...state.decisions, ...decisions] : state.decisions,
235
+ handoff: update.handoff === undefined
236
+ ? state.handoff
237
+ : update.handoff === null
238
+ ? null
239
+ : { ...update.handoff, updatedAt: update.handoff.updatedAt ?? timestamp }
240
+ };
241
+ await writeState(path, next);
242
+ if (state.runId) {
243
+ if (retry) {
244
+ const previousAttempts = state.verification.filter(({ command }) => update.verification?.some((candidate) => candidate.command === command)).length;
245
+ await recordWorkflowRunEvent(state.runId, "retry", {
246
+ target: completedStage,
247
+ attempt: Math.max(2, previousAttempts + 1),
248
+ reason: `stage '${completedStage}' was checkpointed again`
249
+ }, root);
250
+ }
251
+ const [kind, name] = stage.uses.split(":", 2);
252
+ if (kind === "agent" && name) {
253
+ await recordWorkflowRunEvent(state.runId, "agent_invocation", {
254
+ agent: name,
255
+ stage: completedStage
256
+ }, root);
257
+ }
258
+ for (const failure of verification?.filter(({ exitCode }) => exitCode !== 0) ?? []) {
259
+ await recordWorkflowRunEvent(state.runId, "verification_failure", {
260
+ command: failure.command,
261
+ output: failure.output,
262
+ exitCode: failure.exitCode,
263
+ stage: completedStage
264
+ }, root);
265
+ }
266
+ if (!remaining.length) {
267
+ await finishWorkflowRun(state.runId, {
268
+ status: "completed",
269
+ summary: `Workflow '${state.workflow}' completed successfully.`
270
+ }, root);
271
+ }
272
+ }
273
+ return next;
274
+ }
275
+ /** Record one independent reviewer result through its axis-specific checkpoint. */
276
+ export async function submitIndependentReview(axis, report, projectDirectory = ".") {
277
+ return checkpointFeatureWorkflow(axis === "spec" ? "review-spec" : "review-standards", { reviews: [{ ...report, axis }] }, projectDirectory);
278
+ }
279
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type ProviderId = "claude" | "codex";
2
+ export interface ProviderDefinition {
3
+ id: ProviderId;
4
+ displayName: string;
5
+ instructionFile: string;
6
+ skillsDirectory: string;
7
+ capabilities: {
8
+ skills: boolean;
9
+ instructions: boolean;
10
+ };
11
+ }
12
+ export declare const providerRegistry: ReadonlyMap<ProviderId, ProviderDefinition>;
13
+ export declare function listProviders(): ProviderDefinition[];
14
+ export declare function getProvider(id: string): ProviderDefinition;
@@ -0,0 +1,27 @@
1
+ const definitions = [
2
+ {
3
+ id: "claude",
4
+ displayName: "Claude Code",
5
+ instructionFile: "CLAUDE.md",
6
+ skillsDirectory: ".claude/skills",
7
+ capabilities: { skills: true, instructions: true }
8
+ },
9
+ {
10
+ id: "codex",
11
+ displayName: "OpenAI Codex",
12
+ instructionFile: "AGENTS.md",
13
+ skillsDirectory: ".agents/skills",
14
+ capabilities: { skills: true, instructions: true }
15
+ }
16
+ ];
17
+ export const providerRegistry = new Map(definitions.map((definition) => [definition.id, definition]));
18
+ export function listProviders() {
19
+ return [...providerRegistry.values()];
20
+ }
21
+ export function getProvider(id) {
22
+ const provider = providerRegistry.get(id);
23
+ if (!provider)
24
+ throw new Error(`Unsupported provider: ${id}`);
25
+ return provider;
26
+ }
27
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,GAAyB;IACxC;QACE,EAAE,EAAE,QAAQ;QACZ,WAAW,EAAE,aAAa;QAC1B,eAAe,EAAE,WAAW;QAC5B,eAAe,EAAE,gBAAgB;QACjC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;KACnD;IACD;QACE,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,cAAc;QAC3B,eAAe,EAAE,WAAW;QAC5B,eAAe,EAAE,gBAAgB;QACjC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;KACnD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAgD,IAAI,GAAG,CAClF,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAC7D,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAgB,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,29 @@
1
+ export type ReviewAxis = "spec" | "standards";
2
+ export type ReviewVerdict = "PASS" | "FAIL";
3
+ export interface ReviewFinding {
4
+ code: string;
5
+ message: string;
6
+ evidence: string;
7
+ }
8
+ export interface ReviewSubmission {
9
+ axis?: ReviewAxis;
10
+ verdict: ReviewVerdict;
11
+ summary: string;
12
+ findings: ReviewFinding[];
13
+ }
14
+ export interface ReviewRecord extends ReviewSubmission {
15
+ axis: ReviewAxis;
16
+ reviewer: "spec-reviewer" | "standards-reviewer";
17
+ recordedAt: string;
18
+ }
19
+ export interface IndependentReviews {
20
+ spec: ReviewRecord | null;
21
+ standards: ReviewRecord | null;
22
+ }
23
+ export declare class ReviewError extends Error {
24
+ constructor(message: string);
25
+ }
26
+ /** Validate one axis-scoped report without consulting the other reviewer. */
27
+ export declare function createReviewRecord(axis: ReviewAxis, value: unknown, recordedAt?: string): ReviewRecord;
28
+ /** Enforce the join gate and preserve axis-specific failure reasons. */
29
+ export declare function assertIndependentReviewGate(reviews: IndependentReviews): void;