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.
- package/CHANGELOG.md +33 -0
- package/harness/loop-runtime.ts +3 -0
- package/index.ts +130 -29
- package/package.json +2 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/dist/client.d.ts +51 -0
- package/packages/qdrant-skills/dist/client.d.ts.map +1 -0
- package/packages/qdrant-skills/dist/client.js +105 -0
- package/packages/qdrant-skills/dist/client.js.map +1 -0
- package/packages/qdrant-skills/dist/embedder.d.ts +39 -0
- package/packages/qdrant-skills/dist/embedder.d.ts.map +1 -0
- package/packages/qdrant-skills/dist/embedder.js +101 -0
- package/packages/qdrant-skills/dist/embedder.js.map +1 -0
- package/packages/qdrant-skills/dist/index.d.ts +25 -0
- package/packages/qdrant-skills/dist/index.d.ts.map +1 -0
- package/packages/qdrant-skills/dist/index.js +25 -0
- package/packages/qdrant-skills/dist/index.js.map +1 -0
- package/packages/qdrant-skills/package.json +27 -0
- package/packages/qdrant-skills/src/client.ts +178 -0
- package/packages/qdrant-skills/src/embedder.ts +137 -0
- package/packages/qdrant-skills/src/index.ts +42 -0
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/dist/index.d.ts +40 -0
- package/packages/skills/dist/index.d.ts.map +1 -0
- package/packages/skills/dist/index.js +84 -0
- package/packages/skills/dist/index.js.map +1 -0
- package/packages/skills/dist/linter.d.ts +38 -0
- package/packages/skills/dist/linter.d.ts.map +1 -0
- package/packages/skills/dist/linter.js +323 -0
- package/packages/skills/dist/linter.js.map +1 -0
- package/packages/skills/dist/loader.d.ts +74 -0
- package/packages/skills/dist/loader.d.ts.map +1 -0
- package/packages/skills/dist/loader.js +280 -0
- package/packages/skills/dist/loader.js.map +1 -0
- package/packages/skills/dist/parser.d.ts +32 -0
- package/packages/skills/dist/parser.d.ts.map +1 -0
- package/packages/skills/dist/parser.js +459 -0
- package/packages/skills/dist/parser.js.map +1 -0
- package/packages/skills/dist/scanner.d.ts +33 -0
- package/packages/skills/dist/scanner.d.ts.map +1 -0
- package/packages/skills/dist/scanner.js +257 -0
- package/packages/skills/dist/scanner.js.map +1 -0
- package/packages/skills/dist/skill-commands.d.ts +33 -0
- package/packages/skills/dist/skill-commands.d.ts.map +1 -0
- package/packages/skills/dist/skill-commands.js +239 -0
- package/packages/skills/dist/skill-commands.js.map +1 -0
- package/packages/skills/dist/skill-tool.d.ts +120 -0
- package/packages/skills/dist/skill-tool.d.ts.map +1 -0
- package/packages/skills/dist/skill-tool.js +239 -0
- package/packages/skills/dist/skill-tool.js.map +1 -0
- package/packages/skills/dist/skill-versioning.d.ts +123 -0
- package/packages/skills/dist/skill-versioning.d.ts.map +1 -0
- package/packages/skills/dist/skill-versioning.js +240 -0
- package/packages/skills/dist/skill-versioning.js.map +1 -0
- package/packages/skills/dist/types.d.ts +226 -0
- package/packages/skills/dist/types.d.ts.map +1 -0
- package/packages/skills/dist/types.js +21 -0
- package/packages/skills/dist/types.js.map +1 -0
- package/packages/skills/package.json +46 -0
- package/packages/skills/src/index.ts +95 -0
- package/packages/skills/src/linter.ts +371 -0
- package/packages/skills/src/loader.ts +335 -0
- package/packages/skills/src/parser.ts +548 -0
- package/packages/skills/src/scanner.ts +322 -0
- package/packages/skills/src/skill-commands.ts +318 -0
- package/packages/skills/src/skill-tool.ts +324 -0
- package/packages/skills/src/skill-versioning.ts +345 -0
- package/packages/skills/src/types.ts +259 -0
- package/packages/skills/test/init-skills.test.ts +118 -0
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/dist/src/curator.d.ts +189 -0
- package/packages/trajectory/dist/src/curator.d.ts.map +1 -0
- package/packages/trajectory/dist/src/curator.js +340 -0
- package/packages/trajectory/dist/src/curator.js.map +1 -0
- package/packages/trajectory/dist/src/journey-renderer.d.ts +53 -0
- package/packages/trajectory/dist/src/journey-renderer.d.ts.map +1 -0
- package/packages/trajectory/dist/src/journey-renderer.js +324 -0
- package/packages/trajectory/dist/src/journey-renderer.js.map +1 -0
- package/packages/trajectory/dist/src/learning-graph.d.ts +159 -0
- package/packages/trajectory/dist/src/learning-graph.d.ts.map +1 -0
- package/packages/trajectory/dist/src/learning-graph.js +258 -0
- package/packages/trajectory/dist/src/learning-graph.js.map +1 -0
- package/packages/trajectory/dist/src/memory-store.d.ts +146 -0
- package/packages/trajectory/dist/src/memory-store.d.ts.map +1 -0
- package/packages/trajectory/dist/src/memory-store.js +472 -0
- package/packages/trajectory/dist/src/memory-store.js.map +1 -0
- package/packages/trajectory/dist/src/review-fork.d.ts +164 -0
- package/packages/trajectory/dist/src/review-fork.d.ts.map +1 -0
- package/packages/trajectory/dist/src/review-fork.js +332 -0
- package/packages/trajectory/dist/src/review-fork.js.map +1 -0
- package/packages/trajectory/dist/src/write-approval.d.ts +136 -0
- package/packages/trajectory/dist/src/write-approval.d.ts.map +1 -0
- package/packages/trajectory/dist/src/write-approval.js +281 -0
- package/packages/trajectory/dist/src/write-approval.js.map +1 -0
- package/packages/trajectory/package.json +1 -1
- package/packages/trajectory/src/curator.ts +485 -0
- package/packages/trajectory/src/journey-renderer.ts +399 -0
- package/packages/trajectory/src/learning-graph.ts +363 -0
- package/packages/trajectory/src/memory-store.ts +578 -0
- package/packages/trajectory/src/review-fork.ts +450 -0
- package/packages/trajectory/src/write-approval.ts +372 -0
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/dist/blackboard.d.ts +98 -0
- package/packages/write-review/dist/blackboard.d.ts.map +1 -0
- package/packages/write-review/dist/blackboard.js +289 -0
- package/packages/write-review/dist/blackboard.js.map +1 -0
- package/packages/write-review/dist/event-bus.d.ts +106 -0
- package/packages/write-review/dist/event-bus.d.ts.map +1 -0
- package/packages/write-review/dist/event-bus.js +294 -0
- package/packages/write-review/dist/event-bus.js.map +1 -0
- package/packages/write-review/dist/gate.d.ts +37 -0
- package/packages/write-review/dist/gate.d.ts.map +1 -0
- package/packages/write-review/dist/gate.js +138 -0
- package/packages/write-review/dist/gate.js.map +1 -0
- package/packages/write-review/dist/index.d.ts +22 -0
- package/packages/write-review/dist/index.d.ts.map +1 -0
- package/packages/write-review/dist/index.js +60 -0
- package/packages/write-review/dist/index.js.map +1 -0
- package/packages/write-review/dist/injection.d.ts +40 -0
- package/packages/write-review/dist/injection.d.ts.map +1 -0
- package/packages/write-review/dist/injection.js +179 -0
- package/packages/write-review/dist/injection.js.map +1 -0
- package/packages/write-review/dist/review.d.ts +54 -0
- package/packages/write-review/dist/review.d.ts.map +1 -0
- package/packages/write-review/dist/review.js +154 -0
- package/packages/write-review/dist/review.js.map +1 -0
- package/packages/write-review/dist/trigger.d.ts +39 -0
- package/packages/write-review/dist/trigger.d.ts.map +1 -0
- package/packages/write-review/dist/trigger.js +107 -0
- package/packages/write-review/dist/trigger.js.map +1 -0
- package/packages/write-review/dist/types.d.ts +78 -0
- package/packages/write-review/dist/types.d.ts.map +1 -0
- package/packages/write-review/dist/types.js +26 -0
- package/packages/write-review/dist/types.js.map +1 -0
- package/packages/write-review/package.json +1 -1
- package/packages/write-review/src/event-bus.ts +351 -0
- package/packages/write-review/src/index.ts +1 -0
- package/packages/write-review/src/injection.ts +25 -3
- package/proactive-compact.ts +51 -7
- package/scripts/sync-skills.ts +275 -0
- 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
|