dual-brain 0.2.30 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) 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/task-classifier.mjs +328 -0
  240. package/hooks/vibe-router.mjs +387 -0
  241. package/package.json +29 -153
  242. package/src/agents/registry.mjs +0 -405
  243. package/src/awareness.mjs +0 -425
  244. package/src/brief.mjs +0 -266
  245. package/src/calibration.mjs +0 -148
  246. package/src/checkpoint.mjs +0 -109
  247. package/src/ci-triage.mjs +0 -191
  248. package/src/cognitive-loop.mjs +0 -562
  249. package/src/collaboration.mjs +0 -545
  250. package/src/context-intel.mjs +0 -158
  251. package/src/context.mjs +0 -389
  252. package/src/continuity.mjs +0 -298
  253. package/src/cost-tracker.mjs +0 -184
  254. package/src/debrief.mjs +0 -228
  255. package/src/decide.mjs +0 -1099
  256. package/src/decompose.mjs +0 -331
  257. package/src/detect.mjs +0 -702
  258. package/src/dispatch.mjs +0 -1447
  259. package/src/doctor.mjs +0 -1607
  260. package/src/envelope.mjs +0 -139
  261. package/src/failure-memory.mjs +0 -178
  262. package/src/fx.mjs +0 -276
  263. package/src/governance.mjs +0 -279
  264. package/src/handoff.mjs +0 -87
  265. package/src/head-protocol.mjs +0 -128
  266. package/src/head.mjs +0 -952
  267. package/src/health.mjs +0 -528
  268. package/src/inbox.mjs +0 -195
  269. package/src/index.mjs +0 -44
  270. package/src/install-hooks.mjs +0 -100
  271. package/src/integrity.mjs +0 -245
  272. package/src/intelligence.mjs +0 -447
  273. package/src/ledger.mjs +0 -196
  274. package/src/living-docs.mjs +0 -210
  275. package/src/memory-tiers.mjs +0 -193
  276. package/src/models.mjs +0 -363
  277. package/src/narrative.mjs +0 -169
  278. package/src/nextstep.mjs +0 -100
  279. package/src/observer.mjs +0 -241
  280. package/src/outcome.mjs +0 -400
  281. package/src/pipeline.mjs +0 -1711
  282. package/src/playbook.mjs +0 -257
  283. package/src/pr-agent.mjs +0 -214
  284. package/src/predictive.mjs +0 -250
  285. package/src/profile.mjs +0 -1411
  286. package/src/prompt-audit.mjs +0 -231
  287. package/src/prompt-intel.mjs +0 -325
  288. package/src/provider-context.mjs +0 -257
  289. package/src/receipt.mjs +0 -344
  290. package/src/recommendations.mjs +0 -296
  291. package/src/redact.mjs +0 -192
  292. package/src/replit.mjs +0 -1210
  293. package/src/repo.mjs +0 -445
  294. package/src/revert.mjs +0 -149
  295. package/src/routing-advisor.mjs +0 -204
  296. package/src/self-correct.mjs +0 -147
  297. package/src/session-lock.mjs +0 -160
  298. package/src/session.mjs +0 -1655
  299. package/src/settings-tui.mjs +0 -373
  300. package/src/setup-flow.mjs +0 -223
  301. package/src/signal.mjs +0 -115
  302. package/src/simmer.mjs +0 -241
  303. package/src/strategy.mjs +0 -235
  304. package/src/subscription.mjs +0 -212
  305. package/src/templates.mjs +0 -260
  306. package/src/think-engine.mjs +0 -428
  307. package/src/tui.mjs +0 -276
  308. package/src/update-check.mjs +0 -35
  309. 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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"}