contextos-mcp 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/bin/mcp.mjs +61 -0
- package/bin/swarm.mjs +45 -0
- package/dist/agents/aider.d.ts +12 -0
- package/dist/agents/aider.js +192 -0
- package/dist/agents/aider.js.map +1 -0
- package/dist/agents/claude-code.d.ts +9 -0
- package/dist/agents/claude-code.js +236 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/codex.d.ts +14 -0
- package/dist/agents/codex.js +203 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/direct-llm.d.ts +22 -0
- package/dist/agents/direct-llm.js +254 -0
- package/dist/agents/direct-llm.js.map +1 -0
- package/dist/agents/mock.d.ts +10 -0
- package/dist/agents/mock.js +170 -0
- package/dist/agents/mock.js.map +1 -0
- package/dist/agents/opencode.d.ts +23 -0
- package/dist/agents/opencode.js +631 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/provider.d.ts +11 -0
- package/dist/agents/provider.js +31 -0
- package/dist/agents/provider.js.map +1 -0
- package/dist/compression/compressor.d.ts +28 -0
- package/dist/compression/compressor.js +268 -0
- package/dist/compression/compressor.js.map +1 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.js +172 -0
- package/dist/config.js.map +1 -0
- package/dist/contextos/loader.d.ts +46 -0
- package/dist/contextos/loader.js +120 -0
- package/dist/contextos/loader.js.map +1 -0
- package/dist/contextos/selector.d.ts +46 -0
- package/dist/contextos/selector.js +80 -0
- package/dist/contextos/selector.js.map +1 -0
- package/dist/core/action-dispatcher.d.ts +15 -0
- package/dist/core/action-dispatcher.js +28 -0
- package/dist/core/action-dispatcher.js.map +1 -0
- package/dist/core/action-schema.d.ts +72 -0
- package/dist/core/action-schema.js +86 -0
- package/dist/core/action-schema.js.map +1 -0
- package/dist/core/repl-interface.d.ts +48 -0
- package/dist/core/repl-interface.js +5 -0
- package/dist/core/repl-interface.js.map +1 -0
- package/dist/core/repl.d.ts +59 -0
- package/dist/core/repl.js +353 -0
- package/dist/core/repl.js.map +1 -0
- package/dist/core/rlm.d.ts +65 -0
- package/dist/core/rlm.js +564 -0
- package/dist/core/rlm.js.map +1 -0
- package/dist/core/runtime.py +470 -0
- package/dist/core/types.d.ts +265 -0
- package/dist/core/types.js +19 -0
- package/dist/core/types.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/env.js +75 -0
- package/dist/env.js.map +1 -0
- package/dist/hooks/runner.d.ts +43 -0
- package/dist/hooks/runner.js +173 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/labs/cli.d.ts +15 -0
- package/dist/labs/cli.js +295 -0
- package/dist/labs/cli.js.map +1 -0
- package/dist/labs/episodic-memory.d.ts +132 -0
- package/dist/labs/episodic-memory.js +391 -0
- package/dist/labs/episodic-memory.js.map +1 -0
- package/dist/labs/interactive-swarm.d.ts +20 -0
- package/dist/labs/interactive-swarm.js +1173 -0
- package/dist/labs/interactive-swarm.js.map +1 -0
- package/dist/labs/interactive.d.ts +10 -0
- package/dist/labs/interactive.js +2099 -0
- package/dist/labs/interactive.js.map +1 -0
- package/dist/labs/ts-analyzer.d.ts +74 -0
- package/dist/labs/ts-analyzer.js +379 -0
- package/dist/labs/ts-analyzer.js.map +1 -0
- package/dist/labs/viewer.d.ts +12 -0
- package/dist/labs/viewer.js +1284 -0
- package/dist/labs/viewer.js.map +1 -0
- package/dist/main.d.ts +15 -0
- package/dist/main.js +247 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.js +192775 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +117 -0
- package/dist/mcp/session.js +450 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/state.d.ts +42 -0
- package/dist/mcp/state.js +537 -0
- package/dist/mcp/state.js.map +1 -0
- package/dist/mcp/tools/contextos.d.ts +17 -0
- package/dist/mcp/tools/contextos.js +583 -0
- package/dist/mcp/tools/contextos.js.map +1 -0
- package/dist/mcp/tools.d.ts +15 -0
- package/dist/mcp/tools.js +393 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/orchestration/reviewer-gate.d.ts +43 -0
- package/dist/orchestration/reviewer-gate.js +280 -0
- package/dist/orchestration/reviewer-gate.js.map +1 -0
- package/dist/orchestration/reviewer-prompt.d.ts +18 -0
- package/dist/orchestration/reviewer-prompt.js +67 -0
- package/dist/orchestration/reviewer-prompt.js.map +1 -0
- package/dist/orchestration/verification-runner.d.ts +53 -0
- package/dist/orchestration/verification-runner.js +352 -0
- package/dist/orchestration/verification-runner.js.map +1 -0
- package/dist/plugins/adapter.d.ts +11 -0
- package/dist/plugins/adapter.js +11 -0
- package/dist/plugins/adapter.js.map +1 -0
- package/dist/plugins/core/archive.d.ts +9 -0
- package/dist/plugins/core/archive.js +128 -0
- package/dist/plugins/core/archive.js.map +1 -0
- package/dist/plugins/core/digest.d.ts +11 -0
- package/dist/plugins/core/digest.js +70 -0
- package/dist/plugins/core/digest.js.map +1 -0
- package/dist/plugins/core/grants.d.ts +22 -0
- package/dist/plugins/core/grants.js +90 -0
- package/dist/plugins/core/grants.js.map +1 -0
- package/dist/plugins/core/index.d.ts +10 -0
- package/dist/plugins/core/index.js +11 -0
- package/dist/plugins/core/index.js.map +1 -0
- package/dist/plugins/core/pinning.d.ts +15 -0
- package/dist/plugins/core/pinning.js +86 -0
- package/dist/plugins/core/pinning.js.map +1 -0
- package/dist/plugins/core/types.d.ts +105 -0
- package/dist/plugins/core/types.js +22 -0
- package/dist/plugins/core/types.js.map +1 -0
- package/dist/plugins/core/updater.d.ts +16 -0
- package/dist/plugins/core/updater.js +64 -0
- package/dist/plugins/core/updater.js.map +1 -0
- package/dist/plugins/loader.d.ts +65 -0
- package/dist/plugins/loader.js +110 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/prompts/orchestrator.d.ts +6 -0
- package/dist/prompts/orchestrator.js +114 -0
- package/dist/prompts/orchestrator.js.map +1 -0
- package/dist/routing/model-resolver.d.ts +27 -0
- package/dist/routing/model-resolver.js +265 -0
- package/dist/routing/model-resolver.js.map +1 -0
- package/dist/routing/model-router.d.ts +130 -0
- package/dist/routing/model-router.js +515 -0
- package/dist/routing/model-router.js.map +1 -0
- package/dist/runtime/attestations.cjs +260 -0
- package/dist/runtime/reviewer-pipeline.cjs +319 -0
- package/dist/runtime/sandbox.cjs +468 -0
- package/dist/runtime/state-machine.cjs +885 -0
- package/dist/runtime/thread-store.cjs +175 -0
- package/dist/runtime/transactional-git.cjs +315 -0
- package/dist/runtime/verification-pipeline.cjs +435 -0
- package/dist/sandbox/execution.d.ts +165 -0
- package/dist/sandbox/execution.js +497 -0
- package/dist/sandbox/execution.js.map +1 -0
- package/dist/security/file-policy.d.ts +22 -0
- package/dist/security/file-policy.js +53 -0
- package/dist/security/file-policy.js.map +1 -0
- package/dist/security/repository-boundary.d.ts +21 -0
- package/dist/security/repository-boundary.js +119 -0
- package/dist/security/repository-boundary.js.map +1 -0
- package/dist/security/secret-filter.d.ts +36 -0
- package/dist/security/secret-filter.js +149 -0
- package/dist/security/secret-filter.js.map +1 -0
- package/dist/swarm.d.ts +14 -0
- package/dist/swarm.js +624 -0
- package/dist/swarm.js.map +1 -0
- package/dist/threads/cache.d.ts +64 -0
- package/dist/threads/cache.js +241 -0
- package/dist/threads/cache.js.map +1 -0
- package/dist/threads/manager.d.ts +94 -0
- package/dist/threads/manager.js +914 -0
- package/dist/threads/manager.js.map +1 -0
- package/dist/ui/banner.d.ts +14 -0
- package/dist/ui/banner.js +42 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/dashboard.d.ts +33 -0
- package/dist/ui/dashboard.js +135 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/ui/index.d.ts +11 -0
- package/dist/ui/index.js +12 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/log.d.ts +39 -0
- package/dist/ui/log.js +126 -0
- package/dist/ui/log.js.map +1 -0
- package/dist/ui/onboarding.d.ts +14 -0
- package/dist/ui/onboarding.js +755 -0
- package/dist/ui/onboarding.js.map +1 -0
- package/dist/ui/run-log.d.ts +50 -0
- package/dist/ui/run-log.js +60 -0
- package/dist/ui/run-log.js.map +1 -0
- package/dist/ui/spinner.d.ts +41 -0
- package/dist/ui/spinner.js +172 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/streaming-feed.d.ts +72 -0
- package/dist/ui/streaming-feed.js +386 -0
- package/dist/ui/streaming-feed.js.map +1 -0
- package/dist/ui/summary.d.ts +18 -0
- package/dist/ui/summary.js +113 -0
- package/dist/ui/summary.js.map +1 -0
- package/dist/ui/text-input.d.ts +19 -0
- package/dist/ui/text-input.js +266 -0
- package/dist/ui/text-input.js.map +1 -0
- package/dist/ui/theme.d.ts +63 -0
- package/dist/ui/theme.js +97 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/command-exists.d.ts +11 -0
- package/dist/utils/command-exists.js +41 -0
- package/dist/utils/command-exists.js.map +1 -0
- package/dist/utils/process-security.d.ts +19 -0
- package/dist/utils/process-security.js +90 -0
- package/dist/utils/process-security.js.map +1 -0
- package/dist/utils/rolling-buffer.d.ts +16 -0
- package/dist/utils/rolling-buffer.js +30 -0
- package/dist/utils/rolling-buffer.js.map +1 -0
- package/dist/utils/safe-spawn.d.ts +13 -0
- package/dist/utils/safe-spawn.js +49 -0
- package/dist/utils/safe-spawn.js.map +1 -0
- package/dist/worktree/manager.d.ts +69 -0
- package/dist/worktree/manager.js +593 -0
- package/dist/worktree/manager.js.map +1 -0
- package/dist/worktree/merge.d.ts +58 -0
- package/dist/worktree/merge.js +389 -0
- package/dist/worktree/merge.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Independent Reviewer Gate (Dual Verdict) & Final Combined Review.
|
|
3
|
+
*
|
|
4
|
+
* Implements Superpowers-inspired single-reviewer dual-verdict gate:
|
|
5
|
+
* - specCompliance: "PASS" | "FAIL"
|
|
6
|
+
* - codeQuality: "PASS" | "FAIL"
|
|
7
|
+
*
|
|
8
|
+
* Enforces Reviewer != Implementer policy and prevents self-approval.
|
|
9
|
+
*/
|
|
10
|
+
import { execFile } from "node:child_process";
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { promisify } from "node:util";
|
|
13
|
+
import { getAgent, listAgents } from "../agents/provider.js";
|
|
14
|
+
import { assertWithinRepository } from "../security/repository-boundary.js";
|
|
15
|
+
import { isWithinWriteScope } from "../worktree/manager.js";
|
|
16
|
+
import { buildCombinedStagingReviewPrompt, buildReviewerUserPrompt, getReviewerSystemPrompt, } from "./reviewer-prompt.js";
|
|
17
|
+
const execFileAsync = promisify(execFile);
|
|
18
|
+
const LAZY_STUB_PATTERNS = [
|
|
19
|
+
/\/\/\s*TODO:?\s*(implement|fill in|rest of code)/i,
|
|
20
|
+
/\/\/\s*\.\.\.\s*rest of code/i,
|
|
21
|
+
/\/\*\s*\.\.\.\s*rest of code\s*\*\//i,
|
|
22
|
+
/\/\/\s*implement\s+later/i,
|
|
23
|
+
/__PLACEHOLDER__/i,
|
|
24
|
+
];
|
|
25
|
+
function containsLazyStubs(diff) {
|
|
26
|
+
for (const pattern of LAZY_STUB_PATTERNS) {
|
|
27
|
+
if (pattern.test(diff))
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
function parseVerdictJson(text) {
|
|
33
|
+
try {
|
|
34
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
35
|
+
if (!jsonMatch)
|
|
36
|
+
return null;
|
|
37
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
38
|
+
const spec = parsed.specCompliance?.toUpperCase();
|
|
39
|
+
const quality = parsed.codeQuality?.toUpperCase();
|
|
40
|
+
if ((spec === "PASS" || spec === "FAIL") && (quality === "PASS" || quality === "FAIL")) {
|
|
41
|
+
return {
|
|
42
|
+
specCompliance: spec,
|
|
43
|
+
codeQuality: quality,
|
|
44
|
+
summary: typeof parsed.summary === "string" ? parsed.summary : "",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Ignore JSON parse errors
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Determine a distinct reviewer backend to enforce Reviewer != Implementer.
|
|
55
|
+
*/
|
|
56
|
+
export function resolveReviewerAgent(implementerAgent, requestedReviewer) {
|
|
57
|
+
if (requestedReviewer && requestedReviewer !== implementerAgent) {
|
|
58
|
+
return requestedReviewer;
|
|
59
|
+
}
|
|
60
|
+
const available = listAgents();
|
|
61
|
+
const candidates = available.filter((a) => a !== implementerAgent && a !== "mock");
|
|
62
|
+
if (candidates.length > 0) {
|
|
63
|
+
return candidates[0];
|
|
64
|
+
}
|
|
65
|
+
return "reviewer-independent";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Evaluates an implementer's changes against the assigned TaskBrief.
|
|
69
|
+
*/
|
|
70
|
+
export async function evaluateReviewerGate(options) {
|
|
71
|
+
const { taskBrief, diff, filesChanged, verificationVerdict, testOutput, implementerAgent, implementerModel, reviewerAgent: requestedReviewer, reviewerModel, workDir, } = options;
|
|
72
|
+
const effectiveReviewer = resolveReviewerAgent(implementerAgent, requestedReviewer);
|
|
73
|
+
const reviewerId = `reviewer-${effectiveReviewer}-${randomUUID().slice(0, 8)}`;
|
|
74
|
+
// 1. Static Scope Check
|
|
75
|
+
if (taskBrief.writeScope && taskBrief.writeScope.length > 0) {
|
|
76
|
+
for (const file of filesChanged) {
|
|
77
|
+
if (!isWithinWriteScope(file, taskBrief.writeScope)) {
|
|
78
|
+
return {
|
|
79
|
+
reviewerId,
|
|
80
|
+
specCompliance: "FAIL",
|
|
81
|
+
codeQuality: "FAIL",
|
|
82
|
+
summary: `Review failed: touched file "${file}" violates declared writeScope [${taskBrief.writeScope.join(", ")}]`,
|
|
83
|
+
reviewedAt: Date.now(),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// 2. Automated Test Verification Check
|
|
89
|
+
if (verificationVerdict === "FAIL") {
|
|
90
|
+
return {
|
|
91
|
+
reviewerId,
|
|
92
|
+
specCompliance: "FAIL",
|
|
93
|
+
codeQuality: "FAIL",
|
|
94
|
+
summary: `Review failed: automated verification test command failed.\n${testOutput || ""}`.trim(),
|
|
95
|
+
reviewedAt: Date.now(),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// 3. Static Anti-Slop / Zero-Placeholder Inspection
|
|
99
|
+
if (containsLazyStubs(diff)) {
|
|
100
|
+
return {
|
|
101
|
+
reviewerId,
|
|
102
|
+
specCompliance: "FAIL",
|
|
103
|
+
codeQuality: "FAIL",
|
|
104
|
+
summary: "Review failed: diff contains lazy stub placeholders (e.g. // TODO, ... rest of code stays here)",
|
|
105
|
+
reviewedAt: Date.now(),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// 4. Run Reviewer Provider (Fail-closed)
|
|
109
|
+
let agentProvider = null;
|
|
110
|
+
try {
|
|
111
|
+
agentProvider = getAgent(effectiveReviewer);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return {
|
|
115
|
+
reviewerId,
|
|
116
|
+
specCompliance: "UNAVAILABLE",
|
|
117
|
+
codeQuality: "UNAVAILABLE",
|
|
118
|
+
summary: `Review failed: requested reviewer agent "${effectiveReviewer}" is not registered or available.`,
|
|
119
|
+
reviewedAt: Date.now(),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const effectiveWorkDir = workDir || options.repoRoot || process.cwd();
|
|
123
|
+
try {
|
|
124
|
+
const systemPrompt = getReviewerSystemPrompt();
|
|
125
|
+
const userPrompt = buildReviewerUserPrompt({
|
|
126
|
+
taskBrief,
|
|
127
|
+
diff,
|
|
128
|
+
filesChanged,
|
|
129
|
+
verificationVerdict,
|
|
130
|
+
testOutput,
|
|
131
|
+
});
|
|
132
|
+
const reviewTask = `${systemPrompt}\n\n${userPrompt}`;
|
|
133
|
+
const result = await agentProvider.run({
|
|
134
|
+
task: reviewTask,
|
|
135
|
+
workDir: effectiveWorkDir,
|
|
136
|
+
model: reviewerModel || implementerModel || "default",
|
|
137
|
+
signal: AbortSignal.timeout(30000),
|
|
138
|
+
});
|
|
139
|
+
if (!result.success) {
|
|
140
|
+
return {
|
|
141
|
+
reviewerId,
|
|
142
|
+
specCompliance: "ERROR",
|
|
143
|
+
codeQuality: "ERROR",
|
|
144
|
+
summary: `Review failed: agent execution failed: ${result.error || "unknown error"}`,
|
|
145
|
+
reviewedAt: Date.now(),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const parsed = parseVerdictJson(result.output || "");
|
|
149
|
+
if (parsed?.specCompliance && parsed?.codeQuality) {
|
|
150
|
+
// Forged PASS prevention (W5.5): static invariants override forged positive verdicts
|
|
151
|
+
if ((parsed.specCompliance === "PASS" || parsed.codeQuality === "PASS") && containsLazyStubs(diff)) {
|
|
152
|
+
return {
|
|
153
|
+
reviewerId,
|
|
154
|
+
specCompliance: "FAIL",
|
|
155
|
+
codeQuality: "FAIL",
|
|
156
|
+
summary: "Review failed: forged PASS rejected — diff contains forbidden lazy stubs.",
|
|
157
|
+
reviewedAt: Date.now(),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
reviewerId,
|
|
162
|
+
specCompliance: parsed.specCompliance,
|
|
163
|
+
codeQuality: parsed.codeQuality,
|
|
164
|
+
summary: parsed.summary || "Independent review completed successfully.",
|
|
165
|
+
reviewedAt: Date.now(),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
reviewerId,
|
|
170
|
+
specCompliance: "MALFORMED",
|
|
171
|
+
codeQuality: "MALFORMED",
|
|
172
|
+
summary: "Review failed: reviewer returned malformed or unparseable JSON verdict.",
|
|
173
|
+
reviewedAt: Date.now(),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
const isTimeout = err?.name === "TimeoutError" || String(err).includes("timeout");
|
|
178
|
+
return {
|
|
179
|
+
reviewerId,
|
|
180
|
+
specCompliance: isTimeout ? "TIMEOUT" : "ERROR",
|
|
181
|
+
codeQuality: isTimeout ? "TIMEOUT" : "ERROR",
|
|
182
|
+
summary: `Review failed with ${isTimeout ? "timeout" : "error"}: ${err?.message || String(err)}`,
|
|
183
|
+
reviewedAt: Date.now(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Task 2.5f: Final holistic review of combined staging changes before merge to main.
|
|
189
|
+
*/
|
|
190
|
+
export async function reviewCombinedStaging(options) {
|
|
191
|
+
const { repoRoot, baseSha, stagingBranch, taskSummaries = [], reviewerAgent, reviewerModel } = options;
|
|
192
|
+
const canonicalRoot = assertWithinRepository(repoRoot, repoRoot);
|
|
193
|
+
const reviewerId = `combined-reviewer-${reviewerAgent || "audit"}-${randomUUID().slice(0, 8)}`;
|
|
194
|
+
const effectiveReviewer = resolveReviewerAgent(undefined, reviewerAgent);
|
|
195
|
+
let agentProvider = null;
|
|
196
|
+
try {
|
|
197
|
+
agentProvider = getAgent(effectiveReviewer);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return {
|
|
201
|
+
reviewerId,
|
|
202
|
+
specCompliance: "UNAVAILABLE",
|
|
203
|
+
codeQuality: "UNAVAILABLE",
|
|
204
|
+
summary: `Combined staging review failed: reviewer agent "${effectiveReviewer}" is not available.`,
|
|
205
|
+
reviewedAt: Date.now(),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
let combinedDiff = "";
|
|
209
|
+
try {
|
|
210
|
+
const { stdout } = await execFileAsync("git", ["diff", `${baseSha}...${stagingBranch}`], {
|
|
211
|
+
cwd: canonicalRoot,
|
|
212
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
213
|
+
});
|
|
214
|
+
combinedDiff = stdout;
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
return {
|
|
218
|
+
reviewerId,
|
|
219
|
+
specCompliance: "ERROR",
|
|
220
|
+
codeQuality: "ERROR",
|
|
221
|
+
summary: `Failed to inspect staging diff: ${err instanceof Error ? err.message : String(err)}`,
|
|
222
|
+
reviewedAt: Date.now(),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
if (containsLazyStubs(combinedDiff)) {
|
|
226
|
+
return {
|
|
227
|
+
reviewerId,
|
|
228
|
+
specCompliance: "FAIL",
|
|
229
|
+
codeQuality: "FAIL",
|
|
230
|
+
summary: "Combined staging diff contains lazy placeholder stubs or uncommitted remnants.",
|
|
231
|
+
reviewedAt: Date.now(),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const prompt = buildCombinedStagingReviewPrompt(baseSha, stagingBranch, combinedDiff, taskSummaries);
|
|
236
|
+
const result = await agentProvider.run({
|
|
237
|
+
task: prompt,
|
|
238
|
+
workDir: canonicalRoot,
|
|
239
|
+
model: reviewerModel || "default",
|
|
240
|
+
signal: AbortSignal.timeout(30000),
|
|
241
|
+
});
|
|
242
|
+
if (!result.success) {
|
|
243
|
+
return {
|
|
244
|
+
reviewerId,
|
|
245
|
+
specCompliance: "ERROR",
|
|
246
|
+
codeQuality: "ERROR",
|
|
247
|
+
summary: `Combined staging review failed: agent execution error: ${result.error || "unknown error"}`,
|
|
248
|
+
reviewedAt: Date.now(),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
const parsed = parseVerdictJson(result.output || "");
|
|
252
|
+
if (parsed?.specCompliance && parsed?.codeQuality) {
|
|
253
|
+
return {
|
|
254
|
+
reviewerId,
|
|
255
|
+
specCompliance: parsed.specCompliance,
|
|
256
|
+
codeQuality: parsed.codeQuality,
|
|
257
|
+
summary: parsed.summary || "Combined staging review passed.",
|
|
258
|
+
reviewedAt: Date.now(),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
reviewerId,
|
|
263
|
+
specCompliance: "MALFORMED",
|
|
264
|
+
codeQuality: "MALFORMED",
|
|
265
|
+
summary: "Combined staging review failed: reviewer returned invalid JSON verdict.",
|
|
266
|
+
reviewedAt: Date.now(),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
const isTimeout = err?.name === "TimeoutError" || String(err).includes("timeout");
|
|
271
|
+
return {
|
|
272
|
+
reviewerId,
|
|
273
|
+
specCompliance: isTimeout ? "TIMEOUT" : "ERROR",
|
|
274
|
+
codeQuality: isTimeout ? "TIMEOUT" : "ERROR",
|
|
275
|
+
summary: `Combined staging review failed with ${isTimeout ? "timeout" : "error"}: ${err?.message || String(err)}`,
|
|
276
|
+
reviewedAt: Date.now(),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=reviewer-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer-gate.js","sourceRoot":"","sources":["../../src/orchestration/reviewer-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reviewer prompt generator for the independent subagent reviewer gate.
|
|
3
|
+
*
|
|
4
|
+
* Provides specialized evaluation prompts enforcing:
|
|
5
|
+
* 1. specCompliance: did the agent fulfill the objective and stay within writeScope?
|
|
6
|
+
* 2. codeQuality: are there syntax errors, placeholder comments, unhandled rejections, or leaks?
|
|
7
|
+
*/
|
|
8
|
+
import type { TaskBrief, VerificationVerdict } from "../core/types.js";
|
|
9
|
+
export interface ReviewPromptContext {
|
|
10
|
+
taskBrief: TaskBrief;
|
|
11
|
+
diff: string;
|
|
12
|
+
filesChanged: string[];
|
|
13
|
+
verificationVerdict: VerificationVerdict;
|
|
14
|
+
testOutput?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function getReviewerSystemPrompt(): string;
|
|
17
|
+
export declare function buildReviewerUserPrompt(ctx: ReviewPromptContext): string;
|
|
18
|
+
export declare function buildCombinedStagingReviewPrompt(baseSha: string, stagingBranch: string, combinedDiff: string, taskSummaries: string[]): string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reviewer prompt generator for the independent subagent reviewer gate.
|
|
3
|
+
*
|
|
4
|
+
* Provides specialized evaluation prompts enforcing:
|
|
5
|
+
* 1. specCompliance: did the agent fulfill the objective and stay within writeScope?
|
|
6
|
+
* 2. codeQuality: are there syntax errors, placeholder comments, unhandled rejections, or leaks?
|
|
7
|
+
*/
|
|
8
|
+
export function getReviewerSystemPrompt() {
|
|
9
|
+
return `You are the ContextOS Independent Code Reviewer.
|
|
10
|
+
Your role is to strictly audit changes produced by an implementer agent against their assigned TaskBrief.
|
|
11
|
+
|
|
12
|
+
You MUST evaluate two discrete dimensions:
|
|
13
|
+
1. "specCompliance":
|
|
14
|
+
- PASS: All changes strictly align with the objective. Only files declared in writeScope were touched. No undeclared files were modified or deleted. Acceptance criteria are met.
|
|
15
|
+
- FAIL: Objective is not met, files outside writeScope were altered, or scope was violated.
|
|
16
|
+
|
|
17
|
+
2. "codeQuality":
|
|
18
|
+
- PASS: The code is clean, robust, and production-ready. Zero placeholder stubs (e.g. "// TODO", "implement later", "..."), proper error handling, no syntax errors, no hardcoded secrets, and no regressions.
|
|
19
|
+
- FAIL: Contains lazy stubs, placeholders, obvious runtime/type bugs, security vulnerabilities, or broken logic.
|
|
20
|
+
|
|
21
|
+
You MUST reply ONLY with a valid JSON object matching this schema:
|
|
22
|
+
{
|
|
23
|
+
"specCompliance": "PASS" | "FAIL",
|
|
24
|
+
"codeQuality": "PASS" | "FAIL",
|
|
25
|
+
"summary": "Concise 1-3 sentence evaluation explaining verdicts and required fixes if any"
|
|
26
|
+
}`;
|
|
27
|
+
}
|
|
28
|
+
export function buildReviewerUserPrompt(ctx) {
|
|
29
|
+
const { taskBrief, diff, filesChanged, verificationVerdict, testOutput } = ctx;
|
|
30
|
+
const scopeList = taskBrief.writeScope.length > 0 ? taskBrief.writeScope.join(", ") : "(any)";
|
|
31
|
+
const filesList = filesChanged.length > 0 ? filesChanged.join(", ") : "(no files changed)";
|
|
32
|
+
return `Task Brief:
|
|
33
|
+
- Task ID: ${taskBrief.taskId || taskBrief.id}
|
|
34
|
+
- Base SHA: ${taskBrief.baseSha || "HEAD"}
|
|
35
|
+
- Objective: ${taskBrief.objective || taskBrief.task || "(none)"}
|
|
36
|
+
- Declared writeScope: ${scopeList}
|
|
37
|
+
- Test Command: ${taskBrief.testCommand || "(none)"}
|
|
38
|
+
- Expected Result: ${taskBrief.expectedResult || "(none)"}
|
|
39
|
+
|
|
40
|
+
Implementer Changes:
|
|
41
|
+
- Files Changed: ${filesList}
|
|
42
|
+
- Automated Verification: ${verificationVerdict}
|
|
43
|
+
${testOutput ? `- Verification Output:\n\`\`\`\n${testOutput.slice(0, 3000)}\n\`\`\`` : ""}
|
|
44
|
+
|
|
45
|
+
Git Diff:
|
|
46
|
+
\`\`\`diff
|
|
47
|
+
${diff.slice(0, 15000)}
|
|
48
|
+
\`\`\`
|
|
49
|
+
|
|
50
|
+
Evaluate the diff against the TaskBrief and output your JSON verdict.`;
|
|
51
|
+
}
|
|
52
|
+
export function buildCombinedStagingReviewPrompt(baseSha, stagingBranch, combinedDiff, taskSummaries) {
|
|
53
|
+
return `Staging Branch Audit:
|
|
54
|
+
- Base SHA: ${baseSha}
|
|
55
|
+
- Staging Branch: ${stagingBranch}
|
|
56
|
+
- Tasks Merged:
|
|
57
|
+
${taskSummaries.map((s, idx) => ` ${idx + 1}. ${s}`).join("\n")}
|
|
58
|
+
|
|
59
|
+
Combined Diff:
|
|
60
|
+
\`\`\`diff
|
|
61
|
+
${combinedDiff.slice(0, 20000)}
|
|
62
|
+
\`\`\`
|
|
63
|
+
|
|
64
|
+
Perform a holistic integration review across all merged tasks. Check for cross-thread incompatibilities, global regressions, or conflicting changes.
|
|
65
|
+
Return your JSON verdict with "specCompliance", "codeQuality", and "summary".`;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=reviewer-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer-prompt.js","sourceRoot":"","sources":["../../src/orchestration/reviewer-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,MAAM,UAAU,uBAAuB;IACtC,OAAO;;;;;;;;;;;;;;;;;EAiBN,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAwB;IAC/D,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IAE/E,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9F,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAE3F,OAAO;aACK,SAAS,CAAC,MAAM,IAAK,SAAiB,CAAC,EAAE;cACxC,SAAS,CAAC,OAAO,IAAI,MAAM;eAC1B,SAAS,CAAC,SAAS,IAAK,SAAiB,CAAC,IAAI,IAAI,QAAQ;yBAChD,SAAS;kBAChB,SAAS,CAAC,WAAW,IAAI,QAAQ;qBAC9B,SAAS,CAAC,cAAc,IAAI,QAAQ;;;mBAGtC,SAAS;4BACA,mBAAmB;EAC7C,UAAU,CAAC,CAAC,CAAC,mCAAmC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;;;EAIxF,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;;;sEAGgD,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC/C,OAAe,EACf,aAAqB,EACrB,YAAoB,EACpB,aAAuB;IAEvB,OAAO;cACM,OAAO;oBACD,aAAa;;EAE/B,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;EAI9D,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;;;;8EAIgD,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree test command execution engine with strict security guards and lifecycle hardening.
|
|
3
|
+
*
|
|
4
|
+
* Implements Section 16 & Milestones W5.1 and W5.2:
|
|
5
|
+
* - Structured VerificationSpec with validation and legacy reader
|
|
6
|
+
* - Command trust validation (bans npx in host mode, whitelist, forbidden eval args)
|
|
7
|
+
* - Cross-platform process tree termination (Windows taskkill /T /F, POSIX process groups)
|
|
8
|
+
* - Sensitive output redaction (API keys, tokens, passwords)
|
|
9
|
+
* - Post-execution candidate immutability verification (HEAD and dirty working tree checks)
|
|
10
|
+
*/
|
|
11
|
+
import type { VerificationSpec, VerificationStatus } from "../core/types.js";
|
|
12
|
+
import { ExecutionSandbox, type SandboxMode } from "../sandbox/execution.js";
|
|
13
|
+
import { getSanitizedEnv, killProcessTree, redactSensitiveOutput, STRICT_ENV_ALLOWLIST } from "../utils/process-security.js";
|
|
14
|
+
export { getSanitizedEnv, killProcessTree, redactSensitiveOutput, STRICT_ENV_ALLOWLIST };
|
|
15
|
+
export declare const ALLOWED_VERIFY_TOOLS: Set<string>;
|
|
16
|
+
export declare const FORBIDDEN_VERIFY_ARGS: Set<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Parses a string command or object into a canonical VerificationSpec (Section 16.1).
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseVerificationSpec(input: unknown): VerificationSpec;
|
|
21
|
+
/**
|
|
22
|
+
* Enforces command trust policy (Section 16.2).
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateCommandTrust(spec: VerificationSpec, options?: {
|
|
25
|
+
runnerMode?: "host-unsafe" | "oci";
|
|
26
|
+
trusted?: boolean;
|
|
27
|
+
}): void;
|
|
28
|
+
/**
|
|
29
|
+
* Checks that the working tree and candidate commit remained immutable (Section 16.3).
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyCandidateImmutability(worktreePath: string, expectedHeadSha?: string): {
|
|
32
|
+
clean: boolean;
|
|
33
|
+
mutatedHead?: boolean;
|
|
34
|
+
dirtyFiles?: string[];
|
|
35
|
+
};
|
|
36
|
+
export interface VerificationOptions {
|
|
37
|
+
expectedHeadSha?: string;
|
|
38
|
+
runnerMode?: "host-unsafe" | "oci";
|
|
39
|
+
sandboxMode?: SandboxMode;
|
|
40
|
+
sandbox?: ExecutionSandbox;
|
|
41
|
+
trusted?: boolean;
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Executes worktree verification with strict security guards and lifecycle management.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runWorktreeVerification(worktreePath: string, commandOrSpec: string | VerificationSpec, options?: VerificationOptions): Promise<{
|
|
48
|
+
verdict: VerificationStatus;
|
|
49
|
+
verified: boolean;
|
|
50
|
+
output: string;
|
|
51
|
+
exitCode: number | null;
|
|
52
|
+
runnerMode?: "oci" | "host-unsafe";
|
|
53
|
+
}>;
|