@dreki-gg/pi-subagent 0.8.0 → 0.8.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @dreki-gg/pi-subagent
2
2
 
3
+ ## 0.8.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`32797ff`](https://github.com/dreki-gg/pi-extensions/commit/32797ff18d968e22c6c44e95c46e3393d8928cef) Thanks [@jalbarrang](https://github.com/jalbarrang)! - feat(plan-mode): add Windows compatibility — replace Unix shell commands with cross-platform Bun/Node APIs
8
+
9
+ Plan-mode no longer shells out to `cat`, `bash`, or `mkdir` via `pi.exec()`. File I/O now uses `Bun.file()` / `Bun.write()` and `node:fs/promises` `mkdir`, making the extension fully cross-platform. Destructive and safe command pattern lists now include Windows equivalents (`del`, `rd`, `copy`, `move`, `powershell`, `dir`, `where`, `tasklist`, etc.).
10
+
11
+ Also fixes Windows compatibility in three other packages:
12
+
13
+ - **browser-tools**: `spawn` now uses `shell: true` on Windows so `.cmd` wrappers resolve correctly; `shellEscape` uses double-quote style on Windows; install guidance is platform-aware (Homebrew shown only on macOS).
14
+ - **subagent**: `spawn` uses `shell: true` on Windows when the command is bare `pi`, allowing `pi.cmd` resolution.
15
+ - **lsp**: `globalConfigPath()` now uses `os.homedir()` on Windows instead of the unreliable `process.env.HOME`.
16
+
17
+ ## 0.8.1
18
+
19
+ ### Patch Changes
20
+
21
+ - [`d133c3d`](https://github.com/dreki-gg/pi-extensions/commit/d133c3da917e7e5def568d27d6cde8ae8a6c00d2) Thanks [@jalbarrang](https://github.com/jalbarrang)! - Mark pi peer dependencies as optional so npm does not auto-install pi internals when installing extension packages.
22
+
3
23
  ## 0.8.0
4
24
 
5
25
  ### Minor Changes
@@ -114,9 +114,10 @@ export async function spawnPiAgent(options: SpawnPiAgentOptions): Promise<SpawnP
114
114
 
115
115
  const exitCode = await new Promise<number>((resolve) => {
116
116
  const invocation = getPiInvocation(args);
117
+ const needsShell = process.platform === 'win32' && invocation.command === 'pi';
117
118
  const proc = spawn(invocation.command, invocation.args, {
118
119
  cwd: options.cwd,
119
- shell: false,
120
+ shell: needsShell,
120
121
  stdio: ['ignore', 'pipe', 'pipe'],
121
122
  });
122
123
  let buffer = '';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreki-gg/pi-subagent",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "Subagent tool and direct agent runs for pi — isolated agents, parallel scouts, manager workflows, and bundled prompts",
5
5
  "keywords": [
6
6
  "pi-package"
@@ -42,5 +42,22 @@
42
42
  "@earendil-works/pi-coding-agent": "*",
43
43
  "@earendil-works/pi-tui": "*",
44
44
  "typebox": "*"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "@earendil-works/pi-ai": {
48
+ "optional": true
49
+ },
50
+ "@earendil-works/pi-agent-core": {
51
+ "optional": true
52
+ },
53
+ "@earendil-works/pi-coding-agent": {
54
+ "optional": true
55
+ },
56
+ "@earendil-works/pi-tui": {
57
+ "optional": true
58
+ },
59
+ "typebox": {
60
+ "optional": true
61
+ }
45
62
  }
46
63
  }
@@ -1,376 +0,0 @@
1
- ---
2
- name: "Structured handoffs + synthesis for chain workflows"
3
- overview: "Introduce a first-class handoff format for `@dreki-gg/pi-subagent` so chained agents pass compact, decision-rich context instead of raw `{previous}` markdown blobs. This slice should improve coherence across isolated agents without changing the core single/parallel/chain execution model."
4
- todo:
5
- - id: "structured-handoffs-1"
6
- task: "Add a handoff module that normalizes agent output into a compact envelope with goal, decisions, constraints, files, symbols, and raw output"
7
- status: pending
8
- - id: "structured-handoffs-2"
9
- task: "Thread the structured handoff through chain execution in `extensions/subagent/index.ts` while preserving `{previous}` compatibility"
10
- status: pending
11
- - id: "structured-handoffs-3"
12
- task: "Tighten bundled prompts so scout/planner/worker/docs-scout emit sections the handoff module can reliably summarize"
13
- status: pending
14
- ---
15
-
16
- # Goal
17
-
18
- Make chained subagent workflows in `packages/subagent` pass structured, compact handoffs instead of blindly injecting the previous agent’s final markdown blob into the next task.
19
-
20
- # Context
21
-
22
- - Parent rationale: apply the “single writer, many thinkers” / “context engineering over prompt gimmicks” learnings we discussed for `@dreki-gg/pi-subagent`.
23
- - Module root: `packages/subagent`
24
- - This slice is infrastructure. Later slices like clean-context review, manager orchestration, and advisor routing should be able to reuse the same handoff format, but this plan must **not** assume those slices already exist.
25
- - Existing repo convention for package-local planning docs lives under `packages/<pkg>/docs/plans/` (see `packages/browser-tools/docs/plans/`).
26
-
27
- ## What exists
28
-
29
- Current relevant file tree on disk:
30
-
31
- - `packages/subagent/package.json`
32
- - `packages/subagent/tsconfig.json`
33
- - `packages/subagent/README.md`
34
- - `packages/subagent/CHANGELOG.md`
35
- - `packages/subagent/extensions/subagent/index.ts`
36
- - `packages/subagent/extensions/subagent/agents.ts`
37
- - `packages/subagent/extensions/subagent/agent-runner.ts`
38
- - `packages/subagent/extensions/subagent/agent-runner-types.ts`
39
- - `packages/subagent/extensions/subagent/agent-result-utils.ts`
40
- - `packages/subagent/extensions/subagent/run-agent-args.ts`
41
- - `packages/subagent/extensions/subagent/synthesis.ts`
42
- - `packages/subagent/prompts/docs-scout.md`
43
- - `packages/subagent/prompts/planner.md`
44
- - `packages/subagent/prompts/reviewer.md`
45
- - `packages/subagent/prompts/scout.md`
46
- - `packages/subagent/prompts/ux-designer.md`
47
- - `packages/subagent/prompts/worker.md`
48
- - `packages/subagent/prompts/implement.md`
49
- - `packages/subagent/prompts/implement-and-review.md`
50
- - `packages/subagent/prompts/scout-and-plan.md`
51
- - `packages/subagent/skills/spawn-subagents/SKILL.md`
52
- - `packages/subagent/skills/write-an-agent/SKILL.md`
53
-
54
- Actual current behavior on disk:
55
-
56
- - Chain mode is still raw text plumbing. In `packages/subagent/extensions/subagent/index.ts:658-716`, each step computes `taskWithContext = step.task.replace(/\{previous\}/g, previousOutput)` and then updates `previousOutput = getFinalOutput(result.messages)`. There is no typed handoff object, parser, or summarizer.
57
- - `getFinalOutput()` in `packages/subagent/extensions/subagent/index.ts:204-214` returns only the last assistant text block, so any rich structure from tool calls or earlier assistant messages is discarded before handoff.
58
- - `run-agent` synthesizes main-conversation context via `extractRecentConversation()` and `buildRunAgentTask()` (`index.ts:1215-1229`, `index.ts:1557-1559`), but that synthesis is only used for direct `/run-agent` entry and not for agent-to-agent handoff.
59
- - `packages/subagent/extensions/subagent/synthesis.ts:5-38` already defines a strong section-oriented synthesis instruction (`Goal`, `Decisions`, `Constraints`, `Architecture`, `Open Questions`, `Intent`), but those sections are not reused anywhere in chain orchestration.
60
- - Bundled prompt templates still explicitly rely on `{previous}` text substitution:
61
- - `packages/subagent/prompts/implement.md:6-10`
62
- - `packages/subagent/prompts/scout-and-plan.md:6-9`
63
- - `packages/subagent/prompts/implement-and-review.md:6-10`
64
- - The `spawn-subagents` skill already hints at the desired future shape: it says to “return a compact synthesis to the main thread” and to pass previous outputs “verbatim or as a tight structured summary” (`packages/subagent/skills/spawn-subagents/SKILL.md:31-35`, `:49-54`). That guidance is not enforced in code.
65
- - Bundled agents already emit semi-structured markdown, but the section names are inconsistent across roles:
66
- - `scout` => `Files Retrieved`, `Key Code`, `Architecture`, `Start Here`
67
- - `docs-scout` => `Libraries`, `Key Documentation`, `Integration Notes`, `Recommended Next Step`
68
- - `planner` => `Goal`, `Plan`, `Files to Modify`, `New Files`, `Risks`
69
- - `worker` => `Completed`, `Files Changed`, `Notes`
70
- - There is no test directory in `packages/subagent`; current validation is package typechecking (`packages/subagent/package.json`, `packages/subagent/tsconfig.json`).
71
-
72
- # API inventory
73
-
74
- ## Existing public types and helpers the implementation will touch
75
-
76
- From `packages/subagent/extensions/subagent/agents.ts`:
77
-
78
- ```ts
79
- export type AgentScope = 'user' | 'project' | 'both';
80
- export type AgentSource = 'bundled' | 'user' | 'project' | 'package';
81
- export type AgentSessionStrategy = 'inline' | 'fork-at';
82
-
83
- export interface AgentConfig {
84
- name: string;
85
- description: string;
86
- tools?: string[];
87
- model?: string;
88
- thinking?: string;
89
- sessionStrategy?: AgentSessionStrategy;
90
- systemPrompt: string;
91
- source: AgentSource;
92
- filePath: string;
93
- }
94
-
95
- export interface AgentDiscoveryResult {
96
- agents: AgentConfig[];
97
- projectAgentsDir: string | null;
98
- }
99
- ```
100
-
101
- From `packages/subagent/extensions/subagent/agent-runner-types.ts`:
102
-
103
- ```ts
104
- export interface UsageStats {
105
- input: number;
106
- output: number;
107
- cacheRead: number;
108
- cacheWrite: number;
109
- cost: number;
110
- contextTokens: number;
111
- turns: number;
112
- }
113
-
114
- export interface AgentResult {
115
- agent: string;
116
- task: string;
117
- exitCode: number;
118
- messages: Message[];
119
- stderr: string;
120
- usage: UsageStats;
121
- model?: string;
122
- stopReason?: string;
123
- errorMessage?: string;
124
- }
125
- ```
126
-
127
- From `packages/subagent/extensions/subagent/agent-runner.ts`:
128
-
129
- ```ts
130
- export type OnPhaseUpdate = (
131
- phaseName: string,
132
- agentName: string,
133
- result: AgentResult,
134
- ) => void;
135
-
136
- export interface RunAgentOptions {
137
- agentScope?: AgentScope;
138
- cwd?: string;
139
- onUpdate?: OnPhaseUpdate;
140
- phaseName?: string;
141
- signal?: AbortSignal;
142
- resolvedPaths?: ResolvedPaths;
143
- }
144
-
145
- export async function runAgent(
146
- cwd: string,
147
- agentName: string,
148
- task: string,
149
- options: RunAgentOptions = {},
150
- ): Promise<AgentResult>
151
- ```
152
-
153
- From `packages/subagent/extensions/subagent/synthesis.ts`:
154
-
155
- ```ts
156
- export function extractRecentConversation(
157
- ctx: ExtensionCommandContext,
158
- ): string
159
-
160
- export function buildSynthesisPrompt(
161
- conversation: string,
162
- explicitTask?: string,
163
- ): string
164
- ```
165
-
166
- ## Existing internal chain data shape in `index.ts`
167
-
168
- ```ts
169
- interface SingleResult {
170
- agent: string;
171
- agentSource: AgentSource | 'unknown';
172
- task: string;
173
- exitCode: number;
174
- messages: Message[];
175
- stderr: string;
176
- usage: UsageStats;
177
- model?: string;
178
- stopReason?: string;
179
- errorMessage?: string;
180
- step?: number;
181
- }
182
-
183
- interface SubagentDetails {
184
- mode: 'single' | 'parallel' | 'chain';
185
- agentScope: AgentScope;
186
- projectAgentsDir: string | null;
187
- results: SingleResult[];
188
- }
189
- ```
190
-
191
- These are currently private to `index.ts`, but the new handoff helper can either:
192
- - accept a narrow `Pick<SingleResult, ...>` shape, or
193
- - define its own exported `HandoffSource` input type to avoid importing internal UI state.
194
-
195
- ## Proposed new handoff shape for this slice
196
-
197
- Create a dedicated module for this instead of baking ad hoc string munging into `index.ts`:
198
-
199
- ```ts
200
- export interface HandoffFileRef {
201
- path: string;
202
- notes?: string;
203
- }
204
-
205
- export interface HandoffEnvelope {
206
- version: 'subagent-handoff/v1';
207
- sourceAgent: string;
208
- sourceStep?: number;
209
- task: string;
210
- summary: string;
211
- goal?: string;
212
- decisions: string[];
213
- constraints: string[];
214
- files: HandoffFileRef[];
215
- symbols: string[];
216
- openQuestions: string[];
217
- rawOutput: string;
218
- }
219
-
220
- export interface RenderHandoffOptions {
221
- includeRawOutput?: boolean;
222
- maxRawChars?: number;
223
- }
224
-
225
- export function buildHandoffFromResult(input: {
226
- agent: string;
227
- step?: number;
228
- task: string;
229
- output: string;
230
- }): HandoffEnvelope
231
-
232
- export function renderHandoffForPrompt(
233
- handoff: HandoffEnvelope,
234
- options?: RenderHandoffOptions,
235
- ): string
236
- ```
237
-
238
- The parser can be heuristic and markdown-based. It does **not** need to become a full AST parser. The goal is reliable compaction, not perfect semantic extraction.
239
-
240
- # Tasks
241
-
242
- ## 1. Add a handoff module that normalizes agent output into a compact envelope
243
-
244
- ### Files
245
- - Create `packages/subagent/extensions/subagent/handoffs.ts`
246
-
247
- ### What to add
248
- - Export a small, typed handoff model (see `Proposed new handoff shape` above).
249
- - Implement markdown-section extraction that recognizes the current bundled agent contracts:
250
- - `## Goal`
251
- - `## Decisions`
252
- - `## Constraints`
253
- - `## Architecture`
254
- - `## Open Questions`
255
- - `## Plan`
256
- - `## Files Retrieved`
257
- - `## Files to Modify`
258
- - `## New Files`
259
- - `## Files Changed`
260
- - `## Notes`
261
- - `## Risks`
262
- - `## Recommended Next Step`
263
- - Build a compact summary by prioritizing the most useful sections instead of returning the entire raw output.
264
- - Extract file paths by scanning markdown bullets/code spans for repo-looking paths (e.g. `` `packages/subagent/...` ``).
265
- - Extract symbols conservatively from code fences or bullets when they are clearly named functions/types; do not overfit.
266
- - Always keep `rawOutput` so callers can still include the source text when needed.
267
-
268
- ### Code sketch
269
-
270
- ```ts
271
- const SECTION_RE = /^##\s+(.+)$/gm;
272
-
273
- function splitMarkdownSections(markdown: string): Map<string, string> {
274
- // return section title -> body
275
- }
276
-
277
- export function buildHandoffFromResult(input: {
278
- agent: string;
279
- step?: number;
280
- task: string;
281
- output: string;
282
- }): HandoffEnvelope {
283
- const sections = splitMarkdownSections(input.output);
284
- return {
285
- version: 'subagent-handoff/v1',
286
- sourceAgent: input.agent,
287
- sourceStep: input.step,
288
- task: input.task,
289
- summary: ...,
290
- goal: ...,
291
- decisions: ...,
292
- constraints: ...,
293
- files: ...,
294
- symbols: ...,
295
- openQuestions: ...,
296
- rawOutput: input.output,
297
- };
298
- }
299
- ```
300
-
301
- ### Notes
302
- - Keep this module dependency-free.
303
- - Do not move UI rendering logic into this file.
304
- - The formatter should emit readable markdown because existing prompt templates still use string substitution.
305
-
306
- ## 2. Thread the structured handoff through chain execution in `extensions/subagent/index.ts`
307
-
308
- ### Files
309
- - Modify `packages/subagent/extensions/subagent/index.ts`
310
-
311
- ### What to change
312
- - Import the new handoff helper.
313
- - In the chain path (`index.ts:658-716`), replace the raw `previousOutput` update with a rendered handoff string built from the prior step’s final output.
314
- - Preserve the existing `{previous}` placeholder contract so current prompt templates still work, but change what gets injected:
315
- - before: raw final assistant text
316
- - after: a compact structured markdown summary plus optional truncated raw output
317
- - Keep error handling behavior unchanged.
318
- - Keep streaming UI behavior unchanged.
319
-
320
- ### Implementation rules
321
- - Do **not** change single-mode or parallel-mode semantics in this slice.
322
- - Do **not** add a new tool mode; keep `single`, `parallel`, and `chain` only.
323
- - Avoid coupling the handoff module to `Message[]`; extract final text in `index.ts` and pass plain strings into the helper.
324
- - If the previous step returned no final text, fall back to `'(no output)'` exactly as current code does.
325
-
326
- ## 3. Tighten bundled prompts so handoffs have stable sections to summarize
327
-
328
- ### Files
329
- - Modify `packages/subagent/prompts/scout.md`
330
- - Modify `packages/subagent/prompts/docs-scout.md`
331
- - Modify `packages/subagent/prompts/planner.md`
332
- - Modify `packages/subagent/prompts/worker.md`
333
- - Modify `packages/subagent/prompts/implement.md`
334
- - Modify `packages/subagent/prompts/scout-and-plan.md`
335
-
336
- ### What to change
337
- - Keep the roles the same, but make their output contracts easier to summarize reliably.
338
- - Prefer stable section names over freeform prose.
339
- - Add a small “Handoff” / “Next step” section where helpful instead of forcing the summarizer to infer everything from generic notes.
340
-
341
- ### Recommended section adjustments
342
- - `scout.md`: keep `Files Retrieved` / `Key Code` / `Architecture`, and add `## Constraints or Unknowns`
343
- - `docs-scout.md`: keep `Libraries` / `Key Documentation` / `Integration Notes`, and make `Recommended Next Step` mandatory
344
- - `planner.md`: keep `Goal` / `Plan` / `Files to Modify` / `New Files` / `Risks`; optionally add `## Constraints`
345
- - `worker.md`: keep `Completed` / `Files Changed` / `Notes`, but require a short bullet list of decisions made and unresolved concerns
346
- - Prompt templates should mention that `{previous}` now contains a structured handoff, not an unbounded transcript dump
347
-
348
- # Files to create
349
-
350
- - `packages/subagent/extensions/subagent/handoffs.ts`
351
-
352
- # Files to modify
353
-
354
- - `packages/subagent/extensions/subagent/index.ts` — switch chain substitution from raw final text to rendered structured handoff
355
- - `packages/subagent/prompts/scout.md` — make scout output easier to summarize deterministically
356
- - `packages/subagent/prompts/docs-scout.md` — make docs handoff more consistent
357
- - `packages/subagent/prompts/planner.md` — preserve plan structure but expose constraints explicitly
358
- - `packages/subagent/prompts/worker.md` — add explicit decision / unresolved sections for downstream agents
359
- - `packages/subagent/prompts/implement.md` — document structured `{previous}` expectations
360
- - `packages/subagent/prompts/scout-and-plan.md` — document structured `{previous}` expectations
361
-
362
- # Testing notes
363
-
364
- - Run `bun run --filter '@dreki-gg/pi-subagent' typecheck` after adding `handoffs.ts` and updating imports.
365
- - Manually inspect the rendered handoff string by running a small local chain (for example, a trivial `scout -> planner` task) and confirm that the second step receives a compact summary instead of a huge raw blob.
366
- - Verify that existing prompt templates still work without changing the user-facing `{previous}` placeholder name.
367
- - Do not add runtime-only assumptions about sibling plans. This slice must provide value on its own.
368
-
369
- # Patterns to follow
370
-
371
- - `packages/subagent/extensions/subagent/synthesis.ts:5-38` — section-oriented synthesis prompt structure worth mirroring in handoffs
372
- - `packages/subagent/extensions/subagent/index.ts:658-716` — existing chain control flow to preserve
373
- - `packages/subagent/extensions/subagent/index.ts:204-214` — current final-output extraction behavior to wrap, not duplicate all over the package
374
- - `packages/subagent/skills/spawn-subagents/SKILL.md:31-35` — “compact synthesis” guidance already present in the skill
375
- - `packages/subagent/skills/spawn-subagents/SKILL.md:49-54` — existing advice about structured summaries
376
- - `packages/subagent/skills/write-an-agent/SKILL.md:15-20` and `:62-67` — output contracts should stay sharp and structured
@@ -1,240 +0,0 @@
1
- ---
2
- name: "Clean-context review loop"
3
- overview: "Refactor the existing implement→review→fix workflow so the reviewer starts from the diff and a minimal handoff instead of inheriting the worker’s full narrative. This slice should preserve the current single-writer loop while making review less correlated with generation."
4
- todo:
5
- - id: "clean-review-1"
6
- task: "Tighten the reviewer prompt so review starts from `git diff` and re-discovered code context, not from the worker’s rationale"
7
- status: pending
8
- - id: "clean-review-2"
9
- task: "Change the worker output contract so implementation handoff exposes exact files, symbols, validation, and unresolved risks in a compact review packet"
10
- status: pending
11
- - id: "clean-review-3"
12
- task: "Rewrite `/implement-and-review` to pass only the minimal review packet and findings needed for the next step"
13
- status: pending
14
- ---
15
-
16
- # Goal
17
-
18
- Improve the bundled review loop so the reviewer reasons from a fresh, diff-first context and the worker only receives actionable findings back.
19
-
20
- # Context
21
-
22
- - Parent rationale: we want the reviewer to act as a clean-context verifier rather than a second pass over the worker’s self-explanation.
23
- - Module root: `packages/subagent`
24
- - This slice must work against the current package even if the structured-handoff plan has not landed yet.
25
- - Keep the package philosophy intact: one writer (`worker`) plus verifier intelligence (`reviewer`), not competing writers.
26
-
27
- ## What exists
28
-
29
- Current relevant file tree on disk:
30
-
31
- - `packages/subagent/prompts/reviewer.md`
32
- - `packages/subagent/prompts/worker.md`
33
- - `packages/subagent/prompts/implement-and-review.md`
34
- - `packages/subagent/skills/spawn-subagents/SKILL.md`
35
- - `packages/subagent/extensions/subagent/index.ts`
36
- - `packages/subagent/README.md`
37
-
38
- Actual current behavior on disk:
39
-
40
- - The bundled review workflow is a plain chain prompt. `packages/subagent/prompts/implement-and-review.md:4-10` tells the main agent to:
41
- 1. run `worker` to implement `$@`
42
- 2. run `reviewer` “to review the implementation from the previous step (use {previous} placeholder)”
43
- 3. run `worker` again to apply review feedback from `{previous}`
44
- - Chain execution in `packages/subagent/extensions/subagent/index.ts:658-716` performs raw `{previous}` replacement with the previous step’s final assistant text. There is no review-specific minimization layer in code today.
45
- - The current reviewer prompt already points in the right direction:
46
- - `packages/subagent/prompts/reviewer.md:12-18` restricts bash to read-only commands and tells the agent to start with `git diff`, then read modified files.
47
- - But the prompt does **not** explicitly tell the reviewer to distrust or deprioritize the worker’s implementation narrative when that narrative is also passed through `{previous}`.
48
- - The current worker prompt includes a helpful but minimal handoff hint:
49
- - `packages/subagent/prompts/worker.md:13-26` asks for `Completed`, `Files Changed`, and `Notes`, and says that if handing off to another agent it should include exact file paths changed and key functions/types touched.
50
- - There is no required section for validation run, constraints, or unresolved risk, so the review handoff is underspecified.
51
- - The `spawn-subagents` skill currently recommends a `reviewer` loop after implementation and says the main agent may apply fixes directly or send a focused follow-up to `worker` (`packages/subagent/skills/spawn-subagents/SKILL.md:44-58`). It does not yet describe “clean context” review explicitly.
52
- - There is no additional workflow prompt for “clean review”; the current `/implement-and-review` prompt is the only bundled implementation review loop.
53
-
54
- # API inventory
55
-
56
- ## Existing reviewer and worker contracts
57
-
58
- From `packages/subagent/prompts/reviewer.md`:
59
-
60
- ```md
61
- Strategy:
62
- 1. Run `git diff` to see recent changes (if applicable)
63
- 2. Read the modified files
64
- 3. Check for bugs, security issues, code smells
65
-
66
- Output format:
67
- ## Files Reviewed
68
- - `path/to/file.ts` (lines X-Y)
69
-
70
- ## Critical (must fix)
71
- - `file.ts:42` - Issue description
72
-
73
- ## Warnings (should fix)
74
- - `file.ts:100` - Issue description
75
-
76
- ## Suggestions (consider)
77
- - `file.ts:150` - Improvement idea
78
-
79
- ## Summary
80
- Overall assessment in 2-3 sentences.
81
- ```
82
-
83
- From `packages/subagent/prompts/worker.md`:
84
-
85
- ```md
86
- Output format when finished:
87
-
88
- ## Completed
89
- What was done.
90
-
91
- ## Files Changed
92
- - `path/to/file.ts` - what changed
93
-
94
- ## Notes (if any)
95
- Anything the main agent should know.
96
-
97
- If handing off to another agent (e.g. reviewer), include:
98
- - Exact file paths changed
99
- - Key functions/types touched (short list)
100
- ```
101
-
102
- ## Existing workflow prompt shape
103
-
104
- From `packages/subagent/prompts/implement-and-review.md`:
105
-
106
- ```md
107
- 1. First, use the "worker" agent to implement: $@
108
- 2. Then, use the "reviewer" agent to review the implementation from the previous step (use {previous} placeholder)
109
- 3. Finally, use the "worker" agent to apply the feedback from the review (use {previous} placeholder)
110
- ```
111
-
112
- ## Existing chain plumbing in code
113
-
114
- From `packages/subagent/extensions/subagent/index.ts`:
115
-
116
- ```ts
117
- const taskWithContext = step.task.replace(/\{previous\}/g, previousOutput);
118
- ...
119
- previousOutput = getFinalOutput(result.messages);
120
- ```
121
-
122
- This means the review workflow can be improved significantly even with prompt-only changes, because the thing being substituted is whatever the worker chose to emit as final text.
123
-
124
- # Tasks
125
-
126
- ## 1. Tighten the reviewer prompt so review starts from `git diff` and re-discovered code context
127
-
128
- ### Files
129
- - Modify `packages/subagent/prompts/reviewer.md`
130
-
131
- ### What to change
132
- - Keep the reviewer read-only.
133
- - Make “diff first, repo second, worker narrative last” an explicit rule.
134
- - Tell the reviewer to use the incoming handoff only for:
135
- - the original goal
136
- - exact file paths / symbols to inspect first
137
- - any explicit constraints that must not be violated
138
- - Tell the reviewer to challenge assumptions openly when the diff suggests a bug, insecure pattern, or scope creep.
139
- - Add a rule that the reviewer should request more investigation rather than hallucinate missing repo context.
140
-
141
- ### Recommended prompt additions
142
- - Add a short “Rules” section such as:
143
- 1. Start with `git diff` / `git show`; do not trust the generator’s explanation over the code.
144
- 2. Use the incoming handoff only as a pointer to files, constraints, and touched symbols.
145
- 3. Re-discover missing context from the repo yourself.
146
- 4. If a claim cannot be verified from diff or code, say so explicitly.
147
- - Keep the current output sections, but add a mandatory “No findings” bullet format when the diff looks good.
148
-
149
- ## 2. Change the worker output contract so implementation handoff becomes a compact review packet
150
-
151
- ### Files
152
- - Modify `packages/subagent/prompts/worker.md`
153
-
154
- ### What to change
155
- - Keep the worker autonomous and implementation-focused.
156
- - Expand the finish contract so a downstream reviewer gets a compact, machine-readable packet.
157
-
158
- ### Required output structure
159
-
160
- ```md
161
- ## Completed
162
- - concise implementation summary
163
-
164
- ## Files Changed
165
- - `path/to/file.ts` - what changed
166
-
167
- ## Key Symbols Touched
168
- - `functionName`
169
- - `TypeName`
170
-
171
- ## Validation
172
- - command run / not run
173
- - result
174
-
175
- ## Constraints Followed
176
- - user constraints that shaped the implementation
177
-
178
- ## Open Risks or Unknowns
179
- - anything the reviewer should pressure-test
180
- ```
181
-
182
- ### Notes
183
- - Do not ask the worker to justify every design choice in prose; that would reintroduce context bloat.
184
- - The goal is a review packet, not a diary.
185
-
186
- ## 3. Rewrite `/implement-and-review` to pass only the minimal review packet and findings needed for the next step
187
-
188
- ### Files
189
- - Modify `packages/subagent/prompts/implement-and-review.md`
190
-
191
- ### What to change
192
- - Replace the vague “review the implementation from the previous step” language with explicit review behavior.
193
- - The prompt should instruct the main agent to pass a **minimal** handoff to `reviewer`:
194
- - goal
195
- - exact files changed
196
- - touched symbols
197
- - constraints followed
198
- - open risks / unknowns
199
- - The prompt should instruct the reviewer to start from `git diff`, not from the packet itself.
200
- - The prompt should instruct the final `worker` step to apply only concrete review findings, not to rewrite code based on generic commentary.
201
-
202
- ### Suggested prompt shape
203
-
204
- ```md
205
- 1. Use `worker` to implement: $@
206
- 2. Use `reviewer` to perform a diff-first review. Treat the previous step only as a compact review packet (goal, files changed, key symbols, constraints, open risks). Re-discover repo context from the diff and files as needed.
207
- 3. Use `worker` to address concrete Critical and Warning findings from the review. Ignore Suggestions unless they clearly fit scope.
208
- ```
209
-
210
- ### Optional follow-up
211
- - If, during implementation, you find the package benefits from a second prompt template instead of changing the default one, create `packages/subagent/prompts/implement-and-clean-review.md` and keep `/implement-and-review` as a thin wrapper or conservative alias.
212
- - If you choose that route, document the reason in the plan output and README follow-up notes.
213
-
214
- # Files to create
215
-
216
- - None required for the first iteration
217
-
218
- # Files to modify
219
-
220
- - `packages/subagent/prompts/reviewer.md` — make clean-context review an explicit prompt rule
221
- - `packages/subagent/prompts/worker.md` — emit a compact review packet instead of only freeform notes
222
- - `packages/subagent/prompts/implement-and-review.md` — encode diff-first review semantics in the bundled workflow
223
-
224
- # Testing notes
225
-
226
- - No TypeScript changes are required unless you choose to add a helper module, so package validation is primarily manual.
227
- - Run a small local `/implement-and-review` workflow and verify:
228
- - the reviewer starts from `git diff`
229
- - the reviewer output references concrete files/lines
230
- - the worker’s second pass applies Critical/Warning items rather than rewriting everything
231
- - If you add any TS helper to support review packet rendering, run `bun run --filter '@dreki-gg/pi-subagent' typecheck`.
232
- - Do not assume the structured-handoff slice already exists. This prompt-level refactor should still improve behavior on its own.
233
-
234
- # Patterns to follow
235
-
236
- - `packages/subagent/prompts/reviewer.md:12-18` — existing diff-first reviewer stance to strengthen, not replace
237
- - `packages/subagent/prompts/worker.md:24-26` — current handoff hints to make mandatory and more compact
238
- - `packages/subagent/prompts/implement-and-review.md:4-10` — current workflow entry point to refine
239
- - `packages/subagent/skills/spawn-subagents/SKILL.md:44-58` — current review-loop guidance
240
- - `packages/subagent/skills/write-an-agent/SKILL.md:15-20` and `:62-67` — keep prompt files sharp, minimal, and output-contract-driven