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.
Files changed (312) hide show
  1. package/.dual-brain/docs/claude-code-extension-points.md +32 -0
  2. package/.dual-brain/docs/data-tools-capabilities.md +181 -0
  3. package/.dual-brain/docs/ecosystem-tools.md +91 -0
  4. package/.dual-brain/docs/panel-handoff.md +124 -0
  5. package/.dual-brain/docs/ruflo-analysis.md +48 -0
  6. package/bin/dual-brain.mjs +56 -56
  7. package/dist/mcp-server/index.d.ts +27 -0
  8. package/dist/mcp-server/index.js +359 -0
  9. package/dist/mcp-server/index.js.map +1 -0
  10. package/dist/src/agent-protocol.d.ts +163 -0
  11. package/dist/src/agent-protocol.js +368 -0
  12. package/dist/src/agent-protocol.js.map +1 -0
  13. package/dist/src/agents/registry.d.ts +52 -0
  14. package/dist/src/agents/registry.js +393 -0
  15. package/dist/src/agents/registry.js.map +1 -0
  16. package/dist/src/awareness.d.ts +93 -0
  17. package/dist/src/awareness.js +406 -0
  18. package/dist/src/awareness.js.map +1 -0
  19. package/dist/src/brief.d.ts +48 -0
  20. package/dist/src/brief.js +179 -0
  21. package/dist/src/brief.js.map +1 -0
  22. package/dist/src/calibration.d.ts +32 -0
  23. package/dist/src/calibration.js +133 -0
  24. package/dist/src/calibration.js.map +1 -0
  25. package/dist/src/checkpoint.d.ts +33 -0
  26. package/dist/src/checkpoint.js +99 -0
  27. package/dist/src/checkpoint.js.map +1 -0
  28. package/dist/src/ci-triage.d.ts +33 -0
  29. package/dist/src/ci-triage.js +193 -0
  30. package/dist/src/ci-triage.js.map +1 -0
  31. package/dist/src/cognitive-loop.d.ts +56 -0
  32. package/dist/src/cognitive-loop.js +495 -0
  33. package/dist/src/cognitive-loop.js.map +1 -0
  34. package/dist/src/collaboration.d.ts +147 -0
  35. package/dist/src/collaboration.js +438 -0
  36. package/dist/src/collaboration.js.map +1 -0
  37. package/dist/src/context-intel.d.ts +47 -0
  38. package/dist/src/context-intel.js +156 -0
  39. package/dist/src/context-intel.js.map +1 -0
  40. package/dist/src/context.d.ts +53 -0
  41. package/dist/src/context.js +332 -0
  42. package/dist/src/context.js.map +1 -0
  43. package/dist/src/continuity.d.ts +89 -0
  44. package/dist/src/continuity.js +230 -0
  45. package/dist/src/continuity.js.map +1 -0
  46. package/dist/src/cost-tracker.d.ts +47 -0
  47. package/dist/src/cost-tracker.js +170 -0
  48. package/dist/src/cost-tracker.js.map +1 -0
  49. package/dist/src/debrief.d.ts +53 -0
  50. package/dist/src/debrief.js +222 -0
  51. package/dist/src/debrief.js.map +1 -0
  52. package/dist/src/decide.d.ts +96 -0
  53. package/dist/src/decide.js +744 -0
  54. package/dist/src/decide.js.map +1 -0
  55. package/dist/src/decompose.d.ts +39 -0
  56. package/dist/src/decompose.js +218 -0
  57. package/dist/src/decompose.js.map +1 -0
  58. package/dist/src/detect.d.ts +91 -0
  59. package/dist/src/detect.js +544 -0
  60. package/dist/src/detect.js.map +1 -0
  61. package/dist/src/dispatch.d.ts +154 -0
  62. package/dist/src/dispatch.js +1306 -0
  63. package/dist/src/dispatch.js.map +1 -0
  64. package/dist/src/doctor.d.ts +421 -0
  65. package/dist/src/doctor.js +1689 -0
  66. package/dist/src/doctor.js.map +1 -0
  67. package/dist/src/engine.d.ts +70 -0
  68. package/dist/src/engine.js +155 -0
  69. package/dist/src/engine.js.map +1 -0
  70. package/dist/src/envelope.d.ts +36 -0
  71. package/dist/src/envelope.js +80 -0
  72. package/dist/src/envelope.js.map +1 -0
  73. package/dist/src/failure-memory.d.ts +55 -0
  74. package/dist/src/failure-memory.js +175 -0
  75. package/dist/src/failure-memory.js.map +1 -0
  76. package/dist/src/fx.d.ts +87 -0
  77. package/dist/src/fx.js +272 -0
  78. package/dist/src/fx.js.map +1 -0
  79. package/dist/src/governance.d.ts +93 -0
  80. package/dist/src/governance.js +261 -0
  81. package/dist/src/governance.js.map +1 -0
  82. package/dist/src/handoff.d.ts +11 -0
  83. package/dist/src/handoff.js +90 -0
  84. package/dist/src/handoff.js.map +1 -0
  85. package/dist/src/head-protocol.d.ts +76 -0
  86. package/dist/src/head-protocol.js +109 -0
  87. package/dist/src/head-protocol.js.map +1 -0
  88. package/dist/src/head.d.ts +222 -0
  89. package/dist/src/head.js +765 -0
  90. package/dist/src/head.js.map +1 -0
  91. package/dist/src/health.d.ts +132 -0
  92. package/dist/src/health.js +435 -0
  93. package/dist/src/health.js.map +1 -0
  94. package/dist/src/inbox.d.ts +70 -0
  95. package/dist/src/inbox.js +218 -0
  96. package/dist/src/inbox.js.map +1 -0
  97. package/dist/src/index.d.ts +33 -0
  98. package/dist/src/index.js +38 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/install-hooks.d.ts +13 -0
  101. package/dist/src/install-hooks.js +88 -0
  102. package/dist/src/install-hooks.js.map +1 -0
  103. package/dist/src/integrity.d.ts +59 -0
  104. package/dist/src/integrity.js +206 -0
  105. package/dist/src/integrity.js.map +1 -0
  106. package/dist/src/intelligence.d.ts +104 -0
  107. package/dist/src/intelligence.js +391 -0
  108. package/dist/src/intelligence.js.map +1 -0
  109. package/dist/src/ledger.d.ts +54 -0
  110. package/dist/src/ledger.js +179 -0
  111. package/dist/src/ledger.js.map +1 -0
  112. package/dist/src/living-docs.d.ts +14 -0
  113. package/dist/src/living-docs.js +197 -0
  114. package/dist/src/living-docs.js.map +1 -0
  115. package/dist/src/memory-tiers.d.ts +37 -0
  116. package/dist/src/memory-tiers.js +160 -0
  117. package/dist/src/memory-tiers.js.map +1 -0
  118. package/dist/src/model-profiles.d.ts +65 -0
  119. package/dist/src/model-profiles.js +568 -0
  120. package/dist/src/model-profiles.js.map +1 -0
  121. package/dist/src/models.d.ts +58 -0
  122. package/dist/src/models.js +327 -0
  123. package/dist/src/models.js.map +1 -0
  124. package/dist/src/narrative.d.ts +54 -0
  125. package/dist/src/narrative.js +163 -0
  126. package/dist/src/narrative.js.map +1 -0
  127. package/dist/src/nextstep.d.ts +16 -0
  128. package/dist/src/nextstep.js +103 -0
  129. package/dist/src/nextstep.js.map +1 -0
  130. package/dist/src/observer.d.ts +18 -0
  131. package/dist/src/observer.js +251 -0
  132. package/dist/src/observer.js.map +1 -0
  133. package/dist/src/outcome.d.ts +110 -0
  134. package/dist/src/outcome.js +377 -0
  135. package/dist/src/outcome.js.map +1 -0
  136. package/dist/src/pipeline.d.ts +167 -0
  137. package/dist/src/pipeline.js +1503 -0
  138. package/dist/src/pipeline.js.map +1 -0
  139. package/dist/src/playbook.d.ts +59 -0
  140. package/dist/src/playbook.js +238 -0
  141. package/dist/src/playbook.js.map +1 -0
  142. package/dist/src/pr-agent.d.ts +97 -0
  143. package/dist/src/pr-agent.js +195 -0
  144. package/dist/src/pr-agent.js.map +1 -0
  145. package/dist/src/predictive.d.ts +57 -0
  146. package/dist/src/predictive.js +230 -0
  147. package/dist/src/predictive.js.map +1 -0
  148. package/dist/src/profile.d.ts +294 -0
  149. package/dist/src/profile.js +1347 -0
  150. package/dist/src/profile.js.map +1 -0
  151. package/dist/src/prompt-audit.d.ts +22 -0
  152. package/dist/src/prompt-audit.js +194 -0
  153. package/dist/src/prompt-audit.js.map +1 -0
  154. package/dist/src/prompt-intel.d.ts +12 -0
  155. package/dist/src/prompt-intel.js +321 -0
  156. package/dist/src/prompt-intel.js.map +1 -0
  157. package/dist/src/provider-context.d.ts +121 -0
  158. package/dist/src/provider-context.js +222 -0
  159. package/dist/src/provider-context.js.map +1 -0
  160. package/dist/src/provider-manager.d.ts +92 -0
  161. package/dist/src/provider-manager.js +428 -0
  162. package/dist/src/provider-manager.js.map +1 -0
  163. package/dist/src/receipt.d.ts +87 -0
  164. package/dist/src/receipt.js +326 -0
  165. package/dist/src/receipt.js.map +1 -0
  166. package/dist/src/recommendations.d.ts +13 -0
  167. package/dist/src/recommendations.js +291 -0
  168. package/dist/src/recommendations.js.map +1 -0
  169. package/dist/src/redact.d.ts +15 -0
  170. package/dist/src/redact.js +129 -0
  171. package/dist/src/redact.js.map +1 -0
  172. package/dist/src/replit.d.ts +397 -0
  173. package/dist/src/replit.js +1160 -0
  174. package/dist/src/replit.js.map +1 -0
  175. package/dist/src/repo.d.ts +149 -0
  176. package/dist/src/repo.js +416 -0
  177. package/dist/src/repo.js.map +1 -0
  178. package/dist/src/revert.d.ts +30 -0
  179. package/dist/src/revert.js +166 -0
  180. package/dist/src/revert.js.map +1 -0
  181. package/dist/src/room.d.ts +102 -0
  182. package/dist/src/room.js +212 -0
  183. package/dist/src/room.js.map +1 -0
  184. package/dist/src/routing-advisor.d.ts +57 -0
  185. package/dist/src/routing-advisor.js +221 -0
  186. package/dist/src/routing-advisor.js.map +1 -0
  187. package/dist/src/self-correct.d.ts +40 -0
  188. package/dist/src/self-correct.js +137 -0
  189. package/dist/src/self-correct.js.map +1 -0
  190. package/dist/src/session-lock.d.ts +35 -0
  191. package/dist/src/session-lock.js +134 -0
  192. package/dist/src/session-lock.js.map +1 -0
  193. package/dist/src/session.d.ts +267 -0
  194. package/dist/src/session.js +1660 -0
  195. package/dist/src/session.js.map +1 -0
  196. package/dist/src/settings-tui.d.ts +5 -0
  197. package/dist/src/settings-tui.js +422 -0
  198. package/dist/src/settings-tui.js.map +1 -0
  199. package/dist/src/setup-flow.d.ts +63 -0
  200. package/dist/src/setup-flow.js +233 -0
  201. package/dist/src/setup-flow.js.map +1 -0
  202. package/dist/src/signal.d.ts +19 -0
  203. package/dist/src/signal.js +122 -0
  204. package/dist/src/signal.js.map +1 -0
  205. package/dist/src/simmer.d.ts +85 -0
  206. package/dist/src/simmer.js +224 -0
  207. package/dist/src/simmer.js.map +1 -0
  208. package/dist/src/state-export.d.ts +129 -0
  209. package/dist/src/state-export.js +233 -0
  210. package/dist/src/state-export.js.map +1 -0
  211. package/dist/src/strategy.d.ts +54 -0
  212. package/dist/src/strategy.js +95 -0
  213. package/dist/src/strategy.js.map +1 -0
  214. package/dist/src/subscription.d.ts +40 -0
  215. package/dist/src/subscription.js +189 -0
  216. package/dist/src/subscription.js.map +1 -0
  217. package/dist/src/templates.d.ts +208 -0
  218. package/dist/src/templates.js +238 -0
  219. package/dist/src/templates.js.map +1 -0
  220. package/dist/src/test.d.ts +9 -0
  221. package/dist/src/test.js +1173 -0
  222. package/dist/src/test.js.map +1 -0
  223. package/dist/src/think-engine.d.ts +67 -0
  224. package/dist/src/think-engine.js +412 -0
  225. package/dist/src/think-engine.js.map +1 -0
  226. package/dist/src/tui.d.ts +71 -0
  227. package/dist/src/tui.js +242 -0
  228. package/dist/src/tui.js.map +1 -0
  229. package/dist/src/types.d.ts +177 -0
  230. package/dist/src/types.js +6 -0
  231. package/dist/src/types.js.map +1 -0
  232. package/dist/src/update-check.d.ts +7 -0
  233. package/dist/src/update-check.js +36 -0
  234. package/dist/src/update-check.js.map +1 -0
  235. package/dist/src/wave-planner.d.ts +30 -0
  236. package/dist/src/wave-planner.js +281 -0
  237. package/dist/src/wave-planner.js.map +1 -0
  238. package/hooks/head-guard.sh +41 -0
  239. package/hooks/precompact.mjs +3 -3
  240. package/hooks/session-end.mjs +3 -3
  241. package/hooks/task-classifier.mjs +328 -0
  242. package/hooks/vibe-router.mjs +387 -0
  243. package/install.mjs +2 -2
  244. package/package.json +29 -153
  245. package/src/agents/registry.mjs +0 -405
  246. package/src/awareness.mjs +0 -425
  247. package/src/brief.mjs +0 -266
  248. package/src/calibration.mjs +0 -148
  249. package/src/checkpoint.mjs +0 -109
  250. package/src/ci-triage.mjs +0 -191
  251. package/src/cognitive-loop.mjs +0 -562
  252. package/src/collaboration.mjs +0 -545
  253. package/src/context-intel.mjs +0 -158
  254. package/src/context.mjs +0 -389
  255. package/src/continuity.mjs +0 -298
  256. package/src/cost-tracker.mjs +0 -184
  257. package/src/debrief.mjs +0 -228
  258. package/src/decide.mjs +0 -1099
  259. package/src/decompose.mjs +0 -331
  260. package/src/detect.mjs +0 -702
  261. package/src/dispatch.mjs +0 -1447
  262. package/src/doctor.mjs +0 -1607
  263. package/src/envelope.mjs +0 -139
  264. package/src/failure-memory.mjs +0 -178
  265. package/src/fx.mjs +0 -276
  266. package/src/governance.mjs +0 -279
  267. package/src/handoff.mjs +0 -87
  268. package/src/head-protocol.mjs +0 -128
  269. package/src/head.mjs +0 -952
  270. package/src/health.mjs +0 -528
  271. package/src/inbox.mjs +0 -195
  272. package/src/index.mjs +0 -44
  273. package/src/install-hooks.mjs +0 -100
  274. package/src/integrity.mjs +0 -245
  275. package/src/intelligence.mjs +0 -447
  276. package/src/ledger.mjs +0 -196
  277. package/src/living-docs.mjs +0 -210
  278. package/src/memory-tiers.mjs +0 -193
  279. package/src/models.mjs +0 -363
  280. package/src/narrative.mjs +0 -169
  281. package/src/nextstep.mjs +0 -100
  282. package/src/observer.mjs +0 -241
  283. package/src/outcome.mjs +0 -400
  284. package/src/pipeline.mjs +0 -1711
  285. package/src/playbook.mjs +0 -257
  286. package/src/pr-agent.mjs +0 -214
  287. package/src/predictive.mjs +0 -250
  288. package/src/profile.mjs +0 -1411
  289. package/src/prompt-audit.mjs +0 -231
  290. package/src/prompt-intel.mjs +0 -325
  291. package/src/provider-context.mjs +0 -257
  292. package/src/receipt.mjs +0 -344
  293. package/src/recommendations.mjs +0 -296
  294. package/src/redact.mjs +0 -192
  295. package/src/replit.mjs +0 -1210
  296. package/src/repo.mjs +0 -445
  297. package/src/revert.mjs +0 -149
  298. package/src/routing-advisor.mjs +0 -204
  299. package/src/self-correct.mjs +0 -147
  300. package/src/session-lock.mjs +0 -160
  301. package/src/session.mjs +0 -1655
  302. package/src/settings-tui.mjs +0 -373
  303. package/src/setup-flow.mjs +0 -223
  304. package/src/signal.mjs +0 -115
  305. package/src/simmer.mjs +0 -241
  306. package/src/strategy.mjs +0 -235
  307. package/src/subscription.mjs +0 -212
  308. package/src/templates.mjs +0 -260
  309. package/src/think-engine.mjs +0 -428
  310. package/src/tui.mjs +0 -276
  311. package/src/update-check.mjs +0 -35
  312. 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 {};