pi-blueprint 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 (77) hide show
  1. package/README.md +57 -0
  2. package/dist/blueprint-command.d.ts +5 -0
  3. package/dist/blueprint-command.d.ts.map +1 -0
  4. package/dist/blueprint-command.js +56 -0
  5. package/dist/blueprint-command.js.map +1 -0
  6. package/dist/blueprint-injector.d.ts +3 -0
  7. package/dist/blueprint-injector.d.ts.map +1 -0
  8. package/dist/blueprint-injector.js +11 -0
  9. package/dist/blueprint-injector.js.map +1 -0
  10. package/dist/blueprint-tools.d.ts +4 -0
  11. package/dist/blueprint-tools.d.ts.map +1 -0
  12. package/dist/blueprint-tools.js +302 -0
  13. package/dist/blueprint-tools.js.map +1 -0
  14. package/dist/dependency-graph.d.ts +10 -0
  15. package/dist/dependency-graph.d.ts.map +1 -0
  16. package/dist/dependency-graph.js +101 -0
  17. package/dist/dependency-graph.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +88 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/plan-next-command.d.ts +5 -0
  23. package/dist/plan-next-command.d.ts.map +1 -0
  24. package/dist/plan-next-command.js +36 -0
  25. package/dist/plan-next-command.js.map +1 -0
  26. package/dist/plan-renderer.d.ts +3 -0
  27. package/dist/plan-renderer.d.ts.map +1 -0
  28. package/dist/plan-renderer.js +61 -0
  29. package/dist/plan-renderer.js.map +1 -0
  30. package/dist/plan-status-command.d.ts +5 -0
  31. package/dist/plan-status-command.d.ts.map +1 -0
  32. package/dist/plan-status-command.js +20 -0
  33. package/dist/plan-status-command.js.map +1 -0
  34. package/dist/plan-verify-command.d.ts +5 -0
  35. package/dist/plan-verify-command.d.ts.map +1 -0
  36. package/dist/plan-verify-command.js +65 -0
  37. package/dist/plan-verify-command.js.map +1 -0
  38. package/dist/prompts/blueprint-generate.d.ts +2 -0
  39. package/dist/prompts/blueprint-generate.d.ts.map +1 -0
  40. package/dist/prompts/blueprint-generate.js +35 -0
  41. package/dist/prompts/blueprint-generate.js.map +1 -0
  42. package/dist/prompts/phase-context.d.ts +3 -0
  43. package/dist/prompts/phase-context.d.ts.map +1 -0
  44. package/dist/prompts/phase-context.js +62 -0
  45. package/dist/prompts/phase-context.js.map +1 -0
  46. package/dist/state-machine.d.ts +11 -0
  47. package/dist/state-machine.d.ts.map +1 -0
  48. package/dist/state-machine.js +224 -0
  49. package/dist/state-machine.js.map +1 -0
  50. package/dist/storage.d.ts +13 -0
  51. package/dist/storage.d.ts.map +1 -0
  52. package/dist/storage.js +59 -0
  53. package/dist/storage.js.map +1 -0
  54. package/dist/types.d.ts +98 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +7 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/verification.d.ts +4 -0
  59. package/dist/verification.d.ts.map +1 -0
  60. package/dist/verification.js +55 -0
  61. package/dist/verification.js.map +1 -0
  62. package/package.json +72 -0
  63. package/src/blueprint-command.ts +84 -0
  64. package/src/blueprint-injector.ts +10 -0
  65. package/src/blueprint-tools.ts +380 -0
  66. package/src/dependency-graph.ts +113 -0
  67. package/src/index.ts +118 -0
  68. package/src/plan-next-command.ts +56 -0
  69. package/src/plan-renderer.ts +70 -0
  70. package/src/plan-status-command.ts +30 -0
  71. package/src/plan-verify-command.ts +82 -0
  72. package/src/prompts/blueprint-generate.ts +34 -0
  73. package/src/prompts/phase-context.ts +76 -0
  74. package/src/state-machine.ts +278 -0
  75. package/src/storage.ts +83 -0
  76. package/src/types.ts +132 -0
  77. package/src/verification.ts +60 -0
package/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # pi-blueprint
2
+
3
+ A Pi extension that turns high-level objectives into phased, multi-session construction plans with dependency tracking and verification gates.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pi install npm:pi-blueprint
9
+ ```
10
+
11
+ ## Commands
12
+
13
+ | Command | Description |
14
+ |---|---|
15
+ | `/blueprint <objective>` | Generate a phased plan from an objective |
16
+ | `/blueprint abandon` | Abandon the active blueprint |
17
+ | `/plan-status` | Show detailed progress with completion percentage |
18
+ | `/plan-verify` | Run verification gates for the current phase |
19
+ | `/plan-next` | Get and start the next actionable task |
20
+
21
+ ## LLM Tools
22
+
23
+ | Tool | Description |
24
+ |---|---|
25
+ | `blueprint_create` | Create a new blueprint from structured phases |
26
+ | `blueprint_status` | Get current plan progress |
27
+ | `blueprint_update` | Mark tasks as completed, in_progress, or skipped |
28
+ | `blueprint_next` | Get the next actionable task |
29
+
30
+ ## How It Works
31
+
32
+ 1. Run `/blueprint "Add OAuth2 authentication"` to start
33
+ 2. The LLM generates a phased plan with tasks, dependencies, and verification gates
34
+ 3. On each session start, the active blueprint context is injected into the system prompt
35
+ 4. Use `/plan-next` to work through tasks sequentially
36
+ 5. Use `/plan-verify` to run phase verification gates (tests, typecheck) before advancing
37
+ 6. Progress persists across sessions in `~/.pi/blueprints/`
38
+
39
+ ## Storage
40
+
41
+ ```
42
+ ~/.pi/blueprints/
43
+ index.json # Active blueprint pointer
44
+ <blueprint-id>/
45
+ plan.md # Human-readable plan (auto-generated)
46
+ state.json # Machine-readable state (source of truth)
47
+ history.jsonl # Audit log of state transitions
48
+ sessions.json # Session-to-task mapping
49
+ ```
50
+
51
+ ## Features
52
+
53
+ - **Phased execution**: Work is decomposed into ordered phases with verification gates
54
+ - **Dependency tracking**: Tasks declare dependencies; blocked tasks are surfaced automatically
55
+ - **Verification gates**: Tests, type-check, user approval, or custom commands gate phase advancement
56
+ - **Multi-session persistence**: Plan state survives session restarts with context injection
57
+ - **Cycle detection**: Dependency cycles are rejected at blueprint creation time
@@ -0,0 +1,5 @@
1
+ import type { ExtensionAPI, ExtensionCommandContext } from "@mariozechner/pi-coding-agent";
2
+ import type { StateRef } from "./types.js";
3
+ export declare const COMMAND_NAME = "blueprint";
4
+ export declare function handleBlueprintCommand(args: string, ctx: ExtensionCommandContext, stateRef: StateRef, pi: ExtensionAPI): Promise<void>;
5
+ //# sourceMappingURL=blueprint-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-command.d.ts","sourceRoot":"","sources":["../src/blueprint-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,uBAAuB,EACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,uBAAuB,EAC5B,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,YAAY,GACf,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,56 @@
1
+ import { renderPlanMarkdown } from "./plan-renderer.js";
2
+ import { getBlueprintGeneratePrompt } from "./prompts/blueprint-generate.js";
3
+ import { abandonBlueprint } from "./state-machine.js";
4
+ import { saveBlueprint, appendHistory, saveIndex, loadIndex } from "./storage.js";
5
+ export const COMMAND_NAME = "blueprint";
6
+ export async function handleBlueprintCommand(args, ctx, stateRef, pi) {
7
+ const trimmed = args.trim();
8
+ if (trimmed === "") {
9
+ return showBriefStatus(ctx, stateRef);
10
+ }
11
+ if (trimmed.toLowerCase() === "abandon") {
12
+ return handleAbandon(ctx, stateRef);
13
+ }
14
+ const state = stateRef.get();
15
+ if (state.blueprint && state.blueprint.status === "active") {
16
+ ctx.ui.notify(`An active blueprint already exists: "${state.blueprint.objective}"\nUse /blueprint abandon to discard it, or /plan-status for details.`, "warning");
17
+ return;
18
+ }
19
+ const prompt = getBlueprintGeneratePrompt(trimmed);
20
+ pi.sendUserMessage(prompt, { deliverAs: "followUp" });
21
+ }
22
+ function showBriefStatus(ctx, stateRef) {
23
+ const state = stateRef.get();
24
+ if (!state.blueprint) {
25
+ ctx.ui.notify("No active blueprint. Use /blueprint <objective> to create one.", "info");
26
+ return;
27
+ }
28
+ ctx.ui.notify(renderPlanMarkdown(state.blueprint), "info");
29
+ }
30
+ function handleAbandon(ctx, stateRef) {
31
+ const state = stateRef.get();
32
+ if (!state.blueprint || state.blueprint.status !== "active") {
33
+ ctx.ui.notify("No active blueprint to abandon.", "info");
34
+ return;
35
+ }
36
+ const bp = abandonBlueprint(state.blueprint);
37
+ saveBlueprint(bp);
38
+ appendHistory(bp.id, {
39
+ timestamp: new Date().toISOString(),
40
+ event: "blueprint_abandoned",
41
+ phase_id: null,
42
+ task_id: null,
43
+ session_id: state.sessionId,
44
+ details: "User abandoned blueprint",
45
+ });
46
+ const index = loadIndex();
47
+ if (index) {
48
+ saveIndex({
49
+ active_blueprint_id: null,
50
+ blueprints: index.blueprints.map((e) => e.id === bp.id ? { ...e, status: "abandoned" } : e),
51
+ });
52
+ }
53
+ stateRef.set({ ...state, blueprint: null });
54
+ ctx.ui.notify(`Blueprint "${bp.objective}" abandoned.`, "info");
55
+ }
56
+ //# sourceMappingURL=blueprint-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-command.js","sourceRoot":"","sources":["../src/blueprint-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Blueprint } from "./types.js";
2
+ export declare function buildInjectionBlock(blueprint: Blueprint | null): string | null;
3
+ //# sourceMappingURL=blueprint-injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-injector.d.ts","sourceRoot":"","sources":["../src/blueprint-injector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAM9E"}
@@ -0,0 +1,11 @@
1
+ import { buildPhaseContext } from "./prompts/phase-context.js";
2
+ export function buildInjectionBlock(blueprint) {
3
+ if (!blueprint)
4
+ return null;
5
+ if (blueprint.status !== "active")
6
+ return null;
7
+ if (!blueprint.active_phase_id)
8
+ return null;
9
+ return "\n\n" + buildPhaseContext(blueprint);
10
+ }
11
+ //# sourceMappingURL=blueprint-injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-injector.js","sourceRoot":"","sources":["../src/blueprint-injector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,SAA2B;IAC7D,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC,SAAS,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAE5C,OAAO,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
+ import type { StateRef } from "./types.js";
3
+ export declare function registerBlueprintTools(pi: ExtensionAPI, stateRef: StateRef): void;
4
+ //# sourceMappingURL=blueprint-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-tools.d.ts","sourceRoot":"","sources":["../src/blueprint-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,QAAQ,EAAiC,MAAM,YAAY,CAAC;AA+D1E,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAmQjF"}
@@ -0,0 +1,302 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { createBlueprint, startTask, completeTask, skipTask, getNextTask, } from "./state-machine.js";
3
+ import { detectCycles, getAllTasks } from "./dependency-graph.js";
4
+ import { saveBlueprint, saveIndex, appendHistory, loadIndex } from "./storage.js";
5
+ import { renderPlanMarkdown } from "./plan-renderer.js";
6
+ const PhaseSchema = Type.Object({
7
+ id: Type.String({ description: "Phase ID, e.g. '1', '2'" }),
8
+ title: Type.String({ description: "Phase title" }),
9
+ description: Type.String({ description: "Phase description" }),
10
+ tasks: Type.Array(Type.Object({
11
+ id: Type.String({ description: "Task ID, e.g. '1.1', '2.3'" }),
12
+ title: Type.String({ description: "Imperative task title" }),
13
+ description: Type.String({ description: "What to implement" }),
14
+ acceptance_criteria: Type.Array(Type.String(), { description: "Testable acceptance criteria" }),
15
+ file_targets: Type.Array(Type.String(), { description: "Files to create or modify" }),
16
+ dependencies: Type.Array(Type.String(), { description: "Task IDs this depends on" }),
17
+ })),
18
+ verification_gates: Type.Array(Type.Object({
19
+ type: Type.Union([
20
+ Type.Literal("tests_pass"),
21
+ Type.Literal("typecheck_clean"),
22
+ Type.Literal("user_approval"),
23
+ Type.Literal("custom_command"),
24
+ ]),
25
+ description: Type.String(),
26
+ command: Type.Optional(Type.String({ description: "Shell command for custom_command type" })),
27
+ })),
28
+ });
29
+ const CreateParams = Type.Object({
30
+ objective: Type.String({ description: "High-level objective for the blueprint" }),
31
+ phases: Type.Array(PhaseSchema, { description: "Ordered phases of work" }),
32
+ });
33
+ const StatusParams = Type.Object({});
34
+ const UpdateParams = Type.Object({
35
+ task_id: Type.String({ description: "Task ID to update (e.g. '1.1')" }),
36
+ status: Type.Union([
37
+ Type.Literal("in_progress"),
38
+ Type.Literal("completed"),
39
+ Type.Literal("skipped"),
40
+ ], { description: "New status" }),
41
+ notes: Type.Optional(Type.String({ description: "Optional notes about the change" })),
42
+ });
43
+ const NextParams = Type.Object({});
44
+ function generateId() {
45
+ return `bp-${Date.now().toString(36)}`;
46
+ }
47
+ export function registerBlueprintTools(pi, stateRef) {
48
+ const guidelines = [
49
+ "Use blueprint_create to generate a new multi-session plan from an objective.",
50
+ "Use blueprint_status to check current plan progress.",
51
+ "Use blueprint_update to mark tasks as completed, in_progress, or skipped.",
52
+ "Use blueprint_next to get the next actionable task.",
53
+ ];
54
+ pi.registerTool({
55
+ name: "blueprint_create",
56
+ label: "Create Blueprint",
57
+ description: "Create a new phased construction plan from an objective and structured phases",
58
+ promptSnippet: "Create a multi-session blueprint plan",
59
+ parameters: CreateParams,
60
+ promptGuidelines: guidelines,
61
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
62
+ const state = stateRef.get();
63
+ if (state.blueprint && state.blueprint.status === "active") {
64
+ return {
65
+ content: [{
66
+ type: "text",
67
+ text: `Error: An active blueprint already exists ("${state.blueprint.objective}"). Complete or abandon it first.`,
68
+ }],
69
+ details: { error: "active_blueprint_exists" },
70
+ };
71
+ }
72
+ const phases = buildPhases(params.phases);
73
+ const allTasks = getAllTasks(phases);
74
+ const cycles = detectCycles(allTasks);
75
+ if (cycles.length > 0) {
76
+ return {
77
+ content: [{
78
+ type: "text",
79
+ text: `Error: Dependency cycles detected: ${JSON.stringify(cycles)}`,
80
+ }],
81
+ details: { error: "dependency_cycles", cycles },
82
+ };
83
+ }
84
+ const projectId = state.project?.id ?? "unknown";
85
+ const id = generateId();
86
+ const blueprint = createBlueprint(id, params.objective, projectId, phases);
87
+ saveBlueprint(blueprint);
88
+ const index = loadIndex() ?? { active_blueprint_id: null, blueprints: [] };
89
+ saveIndex({
90
+ active_blueprint_id: id,
91
+ blueprints: [
92
+ ...index.blueprints,
93
+ {
94
+ id,
95
+ objective: params.objective,
96
+ status: "active",
97
+ created_at: blueprint.created_at,
98
+ project_id: projectId,
99
+ },
100
+ ],
101
+ });
102
+ appendHistory(id, {
103
+ timestamp: new Date().toISOString(),
104
+ event: "blueprint_created",
105
+ phase_id: null,
106
+ task_id: null,
107
+ session_id: state.sessionId,
108
+ details: params.objective,
109
+ });
110
+ stateRef.set({ ...state, blueprint });
111
+ const summary = renderPlanMarkdown(blueprint);
112
+ return {
113
+ content: [{ type: "text", text: `Blueprint created: ${id}\n\n${summary}` }],
114
+ details: { blueprint_id: id, phases: phases.length, tasks: allTasks.length },
115
+ };
116
+ },
117
+ });
118
+ pi.registerTool({
119
+ name: "blueprint_status",
120
+ label: "Blueprint Status",
121
+ description: "Get the current blueprint progress, active phase, and task status",
122
+ promptSnippet: "Check current blueprint plan progress",
123
+ parameters: StatusParams,
124
+ promptGuidelines: guidelines,
125
+ async execute() {
126
+ const state = stateRef.get();
127
+ if (!state.blueprint) {
128
+ return {
129
+ content: [{ type: "text", text: "No active blueprint." }],
130
+ details: { has_blueprint: false },
131
+ };
132
+ }
133
+ const summary = renderPlanMarkdown(state.blueprint);
134
+ return {
135
+ content: [{ type: "text", text: summary }],
136
+ details: {
137
+ blueprint_id: state.blueprint.id,
138
+ status: state.blueprint.status,
139
+ active_phase: state.blueprint.active_phase_id,
140
+ active_task: state.blueprint.active_task_id,
141
+ },
142
+ };
143
+ },
144
+ });
145
+ pi.registerTool({
146
+ name: "blueprint_update",
147
+ label: "Update Blueprint",
148
+ description: "Update a blueprint task status (mark as completed, in_progress, or skipped)",
149
+ promptSnippet: "Mark a blueprint task as completed or update its status",
150
+ parameters: UpdateParams,
151
+ promptGuidelines: guidelines,
152
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
153
+ const state = stateRef.get();
154
+ if (!state.blueprint) {
155
+ return {
156
+ content: [{ type: "text", text: "No active blueprint." }],
157
+ details: { error: "no_blueprint" },
158
+ };
159
+ }
160
+ let bp = state.blueprint;
161
+ const allTasks = getAllTasks(bp.phases);
162
+ const task = allTasks.find((t) => t.id === params.task_id);
163
+ if (!task) {
164
+ return {
165
+ content: [{ type: "text", text: `Task ${params.task_id} not found.` }],
166
+ details: { error: "task_not_found" },
167
+ };
168
+ }
169
+ switch (params.status) {
170
+ case "in_progress":
171
+ bp = startTask(bp, params.task_id, state.sessionId);
172
+ break;
173
+ case "completed":
174
+ bp = completeTask(bp, params.task_id);
175
+ break;
176
+ case "skipped":
177
+ bp = skipTask(bp, params.task_id);
178
+ break;
179
+ }
180
+ if (params.notes) {
181
+ bp = {
182
+ ...bp,
183
+ phases: bp.phases.map((p) => ({
184
+ ...p,
185
+ tasks: p.tasks.map((t) => t.id === params.task_id ? { ...t, notes: params.notes ?? null } : t),
186
+ })),
187
+ };
188
+ }
189
+ saveBlueprint(bp);
190
+ appendHistory(bp.id, {
191
+ timestamp: new Date().toISOString(),
192
+ event: params.status === "completed" ? "task_completed"
193
+ : params.status === "skipped" ? "task_skipped"
194
+ : "task_started",
195
+ phase_id: bp.active_phase_id,
196
+ task_id: params.task_id,
197
+ session_id: state.sessionId,
198
+ details: params.notes ?? `Task ${params.task_id} -> ${params.status}`,
199
+ });
200
+ stateRef.set({ ...state, blueprint: bp });
201
+ const next = getNextTask(bp);
202
+ const nextInfo = next ? `\nNext task: ${next.id} - ${next.title}` : "\nNo more tasks.";
203
+ return {
204
+ content: [{
205
+ type: "text",
206
+ text: `Task ${params.task_id} updated to ${params.status}.${nextInfo}`,
207
+ }],
208
+ details: {
209
+ task_id: params.task_id,
210
+ new_status: params.status,
211
+ next_task: next?.id ?? null,
212
+ blueprint_status: bp.status,
213
+ },
214
+ };
215
+ },
216
+ });
217
+ pi.registerTool({
218
+ name: "blueprint_next",
219
+ label: "Next Blueprint Task",
220
+ description: "Get the next actionable task from the active blueprint",
221
+ promptSnippet: "Get the next task to work on",
222
+ parameters: NextParams,
223
+ promptGuidelines: guidelines,
224
+ async execute() {
225
+ const state = stateRef.get();
226
+ if (!state.blueprint) {
227
+ return {
228
+ content: [{ type: "text", text: "No active blueprint." }],
229
+ details: { has_blueprint: false },
230
+ };
231
+ }
232
+ const next = getNextTask(state.blueprint);
233
+ if (!next) {
234
+ return {
235
+ content: [{
236
+ type: "text",
237
+ text: state.blueprint.status === "completed"
238
+ ? "Blueprint is complete. All tasks and verifications are done."
239
+ : "No actionable tasks. Some may be blocked or awaiting verification.",
240
+ }],
241
+ details: { blueprint_status: state.blueprint.status },
242
+ };
243
+ }
244
+ const lines = [
245
+ `## Next Task: ${next.id} - ${next.title}`,
246
+ "",
247
+ next.description,
248
+ ];
249
+ if (next.acceptance_criteria.length > 0) {
250
+ lines.push("", "**Acceptance criteria:**");
251
+ for (const c of next.acceptance_criteria) {
252
+ lines.push(`- ${c}`);
253
+ }
254
+ }
255
+ if (next.file_targets.length > 0) {
256
+ lines.push("", "**File targets:**");
257
+ for (const f of next.file_targets) {
258
+ lines.push(`- ${f}`);
259
+ }
260
+ }
261
+ if (next.dependencies.length > 0) {
262
+ lines.push("", `**Dependencies:** ${next.dependencies.join(", ")} (all completed)`);
263
+ }
264
+ return {
265
+ content: [{ type: "text", text: lines.join("\n") }],
266
+ details: { task_id: next.id, phase_id: state.blueprint.active_phase_id },
267
+ };
268
+ },
269
+ });
270
+ }
271
+ function buildPhases(raw) {
272
+ return raw.map((rp) => ({
273
+ id: rp.id,
274
+ title: rp.title,
275
+ description: rp.description,
276
+ status: "pending",
277
+ tasks: rp.tasks.map((rt) => ({
278
+ id: rt.id,
279
+ title: rt.title,
280
+ description: rt.description,
281
+ status: "pending",
282
+ acceptance_criteria: [...rt.acceptance_criteria],
283
+ file_targets: [...rt.file_targets],
284
+ dependencies: [...rt.dependencies],
285
+ started_at: null,
286
+ completed_at: null,
287
+ session_id: null,
288
+ notes: null,
289
+ })),
290
+ verification_gates: rp.verification_gates.map((rg) => ({
291
+ type: rg.type,
292
+ command: rg.command ?? null,
293
+ description: rg.description,
294
+ passed: false,
295
+ last_checked_at: null,
296
+ error_message: null,
297
+ })),
298
+ started_at: null,
299
+ completed_at: null,
300
+ }));
301
+ }
302
+ //# sourceMappingURL=blueprint-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-tools.js","sourceRoot":"","sources":["../src/blueprint-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Task } from "./types.js";
2
+ export declare function findBlockedTasks(tasks: readonly Task[]): readonly string[];
3
+ export declare function isTaskReady(tasks: readonly Task[], taskId: string): boolean;
4
+ export declare function getBlockingTasks(tasks: readonly Task[], taskId: string): readonly string[];
5
+ export declare function detectCycles(tasks: readonly Task[]): readonly (readonly string[])[];
6
+ export declare function topologicalSort(tasks: readonly Task[]): readonly string[];
7
+ export declare function getAllTasks(phases: readonly {
8
+ readonly tasks: readonly Task[];
9
+ }[]): readonly Task[];
10
+ //# sourceMappingURL=dependency-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../src/dependency-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,MAAM,EAAE,CAU1E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAO3E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAK1F;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAuCnF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,MAAM,EAAE,CAoCzE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA;CAAE,EAAE,GAAG,SAAS,IAAI,EAAE,CAEnG"}
@@ -0,0 +1,101 @@
1
+ import { isTaskDone, getCompletedTaskIds } from "./types.js";
2
+ export function findBlockedTasks(tasks) {
3
+ const completedIds = getCompletedTaskIds(tasks);
4
+ return tasks
5
+ .filter((t) => !isTaskDone(t) &&
6
+ t.dependencies.length > 0 &&
7
+ t.dependencies.some((dep) => !completedIds.has(dep)))
8
+ .map((t) => t.id);
9
+ }
10
+ export function isTaskReady(tasks, taskId) {
11
+ const task = tasks.find((t) => t.id === taskId);
12
+ if (!task)
13
+ return false;
14
+ if (isTaskDone(task))
15
+ return false;
16
+ if (task.dependencies.length === 0)
17
+ return true;
18
+ const completedIds = getCompletedTaskIds(tasks);
19
+ return task.dependencies.every((dep) => completedIds.has(dep));
20
+ }
21
+ export function getBlockingTasks(tasks, taskId) {
22
+ const task = tasks.find((t) => t.id === taskId);
23
+ if (!task)
24
+ return [];
25
+ const completedIds = getCompletedTaskIds(tasks);
26
+ return task.dependencies.filter((dep) => !completedIds.has(dep));
27
+ }
28
+ export function detectCycles(tasks) {
29
+ const ids = new Set(tasks.map((t) => t.id));
30
+ const adj = new Map();
31
+ for (const t of tasks) {
32
+ adj.set(t.id, t.dependencies.filter((d) => ids.has(d)));
33
+ }
34
+ const WHITE = 0;
35
+ const GRAY = 1;
36
+ const BLACK = 2;
37
+ const color = new Map();
38
+ for (const id of ids)
39
+ color.set(id, WHITE);
40
+ const cycles = [];
41
+ const stack = [];
42
+ function dfs(node) {
43
+ color.set(node, GRAY);
44
+ stack.push(node);
45
+ for (const neighbor of adj.get(node) ?? []) {
46
+ const c = color.get(neighbor);
47
+ if (c === GRAY) {
48
+ const cycleStart = stack.indexOf(neighbor);
49
+ cycles.push(stack.slice(cycleStart));
50
+ }
51
+ else if (c === WHITE) {
52
+ dfs(neighbor);
53
+ }
54
+ }
55
+ stack.pop();
56
+ color.set(node, BLACK);
57
+ }
58
+ for (const id of ids) {
59
+ if (color.get(id) === WHITE)
60
+ dfs(id);
61
+ }
62
+ return cycles;
63
+ }
64
+ export function topologicalSort(tasks) {
65
+ const ids = new Set(tasks.map((t) => t.id));
66
+ const adj = new Map();
67
+ const inDegree = new Map();
68
+ for (const id of ids) {
69
+ adj.set(id, []);
70
+ inDegree.set(id, 0);
71
+ }
72
+ for (const t of tasks) {
73
+ for (const dep of t.dependencies) {
74
+ if (ids.has(dep)) {
75
+ adj.get(dep).push(t.id);
76
+ inDegree.set(t.id, (inDegree.get(t.id) ?? 0) + 1);
77
+ }
78
+ }
79
+ }
80
+ const queue = [];
81
+ for (const [id, deg] of inDegree) {
82
+ if (deg === 0)
83
+ queue.push(id);
84
+ }
85
+ const result = [];
86
+ while (queue.length > 0) {
87
+ const node = queue.shift();
88
+ result.push(node);
89
+ for (const neighbor of adj.get(node) ?? []) {
90
+ const newDeg = (inDegree.get(neighbor) ?? 1) - 1;
91
+ inDegree.set(neighbor, newDeg);
92
+ if (newDeg === 0)
93
+ queue.push(neighbor);
94
+ }
95
+ }
96
+ return result;
97
+ }
98
+ export function getAllTasks(phases) {
99
+ return phases.flatMap((p) => p.tasks);
100
+ }
101
+ //# sourceMappingURL=dependency-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../src/dependency-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
+ export default function (pi: ExtensionAPI): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,+BAA+B,CAAC;AA2BvC,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CAuF/C"}