pi-rnd 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +74 -0
- package/agents/rnd-builder.md +98 -0
- package/agents/rnd-integrator.md +104 -0
- package/agents/rnd-planner.md +208 -0
- package/agents/rnd-verifier.md +164 -0
- package/dist/doctor.js +166 -0
- package/dist/doctor.js.map +1 -0
- package/dist/gates/bash-discipline.js +27 -0
- package/dist/gates/bash-discipline.js.map +1 -0
- package/dist/gates/read-evidence-pack.js +23 -0
- package/dist/gates/read-evidence-pack.js.map +1 -0
- package/dist/gates/registry.js +24 -0
- package/dist/gates/registry.js.map +1 -0
- package/dist/gates/rnd-dir-required.js +31 -0
- package/dist/gates/rnd-dir-required.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/prompts.js +58 -0
- package/dist/orchestrator/prompts.js.map +1 -0
- package/dist/orchestrator/rnd-dir.js +20 -0
- package/dist/orchestrator/rnd-dir.js.map +1 -0
- package/dist/orchestrator/spawn.js +67 -0
- package/dist/orchestrator/spawn.js.map +1 -0
- package/dist/orchestrator/start.js +195 -0
- package/dist/orchestrator/start.js.map +1 -0
- package/dist/orchestrator/state.js +15 -0
- package/dist/orchestrator/state.js.map +1 -0
- package/dist/orchestrator/types.js +2 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/docs/PI-API.md +574 -0
- package/docs/PORTING.md +105 -0
- package/package.json +57 -0
- package/skills/fp-practices/SKILL.md +128 -0
- package/skills/fp-practices/bash.md +114 -0
- package/skills/fp-practices/duckdb.md +116 -0
- package/skills/fp-practices/elixir.md +115 -0
- package/skills/fp-practices/javascript.md +119 -0
- package/skills/fp-practices/koka.md +120 -0
- package/skills/fp-practices/lean.md +120 -0
- package/skills/fp-practices/postgresql.md +120 -0
- package/skills/fp-practices/python.md +120 -0
- package/skills/fp-practices/svelte.md +114 -0
- package/skills/kiss-practices/SKILL.md +41 -0
- package/skills/kiss-practices/bash.md +70 -0
- package/skills/kiss-practices/duckdb.md +30 -0
- package/skills/kiss-practices/elixir.md +38 -0
- package/skills/kiss-practices/javascript.md +43 -0
- package/skills/kiss-practices/koka.md +34 -0
- package/skills/kiss-practices/lean.md +45 -0
- package/skills/kiss-practices/markdown.md +20 -0
- package/skills/kiss-practices/postgresql.md +31 -0
- package/skills/kiss-practices/python.md +64 -0
- package/skills/kiss-practices/svelte.md +59 -0
- package/skills/rnd-building/SKILL.md +256 -0
- package/skills/rnd-decomposition/SKILL.md +188 -0
- package/skills/rnd-experiments/SKILL.md +197 -0
- package/skills/rnd-failure-modes/SKILL.md +222 -0
- package/skills/rnd-iteration/SKILL.md +170 -0
- package/skills/rnd-orchestration/SKILL.md +314 -0
- package/skills/rnd-scaling/SKILL.md +188 -0
- package/skills/rnd-verification/SKILL.md +248 -0
- package/skills/using-rnd-framework/SKILL.md +65 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
const DEFAULT_SPAWN_TIMEOUT_MS = 10_000;
|
|
4
|
+
const DEFAULT_COMPLETION_TIMEOUT_MS = 600_000;
|
|
5
|
+
export function rpcSpawn(pi, type, prompt, options, timeoutMs = DEFAULT_SPAWN_TIMEOUT_MS) {
|
|
6
|
+
const requestId = randomUUID();
|
|
7
|
+
const replyChannel = `subagents:rpc:spawn:reply:${requestId}`;
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
let settled = false;
|
|
10
|
+
const unsub = pi.events.on(replyChannel, (data) => {
|
|
11
|
+
if (settled)
|
|
12
|
+
return;
|
|
13
|
+
settled = true;
|
|
14
|
+
unsub();
|
|
15
|
+
resolve(data);
|
|
16
|
+
});
|
|
17
|
+
setTimeout(() => {
|
|
18
|
+
if (settled)
|
|
19
|
+
return;
|
|
20
|
+
settled = true;
|
|
21
|
+
unsub();
|
|
22
|
+
resolve(null);
|
|
23
|
+
}, timeoutMs);
|
|
24
|
+
pi.events.emit("subagents:rpc:spawn", { requestId, type, prompt, options });
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function waitForCompletion(pi, agentId, timeoutMs = DEFAULT_COMPLETION_TIMEOUT_MS) {
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
let settled = false;
|
|
30
|
+
const finish = (data) => {
|
|
31
|
+
const e = data;
|
|
32
|
+
if (e?.id !== agentId || settled)
|
|
33
|
+
return;
|
|
34
|
+
settled = true;
|
|
35
|
+
unsubDone();
|
|
36
|
+
unsubFail();
|
|
37
|
+
resolve({
|
|
38
|
+
status: e.status ?? "unknown",
|
|
39
|
+
durationMs: e.durationMs ?? 0,
|
|
40
|
+
result: e.result,
|
|
41
|
+
error: e.error,
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const unsubDone = pi.events.on("subagents:completed", finish);
|
|
45
|
+
const unsubFail = pi.events.on("subagents:failed", finish);
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
if (settled)
|
|
48
|
+
return;
|
|
49
|
+
settled = true;
|
|
50
|
+
unsubDone();
|
|
51
|
+
unsubFail();
|
|
52
|
+
resolve(null);
|
|
53
|
+
}, timeoutMs);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export async function readTranscript(agentId, sessionId, cwd) {
|
|
57
|
+
const uid = process.getuid?.() ?? 0;
|
|
58
|
+
const cwdEncoded = cwd.replace(/\//g, "-").replace(/^-/, "");
|
|
59
|
+
const path = `/tmp/pi-subagents-${uid}/${cwdEncoded}/${sessionId}/tasks/${agentId}.output`;
|
|
60
|
+
try {
|
|
61
|
+
return await readFile(path, "utf8");
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/orchestrator/spawn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { access, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { rpcSpawn, waitForCompletion } from "./spawn.js";
|
|
5
|
+
import { recordPhase, recordVerdict, recordWave } from "./state.js";
|
|
6
|
+
import { computeRndDir, ensureRndDir } from "./rnd-dir.js";
|
|
7
|
+
import { buildPromptFor, integratorPromptFor, plannerPromptFor, verifierPromptFor, } from "./prompts.js";
|
|
8
|
+
// --- pure helpers ---
|
|
9
|
+
export function verdictFromStatus(status) {
|
|
10
|
+
if (status === "completed")
|
|
11
|
+
return "PASS";
|
|
12
|
+
if (status === "error" || status === "aborted")
|
|
13
|
+
return "FAIL";
|
|
14
|
+
return "ITERATE";
|
|
15
|
+
}
|
|
16
|
+
export function parseWavePlan(planMd) {
|
|
17
|
+
// Split on h2 headings, find the Execution Schedule section
|
|
18
|
+
const sections = planMd.split(/^## /m);
|
|
19
|
+
const schedulePart = sections.find((s) => s.startsWith("Execution Schedule"));
|
|
20
|
+
if (!schedulePart)
|
|
21
|
+
return [];
|
|
22
|
+
const body = schedulePart.replace(/^Execution Schedule[^\n]*\n/, "");
|
|
23
|
+
const waves = [];
|
|
24
|
+
const waveBlocks = body.split(/^Wave (\d+):/m).slice(1);
|
|
25
|
+
for (let i = 0; i < waveBlocks.length; i += 2) {
|
|
26
|
+
const waveNum = parseInt(waveBlocks[i] ?? "0", 10);
|
|
27
|
+
const block = waveBlocks[i + 1] ?? "";
|
|
28
|
+
const taskIds = Array.from(block.matchAll(/^- (T[^:\s]+)/gm)).map((m) => m[1] ?? "").filter(Boolean);
|
|
29
|
+
if (taskIds.length > 0) {
|
|
30
|
+
waves.push({ wave: waveNum, taskIds });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return waves;
|
|
34
|
+
}
|
|
35
|
+
export async function agentInstalled(name) {
|
|
36
|
+
const cwd = process.cwd();
|
|
37
|
+
const projectPath = join(cwd, ".pi", "agents", `${name}.md`);
|
|
38
|
+
const globalPath = join(homedir(), ".pi", "agent", "agents", `${name}.md`);
|
|
39
|
+
for (const path of [projectPath, globalPath]) {
|
|
40
|
+
try {
|
|
41
|
+
await access(path);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// not found at this path
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// --- wave execution ---
|
|
51
|
+
async function buildWave(pi, ctx, wave, rndDir) {
|
|
52
|
+
recordWave(pi, wave.wave, wave.taskIds);
|
|
53
|
+
recordPhase(pi, "build");
|
|
54
|
+
ctx.ui.notify(`Wave ${wave.wave}: building ${wave.taskIds.join(", ")}…`, "info");
|
|
55
|
+
const buildResults = await Promise.all(wave.taskIds.map(async (taskId) => {
|
|
56
|
+
const reply = await rpcSpawn(pi, "rnd-builder", buildPromptFor(taskId, rndDir), { description: `build ${taskId}`, run_in_background: true });
|
|
57
|
+
if (!reply?.success || !reply.data?.id) {
|
|
58
|
+
return { taskId, status: "error" };
|
|
59
|
+
}
|
|
60
|
+
const completion = await waitForCompletion(pi, reply.data.id);
|
|
61
|
+
return { taskId, status: completion?.status ?? "error" };
|
|
62
|
+
}));
|
|
63
|
+
let allPassed = true;
|
|
64
|
+
for (const { taskId, status } of buildResults) {
|
|
65
|
+
const verdict = verdictFromStatus(status);
|
|
66
|
+
recordVerdict(pi, taskId, verdict);
|
|
67
|
+
if (verdict !== "PASS") {
|
|
68
|
+
allPassed = false;
|
|
69
|
+
ctx.ui.notify(`Wave ${wave.wave}: build FAIL for ${taskId}`, "error");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return allPassed;
|
|
73
|
+
}
|
|
74
|
+
async function verifyWave(pi, ctx, wave, rndDir) {
|
|
75
|
+
recordPhase(pi, "verify");
|
|
76
|
+
ctx.ui.notify(`Wave ${wave.wave}: verifying…`, "info");
|
|
77
|
+
const reply = await rpcSpawn(pi, "rnd-verifier", verifierPromptFor(wave, rndDir), { description: `verify wave ${wave.wave}`, run_in_background: true }, 10_000);
|
|
78
|
+
if (!reply?.success || !reply.data?.id) {
|
|
79
|
+
ctx.ui.notify(`Wave ${wave.wave}: verifier spawn failed`, "error");
|
|
80
|
+
recordVerdict(pi, `wave-${wave.wave}-verify`, "FAIL");
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
const completion = await waitForCompletion(pi, reply.data.id);
|
|
84
|
+
const verdict = verdictFromStatus(completion?.status ?? "error");
|
|
85
|
+
recordVerdict(pi, `wave-${wave.wave}-verify`, verdict);
|
|
86
|
+
if (verdict !== "PASS") {
|
|
87
|
+
const taskList = wave.taskIds.join(", ");
|
|
88
|
+
ctx.ui.notify(`Wave ${wave.wave}: verification FAIL (tasks: ${taskList}). Check ${rndDir}/verifications/wave-${wave.wave}-report.md`, "error");
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
// --- main handler ---
|
|
94
|
+
async function rndStartHandler(args, ctx, pi) {
|
|
95
|
+
const task = args.trim();
|
|
96
|
+
if (!task) {
|
|
97
|
+
ctx.ui.notify("usage: /rnd-start <task>", "warning");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const rndDir = computeRndDir(process.cwd());
|
|
101
|
+
await ensureRndDir(rndDir);
|
|
102
|
+
recordPhase(pi, "plan");
|
|
103
|
+
const plannerFound = await agentInstalled("rnd-planner");
|
|
104
|
+
if (!plannerFound) {
|
|
105
|
+
ctx.ui.notify("rnd-planner agent not found in .pi/agents/ or ~/.pi/agent/agents/. Install pi-rnd agents first.", "error");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
ctx.ui.notify("Spawning planner…", "info");
|
|
109
|
+
const plannerReply = await rpcSpawn(pi, "rnd-planner", plannerPromptFor(task, rndDir), { description: "rnd plan", run_in_background: true });
|
|
110
|
+
if (!plannerReply?.success || !plannerReply.data?.id) {
|
|
111
|
+
const err = plannerReply?.success === false ? plannerReply.error : "spawn timeout";
|
|
112
|
+
ctx.ui.notify(`Planner spawn failed: ${err}`, "error");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const plannerCompletion = await waitForCompletion(pi, plannerReply.data.id, 600_000);
|
|
116
|
+
if (!plannerCompletion || plannerCompletion.status !== "completed") {
|
|
117
|
+
const st = plannerCompletion?.status ?? "timeout";
|
|
118
|
+
ctx.ui.notify(`Planner did not complete successfully (status: ${st})`, "error");
|
|
119
|
+
recordVerdict(pi, "T-plan", "FAIL");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
recordVerdict(pi, "T-plan", verdictFromStatus(plannerCompletion.status));
|
|
123
|
+
const planPath = `${rndDir}/plan.md`;
|
|
124
|
+
let planMd;
|
|
125
|
+
try {
|
|
126
|
+
planMd = await readFile(planPath, "utf8");
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
ctx.ui.notify(`Could not read plan at ${planPath}`, "error");
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const waves = parseWavePlan(planMd);
|
|
133
|
+
if (waves.length === 0) {
|
|
134
|
+
ctx.ui.notify("Plan produced no waves. Check plan.md for a valid '## Execution Schedule' section.", "warning");
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const waveOutcomes = [];
|
|
138
|
+
for (const wave of waves) {
|
|
139
|
+
const buildOk = await buildWave(pi, ctx, wave, rndDir);
|
|
140
|
+
if (!buildOk) {
|
|
141
|
+
await writeIterationLog(rndDir, wave, "build");
|
|
142
|
+
waveOutcomes.push(`Wave ${wave.wave}: BUILD FAIL`);
|
|
143
|
+
ctx.ui.notify(buildSummary(waveOutcomes, "NO-SHIP"), "warning");
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const verifyOk = await verifyWave(pi, ctx, wave, rndDir);
|
|
147
|
+
if (!verifyOk) {
|
|
148
|
+
await writeIterationLog(rndDir, wave, "verify");
|
|
149
|
+
waveOutcomes.push(`Wave ${wave.wave}: VERIFY FAIL`);
|
|
150
|
+
ctx.ui.notify(buildSummary(waveOutcomes, "NO-SHIP"), "warning");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
waveOutcomes.push(`Wave ${wave.wave}: PASS`);
|
|
154
|
+
}
|
|
155
|
+
recordPhase(pi, "integrate");
|
|
156
|
+
ctx.ui.notify("All waves passed. Spawning integrator…", "info");
|
|
157
|
+
const integratorReply = await rpcSpawn(pi, "rnd-integrator", integratorPromptFor(rndDir), { description: "rnd integrate", run_in_background: true });
|
|
158
|
+
if (integratorReply?.success && integratorReply.data?.id) {
|
|
159
|
+
const intCompletion = await waitForCompletion(pi, integratorReply.data.id);
|
|
160
|
+
recordVerdict(pi, "integrate", verdictFromStatus(intCompletion?.status ?? "error"));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
recordVerdict(pi, "integrate", "FAIL");
|
|
164
|
+
}
|
|
165
|
+
ctx.ui.notify(buildSummary(waveOutcomes, "SHIP"), "info");
|
|
166
|
+
}
|
|
167
|
+
// --- small helpers ---
|
|
168
|
+
function buildSummary(waveOutcomes, verdict) {
|
|
169
|
+
return [`pi-rnd run complete — ${verdict}`, ...waveOutcomes].join("\n");
|
|
170
|
+
}
|
|
171
|
+
async function writeIterationLog(rndDir, wave, phase) {
|
|
172
|
+
const content = [
|
|
173
|
+
`## Wave ${wave.wave} iteration log`,
|
|
174
|
+
"",
|
|
175
|
+
`Phase failed: ${phase}`,
|
|
176
|
+
`Tasks: ${wave.taskIds.join(", ")}`,
|
|
177
|
+
`Timestamp: ${new Date().toISOString()}`,
|
|
178
|
+
"",
|
|
179
|
+
"Iteration loop not implemented in v0.2. Fix and re-run /rnd-start.",
|
|
180
|
+
].join("\n");
|
|
181
|
+
try {
|
|
182
|
+
await writeFile(`${rndDir}/iteration-log.md`, content, "utf8");
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// non-fatal
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// --- registration ---
|
|
189
|
+
export function registerRndStart(pi) {
|
|
190
|
+
pi.registerCommand("rnd-start", {
|
|
191
|
+
description: "Run the full rnd plan→build→verify→integrate loop for a task",
|
|
192
|
+
handler: (args, ctx) => rndStartHandler(args, ctx, pi),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/orchestrator/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function recordPhase(pi, phase) {
|
|
2
|
+
pi.appendEntry("rnd:phase", { phase, ts: new Date().toISOString() });
|
|
3
|
+
}
|
|
4
|
+
export function recordWave(pi, wave, taskIds) {
|
|
5
|
+
pi.appendEntry("rnd:wave", { wave, taskIds, ts: new Date().toISOString() });
|
|
6
|
+
}
|
|
7
|
+
export function recordVerdict(pi, taskId, verdict, evidence) {
|
|
8
|
+
pi.appendEntry("rnd:verdict", {
|
|
9
|
+
taskId,
|
|
10
|
+
verdict,
|
|
11
|
+
evidence: evidence ?? [],
|
|
12
|
+
ts: new Date().toISOString(),
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/orchestrator/state.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,WAAW,CAAC,EAAgB,EAAE,KAAY;IACxD,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,EAAgB,EAChB,IAAY,EACZ,OAAiB;IAEjB,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAgB,EAChB,MAAc,EACd,OAAqB,EACrB,QAAmB;IAEnB,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE;QAC5B,MAAM;QACN,OAAO;QACP,QAAQ,EAAE,QAAQ,IAAI,EAAE;QACxB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/orchestrator/types.ts"],"names":[],"mappings":""}
|