dual-brain 0.2.30 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dual-brain/docs/claude-code-extension-points.md +32 -0
- package/.dual-brain/docs/data-tools-capabilities.md +181 -0
- package/.dual-brain/docs/ecosystem-tools.md +91 -0
- package/.dual-brain/docs/panel-handoff.md +124 -0
- package/.dual-brain/docs/ruflo-analysis.md +48 -0
- package/bin/dual-brain.mjs +56 -56
- package/dist/mcp-server/index.d.ts +27 -0
- package/dist/mcp-server/index.js +359 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/src/agent-protocol.d.ts +163 -0
- package/dist/src/agent-protocol.js +368 -0
- package/dist/src/agent-protocol.js.map +1 -0
- package/dist/src/agents/registry.d.ts +52 -0
- package/dist/src/agents/registry.js +393 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/awareness.d.ts +93 -0
- package/dist/src/awareness.js +406 -0
- package/dist/src/awareness.js.map +1 -0
- package/dist/src/brief.d.ts +48 -0
- package/dist/src/brief.js +179 -0
- package/dist/src/brief.js.map +1 -0
- package/dist/src/calibration.d.ts +32 -0
- package/dist/src/calibration.js +133 -0
- package/dist/src/calibration.js.map +1 -0
- package/dist/src/checkpoint.d.ts +33 -0
- package/dist/src/checkpoint.js +99 -0
- package/dist/src/checkpoint.js.map +1 -0
- package/dist/src/ci-triage.d.ts +33 -0
- package/dist/src/ci-triage.js +193 -0
- package/dist/src/ci-triage.js.map +1 -0
- package/dist/src/cognitive-loop.d.ts +56 -0
- package/dist/src/cognitive-loop.js +495 -0
- package/dist/src/cognitive-loop.js.map +1 -0
- package/dist/src/collaboration.d.ts +147 -0
- package/dist/src/collaboration.js +438 -0
- package/dist/src/collaboration.js.map +1 -0
- package/dist/src/context-intel.d.ts +47 -0
- package/dist/src/context-intel.js +156 -0
- package/dist/src/context-intel.js.map +1 -0
- package/dist/src/context.d.ts +53 -0
- package/dist/src/context.js +332 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/continuity.d.ts +89 -0
- package/dist/src/continuity.js +230 -0
- package/dist/src/continuity.js.map +1 -0
- package/dist/src/cost-tracker.d.ts +47 -0
- package/dist/src/cost-tracker.js +170 -0
- package/dist/src/cost-tracker.js.map +1 -0
- package/dist/src/debrief.d.ts +53 -0
- package/dist/src/debrief.js +222 -0
- package/dist/src/debrief.js.map +1 -0
- package/dist/src/decide.d.ts +96 -0
- package/dist/src/decide.js +744 -0
- package/dist/src/decide.js.map +1 -0
- package/dist/src/decompose.d.ts +39 -0
- package/dist/src/decompose.js +218 -0
- package/dist/src/decompose.js.map +1 -0
- package/dist/src/detect.d.ts +91 -0
- package/dist/src/detect.js +544 -0
- package/dist/src/detect.js.map +1 -0
- package/dist/src/dispatch.d.ts +154 -0
- package/dist/src/dispatch.js +1306 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/doctor.d.ts +421 -0
- package/dist/src/doctor.js +1689 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/engine.d.ts +70 -0
- package/dist/src/engine.js +155 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/envelope.d.ts +36 -0
- package/dist/src/envelope.js +80 -0
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/failure-memory.d.ts +55 -0
- package/dist/src/failure-memory.js +175 -0
- package/dist/src/failure-memory.js.map +1 -0
- package/dist/src/fx.d.ts +87 -0
- package/dist/src/fx.js +272 -0
- package/dist/src/fx.js.map +1 -0
- package/dist/src/governance.d.ts +93 -0
- package/dist/src/governance.js +261 -0
- package/dist/src/governance.js.map +1 -0
- package/dist/src/handoff.d.ts +11 -0
- package/dist/src/handoff.js +90 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/head-protocol.d.ts +76 -0
- package/dist/src/head-protocol.js +109 -0
- package/dist/src/head-protocol.js.map +1 -0
- package/dist/src/head.d.ts +222 -0
- package/dist/src/head.js +765 -0
- package/dist/src/head.js.map +1 -0
- package/dist/src/health.d.ts +132 -0
- package/dist/src/health.js +435 -0
- package/dist/src/health.js.map +1 -0
- package/dist/src/inbox.d.ts +70 -0
- package/dist/src/inbox.js +218 -0
- package/dist/src/inbox.js.map +1 -0
- package/dist/src/index.d.ts +33 -0
- package/dist/src/index.js +38 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/install-hooks.d.ts +13 -0
- package/dist/src/install-hooks.js +88 -0
- package/dist/src/install-hooks.js.map +1 -0
- package/dist/src/integrity.d.ts +59 -0
- package/dist/src/integrity.js +206 -0
- package/dist/src/integrity.js.map +1 -0
- package/dist/src/intelligence.d.ts +104 -0
- package/dist/src/intelligence.js +391 -0
- package/dist/src/intelligence.js.map +1 -0
- package/dist/src/ledger.d.ts +54 -0
- package/dist/src/ledger.js +179 -0
- package/dist/src/ledger.js.map +1 -0
- package/dist/src/living-docs.d.ts +14 -0
- package/dist/src/living-docs.js +197 -0
- package/dist/src/living-docs.js.map +1 -0
- package/dist/src/memory-tiers.d.ts +37 -0
- package/dist/src/memory-tiers.js +160 -0
- package/dist/src/memory-tiers.js.map +1 -0
- package/dist/src/model-profiles.d.ts +65 -0
- package/dist/src/model-profiles.js +568 -0
- package/dist/src/model-profiles.js.map +1 -0
- package/dist/src/models.d.ts +58 -0
- package/dist/src/models.js +327 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/narrative.d.ts +54 -0
- package/dist/src/narrative.js +163 -0
- package/dist/src/narrative.js.map +1 -0
- package/dist/src/nextstep.d.ts +16 -0
- package/dist/src/nextstep.js +103 -0
- package/dist/src/nextstep.js.map +1 -0
- package/dist/src/observer.d.ts +18 -0
- package/dist/src/observer.js +251 -0
- package/dist/src/observer.js.map +1 -0
- package/dist/src/outcome.d.ts +110 -0
- package/dist/src/outcome.js +377 -0
- package/dist/src/outcome.js.map +1 -0
- package/dist/src/pipeline.d.ts +167 -0
- package/dist/src/pipeline.js +1503 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/src/playbook.d.ts +59 -0
- package/dist/src/playbook.js +238 -0
- package/dist/src/playbook.js.map +1 -0
- package/dist/src/pr-agent.d.ts +97 -0
- package/dist/src/pr-agent.js +195 -0
- package/dist/src/pr-agent.js.map +1 -0
- package/dist/src/predictive.d.ts +57 -0
- package/dist/src/predictive.js +230 -0
- package/dist/src/predictive.js.map +1 -0
- package/dist/src/profile.d.ts +294 -0
- package/dist/src/profile.js +1347 -0
- package/dist/src/profile.js.map +1 -0
- package/dist/src/prompt-audit.d.ts +22 -0
- package/dist/src/prompt-audit.js +194 -0
- package/dist/src/prompt-audit.js.map +1 -0
- package/dist/src/prompt-intel.d.ts +12 -0
- package/dist/src/prompt-intel.js +321 -0
- package/dist/src/prompt-intel.js.map +1 -0
- package/dist/src/provider-context.d.ts +121 -0
- package/dist/src/provider-context.js +222 -0
- package/dist/src/provider-context.js.map +1 -0
- package/dist/src/provider-manager.d.ts +92 -0
- package/dist/src/provider-manager.js +428 -0
- package/dist/src/provider-manager.js.map +1 -0
- package/dist/src/receipt.d.ts +87 -0
- package/dist/src/receipt.js +326 -0
- package/dist/src/receipt.js.map +1 -0
- package/dist/src/recommendations.d.ts +13 -0
- package/dist/src/recommendations.js +291 -0
- package/dist/src/recommendations.js.map +1 -0
- package/dist/src/redact.d.ts +15 -0
- package/dist/src/redact.js +129 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/replit.d.ts +397 -0
- package/dist/src/replit.js +1160 -0
- package/dist/src/replit.js.map +1 -0
- package/dist/src/repo.d.ts +149 -0
- package/dist/src/repo.js +416 -0
- package/dist/src/repo.js.map +1 -0
- package/dist/src/revert.d.ts +30 -0
- package/dist/src/revert.js +166 -0
- package/dist/src/revert.js.map +1 -0
- package/dist/src/room.d.ts +102 -0
- package/dist/src/room.js +212 -0
- package/dist/src/room.js.map +1 -0
- package/dist/src/routing-advisor.d.ts +57 -0
- package/dist/src/routing-advisor.js +221 -0
- package/dist/src/routing-advisor.js.map +1 -0
- package/dist/src/self-correct.d.ts +40 -0
- package/dist/src/self-correct.js +137 -0
- package/dist/src/self-correct.js.map +1 -0
- package/dist/src/session-lock.d.ts +35 -0
- package/dist/src/session-lock.js +134 -0
- package/dist/src/session-lock.js.map +1 -0
- package/dist/src/session.d.ts +267 -0
- package/dist/src/session.js +1660 -0
- package/dist/src/session.js.map +1 -0
- package/dist/src/settings-tui.d.ts +5 -0
- package/dist/src/settings-tui.js +422 -0
- package/dist/src/settings-tui.js.map +1 -0
- package/dist/src/setup-flow.d.ts +63 -0
- package/dist/src/setup-flow.js +233 -0
- package/dist/src/setup-flow.js.map +1 -0
- package/dist/src/signal.d.ts +19 -0
- package/dist/src/signal.js +122 -0
- package/dist/src/signal.js.map +1 -0
- package/dist/src/simmer.d.ts +85 -0
- package/dist/src/simmer.js +224 -0
- package/dist/src/simmer.js.map +1 -0
- package/dist/src/state-export.d.ts +129 -0
- package/dist/src/state-export.js +233 -0
- package/dist/src/state-export.js.map +1 -0
- package/dist/src/strategy.d.ts +54 -0
- package/dist/src/strategy.js +95 -0
- package/dist/src/strategy.js.map +1 -0
- package/dist/src/subscription.d.ts +40 -0
- package/dist/src/subscription.js +189 -0
- package/dist/src/subscription.js.map +1 -0
- package/dist/src/templates.d.ts +208 -0
- package/dist/src/templates.js +238 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/test.d.ts +9 -0
- package/dist/src/test.js +1173 -0
- package/dist/src/test.js.map +1 -0
- package/dist/src/think-engine.d.ts +67 -0
- package/dist/src/think-engine.js +412 -0
- package/dist/src/think-engine.js.map +1 -0
- package/dist/src/tui.d.ts +71 -0
- package/dist/src/tui.js +242 -0
- package/dist/src/tui.js.map +1 -0
- package/dist/src/types.d.ts +177 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/update-check.d.ts +7 -0
- package/dist/src/update-check.js +36 -0
- package/dist/src/update-check.js.map +1 -0
- package/dist/src/wave-planner.d.ts +30 -0
- package/dist/src/wave-planner.js +281 -0
- package/dist/src/wave-planner.js.map +1 -0
- package/hooks/head-guard.sh +41 -0
- package/hooks/precompact.mjs +3 -3
- package/hooks/session-end.mjs +3 -3
- package/hooks/task-classifier.mjs +328 -0
- package/hooks/vibe-router.mjs +387 -0
- package/install.mjs +2 -2
- package/package.json +29 -153
- package/src/agents/registry.mjs +0 -405
- package/src/awareness.mjs +0 -425
- package/src/brief.mjs +0 -266
- package/src/calibration.mjs +0 -148
- package/src/checkpoint.mjs +0 -109
- package/src/ci-triage.mjs +0 -191
- package/src/cognitive-loop.mjs +0 -562
- package/src/collaboration.mjs +0 -545
- package/src/context-intel.mjs +0 -158
- package/src/context.mjs +0 -389
- package/src/continuity.mjs +0 -298
- package/src/cost-tracker.mjs +0 -184
- package/src/debrief.mjs +0 -228
- package/src/decide.mjs +0 -1099
- package/src/decompose.mjs +0 -331
- package/src/detect.mjs +0 -702
- package/src/dispatch.mjs +0 -1447
- package/src/doctor.mjs +0 -1607
- package/src/envelope.mjs +0 -139
- package/src/failure-memory.mjs +0 -178
- package/src/fx.mjs +0 -276
- package/src/governance.mjs +0 -279
- package/src/handoff.mjs +0 -87
- package/src/head-protocol.mjs +0 -128
- package/src/head.mjs +0 -952
- package/src/health.mjs +0 -528
- package/src/inbox.mjs +0 -195
- package/src/index.mjs +0 -44
- package/src/install-hooks.mjs +0 -100
- package/src/integrity.mjs +0 -245
- package/src/intelligence.mjs +0 -447
- package/src/ledger.mjs +0 -196
- package/src/living-docs.mjs +0 -210
- package/src/memory-tiers.mjs +0 -193
- package/src/models.mjs +0 -363
- package/src/narrative.mjs +0 -169
- package/src/nextstep.mjs +0 -100
- package/src/observer.mjs +0 -241
- package/src/outcome.mjs +0 -400
- package/src/pipeline.mjs +0 -1711
- package/src/playbook.mjs +0 -257
- package/src/pr-agent.mjs +0 -214
- package/src/predictive.mjs +0 -250
- package/src/profile.mjs +0 -1411
- package/src/prompt-audit.mjs +0 -231
- package/src/prompt-intel.mjs +0 -325
- package/src/provider-context.mjs +0 -257
- package/src/receipt.mjs +0 -344
- package/src/recommendations.mjs +0 -296
- package/src/redact.mjs +0 -192
- package/src/replit.mjs +0 -1210
- package/src/repo.mjs +0 -445
- package/src/revert.mjs +0 -149
- package/src/routing-advisor.mjs +0 -204
- package/src/self-correct.mjs +0 -147
- package/src/session-lock.mjs +0 -160
- package/src/session.mjs +0 -1655
- package/src/settings-tui.mjs +0 -373
- package/src/setup-flow.mjs +0 -223
- package/src/signal.mjs +0 -115
- package/src/simmer.mjs +0 -241
- package/src/strategy.mjs +0 -235
- package/src/subscription.mjs +0 -212
- package/src/templates.mjs +0 -260
- package/src/think-engine.mjs +0 -428
- package/src/tui.mjs +0 -276
- package/src/update-check.mjs +0 -35
- package/src/wave-planner.mjs +0 -294
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
const AUTH_PAT = /\b(auth|credential|secret|token|password|encrypt|permission|oauth|jwt|api.?key)\b/i;
|
|
5
|
+
const TEST_PAT = /\b(test|spec|\.test\.|\.spec\.)\b/i;
|
|
6
|
+
function gitBranch(cwd) {
|
|
7
|
+
try {
|
|
8
|
+
return execSync('git rev-parse --abbrev-ref HEAD', { cwd, stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function packageVersionChanged(cwd, files) {
|
|
15
|
+
if (!files.some(f => f.includes('package.json')))
|
|
16
|
+
return false;
|
|
17
|
+
try {
|
|
18
|
+
return execSync('git diff HEAD~1 HEAD -- package.json', { cwd, stdio: ['ignore', 'pipe', 'ignore'] }).toString().includes('"version"');
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function changelogExists(cwd) {
|
|
25
|
+
return ['CHANGELOG.md', 'CHANGELOG', 'changelog.md'].some(f => existsSync(join(cwd, f)));
|
|
26
|
+
}
|
|
27
|
+
function step(priority, type, message, command, reason) {
|
|
28
|
+
return { priority, type, message, command, reason };
|
|
29
|
+
}
|
|
30
|
+
function dedup(steps) {
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
return steps.filter(s => { if (seen.has(s.type))
|
|
33
|
+
return false; seen.add(s.type); return true; });
|
|
34
|
+
}
|
|
35
|
+
export async function suggestNextSteps(completedTask = {}, outcome = {}, cwd = process.cwd()) {
|
|
36
|
+
try {
|
|
37
|
+
const { prompt = '', files = [], trigger } = completedTask;
|
|
38
|
+
const { success = false, filesChanged = [], error = '' } = outcome;
|
|
39
|
+
const steps = [];
|
|
40
|
+
const branch = gitBranch(cwd);
|
|
41
|
+
const onMain = !branch || branch === 'main' || branch === 'master';
|
|
42
|
+
const allFiles = [...files, ...filesChanged];
|
|
43
|
+
const hasAuth = allFiles.some(f => AUTH_PAT.test(f));
|
|
44
|
+
const hasTests = allFiles.some(f => TEST_PAT.test(f));
|
|
45
|
+
const n = filesChanged.length;
|
|
46
|
+
const fstr = (count) => `${count} file${count !== 1 ? 's' : ''}`;
|
|
47
|
+
if (trigger === 'auto-commit') {
|
|
48
|
+
steps.push(!onMain && branch
|
|
49
|
+
? step(4, 'pr', `Open a pull request for branch "${branch}"`, `gh pr create --head ${branch}`, `On feature branch — changes need review before merging`)
|
|
50
|
+
: step(3, 'deploy', 'Deploy or tag a release', null, 'Committed to main — ready to ship or version'));
|
|
51
|
+
if (packageVersionChanged(cwd, filesChanged))
|
|
52
|
+
steps.push(step(4, 'publish', 'Publish the new package version to npm', 'npm publish', 'package.json version changed in this commit'));
|
|
53
|
+
if (changelogExists(cwd) && !filesChanged.some(f => /changelog/i.test(f)))
|
|
54
|
+
steps.push(step(2, 'changelog', 'Update CHANGELOG with this change', null, 'CHANGELOG exists but was not updated'));
|
|
55
|
+
}
|
|
56
|
+
else if (trigger === 'review' || trigger === 'think') {
|
|
57
|
+
const issues = error || /issue|problem|fail|error|warn/i.test(prompt);
|
|
58
|
+
steps.push(issues
|
|
59
|
+
? step(5, 'fix', 'Fix the issues identified in the review', `dual-brain go "fix issues identified in review"`, 'Review found problems that need resolution')
|
|
60
|
+
: step(3, 'continue', 'Ship it — the review looks good', null, 'Review completed without critical findings'));
|
|
61
|
+
}
|
|
62
|
+
else if (!success) {
|
|
63
|
+
steps.push(step(5, 'fix', 'Retry with higher reasoning depth', `dual-brain go --tier think "${prompt}"`, 'Task failed — escalating tier may resolve it'));
|
|
64
|
+
if (error && /test/i.test(error))
|
|
65
|
+
steps.push(step(4, 'test', 'Look at test output for clues', null, 'Error references tests — check output to understand the failure'));
|
|
66
|
+
steps.push(step(3, 'review', 'Try a different approach — dual-brain think', `node .claude/hooks/dual-brain-think.mjs --question "${prompt}"`, 'GPT perspective may surface a different solution'));
|
|
67
|
+
}
|
|
68
|
+
else if (success && n > 0) {
|
|
69
|
+
if (!hasTests)
|
|
70
|
+
steps.push(step(5, 'test', `Run tests to verify the ${fstr(n)} changed`, 'npm test', `${fstr(n)} changed without test verification`));
|
|
71
|
+
if (hasAuth)
|
|
72
|
+
steps.push(step(5, 'review', 'Run a security review on auth/credential changes', `node .claude/hooks/dual-brain-think.mjs --question "Security review: ${prompt}"`, 'Auth or security-sensitive files were modified'));
|
|
73
|
+
if (n > 3)
|
|
74
|
+
steps.push(step(4, 'review', `Review the ${n}-file diff before committing`, 'git diff', `${n} files changed — quick diff review before committing`));
|
|
75
|
+
if (!onMain && branch)
|
|
76
|
+
steps.push(step(4, 'pr', `Open a pull request for branch "${branch}"`, `gh pr create --head ${branch}`, `Changes are on feature branch "${branch}" — ready for PR`));
|
|
77
|
+
if (hasTests)
|
|
78
|
+
steps.push(step(3, 'commit', 'Commit changes', 'git add -p && git commit', 'Tests passed — safe to commit'));
|
|
79
|
+
steps.push(step(2, 'continue', 'Check for edge cases in the changed code', null, 'Edge cases are often missed during implementation'));
|
|
80
|
+
if (changelogExists(cwd) && !filesChanged.some(f => /changelog/i.test(f)))
|
|
81
|
+
steps.push(step(2, 'changelog', 'Update CHANGELOG with this change', null, 'CHANGELOG exists but was not updated in this batch'));
|
|
82
|
+
}
|
|
83
|
+
const sorted = dedup(steps.sort((a, b) => b.priority - a.priority));
|
|
84
|
+
return {
|
|
85
|
+
steps: sorted,
|
|
86
|
+
topSuggestion: sorted.length > 0 ? `→ ${sorted[0].message}` : '→ Nothing urgent — task complete',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return { steps: [], topSuggestion: '→ Task complete' };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function formatNextSteps(steps, limit = 3) {
|
|
94
|
+
if (!steps?.length)
|
|
95
|
+
return '';
|
|
96
|
+
return `📋 Next steps\n${steps.slice(0, limit).map((s, i) => ` ${i + 1}. ${s.message}`).join('\n')}`;
|
|
97
|
+
}
|
|
98
|
+
export function getTopSuggestion(steps) {
|
|
99
|
+
if (!steps?.length)
|
|
100
|
+
return '→ Task complete';
|
|
101
|
+
return `→ ${steps[0].message}`;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=nextstep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextstep.js","sourceRoot":"","sources":["../../src/nextstep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface Observation {
|
|
2
|
+
type: string;
|
|
3
|
+
priority: 'high' | 'medium' | 'low';
|
|
4
|
+
message: string;
|
|
5
|
+
action: string;
|
|
6
|
+
files: string[];
|
|
7
|
+
}
|
|
8
|
+
interface ObserveResult {
|
|
9
|
+
observations: Observation[];
|
|
10
|
+
summary: string;
|
|
11
|
+
}
|
|
12
|
+
interface ObserveOptions {
|
|
13
|
+
runTests?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function observe(cwd: string, options?: ObserveOptions): Promise<ObserveResult>;
|
|
16
|
+
export declare function formatObservations(observations: Observation[]): string;
|
|
17
|
+
export declare function getQuickState(cwd: string): Promise<ObserveResult>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
const SEC_PATTERNS = /auth|login|password|token|secret|credential|session|jwt|oauth|permission|role|middleware/i;
|
|
5
|
+
const SOURCE_EXT = /\.(mjs|js|ts|py)$/;
|
|
6
|
+
function exec(cmd, cwd, timeout = 5000) {
|
|
7
|
+
try {
|
|
8
|
+
return execSync(cmd, { cwd, encoding: 'utf8', timeout, stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function changedFiles(cwd) {
|
|
15
|
+
const output = exec('git diff --name-only HEAD 2>/dev/null || git diff --name-only', cwd);
|
|
16
|
+
return output ? output.split('\n').filter(Boolean) : [];
|
|
17
|
+
}
|
|
18
|
+
function checkSecurity(files) {
|
|
19
|
+
const hits = files.filter(f => SEC_PATTERNS.test(f));
|
|
20
|
+
if (!hits.length)
|
|
21
|
+
return null;
|
|
22
|
+
return {
|
|
23
|
+
type: 'security-review',
|
|
24
|
+
priority: 'high',
|
|
25
|
+
message: 'Auth-related files changed — want a security review?',
|
|
26
|
+
action: 'dual-brain review',
|
|
27
|
+
files: hits,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function checkNoTests(files, cwd) {
|
|
31
|
+
const sources = files.filter(f => SOURCE_EXT.test(f));
|
|
32
|
+
if (!sources.length)
|
|
33
|
+
return null;
|
|
34
|
+
const untested = sources.filter(f => {
|
|
35
|
+
const base = f.replace(SOURCE_EXT, '');
|
|
36
|
+
const dir = join(cwd, f.split('/').slice(0, -1).join('/'));
|
|
37
|
+
const name = f.split('/').pop().replace(SOURCE_EXT, '');
|
|
38
|
+
const candidates = ['test', 'spec'].flatMap(k => ['mjs', 'js', 'ts'].flatMap(e => [
|
|
39
|
+
join(cwd, `${base}.${k}.${e}`),
|
|
40
|
+
join(dir, '__tests__', `${name}.${e}`),
|
|
41
|
+
]));
|
|
42
|
+
return !candidates.some(c => existsSync(c));
|
|
43
|
+
});
|
|
44
|
+
if (!untested.length)
|
|
45
|
+
return null;
|
|
46
|
+
return {
|
|
47
|
+
type: 'no-tests',
|
|
48
|
+
priority: 'medium',
|
|
49
|
+
message: `${untested.length} changed file${untested.length > 1 ? 's' : ''} have no tests`,
|
|
50
|
+
action: "dual-brain go 'add tests for changed files'",
|
|
51
|
+
files: untested,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function checkLargeDiff(cwd) {
|
|
55
|
+
const stat = exec('git diff --stat', cwd);
|
|
56
|
+
if (!stat)
|
|
57
|
+
return null;
|
|
58
|
+
const match = stat.match(/(\d+) insertion|(\d+) deletion/g);
|
|
59
|
+
if (!match)
|
|
60
|
+
return null;
|
|
61
|
+
const total = match.reduce((sum, m) => sum + parseInt(m), 0);
|
|
62
|
+
if (total <= 500)
|
|
63
|
+
return null;
|
|
64
|
+
return {
|
|
65
|
+
type: 'large-diff',
|
|
66
|
+
priority: 'medium',
|
|
67
|
+
message: `Large uncommitted changes (${total} lines) — consider committing`,
|
|
68
|
+
action: "dual-brain go 'commit current changes'",
|
|
69
|
+
files: [],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function checkStaleBranch(cwd, files) {
|
|
73
|
+
if (!files.length)
|
|
74
|
+
return null;
|
|
75
|
+
const ts = exec('git log -1 --format=%ct', cwd);
|
|
76
|
+
if (!ts)
|
|
77
|
+
return null;
|
|
78
|
+
const age = Date.now() / 1000 - parseInt(ts);
|
|
79
|
+
if (age < 86400)
|
|
80
|
+
return null;
|
|
81
|
+
const hours = Math.round(age / 3600);
|
|
82
|
+
return {
|
|
83
|
+
type: 'stale-branch',
|
|
84
|
+
priority: 'low',
|
|
85
|
+
message: `Last commit was ${hours}h ago with uncommitted work`,
|
|
86
|
+
action: "dual-brain go 'commit current changes'",
|
|
87
|
+
files: [],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function checkConflicts(cwd) {
|
|
91
|
+
const conflicted = exec('git diff --name-only --diff-filter=U', cwd);
|
|
92
|
+
if (!conflicted)
|
|
93
|
+
return null;
|
|
94
|
+
const files = conflicted.split('\n').filter(Boolean);
|
|
95
|
+
if (!files.length)
|
|
96
|
+
return null;
|
|
97
|
+
return {
|
|
98
|
+
type: 'conflict',
|
|
99
|
+
priority: 'high',
|
|
100
|
+
message: `${files.length} file${files.length > 1 ? 's' : ''} have merge conflicts`,
|
|
101
|
+
action: "dual-brain go 'resolve merge conflicts'",
|
|
102
|
+
files,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function checkUnfinishedWork(cwd) {
|
|
106
|
+
const outcomesDir = join(cwd, '.dualbrain', 'outcomes');
|
|
107
|
+
if (!existsSync(outcomesDir))
|
|
108
|
+
return null;
|
|
109
|
+
const cutoff = Date.now() - 86_400_000;
|
|
110
|
+
let failed = null;
|
|
111
|
+
try {
|
|
112
|
+
const files = readdirSync(outcomesDir).filter(f => f.endsWith('.jsonl')).sort().reverse();
|
|
113
|
+
for (const file of files) {
|
|
114
|
+
const lines = readFileSync(join(outcomesDir, file), 'utf8')
|
|
115
|
+
.split('\n').filter(Boolean);
|
|
116
|
+
for (const line of lines.reverse()) {
|
|
117
|
+
try {
|
|
118
|
+
const rec = JSON.parse(line);
|
|
119
|
+
if (rec.timestamp && rec.timestamp < cutoff)
|
|
120
|
+
break;
|
|
121
|
+
if (rec.result && rec.result.success === false && rec.prompt) {
|
|
122
|
+
failed = rec;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch { /* skip */ }
|
|
127
|
+
}
|
|
128
|
+
if (failed)
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
if (!failed)
|
|
136
|
+
return null;
|
|
137
|
+
const prompt = failed.prompt.slice(0, 60);
|
|
138
|
+
return {
|
|
139
|
+
type: 'unfinished-work',
|
|
140
|
+
priority: 'medium',
|
|
141
|
+
message: `Last session had a failed task: '${prompt}' — resume?`,
|
|
142
|
+
action: `dual-brain go '${failed.prompt}'`,
|
|
143
|
+
files: [],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
async function checkFailingTests(cwd) {
|
|
147
|
+
const pkgPath = join(cwd, 'package.json');
|
|
148
|
+
if (!existsSync(pkgPath))
|
|
149
|
+
return null;
|
|
150
|
+
try {
|
|
151
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
152
|
+
if (!pkg.scripts?.test)
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
execSync('npm test --silent 2>&1', { cwd, encoding: 'utf8', timeout: 30000, stdio: 'pipe' });
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return {
|
|
164
|
+
type: 'failing-tests',
|
|
165
|
+
priority: 'high',
|
|
166
|
+
message: 'Tests are failing — want me to investigate?',
|
|
167
|
+
action: "dual-brain go 'fix failing tests'",
|
|
168
|
+
files: [],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function buildSummary(files, observations) {
|
|
173
|
+
const conflicts = observations.filter(o => o.type === 'conflict').length;
|
|
174
|
+
const hi = observations.filter(o => o.priority === 'high').length;
|
|
175
|
+
const parts = [];
|
|
176
|
+
if (files.length)
|
|
177
|
+
parts.push(`${files.length} file${files.length > 1 ? 's' : ''} changed`);
|
|
178
|
+
else
|
|
179
|
+
parts.push('no uncommitted changes');
|
|
180
|
+
if (conflicts)
|
|
181
|
+
parts.push(`${conflicts} conflict${conflicts > 1 ? 's' : ''}`);
|
|
182
|
+
if (hi)
|
|
183
|
+
parts.push(`${hi} high-priority suggestion${hi > 1 ? 's' : ''}`);
|
|
184
|
+
return parts.join(', ');
|
|
185
|
+
}
|
|
186
|
+
export async function observe(cwd, options = {}) {
|
|
187
|
+
const observations = [];
|
|
188
|
+
try {
|
|
189
|
+
const files = changedFiles(cwd);
|
|
190
|
+
const sec = checkSecurity(files);
|
|
191
|
+
if (sec)
|
|
192
|
+
observations.push(sec);
|
|
193
|
+
const conflicts = checkConflicts(cwd);
|
|
194
|
+
if (conflicts)
|
|
195
|
+
observations.push(conflicts);
|
|
196
|
+
const noTests = checkNoTests(files, cwd);
|
|
197
|
+
if (noTests)
|
|
198
|
+
observations.push(noTests);
|
|
199
|
+
const largeDiff = checkLargeDiff(cwd);
|
|
200
|
+
if (largeDiff)
|
|
201
|
+
observations.push(largeDiff);
|
|
202
|
+
const stale = checkStaleBranch(cwd, files);
|
|
203
|
+
if (stale)
|
|
204
|
+
observations.push(stale);
|
|
205
|
+
const unfinished = checkUnfinishedWork(cwd);
|
|
206
|
+
if (unfinished)
|
|
207
|
+
observations.push(unfinished);
|
|
208
|
+
if (options.runTests) {
|
|
209
|
+
const failing = await checkFailingTests(cwd);
|
|
210
|
+
if (failing)
|
|
211
|
+
observations.push(failing);
|
|
212
|
+
}
|
|
213
|
+
return { observations, summary: buildSummary(files, observations) };
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return { observations: [], summary: 'unable to observe repo state' };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
export function formatObservations(observations) {
|
|
220
|
+
if (!observations.length)
|
|
221
|
+
return '\u{1F4A1} Suggestions\n (none)';
|
|
222
|
+
const icon = { high: '\u{1F534}', medium: '\u{1F7E1}', low: '\u{1F7E2}' };
|
|
223
|
+
const lines = observations.map(o => ` ${icon[o.priority] || '⚪'} ${o.message}`);
|
|
224
|
+
return `\u{1F4A1} Suggestions\n${lines.join('\n')}`;
|
|
225
|
+
}
|
|
226
|
+
export async function getQuickState(cwd) {
|
|
227
|
+
try {
|
|
228
|
+
const files = changedFiles(cwd);
|
|
229
|
+
const observations = [];
|
|
230
|
+
const sec = checkSecurity(files);
|
|
231
|
+
if (sec)
|
|
232
|
+
observations.push(sec);
|
|
233
|
+
const conflicts = checkConflicts(cwd);
|
|
234
|
+
if (conflicts)
|
|
235
|
+
observations.push(conflicts);
|
|
236
|
+
const noTests = checkNoTests(files, cwd);
|
|
237
|
+
if (noTests)
|
|
238
|
+
observations.push(noTests);
|
|
239
|
+
const largeDiff = checkLargeDiff(cwd);
|
|
240
|
+
if (largeDiff)
|
|
241
|
+
observations.push(largeDiff);
|
|
242
|
+
const stale = checkStaleBranch(cwd, files);
|
|
243
|
+
if (stale)
|
|
244
|
+
observations.push(stale);
|
|
245
|
+
return { observations, summary: buildSummary(files, observations) };
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return { observations: [], summary: 'unable to observe repo state' };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.js","sourceRoot":"","sources":["../../src/observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
interface OutcomeRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
timestamp: string | number;
|
|
4
|
+
prompt: string;
|
|
5
|
+
tier: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
provider?: string;
|
|
8
|
+
success: boolean;
|
|
9
|
+
status: string;
|
|
10
|
+
durationMs?: number;
|
|
11
|
+
filesChanged?: number;
|
|
12
|
+
errors?: string[];
|
|
13
|
+
lesson?: string;
|
|
14
|
+
primaryModel?: string;
|
|
15
|
+
reasoningDepth?: string;
|
|
16
|
+
challengerPolicy?: string;
|
|
17
|
+
risk?: string;
|
|
18
|
+
result?: {
|
|
19
|
+
success?: boolean;
|
|
20
|
+
filesChanged?: string[];
|
|
21
|
+
duration?: number;
|
|
22
|
+
error?: string | null;
|
|
23
|
+
};
|
|
24
|
+
verification?: {
|
|
25
|
+
filesVerified?: boolean;
|
|
26
|
+
testsRun?: boolean;
|
|
27
|
+
testsPassed?: boolean | null;
|
|
28
|
+
};
|
|
29
|
+
routingScore?: number;
|
|
30
|
+
lessons?: string[];
|
|
31
|
+
survivalScore?: number;
|
|
32
|
+
}
|
|
33
|
+
interface DispatchInput {
|
|
34
|
+
cwd?: string;
|
|
35
|
+
prompt?: string;
|
|
36
|
+
decision?: {
|
|
37
|
+
tier?: string;
|
|
38
|
+
model?: string;
|
|
39
|
+
provider?: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
interface DispatchResult {
|
|
43
|
+
tier?: string;
|
|
44
|
+
model?: string;
|
|
45
|
+
provider?: string;
|
|
46
|
+
status?: string;
|
|
47
|
+
durationMs?: number;
|
|
48
|
+
filesChanged?: string[];
|
|
49
|
+
errors?: string[];
|
|
50
|
+
error?: string;
|
|
51
|
+
}
|
|
52
|
+
interface Plan {
|
|
53
|
+
prompt?: string;
|
|
54
|
+
tier?: string;
|
|
55
|
+
primaryModel?: string;
|
|
56
|
+
reasoningDepth?: string;
|
|
57
|
+
challengerPolicy?: string;
|
|
58
|
+
risk?: string;
|
|
59
|
+
complexity?: string;
|
|
60
|
+
}
|
|
61
|
+
interface Result {
|
|
62
|
+
success?: boolean;
|
|
63
|
+
filesChanged?: string[];
|
|
64
|
+
duration?: number;
|
|
65
|
+
error?: string | null;
|
|
66
|
+
}
|
|
67
|
+
interface Verification {
|
|
68
|
+
filesVerified?: boolean;
|
|
69
|
+
testsRun?: boolean;
|
|
70
|
+
testsPassed?: boolean | null;
|
|
71
|
+
}
|
|
72
|
+
interface RelevantOutcome {
|
|
73
|
+
id: string;
|
|
74
|
+
timestamp: string | number;
|
|
75
|
+
prompt: string;
|
|
76
|
+
success: boolean;
|
|
77
|
+
routingScore?: number;
|
|
78
|
+
lessons?: string[];
|
|
79
|
+
relevanceScore: number;
|
|
80
|
+
}
|
|
81
|
+
interface OutcomeStats {
|
|
82
|
+
totalTasks: number;
|
|
83
|
+
successRate: number;
|
|
84
|
+
avgRoutingScore: number;
|
|
85
|
+
avgDuration: number;
|
|
86
|
+
challengerHelpRate: number;
|
|
87
|
+
topLessons: string[];
|
|
88
|
+
modelBreakdown: Record<string, {
|
|
89
|
+
count: number;
|
|
90
|
+
successRate: number;
|
|
91
|
+
}>;
|
|
92
|
+
}
|
|
93
|
+
interface SurvivalResult {
|
|
94
|
+
id: string;
|
|
95
|
+
survivalScore: number;
|
|
96
|
+
}
|
|
97
|
+
export declare function recordDispatchOutcome(dispatchInput: DispatchInput, result: DispatchResult): OutcomeRecord | null;
|
|
98
|
+
export declare function computeRoutingScore(plan: Plan, result: Result & {
|
|
99
|
+
duration?: number;
|
|
100
|
+
}, verification: Verification): number;
|
|
101
|
+
export declare function generateLessons(plan: Plan, result: Result & {
|
|
102
|
+
duration?: number;
|
|
103
|
+
}, verification: Verification): string[];
|
|
104
|
+
export declare function recordOutcome(plan: Plan, result: Result & {
|
|
105
|
+
duration?: number;
|
|
106
|
+
}, verification: Verification, cwd: string): Promise<OutcomeRecord | null>;
|
|
107
|
+
export declare function getRelevantOutcomes(prompt: string, files: string[] | undefined, cwd: string, options?: Record<string, unknown>): Promise<RelevantOutcome[]>;
|
|
108
|
+
export declare function checkFileSurvival(cwd: string): Promise<SurvivalResult[]>;
|
|
109
|
+
export declare function getOutcomeStats(cwd: string, days?: number): Promise<OutcomeStats>;
|
|
110
|
+
export {};
|