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.
- package/README.md +57 -0
- package/dist/blueprint-command.d.ts +5 -0
- package/dist/blueprint-command.d.ts.map +1 -0
- package/dist/blueprint-command.js +56 -0
- package/dist/blueprint-command.js.map +1 -0
- package/dist/blueprint-injector.d.ts +3 -0
- package/dist/blueprint-injector.d.ts.map +1 -0
- package/dist/blueprint-injector.js +11 -0
- package/dist/blueprint-injector.js.map +1 -0
- package/dist/blueprint-tools.d.ts +4 -0
- package/dist/blueprint-tools.d.ts.map +1 -0
- package/dist/blueprint-tools.js +302 -0
- package/dist/blueprint-tools.js.map +1 -0
- package/dist/dependency-graph.d.ts +10 -0
- package/dist/dependency-graph.d.ts.map +1 -0
- package/dist/dependency-graph.js +101 -0
- package/dist/dependency-graph.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/plan-next-command.d.ts +5 -0
- package/dist/plan-next-command.d.ts.map +1 -0
- package/dist/plan-next-command.js +36 -0
- package/dist/plan-next-command.js.map +1 -0
- package/dist/plan-renderer.d.ts +3 -0
- package/dist/plan-renderer.d.ts.map +1 -0
- package/dist/plan-renderer.js +61 -0
- package/dist/plan-renderer.js.map +1 -0
- package/dist/plan-status-command.d.ts +5 -0
- package/dist/plan-status-command.d.ts.map +1 -0
- package/dist/plan-status-command.js +20 -0
- package/dist/plan-status-command.js.map +1 -0
- package/dist/plan-verify-command.d.ts +5 -0
- package/dist/plan-verify-command.d.ts.map +1 -0
- package/dist/plan-verify-command.js +65 -0
- package/dist/plan-verify-command.js.map +1 -0
- package/dist/prompts/blueprint-generate.d.ts +2 -0
- package/dist/prompts/blueprint-generate.d.ts.map +1 -0
- package/dist/prompts/blueprint-generate.js +35 -0
- package/dist/prompts/blueprint-generate.js.map +1 -0
- package/dist/prompts/phase-context.d.ts +3 -0
- package/dist/prompts/phase-context.d.ts.map +1 -0
- package/dist/prompts/phase-context.js +62 -0
- package/dist/prompts/phase-context.js.map +1 -0
- package/dist/state-machine.d.ts +11 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +224 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/storage.d.ts +13 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +59 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/verification.d.ts +4 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +55 -0
- package/dist/verification.js.map +1 -0
- package/package.json +72 -0
- package/src/blueprint-command.ts +84 -0
- package/src/blueprint-injector.ts +10 -0
- package/src/blueprint-tools.ts +380 -0
- package/src/dependency-graph.ts +113 -0
- package/src/index.ts +118 -0
- package/src/plan-next-command.ts +56 -0
- package/src/plan-renderer.ts +70 -0
- package/src/plan-status-command.ts +30 -0
- package/src/plan-verify-command.ts +82 -0
- package/src/prompts/blueprint-generate.ts +34 -0
- package/src/prompts/phase-context.ts +76 -0
- package/src/state-machine.ts +278 -0
- package/src/storage.ts +83 -0
- package/src/types.ts +132 -0
- package/src/verification.ts +60 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ensureBaseDir, loadIndex, loadBlueprint, saveBlueprint, } from "./storage.js";
|
|
2
|
+
import { buildInjectionBlock } from "./blueprint-injector.js";
|
|
3
|
+
import { registerBlueprintTools } from "./blueprint-tools.js";
|
|
4
|
+
import { handleBlueprintCommand, COMMAND_NAME as BLUEPRINT_CMD, } from "./blueprint-command.js";
|
|
5
|
+
import { handlePlanStatusCommand, COMMAND_NAME as STATUS_CMD, } from "./plan-status-command.js";
|
|
6
|
+
import { handlePlanVerifyCommand, COMMAND_NAME as VERIFY_CMD, } from "./plan-verify-command.js";
|
|
7
|
+
import { handlePlanNextCommand, COMMAND_NAME as NEXT_CMD, } from "./plan-next-command.js";
|
|
8
|
+
export default function (pi) {
|
|
9
|
+
let state = {
|
|
10
|
+
project: null,
|
|
11
|
+
blueprint: null,
|
|
12
|
+
sessionId: "",
|
|
13
|
+
};
|
|
14
|
+
let dirty = false;
|
|
15
|
+
const stateRef = {
|
|
16
|
+
get: () => state,
|
|
17
|
+
set: (s) => {
|
|
18
|
+
state = s;
|
|
19
|
+
dirty = true;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
pi.on("session_start", (_event, _ctx) => {
|
|
23
|
+
try {
|
|
24
|
+
ensureBaseDir();
|
|
25
|
+
const index = loadIndex();
|
|
26
|
+
if (index?.active_blueprint_id) {
|
|
27
|
+
const blueprint = loadBlueprint(index.active_blueprint_id);
|
|
28
|
+
if (blueprint && blueprint.status === "active") {
|
|
29
|
+
state = { ...state, blueprint };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
registerBlueprintTools(pi, stateRef);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error("[pi-blueprint] session_start error:", err);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
pi.on("session_shutdown", (_event, _ctx) => {
|
|
39
|
+
try {
|
|
40
|
+
if (state.blueprint) {
|
|
41
|
+
saveBlueprint(state.blueprint);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
console.error("[pi-blueprint] session_shutdown error:", err);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
pi.on("before_agent_start", (event, _ctx) => {
|
|
49
|
+
try {
|
|
50
|
+
const block = buildInjectionBlock(state.blueprint);
|
|
51
|
+
if (!block)
|
|
52
|
+
return;
|
|
53
|
+
const e = event;
|
|
54
|
+
return { systemPrompt: (e.systemPrompt ?? "") + block };
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.error("[pi-blueprint] before_agent_start error:", err);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
pi.on("turn_end", (_event, _ctx) => {
|
|
61
|
+
try {
|
|
62
|
+
if (state.blueprint && dirty) {
|
|
63
|
+
saveBlueprint(state.blueprint);
|
|
64
|
+
dirty = false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.error("[pi-blueprint] turn_end error:", err);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
pi.registerCommand(BLUEPRINT_CMD, {
|
|
72
|
+
description: "Create or manage a multi-session blueprint plan",
|
|
73
|
+
handler: (args, ctx) => handleBlueprintCommand(args, ctx, stateRef, pi),
|
|
74
|
+
});
|
|
75
|
+
pi.registerCommand(STATUS_CMD, {
|
|
76
|
+
description: "Show detailed blueprint progress",
|
|
77
|
+
handler: (args, ctx) => handlePlanStatusCommand(args, ctx, stateRef),
|
|
78
|
+
});
|
|
79
|
+
pi.registerCommand(VERIFY_CMD, {
|
|
80
|
+
description: "Run verification gates for the current phase",
|
|
81
|
+
handler: (args, ctx) => handlePlanVerifyCommand(args, ctx, stateRef),
|
|
82
|
+
});
|
|
83
|
+
pi.registerCommand(NEXT_CMD, {
|
|
84
|
+
description: "Get and start the next blueprint task",
|
|
85
|
+
handler: (args, ctx) => handlePlanNextCommand(args, ctx, stateRef, pi),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 = "plan-next";
|
|
4
|
+
export declare function handlePlanNextCommand(_args: string, ctx: ExtensionCommandContext, stateRef: StateRef, pi: ExtensionAPI): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=plan-next-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-next-command.d.ts","sourceRoot":"","sources":["../src/plan-next-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;AAG3C,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,uBAAuB,EAC5B,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,YAAY,GACf,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getNextTask } from "./state-machine.js";
|
|
2
|
+
export const COMMAND_NAME = "plan-next";
|
|
3
|
+
export async function handlePlanNextCommand(_args, ctx, stateRef, pi) {
|
|
4
|
+
const state = stateRef.get();
|
|
5
|
+
if (!state.blueprint) {
|
|
6
|
+
ctx.ui.notify("No active blueprint.", "info");
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const next = getNextTask(state.blueprint);
|
|
10
|
+
if (!next) {
|
|
11
|
+
ctx.ui.notify(state.blueprint.status === "completed"
|
|
12
|
+
? "Blueprint is complete."
|
|
13
|
+
: "No actionable tasks. Some may be blocked or awaiting verification.", "info");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const lines = [
|
|
17
|
+
`Work on blueprint task ${next.id}: ${next.title}`,
|
|
18
|
+
"",
|
|
19
|
+
next.description,
|
|
20
|
+
];
|
|
21
|
+
if (next.acceptance_criteria.length > 0) {
|
|
22
|
+
lines.push("", "Acceptance criteria:");
|
|
23
|
+
for (const c of next.acceptance_criteria) {
|
|
24
|
+
lines.push(`- ${c}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (next.file_targets.length > 0) {
|
|
28
|
+
lines.push("", "File targets:");
|
|
29
|
+
for (const f of next.file_targets) {
|
|
30
|
+
lines.push(`- ${f}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
lines.push("", "When done, call the blueprint_update tool to mark this task as completed.");
|
|
34
|
+
pi.sendUserMessage(lines.join("\n"), { deliverAs: "followUp" });
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=plan-next-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-next-command.js","sourceRoot":"","sources":["../src/plan-next-command.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAa,EACb,GAA4B,EAC5B,QAAkB,EAClB,EAAgB;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW;YACpC,CAAC,CAAC,wBAAwB;YAC1B,CAAC,CAAC,oEAAoE,EACxE,MAAM,CACP,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,0BAA0B,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE;QAClD,EAAE;QACF,IAAI,CAAC,WAAW;KACjB,CAAC;IAEF,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,2EAA2E,CAAC,CAAC;IAE5F,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-renderer.d.ts","sourceRoot":"","sources":["../src/plan-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AAGzD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAc/D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { isTaskDone } from "./types.js";
|
|
2
|
+
export function renderPlanMarkdown(blueprint) {
|
|
3
|
+
const lines = [];
|
|
4
|
+
lines.push(`# Blueprint: ${blueprint.objective}`);
|
|
5
|
+
lines.push("");
|
|
6
|
+
lines.push(`**Status:** ${blueprint.status} | Created: ${formatDate(blueprint.created_at)} | Updated: ${formatDate(blueprint.updated_at)}`);
|
|
7
|
+
for (const phase of blueprint.phases) {
|
|
8
|
+
lines.push("");
|
|
9
|
+
lines.push("---");
|
|
10
|
+
lines.push("");
|
|
11
|
+
lines.push(renderPhase(phase, blueprint.active_phase_id));
|
|
12
|
+
}
|
|
13
|
+
return lines.join("\n") + "\n";
|
|
14
|
+
}
|
|
15
|
+
function renderPhase(phase, activePhaseId) {
|
|
16
|
+
const lines = [];
|
|
17
|
+
const isActive = phase.id === activePhaseId;
|
|
18
|
+
const activeTag = isActive ? " (active)" : "";
|
|
19
|
+
const completed = phase.tasks.filter(isTaskDone).length;
|
|
20
|
+
const total = phase.tasks.length;
|
|
21
|
+
lines.push(`## Phase ${phase.id}: ${phase.title}${activeTag}`);
|
|
22
|
+
lines.push("");
|
|
23
|
+
lines.push(`**Status:** ${phase.status} | ${completed}/${total} tasks completed`);
|
|
24
|
+
if (phase.description) {
|
|
25
|
+
lines.push("");
|
|
26
|
+
lines.push(phase.description);
|
|
27
|
+
}
|
|
28
|
+
if (phase.tasks.length > 0) {
|
|
29
|
+
lines.push("");
|
|
30
|
+
lines.push("### Tasks");
|
|
31
|
+
lines.push("");
|
|
32
|
+
for (const task of phase.tasks) {
|
|
33
|
+
lines.push(renderTask(task));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (phase.verification_gates.length > 0) {
|
|
37
|
+
lines.push("");
|
|
38
|
+
lines.push("### Verification Gates");
|
|
39
|
+
lines.push("");
|
|
40
|
+
for (const gate of phase.verification_gates) {
|
|
41
|
+
const check = gate.passed ? "x" : " ";
|
|
42
|
+
lines.push(`- [${check}] ${gate.description}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return lines.join("\n");
|
|
46
|
+
}
|
|
47
|
+
function renderTask(task) {
|
|
48
|
+
const check = isTaskDone(task) ? "x" : " ";
|
|
49
|
+
let annotation = "";
|
|
50
|
+
if (task.status === "in_progress")
|
|
51
|
+
annotation = " *(in progress)*";
|
|
52
|
+
else if (task.status === "blocked")
|
|
53
|
+
annotation = " *(blocked)*";
|
|
54
|
+
else if (task.status === "skipped")
|
|
55
|
+
annotation = " *(skipped)*";
|
|
56
|
+
return `- [${check}] ${task.id} ${task.title}${annotation}`;
|
|
57
|
+
}
|
|
58
|
+
function formatDate(iso) {
|
|
59
|
+
return iso.slice(0, 10);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=plan-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-renderer.js","sourceRoot":"","sources":["../src/plan-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from "@mariozechner/pi-coding-agent";
|
|
2
|
+
import type { StateRef } from "./types.js";
|
|
3
|
+
export declare const COMMAND_NAME = "plan-status";
|
|
4
|
+
export declare function handlePlanStatusCommand(_args: string, ctx: ExtensionCommandContext, stateRef: StateRef): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=plan-status-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-status-command.d.ts","sourceRoot":"","sources":["../src/plan-status-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,uBAAuB,EAC5B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { isTaskDone } from "./types.js";
|
|
2
|
+
import { renderPlanMarkdown } from "./plan-renderer.js";
|
|
3
|
+
import { getAllTasks } from "./dependency-graph.js";
|
|
4
|
+
export const COMMAND_NAME = "plan-status";
|
|
5
|
+
export async function handlePlanStatusCommand(_args, ctx, stateRef) {
|
|
6
|
+
const state = stateRef.get();
|
|
7
|
+
if (!state.blueprint) {
|
|
8
|
+
ctx.ui.notify("No active blueprint.", "info");
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const bp = state.blueprint;
|
|
12
|
+
const allTasks = getAllTasks(bp.phases);
|
|
13
|
+
const completed = allTasks.filter(isTaskDone).length;
|
|
14
|
+
const total = allTasks.length;
|
|
15
|
+
const pct = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
16
|
+
const header = `Progress: ${completed}/${total} tasks (${pct}%)`;
|
|
17
|
+
const plan = renderPlanMarkdown(bp);
|
|
18
|
+
ctx.ui.notify(`${header}\n\n${plan}`, "info");
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=plan-status-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-status-command.js","sourceRoot":"","sources":["../src/plan-status-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAa,EACb,GAA4B,EAC5B,QAAkB;IAElB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC9B,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,aAAa,SAAS,IAAI,KAAK,WAAW,GAAG,IAAI,CAAC;IACjE,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAEpC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from "@mariozechner/pi-coding-agent";
|
|
2
|
+
import type { StateRef } from "./types.js";
|
|
3
|
+
export declare const COMMAND_NAME = "plan-verify";
|
|
4
|
+
export declare function handlePlanVerifyCommand(_args: string, ctx: ExtensionCommandContext, stateRef: StateRef): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=plan-verify-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-verify-command.d.ts","sourceRoot":"","sources":["../src/plan-verify-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,uBAAuB,EAC5B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAqEf"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { verifyGate, advancePhase } from "./state-machine.js";
|
|
2
|
+
import { runGate } from "./verification.js";
|
|
3
|
+
import { saveBlueprint, appendHistory } from "./storage.js";
|
|
4
|
+
export const COMMAND_NAME = "plan-verify";
|
|
5
|
+
export async function handlePlanVerifyCommand(_args, ctx, stateRef) {
|
|
6
|
+
const state = stateRef.get();
|
|
7
|
+
if (!state.blueprint) {
|
|
8
|
+
ctx.ui.notify("No active blueprint.", "info");
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const bp = state.blueprint;
|
|
12
|
+
const phase = bp.phases.find((p) => p.id === bp.active_phase_id);
|
|
13
|
+
if (!phase) {
|
|
14
|
+
ctx.ui.notify("No active phase to verify.", "info");
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (phase.verification_gates.length === 0) {
|
|
18
|
+
ctx.ui.notify(`Phase ${phase.id} has no verification gates. Advancing.`, "info");
|
|
19
|
+
const advanced = advancePhase(bp);
|
|
20
|
+
saveBlueprint(advanced);
|
|
21
|
+
stateRef.set({ ...state, blueprint: advanced });
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const cwd = state.project?.root ?? process.cwd();
|
|
25
|
+
let updated = bp;
|
|
26
|
+
const results = [];
|
|
27
|
+
for (let i = 0; i < phase.verification_gates.length; i++) {
|
|
28
|
+
const gate = phase.verification_gates[i];
|
|
29
|
+
if (gate.type === "user_approval") {
|
|
30
|
+
results.push(`- ${gate.description}: requires manual approval (skipped in automated run)`);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
ctx.ui.notify(`Running: ${gate.description}...`, "info");
|
|
34
|
+
const result = runGate(gate, cwd);
|
|
35
|
+
updated = verifyGate(updated, phase.id, i, result.passed, result.passed ? undefined : result.output);
|
|
36
|
+
const status = result.passed ? "PASSED" : "FAILED";
|
|
37
|
+
results.push(`- ${gate.description}: ${status} (${result.duration_ms}ms)`);
|
|
38
|
+
appendHistory(updated.id, {
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
event: result.passed ? "verification_passed" : "verification_failed",
|
|
41
|
+
phase_id: phase.id,
|
|
42
|
+
task_id: null,
|
|
43
|
+
session_id: state.sessionId,
|
|
44
|
+
details: `${gate.description}: ${status}`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const currentPhase = updated.phases.find((p) => p.id === phase.id);
|
|
48
|
+
const allPassed = currentPhase.verification_gates
|
|
49
|
+
.filter((g) => g.type !== "user_approval")
|
|
50
|
+
.every((g) => g.passed);
|
|
51
|
+
if (allPassed) {
|
|
52
|
+
const hasUserApproval = currentPhase.verification_gates.some((g) => g.type === "user_approval" && !g.passed);
|
|
53
|
+
if (!hasUserApproval) {
|
|
54
|
+
updated = advancePhase(updated);
|
|
55
|
+
results.push("\nAll gates passed. Phase advanced.");
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
results.push("\nAutomated gates passed. User approval still required.");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
saveBlueprint(updated);
|
|
62
|
+
stateRef.set({ ...state, blueprint: updated });
|
|
63
|
+
ctx.ui.notify(`Verification results for Phase ${phase.id}:\n${results.join("\n")}`, "info");
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=plan-verify-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-verify-command.js","sourceRoot":"","sources":["../src/plan-verify-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint-generate.d.ts","sourceRoot":"","sources":["../../src/prompts/blueprint-generate.ts"],"names":[],"mappings":"AAAA,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiCpE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export function getBlueprintGeneratePrompt(objective) {
|
|
2
|
+
return `You are a senior software architect planning a complex implementation.
|
|
3
|
+
|
|
4
|
+
## Objective
|
|
5
|
+
${objective}
|
|
6
|
+
|
|
7
|
+
## Instructions
|
|
8
|
+
|
|
9
|
+
Analyze the codebase and the objective above, then create a phased construction plan by calling the \`blueprint_create\` tool.
|
|
10
|
+
|
|
11
|
+
### Plan structure requirements:
|
|
12
|
+
1. Break the work into 2-6 phases, ordered by dependency (foundations first)
|
|
13
|
+
2. Each phase should have 2-8 concrete, agent-sized tasks
|
|
14
|
+
3. Each task must have:
|
|
15
|
+
- A clear, imperative title (e.g., "Add OAuth2 callback endpoint")
|
|
16
|
+
- A brief description of what to implement
|
|
17
|
+
- Acceptance criteria (testable conditions)
|
|
18
|
+
- File targets (files to create or modify)
|
|
19
|
+
- Dependencies on other tasks (by task ID, e.g., "1.1", "2.3")
|
|
20
|
+
4. Each phase should have verification gates:
|
|
21
|
+
- Phase 1 typically: tests_pass
|
|
22
|
+
- Later phases: tests_pass + typecheck_clean
|
|
23
|
+
- Final phase: tests_pass + typecheck_clean + user_approval (optional)
|
|
24
|
+
5. Tasks within a phase can depend on other tasks (within or across phases)
|
|
25
|
+
6. Task IDs follow the format "phase.task" (e.g., "1.1", "1.2", "2.1")
|
|
26
|
+
|
|
27
|
+
### Quality criteria:
|
|
28
|
+
- Each task should be completable in a single agent session
|
|
29
|
+
- Dependencies should be minimal and acyclic
|
|
30
|
+
- Acceptance criteria should be specific and testable
|
|
31
|
+
- File targets should reference real paths in the codebase when possible
|
|
32
|
+
|
|
33
|
+
Call the \`blueprint_create\` tool with the structured plan.`;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=blueprint-generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint-generate.js","sourceRoot":"","sources":["../../src/prompts/blueprint-generate.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,0BAA0B,CAAC,SAAiB;IAC1D,OAAO;;;EAGP,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DA4BkD,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-context.d.ts","sourceRoot":"","sources":["../../src/prompts/phase-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAQ,MAAM,aAAa,CAAC;AAInD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CA4C9D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { isTaskDone } from "../types.js";
|
|
2
|
+
import { getBlockingTasks, getAllTasks } from "../dependency-graph.js";
|
|
3
|
+
export function buildPhaseContext(blueprint) {
|
|
4
|
+
const lines = [];
|
|
5
|
+
lines.push(`## Active Blueprint: "${blueprint.objective}"`);
|
|
6
|
+
lines.push("");
|
|
7
|
+
const activePhase = blueprint.phases.find((p) => p.id === blueprint.active_phase_id);
|
|
8
|
+
if (!activePhase) {
|
|
9
|
+
lines.push("No active phase. All phases may be complete or verified.");
|
|
10
|
+
return lines.join("\n");
|
|
11
|
+
}
|
|
12
|
+
const completed = activePhase.tasks.filter(isTaskDone).length;
|
|
13
|
+
lines.push(`### Current Phase: Phase ${activePhase.id} - ${activePhase.title}`);
|
|
14
|
+
lines.push(`Status: ${activePhase.status} | ${completed}/${activePhase.tasks.length} tasks completed`);
|
|
15
|
+
const activeTask = activePhase.tasks.find((t) => t.id === blueprint.active_task_id);
|
|
16
|
+
if (activeTask) {
|
|
17
|
+
lines.push("");
|
|
18
|
+
lines.push(buildTaskContext(activeTask));
|
|
19
|
+
}
|
|
20
|
+
const blockedTasks = activePhase.tasks.filter((t) => t.status === "blocked");
|
|
21
|
+
if (blockedTasks.length > 0) {
|
|
22
|
+
lines.push("");
|
|
23
|
+
lines.push("### Blocked Tasks");
|
|
24
|
+
const allTasks = getAllTasks(blueprint.phases);
|
|
25
|
+
for (const task of blockedTasks) {
|
|
26
|
+
const blockers = getBlockingTasks(allTasks, task.id);
|
|
27
|
+
lines.push(`- ${task.id} "${task.title}" - blocked by ${blockers.join(", ")}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (activePhase.verification_gates.length > 0) {
|
|
31
|
+
lines.push("");
|
|
32
|
+
lines.push(`### Phase ${activePhase.id} Verification Gates`);
|
|
33
|
+
for (const gate of activePhase.verification_gates) {
|
|
34
|
+
const check = gate.passed ? "x" : " ";
|
|
35
|
+
lines.push(`- [${check}] ${gate.description}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return lines.join("\n");
|
|
39
|
+
}
|
|
40
|
+
function buildTaskContext(task) {
|
|
41
|
+
const lines = [];
|
|
42
|
+
lines.push(`### Current Task: ${task.id} - ${task.title}`);
|
|
43
|
+
if (task.description) {
|
|
44
|
+
lines.push(task.description);
|
|
45
|
+
}
|
|
46
|
+
if (task.acceptance_criteria.length > 0) {
|
|
47
|
+
lines.push("");
|
|
48
|
+
lines.push("**Acceptance criteria:**");
|
|
49
|
+
for (const c of task.acceptance_criteria) {
|
|
50
|
+
lines.push(`- ${c}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (task.file_targets.length > 0) {
|
|
54
|
+
lines.push("");
|
|
55
|
+
lines.push("**File targets:**");
|
|
56
|
+
for (const f of task.file_targets) {
|
|
57
|
+
lines.push(`- ${f}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return lines.join("\n");
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=phase-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-context.js","sourceRoot":"","sources":["../../src/prompts/phase-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Blueprint, Phase, Task } from "./types.js";
|
|
2
|
+
export declare function startTask(blueprint: Blueprint, taskId: string, sessionId: string): Blueprint;
|
|
3
|
+
export declare function completeTask(blueprint: Blueprint, taskId: string): Blueprint;
|
|
4
|
+
export declare function skipTask(blueprint: Blueprint, taskId: string): Blueprint;
|
|
5
|
+
export declare function verifyGate(blueprint: Blueprint, phaseId: string, gateIndex: number, passed: boolean, errorMsg?: string): Blueprint;
|
|
6
|
+
export declare function advancePhase(blueprint: Blueprint): Blueprint;
|
|
7
|
+
export declare function getNextTask(blueprint: Blueprint): Task | null;
|
|
8
|
+
export declare function recomputeBlocked(blueprint: Blueprint): Blueprint;
|
|
9
|
+
export declare function createBlueprint(id: string, objective: string, projectId: string, phases: readonly Phase[]): Blueprint;
|
|
10
|
+
export declare function abandonBlueprint(blueprint: Blueprint): Blueprint;
|
|
11
|
+
//# sourceMappingURL=state-machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../src/state-machine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAA2B,MAAM,YAAY,CAAC;AA4DlF,wBAAgB,SAAS,CACvB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,SAAS,CAiCX;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CA0B5E;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAcxE;AAED,wBAAgB,UAAU,CACxB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,SAAS,CAeX;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAsC5D;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAkB7D;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAqBhE;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,KAAK,EAAE,GACvB,SAAS,CAmBX;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAEhE"}
|