pi-harness-runtime 1.1.95 → 1.1.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/harness/loop-runtime.ts +3 -0
  3. package/index.ts +130 -29
  4. package/package.json +2 -1
  5. package/packages/a2a-adapter/package.json +1 -1
  6. package/packages/architecture-generator/package.json +1 -1
  7. package/packages/auth/package.json +1 -1
  8. package/packages/autonomous-refactor/package.json +1 -1
  9. package/packages/autonomous-runtime/package.json +1 -1
  10. package/packages/cache-strategy/package.json +1 -1
  11. package/packages/capability-registry/package.json +1 -1
  12. package/packages/checkpoint/package.json +1 -1
  13. package/packages/cli-plugin-sdk/package.json +1 -1
  14. package/packages/clipboard/package.json +1 -1
  15. package/packages/clipboard-plugin/package.json +1 -1
  16. package/packages/code-generation/package.json +1 -1
  17. package/packages/code-review/package.json +1 -1
  18. package/packages/codex-adapter/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/context-compiler/package.json +1 -1
  21. package/packages/context-discovery/package.json +1 -1
  22. package/packages/context-manager/package.json +1 -1
  23. package/packages/cookie-sanitizer/package.json +1 -1
  24. package/packages/cost-optimizer/package.json +1 -1
  25. package/packages/dependency-analyzer/package.json +1 -1
  26. package/packages/django-plugin/package.json +1 -1
  27. package/packages/doc-generator/package.json +1 -1
  28. package/packages/evaluation-engine/package.json +1 -1
  29. package/packages/evaluation-runner/package.json +1 -1
  30. package/packages/event-bus/package.json +1 -1
  31. package/packages/event-store/package.json +1 -1
  32. package/packages/experience-replay/package.json +1 -1
  33. package/packages/feedback-collector/package.json +1 -1
  34. package/packages/file-copy-helper/package.json +1 -1
  35. package/packages/framework-detector/package.json +1 -1
  36. package/packages/framework-plugin-sdk/package.json +1 -1
  37. package/packages/frappe-plugin/package.json +1 -1
  38. package/packages/generic-web-plugin/package.json +1 -1
  39. package/packages/health-monitor/package.json +1 -1
  40. package/packages/intent-analyzer/package.json +1 -1
  41. package/packages/jev-judge/package.json +1 -1
  42. package/packages/knowledge-graph/package.json +1 -1
  43. package/packages/knowledge-retrieval/package.json +1 -1
  44. package/packages/laravel-plugin/package.json +1 -1
  45. package/packages/learning-engine/package.json +1 -1
  46. package/packages/mcp-adapter/package.json +1 -1
  47. package/packages/memory-engine/package.json +1 -1
  48. package/packages/milestone-manager/package.json +1 -1
  49. package/packages/model-registry/package.json +1 -1
  50. package/packages/nextjs-plugin/package.json +1 -1
  51. package/packages/notification/package.json +1 -1
  52. package/packages/observability/package.json +1 -1
  53. package/packages/okf-indexer/package.json +1 -1
  54. package/packages/performance-optimizer/package.json +1 -1
  55. package/packages/privilege-broker/package.json +1 -1
  56. package/packages/project-analyzer/package.json +1 -1
  57. package/packages/project-bootstrap/package.json +1 -1
  58. package/packages/projection-engine/package.json +1 -1
  59. package/packages/prompt-compiler/package.json +1 -1
  60. package/packages/prompt-versioning/package.json +1 -1
  61. package/packages/provider-adapter-sdk/package.json +1 -1
  62. package/packages/provider-router/package.json +1 -1
  63. package/packages/provider-selector/package.json +1 -1
  64. package/packages/providers/package.json +1 -1
  65. package/packages/qdrant-skills/dist/client.d.ts +51 -0
  66. package/packages/qdrant-skills/dist/client.d.ts.map +1 -0
  67. package/packages/qdrant-skills/dist/client.js +105 -0
  68. package/packages/qdrant-skills/dist/client.js.map +1 -0
  69. package/packages/qdrant-skills/dist/embedder.d.ts +39 -0
  70. package/packages/qdrant-skills/dist/embedder.d.ts.map +1 -0
  71. package/packages/qdrant-skills/dist/embedder.js +101 -0
  72. package/packages/qdrant-skills/dist/embedder.js.map +1 -0
  73. package/packages/qdrant-skills/dist/index.d.ts +25 -0
  74. package/packages/qdrant-skills/dist/index.d.ts.map +1 -0
  75. package/packages/qdrant-skills/dist/index.js +25 -0
  76. package/packages/qdrant-skills/dist/index.js.map +1 -0
  77. package/packages/qdrant-skills/package.json +27 -0
  78. package/packages/qdrant-skills/src/client.ts +178 -0
  79. package/packages/qdrant-skills/src/embedder.ts +137 -0
  80. package/packages/qdrant-skills/src/index.ts +42 -0
  81. package/packages/quota-manager/package.json +1 -1
  82. package/packages/rate-limiter/package.json +1 -1
  83. package/packages/react-vite-plugin/package.json +1 -1
  84. package/packages/release-manager/package.json +1 -1
  85. package/packages/requirement-compiler/package.json +1 -1
  86. package/packages/runtime/package.json +1 -1
  87. package/packages/scheduler/package.json +1 -1
  88. package/packages/scheduler-adapter/package.json +1 -1
  89. package/packages/session/package.json +1 -1
  90. package/packages/session-api/package.json +1 -1
  91. package/packages/session-export/package.json +1 -1
  92. package/packages/shared-context/package.json +1 -1
  93. package/packages/skill-mcp-client/package.json +1 -1
  94. package/packages/skill-registry/package.json +1 -1
  95. package/packages/skills/dist/index.d.ts +40 -0
  96. package/packages/skills/dist/index.d.ts.map +1 -0
  97. package/packages/skills/dist/index.js +84 -0
  98. package/packages/skills/dist/index.js.map +1 -0
  99. package/packages/skills/dist/linter.d.ts +38 -0
  100. package/packages/skills/dist/linter.d.ts.map +1 -0
  101. package/packages/skills/dist/linter.js +323 -0
  102. package/packages/skills/dist/linter.js.map +1 -0
  103. package/packages/skills/dist/loader.d.ts +74 -0
  104. package/packages/skills/dist/loader.d.ts.map +1 -0
  105. package/packages/skills/dist/loader.js +280 -0
  106. package/packages/skills/dist/loader.js.map +1 -0
  107. package/packages/skills/dist/parser.d.ts +32 -0
  108. package/packages/skills/dist/parser.d.ts.map +1 -0
  109. package/packages/skills/dist/parser.js +459 -0
  110. package/packages/skills/dist/parser.js.map +1 -0
  111. package/packages/skills/dist/scanner.d.ts +33 -0
  112. package/packages/skills/dist/scanner.d.ts.map +1 -0
  113. package/packages/skills/dist/scanner.js +257 -0
  114. package/packages/skills/dist/scanner.js.map +1 -0
  115. package/packages/skills/dist/skill-commands.d.ts +33 -0
  116. package/packages/skills/dist/skill-commands.d.ts.map +1 -0
  117. package/packages/skills/dist/skill-commands.js +239 -0
  118. package/packages/skills/dist/skill-commands.js.map +1 -0
  119. package/packages/skills/dist/skill-tool.d.ts +120 -0
  120. package/packages/skills/dist/skill-tool.d.ts.map +1 -0
  121. package/packages/skills/dist/skill-tool.js +239 -0
  122. package/packages/skills/dist/skill-tool.js.map +1 -0
  123. package/packages/skills/dist/skill-versioning.d.ts +123 -0
  124. package/packages/skills/dist/skill-versioning.d.ts.map +1 -0
  125. package/packages/skills/dist/skill-versioning.js +240 -0
  126. package/packages/skills/dist/skill-versioning.js.map +1 -0
  127. package/packages/skills/dist/types.d.ts +226 -0
  128. package/packages/skills/dist/types.d.ts.map +1 -0
  129. package/packages/skills/dist/types.js +21 -0
  130. package/packages/skills/dist/types.js.map +1 -0
  131. package/packages/skills/package.json +46 -0
  132. package/packages/skills/src/index.ts +95 -0
  133. package/packages/skills/src/linter.ts +371 -0
  134. package/packages/skills/src/loader.ts +335 -0
  135. package/packages/skills/src/parser.ts +548 -0
  136. package/packages/skills/src/scanner.ts +322 -0
  137. package/packages/skills/src/skill-commands.ts +318 -0
  138. package/packages/skills/src/skill-tool.ts +324 -0
  139. package/packages/skills/src/skill-versioning.ts +345 -0
  140. package/packages/skills/src/types.ts +259 -0
  141. package/packages/skills/test/init-skills.test.ts +118 -0
  142. package/packages/sprint-planner/package.json +1 -1
  143. package/packages/subscription-engine/package.json +1 -1
  144. package/packages/task-compiler/package.json +1 -1
  145. package/packages/tencentdb-memory/package.json +1 -1
  146. package/packages/tencentdb-sync/package.json +1 -1
  147. package/packages/test-data-generator/package.json +1 -1
  148. package/packages/test-generator/package.json +1 -1
  149. package/packages/todo-bd-sync/package.json +1 -1
  150. package/packages/token-estimation/package.json +1 -1
  151. package/packages/token-optimizer/package.json +1 -1
  152. package/packages/trajectory/dist/src/curator.d.ts +189 -0
  153. package/packages/trajectory/dist/src/curator.d.ts.map +1 -0
  154. package/packages/trajectory/dist/src/curator.js +340 -0
  155. package/packages/trajectory/dist/src/curator.js.map +1 -0
  156. package/packages/trajectory/dist/src/journey-renderer.d.ts +53 -0
  157. package/packages/trajectory/dist/src/journey-renderer.d.ts.map +1 -0
  158. package/packages/trajectory/dist/src/journey-renderer.js +324 -0
  159. package/packages/trajectory/dist/src/journey-renderer.js.map +1 -0
  160. package/packages/trajectory/dist/src/learning-graph.d.ts +159 -0
  161. package/packages/trajectory/dist/src/learning-graph.d.ts.map +1 -0
  162. package/packages/trajectory/dist/src/learning-graph.js +258 -0
  163. package/packages/trajectory/dist/src/learning-graph.js.map +1 -0
  164. package/packages/trajectory/dist/src/memory-store.d.ts +146 -0
  165. package/packages/trajectory/dist/src/memory-store.d.ts.map +1 -0
  166. package/packages/trajectory/dist/src/memory-store.js +472 -0
  167. package/packages/trajectory/dist/src/memory-store.js.map +1 -0
  168. package/packages/trajectory/dist/src/review-fork.d.ts +164 -0
  169. package/packages/trajectory/dist/src/review-fork.d.ts.map +1 -0
  170. package/packages/trajectory/dist/src/review-fork.js +332 -0
  171. package/packages/trajectory/dist/src/review-fork.js.map +1 -0
  172. package/packages/trajectory/dist/src/write-approval.d.ts +136 -0
  173. package/packages/trajectory/dist/src/write-approval.d.ts.map +1 -0
  174. package/packages/trajectory/dist/src/write-approval.js +281 -0
  175. package/packages/trajectory/dist/src/write-approval.js.map +1 -0
  176. package/packages/trajectory/package.json +1 -1
  177. package/packages/trajectory/src/curator.ts +485 -0
  178. package/packages/trajectory/src/journey-renderer.ts +399 -0
  179. package/packages/trajectory/src/learning-graph.ts +363 -0
  180. package/packages/trajectory/src/memory-store.ts +578 -0
  181. package/packages/trajectory/src/review-fork.ts +450 -0
  182. package/packages/trajectory/src/write-approval.ts +372 -0
  183. package/packages/tui/package.json +1 -1
  184. package/packages/types/package.json +1 -1
  185. package/packages/workflow-events/package.json +1 -1
  186. package/packages/workspace-scanner/package.json +1 -1
  187. package/packages/worktree/package.json +1 -1
  188. package/packages/write-review/dist/blackboard.d.ts +98 -0
  189. package/packages/write-review/dist/blackboard.d.ts.map +1 -0
  190. package/packages/write-review/dist/blackboard.js +289 -0
  191. package/packages/write-review/dist/blackboard.js.map +1 -0
  192. package/packages/write-review/dist/event-bus.d.ts +106 -0
  193. package/packages/write-review/dist/event-bus.d.ts.map +1 -0
  194. package/packages/write-review/dist/event-bus.js +294 -0
  195. package/packages/write-review/dist/event-bus.js.map +1 -0
  196. package/packages/write-review/dist/gate.d.ts +37 -0
  197. package/packages/write-review/dist/gate.d.ts.map +1 -0
  198. package/packages/write-review/dist/gate.js +138 -0
  199. package/packages/write-review/dist/gate.js.map +1 -0
  200. package/packages/write-review/dist/index.d.ts +22 -0
  201. package/packages/write-review/dist/index.d.ts.map +1 -0
  202. package/packages/write-review/dist/index.js +60 -0
  203. package/packages/write-review/dist/index.js.map +1 -0
  204. package/packages/write-review/dist/injection.d.ts +40 -0
  205. package/packages/write-review/dist/injection.d.ts.map +1 -0
  206. package/packages/write-review/dist/injection.js +179 -0
  207. package/packages/write-review/dist/injection.js.map +1 -0
  208. package/packages/write-review/dist/review.d.ts +54 -0
  209. package/packages/write-review/dist/review.d.ts.map +1 -0
  210. package/packages/write-review/dist/review.js +154 -0
  211. package/packages/write-review/dist/review.js.map +1 -0
  212. package/packages/write-review/dist/trigger.d.ts +39 -0
  213. package/packages/write-review/dist/trigger.d.ts.map +1 -0
  214. package/packages/write-review/dist/trigger.js +107 -0
  215. package/packages/write-review/dist/trigger.js.map +1 -0
  216. package/packages/write-review/dist/types.d.ts +78 -0
  217. package/packages/write-review/dist/types.d.ts.map +1 -0
  218. package/packages/write-review/dist/types.js +26 -0
  219. package/packages/write-review/dist/types.js.map +1 -0
  220. package/packages/write-review/package.json +1 -1
  221. package/packages/write-review/src/event-bus.ts +351 -0
  222. package/packages/write-review/src/index.ts +1 -0
  223. package/packages/write-review/src/injection.ts +25 -3
  224. package/proactive-compact.ts +51 -7
  225. package/scripts/sync-skills.ts +275 -0
  226. package/scripts/sync-to-qdrant.ts +398 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * System Prompt Injection
3
+ *
4
+ * Adds write-review hints to the agent's system prompt.
5
+ */
6
+ import { existsSync } from "node:fs";
7
+ import { dirname, join } from "node:path";
8
+ /**
9
+ * Find the project root (directory containing .git)
10
+ */
11
+ function findProjectRoot(startPath) {
12
+ let dir = startPath;
13
+ // Limit traversal to prevent infinite loops
14
+ for (let i = 0; i < 20; i++) {
15
+ if (existsSync(join(dir, ".git"))) {
16
+ return dir;
17
+ }
18
+ const parent = dirname(dir);
19
+ if (parent === dir)
20
+ break; // Reached filesystem root
21
+ dir = parent;
22
+ }
23
+ return startPath; // Fallback to start path
24
+ }
25
+ /**
26
+ * Write-review hint for system prompt
27
+ */
28
+ export const WRITE_REVIEW_HINT = `
29
+
30
+ ## Write-Review Loop
31
+
32
+ When reading a prompt from {project}/wiki/*:
33
+
34
+ 1. You are the **WRITER** agent (Minimax). Read the wiki prompt and write code.
35
+ 2. After writing code, write "## WRITER_DONE" to signal completion.
36
+ 3. Do NOT build or commit until you receive "APPROVED" verdict.
37
+ 4. If you receive "CHANGES_REQUESTED", update the code accordingly.
38
+ 5. Acknowledge each verdict in your response.
39
+
40
+ ### Blackboard Path
41
+ {p}/.write-review/status.json
42
+
43
+ ### Verdict Types
44
+ - **APPROVED**: Code is ready. You may build/commit.
45
+ - **CHANGES_REQUESTED**: Reviewer found issues. Update code.
46
+ - **BLOCKED**: Critical issues. Human intervention needed.
47
+ `;
48
+ /**
49
+ * Helper agent hint (for worker agent)
50
+ */
51
+ export const HELPER_HINT = `
52
+
53
+ ## Helper Agent Task
54
+
55
+ The writer agent is busy or needs assistance. Your task:
56
+
57
+ 1. Note any pending tasks to the Todos list using the todo tool.
58
+ 2. Review the changes requested and prepare notes for the writer.
59
+ 3. Do NOT write code directly - that's the writer's job.
60
+ 4. Write a summary of pending tasks to the blackboard.
61
+ `;
62
+ /**
63
+ * Review reminder hint
64
+ */
65
+ export const REVIEW_REMINDER_HINT = `
66
+
67
+ ## Review Reminder
68
+
69
+ Before committing or building, ALWAYS check the write-review status:
70
+
71
+ \`\`\`bash
72
+ cat {project}/.write-review/status.json
73
+ \`\`\`
74
+
75
+ Only build/commit if the status shows "approved" or "phase": "approved".
76
+ `;
77
+ /**
78
+ * Format hint with project path
79
+ */
80
+ export function formatWriteReviewHint(projectPath) {
81
+ return WRITE_REVIEW_HINT.replace("{project}", projectPath).replace("{p}", projectPath);
82
+ }
83
+ /**
84
+ * Format review reminder with project path
85
+ */
86
+ export function formatReviewReminder(projectPath) {
87
+ return REVIEW_REMINDER_HINT.replace("{project}", projectPath);
88
+ }
89
+ /**
90
+ * Get all hints to inject
91
+ */
92
+ export function getWriteReviewHints(projectPath) {
93
+ return {
94
+ writeHint: formatWriteReviewHint(projectPath),
95
+ reminderHint: formatReviewReminder(projectPath),
96
+ };
97
+ }
98
+ import { createBlackboard } from "./blackboard.js";
99
+ import { getPingPongEventBus, PingPongEvent } from "./event-bus.js";
100
+ export function injectWriterInstructions(pi, config) {
101
+ let currentProject = null;
102
+ let blackboard = null;
103
+ let hintsInjected = false;
104
+ // Initialize event bus with ExtensionAPI
105
+ const eventBus = getPingPongEventBus();
106
+ eventBus.setExtensionAPI(pi);
107
+ // Register event listeners for debugging
108
+ eventBus.on(PingPongEvent.WRITER_DONE, (payload) => {
109
+ if (config?.debug) {
110
+ console.log(`[write-review] Writer done: ${JSON.stringify(payload)}`);
111
+ }
112
+ });
113
+ eventBus.on(PingPongEvent.REVIEW_NEEDED, (payload) => {
114
+ if (config?.debug) {
115
+ console.log(`[write-review] Review needed: ${JSON.stringify(payload)}`);
116
+ }
117
+ });
118
+ // System prompt injection
119
+ pi.on("before_agent_start", async (event) => {
120
+ const cwd = findProjectRoot(process.cwd?.() ?? "/");
121
+ if (cwd !== currentProject) {
122
+ currentProject = cwd;
123
+ blackboard = createBlackboard(cwd);
124
+ hintsInjected = false;
125
+ }
126
+ if (!hintsInjected && blackboard) {
127
+ const status = blackboard.load();
128
+ if (status && status.phase !== "idle") {
129
+ let systemPrompt = event.systemPrompt;
130
+ systemPrompt += formatWriteReviewHint(cwd);
131
+ if (status.phase !== "approved") {
132
+ systemPrompt += formatReviewReminder(cwd);
133
+ }
134
+ hintsInjected = true;
135
+ if (config?.debug) {
136
+ console.log(`[write-review] Hints injected for ${cwd}, phase: ${status.phase}`);
137
+ }
138
+ return { systemPrompt };
139
+ }
140
+ }
141
+ return undefined;
142
+ });
143
+ // Build gate
144
+ pi.on("tool_execution_end", async (event) => {
145
+ const toolName = event.tool?.name ?? "";
146
+ if (toolName !== "bash")
147
+ return;
148
+ const result = event;
149
+ const content = result.result?.content ?? "";
150
+ // Check for build commands
151
+ const buildCommands = [
152
+ "bench build",
153
+ "npm run build",
154
+ "yarn build",
155
+ "pnpm build",
156
+ "bun run build",
157
+ "make build",
158
+ "gradle build",
159
+ "dotnet build",
160
+ "cargo build",
161
+ ];
162
+ const isBuild = buildCommands.some((cmd) => content.includes(cmd));
163
+ if (isBuild && blackboard) {
164
+ const status = blackboard.load();
165
+ if (status && status.phase !== "approved") {
166
+ result.result.content =
167
+ content +
168
+ "\n\n" +
169
+ "⚠️ BUILD BLOCKED - Review not approved yet.\n" +
170
+ `Current phase: ${status.phase}\n` +
171
+ "Wait for APPROVED verdict before building.";
172
+ }
173
+ }
174
+ });
175
+ if (config?.debug) {
176
+ console.log("[write-review] Extension registered");
177
+ }
178
+ }
179
+ //# sourceMappingURL=injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection.js","sourceRoot":"","sources":["../src/injection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Review Integration
3
+ *
4
+ * Uses pi-subagents review-loop for multi-round code review.
5
+ */
6
+ import type { WriteReviewStatus } from "./types.js";
7
+ /**
8
+ * Review round result
9
+ */
10
+ export interface ReviewResult {
11
+ verdict: "approved" | "changes_requested" | "blocked";
12
+ iteration: number;
13
+ message: string;
14
+ changesNeeded?: string[];
15
+ issues?: ReviewIssue[];
16
+ }
17
+ /**
18
+ * Issue found during review
19
+ */
20
+ export interface ReviewIssue {
21
+ severity: "blocker" | "major" | "minor" | "suggestion";
22
+ type: "correctness" | "security" | "performance" | "style" | "test" | "docs";
23
+ location: string;
24
+ description: string;
25
+ suggestion?: string;
26
+ }
27
+ /**
28
+ * Build review task for pi-subagents
29
+ */
30
+ export declare function buildReviewTask(status: WriteReviewStatus, projectPath: string): string;
31
+ /**
32
+ * Parse verdict from review output
33
+ */
34
+ export declare function parseVerdict(output: string): {
35
+ verdict: "approved" | "changes_requested" | "blocked";
36
+ message: string;
37
+ changes?: string[];
38
+ } | null;
39
+ /**
40
+ * Review angles for parallel review
41
+ */
42
+ export declare const REVIEW_ANGLES: {
43
+ name: string;
44
+ description: string;
45
+ }[];
46
+ /**
47
+ * Build parallel review prompt
48
+ */
49
+ export declare function buildParallelReviewPrompt(codeFiles: string[], projectPath: string): string;
50
+ /**
51
+ * Format review summary for blackboard
52
+ */
53
+ export declare function formatReviewSummary(result: ReviewResult): string;
54
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,UAAU,GAAG,mBAAmB,GAAG,SAAS,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,QAAQ,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,CAAC;IACvD,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,MAAM,GACjB,MAAM,CAkCR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAC7C,OAAO,EAAE,UAAU,GAAG,mBAAmB,GAAG,SAAS,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,IAAI,CA8CP;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;GAezB,CAAC;AAEF;;GAEG;AACH,wBAAgB,yBAAyB,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,GACjB,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoChE"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Review Integration
3
+ *
4
+ * Uses pi-subagents review-loop for multi-round code review.
5
+ */
6
+ /**
7
+ * Build review task for pi-subagents
8
+ */
9
+ export function buildReviewTask(status, projectPath) {
10
+ const codeFiles = status.codeFiles ?? [];
11
+ const iteration = status.iteration;
12
+ const task = `## Review Task - Iteration ${iteration}
13
+
14
+ Review the code written in this iteration.
15
+
16
+ ### Code Files to Review:
17
+ ${codeFiles.map((f) => `- ${f}`).join("\n") || "No files recorded yet."}
18
+
19
+ ### Project Path: ${projectPath}
20
+
21
+ ### Review Instructions:
22
+ 1. Read the code files listed above.
23
+ 2. Run the review-loop workflow using pi-subagents.
24
+ 3. Focus on: correctness, security, performance, tests, and code style.
25
+ 4. Return a verdict: APPROVED, CHANGES_REQUESTED, or BLOCKED.
26
+
27
+ ### Verdict Format:
28
+ \`\`\`
29
+ ## Verdict: [APPROVED|CHANGES_REQUESTED|BLOCKED]
30
+ [Your detailed review message]
31
+ \`\`\`
32
+
33
+ For CHANGES_REQUESTED, list specific changes needed:
34
+ \`\`\`
35
+ ## Changes Needed:
36
+ 1. [Issue description] - [File:Line]
37
+ 2. [Issue description] - [File:Line]
38
+ \`\`\`
39
+ `;
40
+ return task;
41
+ }
42
+ /**
43
+ * Parse verdict from review output
44
+ */
45
+ export function parseVerdict(output) {
46
+ const lines = output.split("\n");
47
+ let verdict = null;
48
+ let message = "";
49
+ const changes = [];
50
+ let inChanges = false;
51
+ for (const line of lines) {
52
+ const lower = line.toLowerCase();
53
+ if (lower.includes("## verdict:")) {
54
+ if (lower.includes("approved")) {
55
+ verdict = "approved";
56
+ }
57
+ else if (lower.includes("changes_requested") ||
58
+ lower.includes("changes requested")) {
59
+ verdict = "changes_requested";
60
+ }
61
+ else if (lower.includes("blocked")) {
62
+ verdict = "blocked";
63
+ }
64
+ continue;
65
+ }
66
+ if (lower.includes("## changes needed:") || lower.includes("changes:")) {
67
+ inChanges = true;
68
+ continue;
69
+ }
70
+ if (inChanges && line.trim().match(/^\d+\./)) {
71
+ changes.push(line.trim());
72
+ continue;
73
+ }
74
+ if (verdict && line.trim()) {
75
+ message += line + "\n";
76
+ }
77
+ }
78
+ if (!verdict)
79
+ return null;
80
+ return {
81
+ verdict,
82
+ message: message.trim(),
83
+ changes: changes.length > 0 ? changes : undefined,
84
+ };
85
+ }
86
+ /**
87
+ * Review angles for parallel review
88
+ */
89
+ export const REVIEW_ANGLES = [
90
+ {
91
+ name: "correctness",
92
+ description: "Verify implementation matches requirements and handles edge cases",
93
+ },
94
+ {
95
+ name: "tests",
96
+ description: "Check test coverage and validity",
97
+ },
98
+ {
99
+ name: "complexity",
100
+ description: "Look for unnecessary complexity and opportunities to simplify",
101
+ },
102
+ ];
103
+ /**
104
+ * Build parallel review prompt
105
+ */
106
+ export function buildParallelReviewPrompt(codeFiles, projectPath) {
107
+ return `Run parallel reviewers on this code:
108
+
109
+ 1. **correctness** - Verify implementation matches requirements and handles edge cases
110
+ 2. **tests** - Check test coverage and validity
111
+ 3. **complexity** - Look for unnecessary complexity
112
+
113
+ Files: ${codeFiles.join(", ")}
114
+ Project: ${projectPath}
115
+
116
+ Use pi-subagents to spawn 3 parallel reviewers. Wait for all results, then synthesize into a final verdict.`;
117
+ }
118
+ /**
119
+ * Format review summary for blackboard
120
+ */
121
+ export function formatReviewSummary(result) {
122
+ const lines = [
123
+ `## Review Result - Iteration ${result.iteration}`,
124
+ "",
125
+ `**Verdict:** ${result.verdict.toUpperCase()}`,
126
+ "",
127
+ ];
128
+ if (result.message) {
129
+ lines.push("### Message");
130
+ lines.push(result.message);
131
+ lines.push("");
132
+ }
133
+ if (result.changesNeeded && result.changesNeeded.length > 0) {
134
+ lines.push("### Changes Needed");
135
+ for (const change of result.changesNeeded) {
136
+ lines.push(`- ${change}`);
137
+ }
138
+ lines.push("");
139
+ }
140
+ if (result.issues && result.issues.length > 0) {
141
+ lines.push("### Issues Found");
142
+ for (const issue of result.issues) {
143
+ lines.push(`- [${issue.severity}] ${issue.type}: ${issue.description}`);
144
+ if (issue.location) {
145
+ lines.push(` Location: ${issue.location}`);
146
+ }
147
+ if (issue.suggestion) {
148
+ lines.push(` Suggestion: ${issue.suggestion}`);
149
+ }
150
+ }
151
+ }
152
+ return lines.join("\n");
153
+ }
154
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Wiki Prompt Trigger
3
+ *
4
+ * Detects when an agent reads a prompt from {project}/wiki/*
5
+ * This triggers the write-review loop.
6
+ */
7
+ import type { ReviewTriggerContext } from "./types.js";
8
+ /**
9
+ * Detect if a file path is a wiki prompt
10
+ */
11
+ export declare function isWikiPrompt(filePath: string, projectPath: string): boolean;
12
+ /**
13
+ * Extract prompt metadata from wiki path
14
+ */
15
+ export declare function parseWikiPrompt(filePath: string, projectPath: string): {
16
+ category: string;
17
+ filename: string;
18
+ } | null;
19
+ /**
20
+ * Get all wiki prompt files in a project
21
+ */
22
+ export declare function getWikiPrompts(projectPath: string): {
23
+ path: string;
24
+ category: string;
25
+ filename: string;
26
+ }[];
27
+ /**
28
+ * Create trigger context from a wiki read event
29
+ */
30
+ export declare function createTriggerContext(filePath: string, projectPath: string, triggerType?: ReviewTriggerContext["triggerType"]): ReviewTriggerContext | null;
31
+ /**
32
+ * Check if current working directory has wiki prompts
33
+ */
34
+ export declare function hasWikiPrompts(projectPath: string): boolean;
35
+ /**
36
+ * Get wiki directory path
37
+ */
38
+ export declare function getWikiDir(projectPath: string): string;
39
+ //# sourceMappingURL=trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.d.ts","sourceRoot":"","sources":["../src/trigger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIvD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAS3E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GACjB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiB/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,WAAW,EAAE,MAAM,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAqCxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,oBAAoB,CAAC,aAAa,CAAe,GAC5D,oBAAoB,GAAG,IAAI,CAc7B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Wiki Prompt Trigger
3
+ *
4
+ * Detects when an agent reads a prompt from {project}/wiki/*
5
+ * This triggers the write-review loop.
6
+ */
7
+ import { existsSync } from "fs";
8
+ import { join, relative } from "path";
9
+ const DEFAULT_WIKI_DIR = "wiki";
10
+ /**
11
+ * Detect if a file path is a wiki prompt
12
+ */
13
+ export function isWikiPrompt(filePath, projectPath) {
14
+ const wikiDir = join(projectPath, DEFAULT_WIKI_DIR);
15
+ const normalizedPath = filePath.replace(/\\/g, "/");
16
+ const normalizedWiki = wikiDir.replace(/\\/g, "/");
17
+ return (normalizedPath.startsWith(normalizedWiki + "/") ||
18
+ normalizedPath.startsWith(normalizedWiki + "\\"));
19
+ }
20
+ /**
21
+ * Extract prompt metadata from wiki path
22
+ */
23
+ export function parseWikiPrompt(filePath, projectPath) {
24
+ const wikiDir = join(projectPath, DEFAULT_WIKI_DIR);
25
+ const rel = relative(wikiDir, filePath).replace(/\\/g, "/");
26
+ if (!rel || rel.startsWith(".."))
27
+ return null;
28
+ const parts = rel.split("/");
29
+ if (parts.length >= 2) {
30
+ return {
31
+ category: parts[0],
32
+ filename: parts.slice(1).join("/"),
33
+ };
34
+ }
35
+ return {
36
+ category: "root",
37
+ filename: parts[0],
38
+ };
39
+ }
40
+ /**
41
+ * Get all wiki prompt files in a project
42
+ */
43
+ export function getWikiPrompts(projectPath) {
44
+ const wikiDir = join(projectPath, DEFAULT_WIKI_DIR);
45
+ if (!existsSync(wikiDir)) {
46
+ return [];
47
+ }
48
+ const prompts = [];
49
+ function scanDir(dir) {
50
+ const { readdirSync, statSync } = require("fs");
51
+ try {
52
+ for (const entry of readdirSync(dir)) {
53
+ const fullPath = join(dir, entry);
54
+ const stat = statSync(fullPath);
55
+ if (stat.isDirectory()) {
56
+ scanDir(fullPath);
57
+ }
58
+ else if (stat.isFile() &&
59
+ (entry.endsWith(".md") || entry.endsWith(".txt"))) {
60
+ const relPath = relative(wikiDir, fullPath).replace(/\\/g, "/");
61
+ const parts = relPath.split("/");
62
+ prompts.push({
63
+ path: fullPath,
64
+ category: parts[0],
65
+ filename: parts.slice(1).join("/"),
66
+ });
67
+ }
68
+ }
69
+ }
70
+ catch {
71
+ // Ignore permission errors
72
+ }
73
+ }
74
+ scanDir(wikiDir);
75
+ return prompts;
76
+ }
77
+ /**
78
+ * Create trigger context from a wiki read event
79
+ */
80
+ export function createTriggerContext(filePath, projectPath, triggerType = "wiki_read") {
81
+ if (!isWikiPrompt(filePath, projectPath)) {
82
+ return null;
83
+ }
84
+ const parsed = parseWikiPrompt(filePath, projectPath);
85
+ if (!parsed)
86
+ return null;
87
+ return {
88
+ projectPath,
89
+ promptFile: filePath,
90
+ promptContent: "", // Will be filled by caller
91
+ triggerType,
92
+ };
93
+ }
94
+ /**
95
+ * Check if current working directory has wiki prompts
96
+ */
97
+ export function hasWikiPrompts(projectPath) {
98
+ const wikiDir = join(projectPath, DEFAULT_WIKI_DIR);
99
+ return existsSync(wikiDir);
100
+ }
101
+ /**
102
+ * Get wiki directory path
103
+ */
104
+ export function getWikiDir(projectPath) {
105
+ return join(projectPath, DEFAULT_WIKI_DIR);
106
+ }
107
+ //# sourceMappingURL=trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.js","sourceRoot":"","sources":["../src/trigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Write-Review Loop Types
3
+ *
4
+ * State machine for two-agent write-review coordination.
5
+ */
6
+ /**
7
+ * Review phases
8
+ */
9
+ export type ReviewPhase = "idle" | "writing" | "pending_review" | "reviewing" | "approved" | "blocked" | "changes_requested";
10
+ /**
11
+ * Review verdict
12
+ */
13
+ export type Verdict = "approved" | "changes_requested" | "blocked";
14
+ export interface PingPongDecisionSnapshot {
15
+ decision: "run_ping_pong" | "suggest_ping_pong" | "handle_inline";
16
+ score: number;
17
+ runThreshold: number;
18
+ suggestThreshold: number;
19
+ reasons: string[];
20
+ request: string;
21
+ taskId?: string;
22
+ createdAt: string;
23
+ }
24
+ /**
25
+ * Blackboard status record
26
+ */
27
+ export interface WriteReviewStatus {
28
+ projectPath: string;
29
+ phase: ReviewPhase;
30
+ writerDone: boolean;
31
+ writerMessage?: string;
32
+ iteration: number;
33
+ verdict?: Verdict;
34
+ verdictMessage?: string;
35
+ reviewerStarted?: string;
36
+ codeFiles?: string[];
37
+ changesRequested?: string[];
38
+ approvedAt?: string;
39
+ blockedAt?: string;
40
+ mode?: "manual" | "ping_pong";
41
+ pingPong?: PingPongDecisionSnapshot;
42
+ updatedAt: string;
43
+ createdAt: string;
44
+ }
45
+ /**
46
+ * Review trigger context
47
+ */
48
+ export interface ReviewTriggerContext {
49
+ projectPath: string;
50
+ promptFile: string;
51
+ promptContent: string;
52
+ triggerType: "wiki_read" | "manual" | "code_written";
53
+ }
54
+ /**
55
+ * Extension config
56
+ */
57
+ export interface WriteReviewConfig {
58
+ debug?: boolean;
59
+ blackboardDir?: string;
60
+ wikiDir?: string;
61
+ enabled?: boolean;
62
+ }
63
+ /**
64
+ * Agent roles
65
+ */
66
+ export declare const AGENT_ROLES: {
67
+ readonly WRITER: "writer";
68
+ readonly REVIEWER: "reviewer";
69
+ readonly HELPER: "helper";
70
+ };
71
+ export type AgentRole = (typeof AGENT_ROLES)[keyof typeof AGENT_ROLES];
72
+ /**
73
+ * State transition helpers
74
+ */
75
+ export declare function isTerminalPhase(phase: ReviewPhase): boolean;
76
+ export declare function needsReview(phase: ReviewPhase): boolean;
77
+ export declare function canWrite(phase: ReviewPhase): boolean;
78
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,WAAW,GACpB,MAAM,GACN,SAAS,GACT,gBAAgB,GAChB,WAAW,GACX,UAAU,GACV,SAAS,GACT,mBAAmB,CAAC;AAEvB;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,mBAAmB,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACxC,QAAQ,EAAE,eAAe,GAAG,mBAAmB,GAAG,eAAe,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC9B,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;aACvB,MAAM,EAAE,QAAQ;aAChB,QAAQ,EAAE,UAAU;aACpB,MAAM,EAAE,QAAQ;CACP,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAEvE;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAEvD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAIpD"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Write-Review Loop Types
3
+ *
4
+ * State machine for two-agent write-review coordination.
5
+ */
6
+ /**
7
+ * Agent roles
8
+ */
9
+ export const AGENT_ROLES = {
10
+ WRITER: "writer", // Minimax - reads wiki, writes code
11
+ REVIEWER: "reviewer", // Uses pi-subagents review-loop
12
+ HELPER: "helper", // worker - notes tasks to todo
13
+ };
14
+ /**
15
+ * State transition helpers
16
+ */
17
+ export function isTerminalPhase(phase) {
18
+ return phase === "approved" || phase === "blocked";
19
+ }
20
+ export function needsReview(phase) {
21
+ return phase === "pending_review" || phase === "reviewing";
22
+ }
23
+ export function canWrite(phase) {
24
+ return (phase === "idle" || phase === "writing" || phase === "changes_requested");
25
+ }
26
+ //# sourceMappingURL=types.js.map