ultimate-pi 0.17.0 → 0.18.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/.agents/skills/harness-context/SKILL.md +13 -6
- package/.agents/skills/harness-debate-plan/SKILL.md +37 -20
- package/.agents/skills/harness-decisions/SKILL.md +1 -1
- package/.agents/skills/harness-eval/SKILL.md +6 -21
- package/.agents/skills/harness-governor/SKILL.md +4 -3
- package/.agents/skills/harness-orchestration/SKILL.md +41 -53
- package/.agents/skills/harness-plan/SKILL.md +23 -12
- package/.agents/skills/harness-review/SKILL.md +52 -0
- package/.agents/skills/harness-sentrux-setup/SKILL.md +16 -3
- package/.agents/skills/harness-steer/SKILL.md +14 -0
- package/.agents/skills/sentrux/SKILL.md +9 -9
- package/.pi/agents/harness/planning/decompose.md +7 -4
- package/.pi/agents/harness/planning/hypothesis-validator.md +2 -0
- package/.pi/agents/harness/planning/hypothesis.md +3 -1
- package/.pi/agents/harness/planning/plan-adversary.md +2 -0
- package/.pi/agents/harness/planning/plan-evaluator.md +2 -0
- package/.pi/agents/harness/planning/plan-synthesizer.md +25 -0
- package/.pi/agents/harness/planning/planning-context.md +48 -0
- package/.pi/agents/harness/planning/review-integrator.md +2 -0
- package/.pi/agents/harness/planning/sprint-contract-auditor.md +2 -0
- package/.pi/agents/harness/{adversary.md → reviewing/adversary.md} +3 -10
- package/.pi/agents/harness/{evaluator.md → reviewing/evaluator.md} +3 -12
- package/.pi/agents/harness/running/executor.md +45 -0
- package/.pi/agents/harness/sentrux-steward.md +51 -0
- package/.pi/extensions/00-harness-project-control.ts +133 -0
- package/.pi/extensions/00-posthog-network-bootstrap.ts +11 -0
- package/.pi/extensions/budget-guard.ts +2 -0
- package/.pi/extensions/debate-orchestrator.ts +2 -0
- package/.pi/extensions/harness-ask-user.ts +2 -2
- package/.pi/extensions/harness-debate-tools.ts +2 -2
- package/.pi/extensions/harness-live-widget.ts +60 -3
- package/.pi/extensions/harness-plan-approval.ts +64 -58
- package/.pi/extensions/harness-run-context.ts +715 -90
- package/.pi/extensions/harness-subagent-submit.ts +46 -12
- package/.pi/extensions/harness-subagents.ts +2 -2
- package/.pi/extensions/harness-telemetry.ts +2 -0
- package/.pi/extensions/harness-web-tools.ts +2 -2
- package/.pi/extensions/lib/extension-load-guard.ts +10 -0
- package/.pi/extensions/lib/harness-artifact-gate.ts +172 -0
- package/.pi/extensions/lib/harness-posthog.ts +9 -5
- package/.pi/extensions/lib/harness-spawn-topology.ts +165 -0
- package/.pi/extensions/lib/harness-subagent-auth.ts +1 -2
- package/.pi/extensions/lib/harness-subagent-policy.ts +28 -24
- package/.pi/extensions/lib/harness-subagent-precheck.ts +36 -10
- package/.pi/extensions/lib/harness-subagent-submit-pipeline.ts +66 -2
- package/.pi/extensions/lib/harness-subagent-submit-registry.ts +22 -22
- package/.pi/extensions/lib/harness-subagents-bridge.ts +7 -29
- package/.pi/extensions/lib/harness-subprocess-bootstrap.ts +73 -0
- package/.pi/extensions/lib/plan-approval/create-plan.ts +2 -3
- package/.pi/extensions/lib/plan-approval/resolve-disk.ts +102 -0
- package/.pi/extensions/lib/plan-approval/schema.ts +22 -8
- package/.pi/extensions/lib/plan-approval/types.ts +1 -1
- package/.pi/extensions/lib/plan-approval/validate.ts +2 -2
- package/.pi/extensions/lib/plan-approval-readiness.ts +192 -0
- package/.pi/extensions/lib/plan-debate-eligibility.ts +12 -5
- package/.pi/extensions/lib/plan-debate-gate.ts +22 -1
- package/.pi/extensions/lib/plan-debate-lanes.ts +32 -2
- package/.pi/extensions/lib/plan-review-gate.ts +8 -0
- package/.pi/extensions/lib/posthog-client.ts +76 -0
- package/.pi/extensions/lib/spawn-policy.ts +3 -3
- package/.pi/extensions/observation-bus.ts +2 -0
- package/.pi/extensions/policy-gate.ts +26 -19
- package/.pi/extensions/review-integrity.ts +91 -10
- package/.pi/extensions/sentrux-rules-sync.ts +2 -0
- package/.pi/extensions/test-diff-integrity.ts +1 -0
- package/.pi/extensions/trace-recorder.ts +2 -0
- package/.pi/harness/agents.manifest.json +37 -37
- package/.pi/harness/corpus/cron.example +8 -0
- package/.pi/harness/corpus/graphify-kb-updater.config.json +214 -0
- package/.pi/harness/corpus/systemd/graphify-kb-updater.env.template +4 -0
- package/.pi/harness/corpus/systemd/graphify-kb-updater.service +17 -0
- package/.pi/harness/corpus/systemd/graphify-kb-updater.timer +11 -0
- package/.pi/harness/docs/adrs/0001-harness-constitution.md +2 -1
- package/.pi/harness/docs/adrs/0006-sentrux-dual-layer.md +8 -6
- package/.pi/harness/docs/adrs/0009-sentrux-rules-lifecycle.md +6 -1
- package/.pi/harness/docs/adrs/0031-harness-run-context.md +1 -1
- package/.pi/harness/docs/adrs/0032-harness-command-orchestration.md +7 -0
- package/.pi/harness/docs/adrs/0034-darwin-plan-research-pipeline.md +3 -3
- package/.pi/harness/docs/adrs/0036-implementation-research-and-selective-debate.md +8 -5
- package/.pi/harness/docs/adrs/0039-harness-post-run-review-gate.md +47 -0
- package/.pi/harness/docs/adrs/0040-practice-grounded-orchestration.md +40 -0
- package/.pi/harness/docs/adrs/0041-intelligent-planning-reconnaissance.md +39 -0
- package/.pi/harness/docs/adrs/0042-agent-native-orchestration.md +35 -0
- package/.pi/harness/docs/adrs/0043-path-first-harness-tools.md +38 -0
- package/.pi/harness/docs/adrs/0044-harness-steer-loop.md +37 -0
- package/.pi/harness/docs/adrs/0045-phase-scoped-agent-directories.md +33 -0
- package/.pi/harness/docs/adrs/README.md +11 -0
- package/.pi/harness/docs/graphify-kb-updater-runbook.md +163 -0
- package/.pi/harness/docs/practice-map.md +110 -0
- package/.pi/harness/env.harness.template +5 -3
- package/.pi/harness/evals/smoke/sentrux-stub.json +1 -1
- package/.pi/harness/evals/smoke/smoke-harness-plan.mjs +5 -2
- package/.pi/harness/specs/README.md +1 -1
- package/.pi/harness/specs/harness-run-context.schema.json +11 -0
- package/.pi/harness/specs/harness-spawn-context.schema.json +15 -1
- package/.pi/harness/specs/plan-execution-plan.schema.json +39 -1
- package/.pi/harness/specs/plan-packet.schema.json +4 -0
- package/.pi/harness/specs/plan-phase-status.schema.json +17 -0
- package/.pi/harness/specs/plan-phase-waiver.schema.json +25 -0
- package/.pi/harness/specs/plan-planning-context.schema.json +50 -0
- package/.pi/harness/specs/repair-brief.schema.json +45 -0
- package/.pi/harness/specs/review-outcome.schema.json +46 -0
- package/.pi/harness/specs/sentrux-manifest-proposal.schema.json +80 -0
- package/.pi/harness/specs/sentrux-signal.schema.json +43 -0
- package/.pi/harness/specs/steer-state.schema.json +20 -0
- package/.pi/lib/harness-context-mode-policy.ts +256 -0
- package/.pi/lib/harness-project-config.ts +91 -0
- package/.pi/lib/harness-repair-brief.ts +145 -0
- package/.pi/lib/harness-run-context.ts +591 -32
- package/.pi/lib/harness-ui-state.ts +114 -21
- package/.pi/prompts/harness-auto.md +10 -10
- package/.pi/prompts/harness-critic.md +3 -30
- package/.pi/prompts/harness-eval.md +4 -37
- package/.pi/prompts/harness-plan.md +116 -54
- package/.pi/prompts/harness-review.md +150 -15
- package/.pi/prompts/harness-run.md +62 -10
- package/.pi/prompts/harness-sentrux-steward.md +55 -0
- package/.pi/prompts/harness-setup.md +5 -4
- package/.pi/prompts/harness-steer.md +30 -0
- package/.pi/scripts/README.md +1 -0
- package/.pi/scripts/graphify-kb-updater.mjs +398 -0
- package/.pi/scripts/harness-agents-manifest.mjs +1 -1
- package/.pi/scripts/harness-project-toggle.mjs +129 -0
- package/.pi/scripts/harness-sentrux-cli.mjs +142 -0
- package/.pi/scripts/harness-verify.mjs +22 -6
- package/.pi/scripts/harness-web-policy-guard.mjs +68 -0
- package/.pi/scripts/validate-plan-dag.mjs +3 -3
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +23 -0
- package/README.md +94 -58
- package/package.json +5 -4
- package/.pi/agents/harness/executor.md +0 -47
- package/.pi/agents/harness/planning/scout-graphify.md +0 -37
- package/.pi/agents/harness/planning/scout-semantic.md +0 -39
- package/.pi/agents/harness/planning/scout-structure.md +0 -35
- package/.pi/prompts/git-sync.md +0 -124
- /package/.pi/agents/harness/{tie-breaker.md → reviewing/tie-breaker.md} +0 -0
|
@@ -2,12 +2,8 @@
|
|
|
2
2
|
* harness-plan-approval — PlanPacket approval UI and transcript renderer for parent sessions.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { constants } from "node:fs";
|
|
6
|
-
import { access } from "node:fs/promises";
|
|
7
|
-
import { join } from "node:path";
|
|
8
5
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
9
6
|
import { Text } from "@earendil-works/pi-tui";
|
|
10
|
-
import { Type } from "@sinclair/typebox";
|
|
11
7
|
import type { PlanPacketLike } from "../lib/harness-run-context.js";
|
|
12
8
|
import {
|
|
13
9
|
appendPlanApprovalIfNew,
|
|
@@ -16,7 +12,7 @@ import {
|
|
|
16
12
|
parsePlanApprovalFromMessage,
|
|
17
13
|
planPacketSummary,
|
|
18
14
|
} from "../lib/harness-run-context.js";
|
|
19
|
-
import {
|
|
15
|
+
import { claimHarnessGovernanceLoad } from "./lib/extension-load-guard.js";
|
|
20
16
|
import {
|
|
21
17
|
CREATE_PLAN_GUIDELINES,
|
|
22
18
|
CREATE_PLAN_SNIPPET,
|
|
@@ -33,8 +29,10 @@ import {
|
|
|
33
29
|
renderApprovePlanResult,
|
|
34
30
|
renderHarnessPlanDraft,
|
|
35
31
|
} from "./lib/plan-approval/render.js";
|
|
32
|
+
import { resolveApprovePlanParamsFromDisk } from "./lib/plan-approval/resolve-disk.js";
|
|
36
33
|
import {
|
|
37
34
|
ApprovePlanParamsSchema,
|
|
35
|
+
CreatePlanParamsSchema,
|
|
38
36
|
PROMPT_GUIDELINES,
|
|
39
37
|
PROMPT_SNIPPET,
|
|
40
38
|
} from "./lib/plan-approval/schema.js";
|
|
@@ -47,23 +45,14 @@ import {
|
|
|
47
45
|
toApprovePlanToolDetails,
|
|
48
46
|
validateApprovePlanParams,
|
|
49
47
|
} from "./lib/plan-approval/validate.js";
|
|
48
|
+
import { validatePlanApprovalReadiness } from "./lib/plan-approval-readiness.js";
|
|
50
49
|
import { validatePlanDebateGate } from "./lib/plan-debate-gate.js";
|
|
51
50
|
|
|
52
51
|
// @ts-expect-error pi extensions run as ESM
|
|
53
52
|
const MODULE_URL = import.meta.url;
|
|
54
53
|
|
|
55
|
-
const CreatePlanParamsSchema = Type.Object({
|
|
56
|
-
plan_packet: Type.Object(
|
|
57
|
-
{},
|
|
58
|
-
{
|
|
59
|
-
description:
|
|
60
|
-
"Approved PlanPacket to persist (same object as approve_plan).",
|
|
61
|
-
},
|
|
62
|
-
),
|
|
63
|
-
});
|
|
64
|
-
|
|
65
54
|
export default function harnessPlanApproval(pi: ExtensionAPI) {
|
|
66
|
-
if (!
|
|
55
|
+
if (!claimHarnessGovernanceLoad("harness-plan-approval", MODULE_URL)) return;
|
|
67
56
|
pi.registerMessageRenderer(
|
|
68
57
|
"harness-plan-draft",
|
|
69
58
|
(message, _options, theme) => {
|
|
@@ -103,12 +92,37 @@ export default function harnessPlanApproval(pi: ExtensionAPI) {
|
|
|
103
92
|
parameters: ApprovePlanParamsSchema,
|
|
104
93
|
|
|
105
94
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
106
|
-
const
|
|
95
|
+
const entries = ctx.sessionManager.getEntries();
|
|
96
|
+
const projectRoot = process.cwd();
|
|
97
|
+
const resolved = await resolveApprovePlanParamsFromDisk(
|
|
98
|
+
params as ApprovePlanParams,
|
|
99
|
+
entries,
|
|
100
|
+
projectRoot,
|
|
101
|
+
);
|
|
102
|
+
if (!resolved.ok) {
|
|
103
|
+
return {
|
|
104
|
+
content: [{ type: "text", text: resolved.error }],
|
|
105
|
+
details: {
|
|
106
|
+
plan_packet: (params as ApprovePlanParams).plan_packet ?? {},
|
|
107
|
+
options: [],
|
|
108
|
+
response: null,
|
|
109
|
+
cancelled: true,
|
|
110
|
+
},
|
|
111
|
+
isError: true,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const validated = validateApprovePlanParams({
|
|
115
|
+
...(params as ApprovePlanParams),
|
|
116
|
+
plan_packet: resolved.plan_packet,
|
|
117
|
+
research_brief:
|
|
118
|
+
resolved.research_brief ??
|
|
119
|
+
(params as ApprovePlanParams).research_brief,
|
|
120
|
+
});
|
|
107
121
|
if (typeof validated === "string") {
|
|
108
122
|
return {
|
|
109
123
|
content: [{ type: "text", text: validated }],
|
|
110
124
|
details: {
|
|
111
|
-
plan_packet:
|
|
125
|
+
plan_packet: resolved.plan_packet,
|
|
112
126
|
options: [],
|
|
113
127
|
response: null,
|
|
114
128
|
cancelled: true,
|
|
@@ -116,7 +130,6 @@ export default function harnessPlanApproval(pi: ExtensionAPI) {
|
|
|
116
130
|
};
|
|
117
131
|
}
|
|
118
132
|
|
|
119
|
-
const entries = ctx.sessionManager.getEntries();
|
|
120
133
|
if (
|
|
121
134
|
hasPlanUserApproval(entries, {
|
|
122
135
|
sincePlanCommand: true,
|
|
@@ -148,43 +161,33 @@ export default function harnessPlanApproval(pi: ExtensionAPI) {
|
|
|
148
161
|
validated.human_summary?.trim() ||
|
|
149
162
|
`Plan ${planId} — pending your approval`;
|
|
150
163
|
const runCtx = getLatestRunContext(entries);
|
|
151
|
-
const projectRoot = process.cwd();
|
|
152
164
|
const implWarnings: string[] = [];
|
|
165
|
+
const risk = String(
|
|
166
|
+
validated.plan_packet.risk_level ?? "med",
|
|
167
|
+
).toLowerCase();
|
|
153
168
|
if (runCtx?.run_id) {
|
|
154
|
-
const
|
|
169
|
+
const readiness = await validatePlanApprovalReadiness(
|
|
155
170
|
projectRoot,
|
|
156
|
-
".pi",
|
|
157
|
-
"harness",
|
|
158
|
-
"runs",
|
|
159
171
|
runCtx.run_id,
|
|
160
|
-
|
|
161
|
-
"implementation-research.yaml",
|
|
172
|
+
{ risk_level: risk },
|
|
162
173
|
);
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
const risk = String(
|
|
171
|
-
validated.plan_packet.risk_level ?? "med",
|
|
172
|
-
).toLowerCase();
|
|
173
|
-
if (!implExists) {
|
|
174
|
-
const msg =
|
|
175
|
-
"approve_plan: missing artifacts/implementation-research.yaml (Phase 3.5 required)";
|
|
176
|
-
if (risk === "high") {
|
|
177
|
-
return {
|
|
178
|
-
content: [{ type: "text", text: msg }],
|
|
179
|
-
details: {
|
|
180
|
-
plan_packet: validated.plan_packet,
|
|
181
|
-
cancelled: true,
|
|
174
|
+
if (!readiness.ok) {
|
|
175
|
+
return {
|
|
176
|
+
content: [
|
|
177
|
+
{
|
|
178
|
+
type: "text",
|
|
179
|
+
text: `approve_plan blocked — plan phase not ready:\n- ${readiness.errors.join("\n- ")}`,
|
|
182
180
|
},
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
181
|
+
],
|
|
182
|
+
details: {
|
|
183
|
+
plan_packet: validated.plan_packet,
|
|
184
|
+
readiness,
|
|
185
|
+
cancelled: true,
|
|
186
|
+
},
|
|
187
|
+
isError: true,
|
|
188
|
+
};
|
|
187
189
|
}
|
|
190
|
+
implWarnings.push(...readiness.warnings);
|
|
188
191
|
}
|
|
189
192
|
if (runCtx?.run_id) {
|
|
190
193
|
const gate = await validatePlanDebateGate(projectRoot, runCtx.run_id);
|
|
@@ -308,19 +311,22 @@ export default function harnessPlanApproval(pi: ExtensionAPI) {
|
|
|
308
311
|
parameters: CreatePlanParamsSchema,
|
|
309
312
|
|
|
310
313
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
311
|
-
const
|
|
312
|
-
|
|
314
|
+
const entries = ctx.sessionManager.getEntries();
|
|
315
|
+
const runCtx = getLatestRunContext(entries);
|
|
316
|
+
const projectRoot = process.cwd();
|
|
317
|
+
const resolved = await resolveApprovePlanParamsFromDisk(
|
|
318
|
+
params as ApprovePlanParams,
|
|
319
|
+
entries,
|
|
320
|
+
projectRoot,
|
|
321
|
+
);
|
|
322
|
+
if (!resolved.ok) {
|
|
313
323
|
return {
|
|
314
|
-
content: [{ type: "text", text:
|
|
315
|
-
details: { error:
|
|
324
|
+
content: [{ type: "text", text: resolved.error }],
|
|
325
|
+
details: { error: resolved.error },
|
|
316
326
|
isError: true,
|
|
317
327
|
};
|
|
318
328
|
}
|
|
319
|
-
|
|
320
|
-
const entries = ctx.sessionManager.getEntries();
|
|
321
|
-
const runCtx = getLatestRunContext(entries);
|
|
322
|
-
const projectRoot = process.cwd();
|
|
323
|
-
const result = await executeCreatePlan(validated.plan_packet, {
|
|
329
|
+
const result = await executeCreatePlan(resolved.plan_packet, {
|
|
324
330
|
projectRoot,
|
|
325
331
|
getParentEntries: () => entries,
|
|
326
332
|
getSubagentEntries: () => entries,
|