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,195 @@
1
+ // pr-agent.mjs — PR workflow module for dual-brain.
2
+ // Provides issue/task → branch → implement → PR automation using the gh CLI.
3
+ // Exports: hasGitHub, getBranchInfo, createBranch, getDiffSummary, createPR,
4
+ // listPRs, getPRDetails, buildPRBody
5
+ import { execSync } from 'node:child_process';
6
+ /**
7
+ * Check if gh CLI is available and authenticated.
8
+ * @returns {{ available: boolean, authenticated: boolean }}
9
+ */
10
+ export function hasGitHub() {
11
+ try {
12
+ execSync('gh auth status', { stdio: 'pipe', timeout: 5000 });
13
+ return { available: true, authenticated: true };
14
+ }
15
+ catch {
16
+ try {
17
+ execSync('which gh', { stdio: 'pipe', timeout: 2000 });
18
+ return { available: true, authenticated: false };
19
+ }
20
+ catch {
21
+ return { available: false, authenticated: false };
22
+ }
23
+ }
24
+ }
25
+ /**
26
+ * Get current branch info including distance from default branch.
27
+ * @param {string} [cwd]
28
+ * @returns {{ branch: string|null, defaultBranch: string, ahead: number, behind: number, isDefault: boolean }}
29
+ */
30
+ export function getBranchInfo(cwd) {
31
+ const dir = cwd ?? process.cwd();
32
+ try {
33
+ const branch = execSync('git rev-parse --abbrev-ref HEAD', { cwd: dir, encoding: 'utf8', timeout: 3000 }).trim();
34
+ const defaultBranch = execSync('git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo refs/remotes/origin/main', { cwd: dir, encoding: 'utf8', timeout: 3000 }).trim().replace('refs/remotes/origin/', '');
35
+ const ahead = parseInt(execSync(`git rev-list --count ${defaultBranch}..HEAD 2>/dev/null || echo 0`, { cwd: dir, encoding: 'utf8', timeout: 3000 }).trim()) || 0;
36
+ const behind = parseInt(execSync(`git rev-list --count HEAD..${defaultBranch} 2>/dev/null || echo 0`, { cwd: dir, encoding: 'utf8', timeout: 3000 }).trim()) || 0;
37
+ return { branch, defaultBranch, ahead, behind, isDefault: branch === defaultBranch };
38
+ }
39
+ catch {
40
+ return { branch: null, defaultBranch: 'main', ahead: 0, behind: 0, isDefault: true };
41
+ }
42
+ }
43
+ /**
44
+ * Create a feature branch from a task description.
45
+ * Branch name is prefixed with "db/" and slugified from the description.
46
+ * @param {string} taskDescription
47
+ * @param {string} [cwd]
48
+ * @returns {{ success: boolean, branch: string, error?: string }}
49
+ */
50
+ export function createBranch(taskDescription, cwd) {
51
+ const dir = cwd ?? process.cwd();
52
+ const slug = taskDescription
53
+ .toLowerCase()
54
+ .replace(/[^a-z0-9\s-]/g, '')
55
+ .trim()
56
+ .replace(/\s+/g, '-')
57
+ .slice(0, 50);
58
+ const branchName = `db/${slug}`;
59
+ try {
60
+ execSync(`git checkout -b "${branchName}"`, { cwd: dir, stdio: 'pipe', timeout: 5000 });
61
+ return { success: true, branch: branchName };
62
+ }
63
+ catch (err) {
64
+ const msg = err instanceof Error ? err.message : String(err);
65
+ return { success: false, branch: branchName, error: msg };
66
+ }
67
+ }
68
+ /**
69
+ * Get diff summary for PR description generation.
70
+ * @param {string} baseBranch Base branch name (e.g. 'main')
71
+ * @param {string} [cwd]
72
+ * @returns {{ stat: string, files: string[], summary: string, fileCount: number }}
73
+ */
74
+ export function getDiffSummary(baseBranch, cwd) {
75
+ const dir = cwd ?? process.cwd();
76
+ try {
77
+ const stat = execSync(`git diff --stat ${baseBranch}...HEAD`, { cwd: dir, encoding: 'utf8', timeout: 10000 }).trim();
78
+ const files = execSync(`git diff --name-only ${baseBranch}...HEAD`, { cwd: dir, encoding: 'utf8', timeout: 5000 })
79
+ .trim()
80
+ .split('\n')
81
+ .filter(Boolean);
82
+ const summary = execSync(`git diff --shortstat ${baseBranch}...HEAD`, { cwd: dir, encoding: 'utf8', timeout: 5000 }).trim();
83
+ return { stat, files, summary, fileCount: files.length };
84
+ }
85
+ catch {
86
+ return { stat: '', files: [], summary: '', fileCount: 0 };
87
+ }
88
+ }
89
+ /**
90
+ * Create a PR using the gh CLI. Pushes the current branch first.
91
+ * @param {object} opts
92
+ * @param {string} opts.title
93
+ * @param {string} opts.body
94
+ * @param {string} [opts.baseBranch]
95
+ * @param {boolean} [opts.draft]
96
+ * @param {string[]} [opts.labels]
97
+ * @param {string} [opts.cwd]
98
+ * @returns {{ success: boolean, url?: string, error?: string }}
99
+ */
100
+ export function createPR(opts) {
101
+ const { title, body, baseBranch, draft, labels, cwd } = opts;
102
+ const dir = cwd ?? process.cwd();
103
+ try {
104
+ // Push current branch to origin first
105
+ const branch = execSync('git rev-parse --abbrev-ref HEAD', { cwd: dir, encoding: 'utf8', timeout: 3000 }).trim();
106
+ execSync(`git push -u origin "${branch}"`, { cwd: dir, stdio: 'pipe', timeout: 30000 });
107
+ // Build gh pr create args
108
+ const args = ['gh', 'pr', 'create', '--title', JSON.stringify(title), '--body', JSON.stringify(body)];
109
+ if (baseBranch)
110
+ args.push('--base', baseBranch);
111
+ if (draft)
112
+ args.push('--draft');
113
+ if (labels?.length)
114
+ args.push('--label', labels.join(','));
115
+ const result = execSync(args.join(' '), { cwd: dir, encoding: 'utf8', timeout: 30000 });
116
+ const url = result.trim();
117
+ return { success: true, url };
118
+ }
119
+ catch (err) {
120
+ const msg = err instanceof Error ? err.message : String(err);
121
+ return { success: false, error: msg };
122
+ }
123
+ }
124
+ /**
125
+ * List open (or other state) PRs for the current repo.
126
+ * @param {string} [cwd]
127
+ * @param {object} [opts]
128
+ * @param {'open'|'closed'|'merged'|'all'} [opts.state]
129
+ * @param {number} [opts.limit]
130
+ * @returns {object[]}
131
+ */
132
+ export function listPRs(cwd, opts = {}) {
133
+ const dir = cwd ?? process.cwd();
134
+ const { state = 'open', limit = 10 } = opts;
135
+ try {
136
+ const json = execSync(`gh pr list --state ${state} --limit ${limit} --json number,title,headRefName,author,createdAt,isDraft`, { cwd: dir, encoding: 'utf8', timeout: 10000 });
137
+ return JSON.parse(json);
138
+ }
139
+ catch {
140
+ return [];
141
+ }
142
+ }
143
+ /**
144
+ * Get PR details including diff stats, comments, and CI checks.
145
+ * @param {number|string} prNumber
146
+ * @param {string} [cwd]
147
+ * @returns {object|null}
148
+ */
149
+ export function getPRDetails(prNumber, cwd) {
150
+ const dir = cwd ?? process.cwd();
151
+ try {
152
+ const json = execSync(`gh pr view ${prNumber} --json title,body,headRefName,baseRefName,state,additions,deletions,changedFiles,reviews,comments,statusCheckRollup`, { cwd: dir, encoding: 'utf8', timeout: 10000 });
153
+ return JSON.parse(json);
154
+ }
155
+ catch {
156
+ return null;
157
+ }
158
+ }
159
+ /**
160
+ * Build a PR body from a task description and dispatch results.
161
+ * @param {string} taskDescription
162
+ * @param {object} results Dispatch result object (filesChanged, testsRun, decisions, etc.)
163
+ * @returns {string}
164
+ */
165
+ export function buildPRBody(taskDescription, results) {
166
+ const lines = [];
167
+ lines.push('## Summary');
168
+ lines.push(taskDescription);
169
+ lines.push('');
170
+ if (results.filesChanged?.length) {
171
+ lines.push('## Changes');
172
+ for (const f of results.filesChanged) {
173
+ lines.push(`- \`${f}\``);
174
+ }
175
+ lines.push('');
176
+ }
177
+ if (results.testsRun?.length) {
178
+ lines.push('## Tests');
179
+ for (const t of results.testsRun) {
180
+ lines.push(`- ${t}`);
181
+ }
182
+ lines.push('');
183
+ }
184
+ if (results.decisions?.length) {
185
+ lines.push('## Routing');
186
+ for (const d of results.decisions) {
187
+ lines.push(`- ${d}`);
188
+ }
189
+ lines.push('');
190
+ }
191
+ lines.push('---');
192
+ lines.push('Generated by [dual-brain](https://npmjs.com/package/dual-brain)');
193
+ return lines.join('\n');
194
+ }
195
+ //# sourceMappingURL=pr-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-agent.js","sourceRoot":"","sources":["../../src/pr-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ interface SessionPatterns {
2
+ frequencies: Array<{
3
+ type: string;
4
+ count: number;
5
+ }>;
6
+ avgSeverity: number;
7
+ precedingTools: Record<string, string[]>;
8
+ timeTrends: Array<{
9
+ type: string;
10
+ position: number;
11
+ }>;
12
+ }
13
+ export declare function loadSessionPatterns(): SessionPatterns;
14
+ interface AgentSpec {
15
+ objective?: string;
16
+ scope?: {
17
+ files?: string[];
18
+ };
19
+ tier?: string;
20
+ }
21
+ interface PredictionContext {
22
+ patterns?: SessionPatterns;
23
+ priorFailures?: Array<{
24
+ objective?: string;
25
+ }>;
26
+ activeWaves?: Array<{
27
+ output?: string;
28
+ }>;
29
+ lastReadAge?: number;
30
+ priorSearchWave?: boolean;
31
+ }
32
+ interface Prediction {
33
+ mode: string;
34
+ likelihood: number;
35
+ basis: string;
36
+ prevention: string;
37
+ }
38
+ export declare function predictFailureModes(agentSpec: AgentSpec, context?: PredictionContext): Prediction[];
39
+ export declare function generatePreventions(predictions: Prediction[]): string;
40
+ interface WavePlan {
41
+ completedSearchWave?: boolean;
42
+ unresolvedBlockers?: string[];
43
+ }
44
+ interface ReadinessScore {
45
+ ready: boolean;
46
+ score: number;
47
+ blockers: string[];
48
+ warnings: string[];
49
+ suggestion: string;
50
+ }
51
+ export declare function scoreDispatchReadiness(agentSpec: AgentSpec, wavePlan?: WavePlan, predictions?: Prediction[]): ReadinessScore;
52
+ interface Debrief {
53
+ issues?: string[];
54
+ patterns?: string[];
55
+ }
56
+ export declare function evolvePatterns(newDebrief: Debrief, predictions: Prediction[]): void;
57
+ export {};
@@ -0,0 +1,230 @@
1
+ /** Predictive Dispatch — Layer 3: anticipates failure modes BEFORE dispatching. */
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
3
+ import { join } from 'path';
4
+ const DIAG_DIR = join(process.cwd(), '.dualbrain', 'diagnostic');
5
+ const STATE_PATH = join(DIAG_DIR, 'current.json');
6
+ const WEIGHTS_PATH = join(DIAG_DIR, 'pattern-weights.json');
7
+ export function loadSessionPatterns() {
8
+ const empty = { frequencies: [], avgSeverity: 0, precedingTools: {}, timeTrends: [] };
9
+ if (!existsSync(STATE_PATH))
10
+ return empty;
11
+ let state;
12
+ try {
13
+ state = JSON.parse(readFileSync(STATE_PATH, 'utf8'));
14
+ }
15
+ catch {
16
+ return empty;
17
+ }
18
+ const noticings = state.noticings || [];
19
+ if (!noticings.length)
20
+ return empty;
21
+ const counts = {};
22
+ const severityMap = { low: 1, medium: 2, high: 3 };
23
+ let totalSeverity = 0;
24
+ for (const n of noticings) {
25
+ counts[n.type] = (counts[n.type] || 0) + 1;
26
+ totalSeverity += severityMap[n.severity] || 1;
27
+ }
28
+ const frequencies = Object.entries(counts)
29
+ .map(([type, count]) => ({ type, count }))
30
+ .sort((a, b) => b.count - a.count);
31
+ const toolCalls = state.toolCalls || [];
32
+ const precedingTools = {};
33
+ for (const n of noticings) {
34
+ const before = toolCalls.filter(tc => tc.ts < n.ts).slice(-3).map(tc => tc.tool);
35
+ if (!precedingTools[n.type])
36
+ precedingTools[n.type] = [];
37
+ precedingTools[n.type].push(...before);
38
+ }
39
+ const sessionStart = state.startedAt || noticings[0]?.ts || 0;
40
+ const sessionEnd = state.lastActivity || noticings[noticings.length - 1]?.ts || Date.now();
41
+ const duration = sessionEnd - sessionStart || 1;
42
+ const timeTrends = noticings.map(n => ({
43
+ type: n.type, position: (n.ts - sessionStart) / duration,
44
+ }));
45
+ return { frequencies, avgSeverity: totalSeverity / noticings.length, precedingTools, timeTrends };
46
+ }
47
+ function loadWeights() {
48
+ if (!existsSync(WEIGHTS_PATH))
49
+ return {};
50
+ try {
51
+ return JSON.parse(readFileSync(WEIGHTS_PATH, 'utf8'));
52
+ }
53
+ catch {
54
+ return {};
55
+ }
56
+ }
57
+ export function predictFailureModes(agentSpec, context = {}) {
58
+ const predictions = [];
59
+ const patterns = context.patterns || loadSessionPatterns();
60
+ const weights = loadWeights();
61
+ const objective = agentSpec.objective || '';
62
+ const scope = agentSpec.scope || {};
63
+ const files = scope.files || [];
64
+ const tier = agentSpec.tier || '';
65
+ const priorFailures = context.priorFailures || [];
66
+ const activeWaves = context.activeWaves || [];
67
+ const lastReadAge = context.lastReadAge || 0; // ms
68
+ const applyWeight = (mode, base) => {
69
+ const w = weights[mode];
70
+ if (!w)
71
+ return base;
72
+ // Shift likelihood based on historical accuracy
73
+ return Math.min(1, Math.max(0, base + (w.accuracy - 0.5) * 0.3));
74
+ };
75
+ // scope-explosion
76
+ const multiTarget = files.length > 3 || /\band\b|multiple|several|all/i.test(objective);
77
+ const priorScopeCreep = patterns.frequencies.some(f => f.type === 'scope-creep' && f.count >= 2);
78
+ if (multiTarget || priorScopeCreep) {
79
+ const base = multiTarget && priorScopeCreep ? 0.8 : 0.7;
80
+ predictions.push({
81
+ mode: 'scope-explosion',
82
+ likelihood: applyWeight('scope-explosion', base),
83
+ basis: multiTarget
84
+ ? `Objective references ${files.length || 'multiple'} targets`
85
+ : 'Prior waves encountered scope creep',
86
+ prevention: `If scope grows beyond ${Math.max(files.length, 3)} files, STOP and report back rather than continuing.`,
87
+ });
88
+ }
89
+ // missing-context
90
+ const noFiles = files.length === 0;
91
+ const executeWithoutSearch = tier === 'execute' && !(context.priorSearchWave);
92
+ if (noFiles || executeWithoutSearch) {
93
+ const base = 0.6;
94
+ predictions.push({
95
+ mode: 'missing-context',
96
+ likelihood: applyWeight('missing-context', base),
97
+ basis: noFiles
98
+ ? 'No files specified in scope — agent may waste tokens searching'
99
+ : 'Execute tier dispatched without prior search wave',
100
+ prevention: `Read the current state of target files before making changes. If unsure what to modify, list candidates first.`,
101
+ });
102
+ }
103
+ // wrong-approach
104
+ const hasStuckLoop = patterns.frequencies.some(f => f.type === 'stuck-loop' && f.count >= 2);
105
+ const objectiveFailed = priorFailures.some(f => f.objective && objective.toLowerCase().includes(f.objective.toLowerCase().slice(0, 20)));
106
+ if (hasStuckLoop || objectiveFailed) {
107
+ const base = objectiveFailed ? 0.8 : 0.6;
108
+ predictions.push({
109
+ mode: 'wrong-approach',
110
+ likelihood: applyWeight('wrong-approach', base),
111
+ basis: objectiveFailed
112
+ ? 'Prior attempt at this objective failed'
113
+ : 'Diagnostic shows stuck-loop pattern in session',
114
+ prevention: `Try a fundamentally different approach than previous attempts. If stuck after 2 tries, report back with what was tried.`,
115
+ });
116
+ }
117
+ // blocked-dependency
118
+ const refsOtherWave = activeWaves.some(w => objective.toLowerCase().includes(w.output?.toLowerCase()?.slice(0, 20) || '___none'));
119
+ if (refsOtherWave) {
120
+ predictions.push({
121
+ mode: 'blocked-dependency',
122
+ likelihood: applyWeight('blocked-dependency', 0.5),
123
+ basis: 'Objective references output from an in-progress wave',
124
+ prevention: `If blocked by a dependency from another wave, pivot to independent work or report the blocker.`,
125
+ });
126
+ }
127
+ // stale-assumption
128
+ if (lastReadAge > 5 * 60 * 1000 && files.length > 0) {
129
+ predictions.push({
130
+ mode: 'stale-assumption',
131
+ likelihood: applyWeight('stale-assumption', 0.4),
132
+ basis: `Files in scope were last read ${Math.round(lastReadAge / 60000)}m ago — may have changed`,
133
+ prevention: `Re-read ${files.slice(0, 3).join(', ')} before assuming current state.`,
134
+ });
135
+ }
136
+ return predictions;
137
+ }
138
+ export function generatePreventions(predictions) {
139
+ const actionable = predictions
140
+ .filter(p => p.likelihood >= 0.4)
141
+ .sort((a, b) => b.likelihood - a.likelihood)
142
+ .slice(0, 5);
143
+ if (!actionable.length)
144
+ return '';
145
+ const lines = actionable.map(p => `- [${p.prevention}]`);
146
+ return `⚠ Pre-flight awareness:\n${lines.join('\n')}`;
147
+ }
148
+ export function scoreDispatchReadiness(agentSpec, wavePlan = {}, predictions = []) {
149
+ const blockers = [];
150
+ const warnings = [];
151
+ let score = 1.0;
152
+ const files = agentSpec.scope?.files || [];
153
+ const priorSearch = wavePlan.completedSearchWave || false;
154
+ const hasContext = files.length > 0 || priorSearch;
155
+ // Scope researched?
156
+ if (!hasContext) {
157
+ blockers.push('No files in scope and no prior search wave — context unknown');
158
+ score -= 0.3;
159
+ }
160
+ // High-likelihood predictions
161
+ const highRisk = predictions.filter(p => p.likelihood >= 0.7);
162
+ const medRisk = predictions.filter(p => p.likelihood >= 0.4 && p.likelihood < 0.7);
163
+ for (const p of highRisk) {
164
+ blockers.push(`High-risk: ${p.mode} (${Math.round(p.likelihood * 100)}%) — ${p.basis}`);
165
+ score -= 0.25;
166
+ }
167
+ for (const p of medRisk) {
168
+ warnings.push(`${p.mode} (${Math.round(p.likelihood * 100)}%) — ${p.basis}`);
169
+ score -= 0.1;
170
+ }
171
+ // Unresolved blockers from prior waves
172
+ const unresolvedBlockers = wavePlan.unresolvedBlockers || [];
173
+ for (const b of unresolvedBlockers) {
174
+ blockers.push(`Unresolved from prior wave: ${b}`);
175
+ score -= 0.2;
176
+ }
177
+ score = Math.max(0, Math.min(1, score));
178
+ const ready = score >= 0.5 && blockers.length === 0;
179
+ let suggestion = '';
180
+ if (!ready) {
181
+ if (blockers.some(b => b.includes('context unknown'))) {
182
+ suggestion = 'Run a search/read wave first to establish context before executing.';
183
+ }
184
+ else if (highRisk.length) {
185
+ suggestion = `Address high-risk predictions: ${highRisk.map(p => p.mode).join(', ')}. Add preventions to prompt or restructure scope.`;
186
+ }
187
+ else {
188
+ suggestion = 'Resolve listed blockers before dispatching.';
189
+ }
190
+ }
191
+ return { ready, score, blockers, warnings, suggestion };
192
+ }
193
+ export function evolvePatterns(newDebrief, predictions) {
194
+ const weights = loadWeights();
195
+ for (const pred of predictions) {
196
+ if (!weights[pred.mode]) {
197
+ weights[pred.mode] = { correct: 0, incorrect: 0, accuracy: 0.5 };
198
+ }
199
+ const w = weights[pred.mode];
200
+ const occurred = debriefContainsPattern(newDebrief, pred.mode);
201
+ if (occurred && pred.likelihood >= 0.4) {
202
+ w.correct++;
203
+ }
204
+ else if (!occurred && pred.likelihood >= 0.4) {
205
+ w.incorrect++;
206
+ }
207
+ else if (occurred && pred.likelihood < 0.4) {
208
+ // Missed prediction — we should have predicted higher
209
+ w.incorrect++;
210
+ }
211
+ const total = w.correct + w.incorrect;
212
+ w.accuracy = total > 0 ? w.correct / total : 0.5;
213
+ }
214
+ mkdirSync(DIAG_DIR, { recursive: true });
215
+ writeFileSync(WEIGHTS_PATH, JSON.stringify(weights, null, 2));
216
+ }
217
+ function debriefContainsPattern(debrief, mode) {
218
+ if (!debrief)
219
+ return false;
220
+ const modeMap = {
221
+ 'scope-explosion': ['scope-creep', 'scope_explosion', 'expanded'],
222
+ 'missing-context': ['missing-context', 'no_context', 'searched'],
223
+ 'wrong-approach': ['stuck-loop', 'wrong_approach', 'retry'],
224
+ 'blocked-dependency': ['blocked', 'dependency', 'waiting'],
225
+ 'stale-assumption': ['stale', 'outdated', 'changed'],
226
+ };
227
+ const text = JSON.stringify([...(debrief.issues || []), ...(debrief.patterns || [])]).toLowerCase();
228
+ return (modeMap[mode] || [mode]).some(k => text.includes(k));
229
+ }
230
+ //# sourceMappingURL=predictive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predictive.js","sourceRoot":"","sources":["../../src/predictive.ts"],"names":[],"mappings":"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"}