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
@@ -0,0 +1,224 @@
1
+ import { isTaskDone } from "./types.js";
2
+ import { findBlockedTasks, isTaskReady, getAllTasks } from "./dependency-graph.js";
3
+ function updateTask(phase, taskId, patch) {
4
+ return {
5
+ ...phase,
6
+ tasks: phase.tasks.map((t) => (t.id === taskId ? { ...t, ...patch } : t)),
7
+ };
8
+ }
9
+ function updatePhase(blueprint, phaseId, patch) {
10
+ return {
11
+ ...blueprint,
12
+ updated_at: new Date().toISOString(),
13
+ phases: blueprint.phases.map((p) => (p.id === phaseId ? { ...p, ...patch } : p)),
14
+ };
15
+ }
16
+ function findTask(blueprint, taskId) {
17
+ for (const phase of blueprint.phases) {
18
+ const task = phase.tasks.find((t) => t.id === taskId);
19
+ if (task)
20
+ return { phase, task };
21
+ }
22
+ return null;
23
+ }
24
+ function findNextTaskInPhase(phase, allTasks) {
25
+ for (const task of phase.tasks) {
26
+ if (task.status === "in_progress")
27
+ return task;
28
+ }
29
+ for (const task of phase.tasks) {
30
+ if (task.status === "pending" && isTaskReady(allTasks, task.id))
31
+ return task;
32
+ }
33
+ return null;
34
+ }
35
+ function resolveTaskCompletion(blueprint, phaseId, taskId) {
36
+ let bp = recomputeBlocked(blueprint);
37
+ if (bp.active_task_id === taskId) {
38
+ const next = getNextTask(bp);
39
+ bp = { ...bp, active_task_id: next?.id ?? null };
40
+ }
41
+ const currentPhase = bp.phases.find((p) => p.id === phaseId);
42
+ if (currentPhase && currentPhase.tasks.every(isTaskDone)) {
43
+ bp = updatePhase(bp, phaseId, { status: "completed" });
44
+ }
45
+ return bp;
46
+ }
47
+ export function startTask(blueprint, taskId, sessionId) {
48
+ const found = findTask(blueprint, taskId);
49
+ if (!found)
50
+ return blueprint;
51
+ const { phase, task } = found;
52
+ if (isTaskDone(task))
53
+ return blueprint;
54
+ const now = new Date().toISOString();
55
+ const updatedPhase = updateTask(phase, taskId, {
56
+ status: "in_progress",
57
+ started_at: task.started_at ?? now,
58
+ session_id: sessionId,
59
+ });
60
+ let phaseStatus = phase.status;
61
+ if (phaseStatus === "pending") {
62
+ phaseStatus = "active";
63
+ }
64
+ let bp = updatePhase(blueprint, phase.id, {
65
+ ...updatedPhase,
66
+ status: phaseStatus,
67
+ started_at: phase.started_at ?? now,
68
+ });
69
+ bp = {
70
+ ...bp,
71
+ active_phase_id: phase.id,
72
+ active_task_id: taskId,
73
+ status: blueprint.status === "draft" ? "active" : blueprint.status,
74
+ };
75
+ return bp;
76
+ }
77
+ export function completeTask(blueprint, taskId) {
78
+ const found = findTask(blueprint, taskId);
79
+ if (!found)
80
+ return blueprint;
81
+ const { phase, task } = found;
82
+ if (task.status === "completed")
83
+ return blueprint;
84
+ const updatedPhase = updateTask(phase, taskId, {
85
+ status: "completed",
86
+ completed_at: new Date().toISOString(),
87
+ });
88
+ let bp = updatePhase(blueprint, phase.id, updatedPhase);
89
+ bp = resolveTaskCompletion(bp, phase.id, taskId);
90
+ const allTasks = getAllTasks(bp.phases);
91
+ if (allTasks.every(isTaskDone)) {
92
+ const allVerified = bp.phases.every((p) => p.verification_gates.length === 0 || p.verification_gates.every((g) => g.passed));
93
+ if (allVerified) {
94
+ bp = { ...bp, status: "completed" };
95
+ }
96
+ }
97
+ return bp;
98
+ }
99
+ export function skipTask(blueprint, taskId) {
100
+ const found = findTask(blueprint, taskId);
101
+ if (!found)
102
+ return blueprint;
103
+ const { phase } = found;
104
+ const updatedPhase = updateTask(phase, taskId, {
105
+ status: "skipped",
106
+ completed_at: new Date().toISOString(),
107
+ });
108
+ let bp = updatePhase(blueprint, phase.id, updatedPhase);
109
+ bp = resolveTaskCompletion(bp, phase.id, taskId);
110
+ return bp;
111
+ }
112
+ export function verifyGate(blueprint, phaseId, gateIndex, passed, errorMsg) {
113
+ const phase = blueprint.phases.find((p) => p.id === phaseId);
114
+ if (!phase)
115
+ return blueprint;
116
+ const gate = phase.verification_gates[gateIndex];
117
+ if (!gate)
118
+ return blueprint;
119
+ const now = new Date().toISOString();
120
+ const updatedGates = phase.verification_gates.map((g, i) => i === gateIndex
121
+ ? { ...g, passed, last_checked_at: now, error_message: errorMsg ?? null }
122
+ : g);
123
+ return updatePhase(blueprint, phaseId, { verification_gates: updatedGates });
124
+ }
125
+ export function advancePhase(blueprint) {
126
+ const currentPhase = blueprint.phases.find((p) => p.id === blueprint.active_phase_id);
127
+ if (!currentPhase)
128
+ return blueprint;
129
+ const allGatesPassed = currentPhase.verification_gates.length === 0 ||
130
+ currentPhase.verification_gates.every((g) => g.passed);
131
+ if (!currentPhase.tasks.every(isTaskDone) || !allGatesPassed)
132
+ return blueprint;
133
+ let bp = updatePhase(blueprint, currentPhase.id, {
134
+ status: "verified",
135
+ completed_at: new Date().toISOString(),
136
+ });
137
+ const currentIdx = bp.phases.findIndex((p) => p.id === currentPhase.id);
138
+ const nextPhase = bp.phases[currentIdx + 1];
139
+ if (nextPhase) {
140
+ bp = {
141
+ ...bp,
142
+ active_phase_id: nextPhase.id,
143
+ active_task_id: null,
144
+ };
145
+ const next = getNextTask(bp);
146
+ if (next) {
147
+ bp = { ...bp, active_task_id: next.id };
148
+ }
149
+ }
150
+ else {
151
+ bp = {
152
+ ...bp,
153
+ active_phase_id: null,
154
+ active_task_id: null,
155
+ status: "completed",
156
+ };
157
+ }
158
+ return bp;
159
+ }
160
+ export function getNextTask(blueprint) {
161
+ const allTasks = getAllTasks(blueprint.phases);
162
+ if (blueprint.active_phase_id) {
163
+ const phase = blueprint.phases.find((p) => p.id === blueprint.active_phase_id);
164
+ if (phase) {
165
+ const found = findNextTaskInPhase(phase, allTasks);
166
+ if (found)
167
+ return found;
168
+ }
169
+ }
170
+ for (const phase of blueprint.phases) {
171
+ if (phase.status === "verified")
172
+ continue;
173
+ const found = findNextTaskInPhase(phase, allTasks);
174
+ if (found)
175
+ return found;
176
+ }
177
+ return null;
178
+ }
179
+ export function recomputeBlocked(blueprint) {
180
+ const allTasks = getAllTasks(blueprint.phases);
181
+ const blockedIds = new Set(findBlockedTasks(allTasks));
182
+ return {
183
+ ...blueprint,
184
+ updated_at: new Date().toISOString(),
185
+ phases: blueprint.phases.map((phase) => ({
186
+ ...phase,
187
+ tasks: phase.tasks.map((task) => {
188
+ if (isTaskDone(task))
189
+ return task;
190
+ if (blockedIds.has(task.id) && task.status !== "blocked") {
191
+ return { ...task, status: "blocked" };
192
+ }
193
+ if (!blockedIds.has(task.id) && task.status === "blocked") {
194
+ return { ...task, status: "pending" };
195
+ }
196
+ return task;
197
+ }),
198
+ })),
199
+ };
200
+ }
201
+ export function createBlueprint(id, objective, projectId, phases) {
202
+ const now = new Date().toISOString();
203
+ let bp = {
204
+ id,
205
+ objective,
206
+ project_id: projectId,
207
+ status: "active",
208
+ created_at: now,
209
+ updated_at: now,
210
+ phases,
211
+ active_phase_id: phases[0]?.id ?? null,
212
+ active_task_id: null,
213
+ };
214
+ bp = recomputeBlocked(bp);
215
+ const next = getNextTask(bp);
216
+ if (next) {
217
+ bp = { ...bp, active_task_id: next.id };
218
+ }
219
+ return bp;
220
+ }
221
+ export function abandonBlueprint(blueprint) {
222
+ return { ...blueprint, status: "abandoned", updated_at: new Date().toISOString() };
223
+ }
224
+ //# sourceMappingURL=state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../src/state-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Blueprint, BlueprintIndex, HistoryEntry, SessionsState } from "./types.js";
2
+ export declare function getBaseDir(baseDir?: string): string;
3
+ export declare function getBlueprintDir(blueprintId: string, baseDir?: string): string;
4
+ export declare function ensureStorageLayout(blueprintId: string, baseDir?: string): void;
5
+ export declare function ensureBaseDir(baseDir?: string): void;
6
+ export declare function loadIndex(baseDir?: string): BlueprintIndex | null;
7
+ export declare function saveIndex(index: BlueprintIndex, baseDir?: string): void;
8
+ export declare function loadBlueprint(blueprintId: string, baseDir?: string): Blueprint | null;
9
+ export declare function saveBlueprint(blueprint: Blueprint, baseDir?: string): void;
10
+ export declare function appendHistory(blueprintId: string, entry: HistoryEntry, baseDir?: string): void;
11
+ export declare function loadSessions(blueprintId: string, baseDir?: string): SessionsState | null;
12
+ export declare function saveSessions(blueprintId: string, sessions: SessionsState, baseDir?: string): void;
13
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAG/E;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAGjE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAIvE;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGrF;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAK1E;AAED,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAIN;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAGxF;AAED,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAIN"}
@@ -0,0 +1,59 @@
1
+ import { mkdirSync, readFileSync, writeFileSync, appendFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { renderPlanMarkdown } from "./plan-renderer.js";
5
+ export function getBaseDir(baseDir) {
6
+ return baseDir ?? join(homedir(), ".pi", "blueprints");
7
+ }
8
+ export function getBlueprintDir(blueprintId, baseDir) {
9
+ return join(getBaseDir(baseDir), blueprintId);
10
+ }
11
+ export function ensureStorageLayout(blueprintId, baseDir) {
12
+ const dir = getBlueprintDir(blueprintId, baseDir);
13
+ mkdirSync(dir, { recursive: true });
14
+ }
15
+ export function ensureBaseDir(baseDir) {
16
+ mkdirSync(getBaseDir(baseDir), { recursive: true });
17
+ }
18
+ export function loadIndex(baseDir) {
19
+ const path = join(getBaseDir(baseDir), "index.json");
20
+ return readJson(path);
21
+ }
22
+ export function saveIndex(index, baseDir) {
23
+ ensureBaseDir(baseDir);
24
+ const path = join(getBaseDir(baseDir), "index.json");
25
+ writeFileSync(path, JSON.stringify(index, null, 2) + "\n");
26
+ }
27
+ export function loadBlueprint(blueprintId, baseDir) {
28
+ const path = join(getBlueprintDir(blueprintId, baseDir), "state.json");
29
+ return readJson(path);
30
+ }
31
+ export function saveBlueprint(blueprint, baseDir) {
32
+ ensureStorageLayout(blueprint.id, baseDir);
33
+ const dir = getBlueprintDir(blueprint.id, baseDir);
34
+ writeFileSync(join(dir, "state.json"), JSON.stringify(blueprint, null, 2) + "\n");
35
+ writeFileSync(join(dir, "plan.md"), renderPlanMarkdown(blueprint));
36
+ }
37
+ export function appendHistory(blueprintId, entry, baseDir) {
38
+ ensureStorageLayout(blueprintId, baseDir);
39
+ const path = join(getBlueprintDir(blueprintId, baseDir), "history.jsonl");
40
+ appendFileSync(path, JSON.stringify(entry) + "\n");
41
+ }
42
+ export function loadSessions(blueprintId, baseDir) {
43
+ const path = join(getBlueprintDir(blueprintId, baseDir), "sessions.json");
44
+ return readJson(path);
45
+ }
46
+ export function saveSessions(blueprintId, sessions, baseDir) {
47
+ ensureStorageLayout(blueprintId, baseDir);
48
+ const path = join(getBlueprintDir(blueprintId, baseDir), "sessions.json");
49
+ writeFileSync(path, JSON.stringify(sessions, null, 2) + "\n");
50
+ }
51
+ function readJson(path) {
52
+ try {
53
+ return JSON.parse(readFileSync(path, "utf-8"));
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ export type TaskStatus = "pending" | "in_progress" | "completed" | "blocked" | "skipped";
2
+ export type PhaseStatus = "pending" | "active" | "completed" | "verified";
3
+ export type VerificationType = "tests_pass" | "typecheck_clean" | "user_approval" | "custom_command";
4
+ export type BlueprintStatus = "draft" | "active" | "completed" | "abandoned";
5
+ export type HistoryEventType = "blueprint_created" | "task_started" | "task_completed" | "task_blocked" | "task_skipped" | "phase_started" | "phase_completed" | "phase_verified" | "verification_passed" | "verification_failed" | "blueprint_completed" | "blueprint_abandoned";
6
+ export interface Task {
7
+ readonly id: string;
8
+ readonly title: string;
9
+ readonly description: string;
10
+ readonly status: TaskStatus;
11
+ readonly acceptance_criteria: readonly string[];
12
+ readonly file_targets: readonly string[];
13
+ readonly dependencies: readonly string[];
14
+ readonly started_at: string | null;
15
+ readonly completed_at: string | null;
16
+ readonly session_id: string | null;
17
+ readonly notes: string | null;
18
+ }
19
+ export interface VerificationGate {
20
+ readonly type: VerificationType;
21
+ readonly command: string | null;
22
+ readonly description: string;
23
+ readonly passed: boolean;
24
+ readonly last_checked_at: string | null;
25
+ readonly error_message: string | null;
26
+ }
27
+ export interface Phase {
28
+ readonly id: string;
29
+ readonly title: string;
30
+ readonly description: string;
31
+ readonly status: PhaseStatus;
32
+ readonly tasks: readonly Task[];
33
+ readonly verification_gates: readonly VerificationGate[];
34
+ readonly started_at: string | null;
35
+ readonly completed_at: string | null;
36
+ }
37
+ export interface Blueprint {
38
+ readonly id: string;
39
+ readonly objective: string;
40
+ readonly project_id: string;
41
+ readonly status: BlueprintStatus;
42
+ readonly created_at: string;
43
+ readonly updated_at: string;
44
+ readonly phases: readonly Phase[];
45
+ readonly active_phase_id: string | null;
46
+ readonly active_task_id: string | null;
47
+ }
48
+ export interface HistoryEntry {
49
+ readonly timestamp: string;
50
+ readonly event: HistoryEventType;
51
+ readonly phase_id: string | null;
52
+ readonly task_id: string | null;
53
+ readonly session_id: string;
54
+ readonly details: string;
55
+ }
56
+ export interface SessionRecord {
57
+ readonly session_id: string;
58
+ readonly started_at: string;
59
+ readonly ended_at: string | null;
60
+ readonly tasks_worked: readonly string[];
61
+ readonly tasks_completed: readonly string[];
62
+ }
63
+ export interface SessionsState {
64
+ readonly sessions: readonly SessionRecord[];
65
+ }
66
+ export interface BlueprintIndexEntry {
67
+ readonly id: string;
68
+ readonly objective: string;
69
+ readonly status: BlueprintStatus;
70
+ readonly created_at: string;
71
+ readonly project_id: string;
72
+ }
73
+ export interface BlueprintIndex {
74
+ readonly active_blueprint_id: string | null;
75
+ readonly blueprints: readonly BlueprintIndexEntry[];
76
+ }
77
+ export interface ProjectInfo {
78
+ readonly id: string;
79
+ readonly name: string;
80
+ readonly root: string;
81
+ }
82
+ export interface BlueprintExtensionState {
83
+ readonly project: ProjectInfo | null;
84
+ readonly blueprint: Blueprint | null;
85
+ readonly sessionId: string;
86
+ }
87
+ export interface StateRef {
88
+ get: () => BlueprintExtensionState;
89
+ set: (s: BlueprintExtensionState) => void;
90
+ }
91
+ export interface VerificationResult {
92
+ readonly passed: boolean;
93
+ readonly output: string;
94
+ readonly duration_ms: number;
95
+ }
96
+ export declare function isTaskDone(task: Task): boolean;
97
+ export declare function getCompletedTaskIds(tasks: readonly Task[]): Set<string>;
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAE1E,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAErG,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAE7E,MAAM,MAAM,gBAAgB,GACxB,mBAAmB,GACnB,cAAc,GACd,gBAAgB,GAChB,cAAc,GACd,cAAc,GACd,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACzD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,uBAAuB,CAAC;IACnC,GAAG,EAAE,CAAC,CAAC,EAAE,uBAAuB,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE9C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAEvE"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ export function isTaskDone(task) {
2
+ return task.status === "completed" || task.status === "skipped";
3
+ }
4
+ export function getCompletedTaskIds(tasks) {
5
+ return new Set(tasks.filter(isTaskDone).map((t) => t.id));
6
+ }
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA6HA,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { VerificationGate, VerificationResult } from "./types.js";
2
+ export declare function runGate(gate: VerificationGate, cwd: string): VerificationResult;
3
+ export declare function runAllGates(gates: readonly VerificationGate[], cwd: string): readonly VerificationResult[];
4
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvE,wBAAgB,OAAO,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAwB/E;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,GAAG,EAAE,MAAM,GACV,SAAS,kBAAkB,EAAE,CAI/B"}
@@ -0,0 +1,55 @@
1
+ import { execSync } from "node:child_process";
2
+ export function runGate(gate, cwd) {
3
+ if (gate.type === "user_approval") {
4
+ return { passed: false, output: "Requires user approval", duration_ms: 0 };
5
+ }
6
+ const command = resolveCommand(gate);
7
+ if (!command) {
8
+ return { passed: false, output: `No command for gate type: ${gate.type}`, duration_ms: 0 };
9
+ }
10
+ const start = Date.now();
11
+ try {
12
+ const output = execSync(command, {
13
+ cwd,
14
+ encoding: "utf-8",
15
+ timeout: 120_000,
16
+ stdio: ["pipe", "pipe", "pipe"],
17
+ });
18
+ return { passed: true, output, duration_ms: Date.now() - start };
19
+ }
20
+ catch (err) {
21
+ const duration_ms = Date.now() - start;
22
+ const output = extractExecError(err);
23
+ return { passed: false, output, duration_ms };
24
+ }
25
+ }
26
+ export function runAllGates(gates, cwd) {
27
+ return gates
28
+ .filter((g) => g.type !== "user_approval")
29
+ .map((gate) => runGate(gate, cwd));
30
+ }
31
+ function resolveCommand(gate) {
32
+ switch (gate.type) {
33
+ case "tests_pass":
34
+ return "npm test";
35
+ case "typecheck_clean":
36
+ return "npx tsc --noEmit";
37
+ case "custom_command":
38
+ return gate.command;
39
+ case "user_approval":
40
+ return null;
41
+ }
42
+ }
43
+ function extractExecError(err) {
44
+ if (err && typeof err === "object") {
45
+ const obj = err;
46
+ if (typeof obj["stderr"] === "string" && obj["stderr"])
47
+ return obj["stderr"];
48
+ if (typeof obj["stdout"] === "string" && obj["stdout"])
49
+ return obj["stdout"];
50
+ if (typeof obj["message"] === "string")
51
+ return obj["message"];
52
+ }
53
+ return "Unknown error";
54
+ }
55
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,UAAU,OAAO,CAAC,IAAsB,EAAE,GAAW;IACzD,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC7F,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC/B,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IACnE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAkC,EAClC,GAAW;IAEX,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC;SACzC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,IAAsB;IAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,UAAU,CAAC;QACpB,KAAK,iBAAiB;YACpB,OAAO,kBAAkB,CAAC;QAC5B,KAAK,gBAAgB;YACnB,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,KAAK,eAAe;YAClB,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,GAA8B,CAAC;QAC3C,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "pi-blueprint",
3
+ "version": "0.2.0",
4
+ "description": "A Pi extension that turns high-level objectives into phased, multi-session construction plans with dependency tracking and verification gates.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Matt Devy",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/MattDevy/pi-extensions.git",
11
+ "directory": "packages/pi-blueprint"
12
+ },
13
+ "homepage": "https://github.com/MattDevy/pi-extensions/tree/main/packages/pi-blueprint#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/MattDevy/pi-extensions/issues"
16
+ },
17
+ "keywords": [
18
+ "pi-package",
19
+ "pi-extension",
20
+ "pi-coding-agent",
21
+ "blueprint",
22
+ "planning",
23
+ "multi-session",
24
+ "dependency-tracking",
25
+ "ai",
26
+ "llm",
27
+ "ai-agent",
28
+ "coding-assistant",
29
+ "developer-tools"
30
+ ],
31
+ "engines": {
32
+ "node": ">=18"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "src",
37
+ "!src/**/*.test.ts",
38
+ "README.md",
39
+ "LICENSE"
40
+ ],
41
+ "main": "./dist/index.js",
42
+ "types": "./dist/index.d.ts",
43
+ "pi": {
44
+ "extensions": [
45
+ "dist/index.js"
46
+ ]
47
+ },
48
+ "scripts": {
49
+ "clean": "rm -rf dist",
50
+ "build": "npm run clean && tsc -p tsconfig.build.json",
51
+ "typecheck": "tsc --noEmit",
52
+ "test": "vitest run",
53
+ "lint": "eslint src/",
54
+ "check": "vitest run && eslint src/ && tsc --noEmit",
55
+ "prepublishOnly": "npm run build && npm run check",
56
+ "prepack": "test -d dist || { echo 'Error: dist/ missing. Run npm run build first.' && exit 1; }"
57
+ },
58
+ "peerDependencies": {
59
+ "@mariozechner/pi-coding-agent": "^0.62.0",
60
+ "@mariozechner/pi-ai": "^0.62.0",
61
+ "@mariozechner/pi-tui": "^0.62.0",
62
+ "@sinclair/typebox": "^0.34.0"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^24.0.0",
66
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
67
+ "@typescript-eslint/parser": "^8.0.0",
68
+ "eslint": "^9.0.0",
69
+ "typescript": "^5.7.0",
70
+ "vitest": "^3.0.0"
71
+ }
72
+ }