@agimon-ai/doompi 0.0.1-alpha.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 (448) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +546 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  4. package/dist/bin/cli.cjs +3 -0
  5. package/dist/bin/cli.cjs.map +1 -0
  6. package/dist/bin/cli.d.cts +1 -0
  7. package/dist/bin/cli.d.mts +1 -0
  8. package/dist/bin/cli.mjs +3 -0
  9. package/dist/bin/cli.mjs.map +1 -0
  10. package/dist/bin/doomRunner.cjs +3 -0
  11. package/dist/bin/doomRunner.cjs.map +1 -0
  12. package/dist/bin/doomRunner.d.cts +1 -0
  13. package/dist/bin/doomRunner.d.mts +1 -0
  14. package/dist/bin/doomRunner.mjs +3 -0
  15. package/dist/bin/doomRunner.mjs.map +1 -0
  16. package/dist/cli/cliApp.cjs +2 -0
  17. package/dist/cli/cliApp.cjs.map +1 -0
  18. package/dist/cli/cliApp.d.cts +50 -0
  19. package/dist/cli/cliApp.d.cts.map +1 -0
  20. package/dist/cli/cliApp.d.mts +50 -0
  21. package/dist/cli/cliApp.d.mts.map +1 -0
  22. package/dist/cli/cliApp.mjs +2 -0
  23. package/dist/cli/cliApp.mjs.map +1 -0
  24. package/dist/cli/compatibilityOptions.cjs +2 -0
  25. package/dist/cli/compatibilityOptions.cjs.map +1 -0
  26. package/dist/cli/compatibilityOptions.d.cts +15 -0
  27. package/dist/cli/compatibilityOptions.d.cts.map +1 -0
  28. package/dist/cli/compatibilityOptions.d.mts +15 -0
  29. package/dist/cli/compatibilityOptions.d.mts.map +1 -0
  30. package/dist/cli/compatibilityOptions.mjs +2 -0
  31. package/dist/cli/compatibilityOptions.mjs.map +1 -0
  32. package/dist/cli/help.cjs +61 -0
  33. package/dist/cli/help.cjs.map +1 -0
  34. package/dist/cli/help.d.cts +6 -0
  35. package/dist/cli/help.d.cts.map +1 -0
  36. package/dist/cli/help.d.mts +6 -0
  37. package/dist/cli/help.d.mts.map +1 -0
  38. package/dist/cli/help.mjs +61 -0
  39. package/dist/cli/help.mjs.map +1 -0
  40. package/dist/cli/index.cjs +1 -0
  41. package/dist/cli/index.d.cts +5 -0
  42. package/dist/cli/index.d.mts +5 -0
  43. package/dist/cli/index.mjs +1 -0
  44. package/dist/cli/matrixOptions.cjs +2 -0
  45. package/dist/cli/matrixOptions.cjs.map +1 -0
  46. package/dist/cli/matrixOptions.d.cts +99 -0
  47. package/dist/cli/matrixOptions.d.cts.map +1 -0
  48. package/dist/cli/matrixOptions.d.mts +99 -0
  49. package/dist/cli/matrixOptions.d.mts.map +1 -0
  50. package/dist/cli/matrixOptions.mjs +2 -0
  51. package/dist/cli/matrixOptions.mjs.map +1 -0
  52. package/dist/cli/options.cjs +2 -0
  53. package/dist/cli/options.cjs.map +1 -0
  54. package/dist/cli/options.d.cts +7 -0
  55. package/dist/cli/options.d.cts.map +1 -0
  56. package/dist/cli/options.d.mts +7 -0
  57. package/dist/cli/options.d.mts.map +1 -0
  58. package/dist/cli/options.mjs +2 -0
  59. package/dist/cli/options.mjs.map +1 -0
  60. package/dist/commands/baseCommand.cjs +2 -0
  61. package/dist/commands/baseCommand.cjs.map +1 -0
  62. package/dist/commands/baseCommand.d.cts +36 -0
  63. package/dist/commands/baseCommand.d.cts.map +1 -0
  64. package/dist/commands/baseCommand.d.mts +36 -0
  65. package/dist/commands/baseCommand.d.mts.map +1 -0
  66. package/dist/commands/baseCommand.mjs +2 -0
  67. package/dist/commands/baseCommand.mjs.map +1 -0
  68. package/dist/commands/compatibilityCommand.cjs +2 -0
  69. package/dist/commands/compatibilityCommand.cjs.map +1 -0
  70. package/dist/commands/compatibilityCommand.d.cts +14 -0
  71. package/dist/commands/compatibilityCommand.d.cts.map +1 -0
  72. package/dist/commands/compatibilityCommand.d.mts +14 -0
  73. package/dist/commands/compatibilityCommand.d.mts.map +1 -0
  74. package/dist/commands/compatibilityCommand.mjs +2 -0
  75. package/dist/commands/compatibilityCommand.mjs.map +1 -0
  76. package/dist/commands/emitMcpCommand.cjs +2 -0
  77. package/dist/commands/emitMcpCommand.cjs.map +1 -0
  78. package/dist/commands/emitMcpCommand.d.cts +19 -0
  79. package/dist/commands/emitMcpCommand.d.cts.map +1 -0
  80. package/dist/commands/emitMcpCommand.d.mts +19 -0
  81. package/dist/commands/emitMcpCommand.d.mts.map +1 -0
  82. package/dist/commands/emitMcpCommand.mjs +2 -0
  83. package/dist/commands/emitMcpCommand.mjs.map +1 -0
  84. package/dist/commands/explainCommand.cjs +21 -0
  85. package/dist/commands/explainCommand.cjs.map +1 -0
  86. package/dist/commands/explainCommand.d.cts +63 -0
  87. package/dist/commands/explainCommand.d.cts.map +1 -0
  88. package/dist/commands/explainCommand.d.mts +63 -0
  89. package/dist/commands/explainCommand.d.mts.map +1 -0
  90. package/dist/commands/explainCommand.mjs +21 -0
  91. package/dist/commands/explainCommand.mjs.map +1 -0
  92. package/dist/commands/index.cjs +1 -0
  93. package/dist/commands/index.d.cts +8 -0
  94. package/dist/commands/index.d.mts +8 -0
  95. package/dist/commands/index.mjs +1 -0
  96. package/dist/commands/initCommand.cjs +3 -0
  97. package/dist/commands/initCommand.cjs.map +1 -0
  98. package/dist/commands/initCommand.d.cts +11 -0
  99. package/dist/commands/initCommand.d.cts.map +1 -0
  100. package/dist/commands/initCommand.d.mts +11 -0
  101. package/dist/commands/initCommand.d.mts.map +1 -0
  102. package/dist/commands/initCommand.mjs +3 -0
  103. package/dist/commands/initCommand.mjs.map +1 -0
  104. package/dist/commands/launchCommand.cjs +2 -0
  105. package/dist/commands/launchCommand.cjs.map +1 -0
  106. package/dist/commands/launchCommand.d.cts +31 -0
  107. package/dist/commands/launchCommand.d.cts.map +1 -0
  108. package/dist/commands/launchCommand.d.mts +31 -0
  109. package/dist/commands/launchCommand.d.mts.map +1 -0
  110. package/dist/commands/launchCommand.mjs +2 -0
  111. package/dist/commands/launchCommand.mjs.map +1 -0
  112. package/dist/commands/syncCommand.cjs +6 -0
  113. package/dist/commands/syncCommand.cjs.map +1 -0
  114. package/dist/commands/syncCommand.d.cts +37 -0
  115. package/dist/commands/syncCommand.d.cts.map +1 -0
  116. package/dist/commands/syncCommand.d.mts +37 -0
  117. package/dist/commands/syncCommand.d.mts.map +1 -0
  118. package/dist/commands/syncCommand.mjs +6 -0
  119. package/dist/commands/syncCommand.mjs.map +1 -0
  120. package/dist/config/harnessState.cjs +2 -0
  121. package/dist/config/harnessState.cjs.map +1 -0
  122. package/dist/config/harnessState.d.cts +24 -0
  123. package/dist/config/harnessState.d.cts.map +1 -0
  124. package/dist/config/harnessState.d.mts +24 -0
  125. package/dist/config/harnessState.d.mts.map +1 -0
  126. package/dist/config/harnessState.mjs +2 -0
  127. package/dist/config/harnessState.mjs.map +1 -0
  128. package/dist/config/index.cjs +1 -0
  129. package/dist/config/index.d.cts +7 -0
  130. package/dist/config/index.d.mts +7 -0
  131. package/dist/config/index.mjs +1 -0
  132. package/dist/config/projectTrust.cjs +2 -0
  133. package/dist/config/projectTrust.cjs.map +1 -0
  134. package/dist/config/projectTrust.d.cts +14 -0
  135. package/dist/config/projectTrust.d.cts.map +1 -0
  136. package/dist/config/projectTrust.d.mts +14 -0
  137. package/dist/config/projectTrust.d.mts.map +1 -0
  138. package/dist/config/projectTrust.mjs +2 -0
  139. package/dist/config/projectTrust.mjs.map +1 -0
  140. package/dist/entries/autoStop.cjs +2 -0
  141. package/dist/entries/autoStop.cjs.map +1 -0
  142. package/dist/entries/autoStop.d.cts +6 -0
  143. package/dist/entries/autoStop.d.cts.map +1 -0
  144. package/dist/entries/autoStop.d.mts +7 -0
  145. package/dist/entries/autoStop.d.mts.map +1 -0
  146. package/dist/entries/autoStop.mjs +2 -0
  147. package/dist/entries/autoStop.mjs.map +1 -0
  148. package/dist/entries/components/matrixPicker.cjs +2 -0
  149. package/dist/entries/components/matrixPicker.cjs.map +1 -0
  150. package/dist/entries/components/matrixPicker.d.cts +55 -0
  151. package/dist/entries/components/matrixPicker.d.cts.map +1 -0
  152. package/dist/entries/components/matrixPicker.d.mts +55 -0
  153. package/dist/entries/components/matrixPicker.d.mts.map +1 -0
  154. package/dist/entries/components/matrixPicker.mjs +2 -0
  155. package/dist/entries/components/matrixPicker.mjs.map +1 -0
  156. package/dist/entries/components/skillsOverlay.cjs +4 -0
  157. package/dist/entries/components/skillsOverlay.cjs.map +1 -0
  158. package/dist/entries/components/skillsOverlay.d.cts +58 -0
  159. package/dist/entries/components/skillsOverlay.d.cts.map +1 -0
  160. package/dist/entries/components/skillsOverlay.d.mts +58 -0
  161. package/dist/entries/components/skillsOverlay.d.mts.map +1 -0
  162. package/dist/entries/components/skillsOverlay.mjs +4 -0
  163. package/dist/entries/components/skillsOverlay.mjs.map +1 -0
  164. package/dist/entries/domains.cjs +2 -0
  165. package/dist/entries/domains.cjs.map +1 -0
  166. package/dist/entries/domains.d.cts +10 -0
  167. package/dist/entries/domains.d.cts.map +1 -0
  168. package/dist/entries/domains.d.mts +10 -0
  169. package/dist/entries/domains.d.mts.map +1 -0
  170. package/dist/entries/domains.mjs +2 -0
  171. package/dist/entries/domains.mjs.map +1 -0
  172. package/dist/entries/doom.cjs +2 -0
  173. package/dist/entries/doom.cjs.map +1 -0
  174. package/dist/entries/doom.d.cts +13 -0
  175. package/dist/entries/doom.d.cts.map +1 -0
  176. package/dist/entries/doom.d.mts +14 -0
  177. package/dist/entries/doom.d.mts.map +1 -0
  178. package/dist/entries/doom.mjs +2 -0
  179. package/dist/entries/doom.mjs.map +1 -0
  180. package/dist/entries/effort.cjs +2 -0
  181. package/dist/entries/effort.cjs.map +1 -0
  182. package/dist/entries/effort.d.cts +10 -0
  183. package/dist/entries/effort.d.cts.map +1 -0
  184. package/dist/entries/effort.d.mts +10 -0
  185. package/dist/entries/effort.d.mts.map +1 -0
  186. package/dist/entries/effort.mjs +2 -0
  187. package/dist/entries/effort.mjs.map +1 -0
  188. package/dist/entries/majorMode.cjs +6 -0
  189. package/dist/entries/majorMode.cjs.map +1 -0
  190. package/dist/entries/majorMode.d.cts +29 -0
  191. package/dist/entries/majorMode.d.cts.map +1 -0
  192. package/dist/entries/majorMode.d.mts +29 -0
  193. package/dist/entries/majorMode.d.mts.map +1 -0
  194. package/dist/entries/majorMode.mjs +6 -0
  195. package/dist/entries/majorMode.mjs.map +1 -0
  196. package/dist/entries/notifications.cjs +2 -0
  197. package/dist/entries/notifications.cjs.map +1 -0
  198. package/dist/entries/notifications.d.cts +13 -0
  199. package/dist/entries/notifications.d.cts.map +1 -0
  200. package/dist/entries/notifications.d.mts +13 -0
  201. package/dist/entries/notifications.d.mts.map +1 -0
  202. package/dist/entries/notifications.mjs +2 -0
  203. package/dist/entries/notifications.mjs.map +1 -0
  204. package/dist/entries/ollamaProvider.cjs +2 -0
  205. package/dist/entries/ollamaProvider.cjs.map +1 -0
  206. package/dist/entries/ollamaProvider.d.cts +6 -0
  207. package/dist/entries/ollamaProvider.d.cts.map +1 -0
  208. package/dist/entries/ollamaProvider.d.mts +7 -0
  209. package/dist/entries/ollamaProvider.d.mts.map +1 -0
  210. package/dist/entries/ollamaProvider.mjs +2 -0
  211. package/dist/entries/ollamaProvider.mjs.map +1 -0
  212. package/dist/entries/persona.cjs +2 -0
  213. package/dist/entries/persona.cjs.map +1 -0
  214. package/dist/entries/persona.d.cts +14 -0
  215. package/dist/entries/persona.d.cts.map +1 -0
  216. package/dist/entries/persona.d.mts +15 -0
  217. package/dist/entries/persona.d.mts.map +1 -0
  218. package/dist/entries/persona.mjs +2 -0
  219. package/dist/entries/persona.mjs.map +1 -0
  220. package/dist/entries/profile.cjs +3 -0
  221. package/dist/entries/profile.cjs.map +1 -0
  222. package/dist/entries/profile.d.cts +16 -0
  223. package/dist/entries/profile.d.cts.map +1 -0
  224. package/dist/entries/profile.d.mts +16 -0
  225. package/dist/entries/profile.d.mts.map +1 -0
  226. package/dist/entries/profile.mjs +3 -0
  227. package/dist/entries/profile.mjs.map +1 -0
  228. package/dist/entries/repositoryHooks.cjs +9 -0
  229. package/dist/entries/repositoryHooks.cjs.map +1 -0
  230. package/dist/entries/repositoryHooks.d.cts +7 -0
  231. package/dist/entries/repositoryHooks.d.cts.map +1 -0
  232. package/dist/entries/repositoryHooks.d.mts +8 -0
  233. package/dist/entries/repositoryHooks.d.mts.map +1 -0
  234. package/dist/entries/repositoryHooks.mjs +9 -0
  235. package/dist/entries/repositoryHooks.mjs.map +1 -0
  236. package/dist/entries/skills.cjs +2 -0
  237. package/dist/entries/skills.cjs.map +1 -0
  238. package/dist/entries/skills.d.cts +34 -0
  239. package/dist/entries/skills.d.cts.map +1 -0
  240. package/dist/entries/skills.d.mts +34 -0
  241. package/dist/entries/skills.d.mts.map +1 -0
  242. package/dist/entries/skills.mjs +2 -0
  243. package/dist/entries/skills.mjs.map +1 -0
  244. package/dist/entries/styleSystem.cjs +4 -0
  245. package/dist/entries/styleSystem.cjs.map +1 -0
  246. package/dist/entries/styleSystem.d.cts +32 -0
  247. package/dist/entries/styleSystem.d.cts.map +1 -0
  248. package/dist/entries/styleSystem.d.mts +32 -0
  249. package/dist/entries/styleSystem.d.mts.map +1 -0
  250. package/dist/entries/styleSystem.mjs +4 -0
  251. package/dist/entries/styleSystem.mjs.map +1 -0
  252. package/dist/index.cjs +1 -0
  253. package/dist/index.d.cts +34 -0
  254. package/dist/index.d.mts +34 -0
  255. package/dist/index.mjs +1 -0
  256. package/dist/interfaces/compatibility.d.cts +23 -0
  257. package/dist/interfaces/compatibility.d.cts.map +1 -0
  258. package/dist/interfaces/compatibility.d.mts +23 -0
  259. package/dist/interfaces/compatibility.d.mts.map +1 -0
  260. package/dist/interfaces/harness.d.cts +83 -0
  261. package/dist/interfaces/harness.d.cts.map +1 -0
  262. package/dist/interfaces/harness.d.mts +83 -0
  263. package/dist/interfaces/harness.d.mts.map +1 -0
  264. package/dist/logSinkTelemetry.cjs +2 -0
  265. package/dist/logSinkTelemetry.cjs.map +1 -0
  266. package/dist/logSinkTelemetry.d.cts +49 -0
  267. package/dist/logSinkTelemetry.d.cts.map +1 -0
  268. package/dist/logSinkTelemetry.d.mts +49 -0
  269. package/dist/logSinkTelemetry.d.mts.map +1 -0
  270. package/dist/logSinkTelemetry.mjs +2 -0
  271. package/dist/logSinkTelemetry.mjs.map +1 -0
  272. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs +2 -0
  273. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs.map +1 -0
  274. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs +2 -0
  275. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs.map +1 -0
  276. package/dist/services/compatibility/antigravity.cjs +2 -0
  277. package/dist/services/compatibility/antigravity.cjs.map +1 -0
  278. package/dist/services/compatibility/antigravity.d.cts +11 -0
  279. package/dist/services/compatibility/antigravity.d.cts.map +1 -0
  280. package/dist/services/compatibility/antigravity.d.mts +11 -0
  281. package/dist/services/compatibility/antigravity.d.mts.map +1 -0
  282. package/dist/services/compatibility/antigravity.mjs +2 -0
  283. package/dist/services/compatibility/antigravity.mjs.map +1 -0
  284. package/dist/services/compatibility/codex.cjs +2 -0
  285. package/dist/services/compatibility/codex.cjs.map +1 -0
  286. package/dist/services/compatibility/codex.d.cts +19 -0
  287. package/dist/services/compatibility/codex.d.cts.map +1 -0
  288. package/dist/services/compatibility/codex.d.mts +19 -0
  289. package/dist/services/compatibility/codex.d.mts.map +1 -0
  290. package/dist/services/compatibility/codex.mjs +2 -0
  291. package/dist/services/compatibility/codex.mjs.map +1 -0
  292. package/dist/services/compatibility/index.cjs +2 -0
  293. package/dist/services/compatibility/index.cjs.map +1 -0
  294. package/dist/services/compatibility/index.d.cts +16 -0
  295. package/dist/services/compatibility/index.d.cts.map +1 -0
  296. package/dist/services/compatibility/index.d.mts +16 -0
  297. package/dist/services/compatibility/index.d.mts.map +1 -0
  298. package/dist/services/compatibility/index.mjs +2 -0
  299. package/dist/services/compatibility/index.mjs.map +1 -0
  300. package/dist/services/compatibility/process.cjs +2 -0
  301. package/dist/services/compatibility/process.cjs.map +1 -0
  302. package/dist/services/compatibility/process.d.cts +35 -0
  303. package/dist/services/compatibility/process.d.cts.map +1 -0
  304. package/dist/services/compatibility/process.d.mts +35 -0
  305. package/dist/services/compatibility/process.d.mts.map +1 -0
  306. package/dist/services/compatibility/process.mjs +2 -0
  307. package/dist/services/compatibility/process.mjs.map +1 -0
  308. package/dist/services/compatibility/shared.cjs +2 -0
  309. package/dist/services/compatibility/shared.cjs.map +1 -0
  310. package/dist/services/compatibility/shared.d.cts +33 -0
  311. package/dist/services/compatibility/shared.d.cts.map +1 -0
  312. package/dist/services/compatibility/shared.d.mts +33 -0
  313. package/dist/services/compatibility/shared.d.mts.map +1 -0
  314. package/dist/services/compatibility/shared.mjs +2 -0
  315. package/dist/services/compatibility/shared.mjs.map +1 -0
  316. package/dist/services/compatibilityContext.cjs +2 -0
  317. package/dist/services/compatibilityContext.cjs.map +1 -0
  318. package/dist/services/compatibilityContext.d.cts +23 -0
  319. package/dist/services/compatibilityContext.d.cts.map +1 -0
  320. package/dist/services/compatibilityContext.d.mts +23 -0
  321. package/dist/services/compatibilityContext.d.mts.map +1 -0
  322. package/dist/services/compatibilityContext.mjs +2 -0
  323. package/dist/services/compatibilityContext.mjs.map +1 -0
  324. package/dist/services/composer.cjs +2 -0
  325. package/dist/services/composer.cjs.map +1 -0
  326. package/dist/services/composer.d.cts +133 -0
  327. package/dist/services/composer.d.cts.map +1 -0
  328. package/dist/services/composer.d.mts +133 -0
  329. package/dist/services/composer.d.mts.map +1 -0
  330. package/dist/services/composer.mjs +2 -0
  331. package/dist/services/composer.mjs.map +1 -0
  332. package/dist/services/extensionAssembler.cjs +2 -0
  333. package/dist/services/extensionAssembler.cjs.map +1 -0
  334. package/dist/services/extensionAssembler.d.cts +72 -0
  335. package/dist/services/extensionAssembler.d.cts.map +1 -0
  336. package/dist/services/extensionAssembler.d.mts +72 -0
  337. package/dist/services/extensionAssembler.d.mts.map +1 -0
  338. package/dist/services/extensionAssembler.mjs +2 -0
  339. package/dist/services/extensionAssembler.mjs.map +1 -0
  340. package/dist/services/extensionCompiler.cjs +2 -0
  341. package/dist/services/extensionCompiler.cjs.map +1 -0
  342. package/dist/services/extensionCompiler.mjs +2 -0
  343. package/dist/services/extensionCompiler.mjs.map +1 -0
  344. package/dist/services/harnessContext.cjs +2 -0
  345. package/dist/services/harnessContext.cjs.map +1 -0
  346. package/dist/services/harnessContext.d.cts +61 -0
  347. package/dist/services/harnessContext.d.cts.map +1 -0
  348. package/dist/services/harnessContext.d.mts +61 -0
  349. package/dist/services/harnessContext.d.mts.map +1 -0
  350. package/dist/services/harnessContext.mjs +2 -0
  351. package/dist/services/harnessContext.mjs.map +1 -0
  352. package/dist/services/index.cjs +1 -0
  353. package/dist/services/index.d.cts +14 -0
  354. package/dist/services/index.d.mts +14 -0
  355. package/dist/services/index.mjs +1 -0
  356. package/dist/services/matrixSwitcher.cjs +2 -0
  357. package/dist/services/matrixSwitcher.cjs.map +1 -0
  358. package/dist/services/matrixSwitcher.d.cts +46 -0
  359. package/dist/services/matrixSwitcher.d.cts.map +1 -0
  360. package/dist/services/matrixSwitcher.d.mts +46 -0
  361. package/dist/services/matrixSwitcher.d.mts.map +1 -0
  362. package/dist/services/matrixSwitcher.mjs +2 -0
  363. package/dist/services/matrixSwitcher.mjs.map +1 -0
  364. package/dist/services/mcpFilter.cjs +3 -0
  365. package/dist/services/mcpFilter.cjs.map +1 -0
  366. package/dist/services/mcpFilter.d.cts +40 -0
  367. package/dist/services/mcpFilter.d.cts.map +1 -0
  368. package/dist/services/mcpFilter.d.mts +40 -0
  369. package/dist/services/mcpFilter.d.mts.map +1 -0
  370. package/dist/services/mcpFilter.mjs +3 -0
  371. package/dist/services/mcpFilter.mjs.map +1 -0
  372. package/dist/services/piSettings.cjs +2 -0
  373. package/dist/services/piSettings.cjs.map +1 -0
  374. package/dist/services/piSettings.d.cts +24 -0
  375. package/dist/services/piSettings.d.cts.map +1 -0
  376. package/dist/services/piSettings.d.mts +24 -0
  377. package/dist/services/piSettings.d.mts.map +1 -0
  378. package/dist/services/piSettings.mjs +2 -0
  379. package/dist/services/piSettings.mjs.map +1 -0
  380. package/dist/services/resourceCollector.cjs +3 -0
  381. package/dist/services/resourceCollector.cjs.map +1 -0
  382. package/dist/services/resourceCollector.d.cts +16 -0
  383. package/dist/services/resourceCollector.d.cts.map +1 -0
  384. package/dist/services/resourceCollector.d.mts +16 -0
  385. package/dist/services/resourceCollector.d.mts.map +1 -0
  386. package/dist/services/resourceCollector.mjs +3 -0
  387. package/dist/services/resourceCollector.mjs.map +1 -0
  388. package/dist/services/skillCatalog.cjs +2 -0
  389. package/dist/services/skillCatalog.cjs.map +1 -0
  390. package/dist/services/skillCatalog.d.cts +56 -0
  391. package/dist/services/skillCatalog.d.cts.map +1 -0
  392. package/dist/services/skillCatalog.d.mts +56 -0
  393. package/dist/services/skillCatalog.d.mts.map +1 -0
  394. package/dist/services/skillCatalog.mjs +2 -0
  395. package/dist/services/skillCatalog.mjs.map +1 -0
  396. package/dist/services/skillSources.cjs +2 -0
  397. package/dist/services/skillSources.cjs.map +1 -0
  398. package/dist/services/skillSources.d.cts +24 -0
  399. package/dist/services/skillSources.d.cts.map +1 -0
  400. package/dist/services/skillSources.d.mts +24 -0
  401. package/dist/services/skillSources.d.mts.map +1 -0
  402. package/dist/services/skillSources.mjs +2 -0
  403. package/dist/services/skillSources.mjs.map +1 -0
  404. package/dist/services/syncState.cjs +2 -0
  405. package/dist/services/syncState.cjs.map +1 -0
  406. package/dist/services/syncState.d.cts +130 -0
  407. package/dist/services/syncState.d.cts.map +1 -0
  408. package/dist/services/syncState.d.mts +130 -0
  409. package/dist/services/syncState.d.mts.map +1 -0
  410. package/dist/services/syncState.mjs +2 -0
  411. package/dist/services/syncState.mjs.map +1 -0
  412. package/dist/utils/index.cjs +1 -0
  413. package/dist/utils/index.d.cts +5 -0
  414. package/dist/utils/index.d.mts +5 -0
  415. package/dist/utils/index.mjs +1 -0
  416. package/dist/utils/json.cjs +2 -0
  417. package/dist/utils/json.cjs.map +1 -0
  418. package/dist/utils/json.d.cts +23 -0
  419. package/dist/utils/json.d.cts.map +1 -0
  420. package/dist/utils/json.d.mts +23 -0
  421. package/dist/utils/json.d.mts.map +1 -0
  422. package/dist/utils/json.mjs +2 -0
  423. package/dist/utils/json.mjs.map +1 -0
  424. package/dist/utils/moduleResolution.cjs +2 -0
  425. package/dist/utils/moduleResolution.cjs.map +1 -0
  426. package/dist/utils/moduleResolution.d.cts +56 -0
  427. package/dist/utils/moduleResolution.d.cts.map +1 -0
  428. package/dist/utils/moduleResolution.d.mts +56 -0
  429. package/dist/utils/moduleResolution.d.mts.map +1 -0
  430. package/dist/utils/moduleResolution.mjs +2 -0
  431. package/dist/utils/moduleResolution.mjs.map +1 -0
  432. package/dist/utils/repository.cjs +2 -0
  433. package/dist/utils/repository.cjs.map +1 -0
  434. package/dist/utils/repository.d.cts +21 -0
  435. package/dist/utils/repository.d.cts.map +1 -0
  436. package/dist/utils/repository.d.mts +21 -0
  437. package/dist/utils/repository.d.mts.map +1 -0
  438. package/dist/utils/repository.mjs +2 -0
  439. package/dist/utils/repository.mjs.map +1 -0
  440. package/dist/utils/toolNames.cjs +2 -0
  441. package/dist/utils/toolNames.cjs.map +1 -0
  442. package/dist/utils/toolNames.d.cts +25 -0
  443. package/dist/utils/toolNames.d.cts.map +1 -0
  444. package/dist/utils/toolNames.d.mts +25 -0
  445. package/dist/utils/toolNames.d.mts.map +1 -0
  446. package/dist/utils/toolNames.mjs +2 -0
  447. package/dist/utils/toolNames.mjs.map +1 -0
  448. package/package.json +369 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vuong Ngo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,546 @@
1
+ # Doompi
2
+
3
+ **A coding agent that loads only the skills and tools you name.**
4
+
5
+ Plugin systems scope what an agent knows. Nothing scopes what it can reach. Claude Code
6
+ gives you `enableAllProjectMcpServers` and a static denylist, both repository-wide, so
7
+ every session pays for every MCP server's tool schemas whether the task is a database
8
+ migration or a landing page.
9
+
10
+ Doompi makes both a declared input. Three YAML files decide what a session loads, and
11
+ `--explain` prints the bill before you launch.
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ npm install -g @agimon-ai/doompi @earendil-works/pi-coding-agent
17
+ ```
18
+
19
+ ## Quickstart
20
+
21
+ ```bash
22
+ doompi init # seed ~/.pi/.doom, once per machine
23
+ mkdir .doom && cp ~/.pi/.doom/*.yaml .doom/ # the repository config Doompi reads
24
+ doompi --explain # what would load, and why
25
+ doompi # start a session
26
+ ```
27
+
28
+ `.doom/` is committed to git, so a checkout carries its own agent configuration. Edit a
29
+ YAML file and the next launch picks it up.
30
+
31
+ ```bash
32
+ doompi --major-mode dev --domains development
33
+ doompi --domains marketing --profile marketing
34
+ doompi --domains analytics --explain
35
+ ```
36
+
37
+ ## The three axes
38
+
39
+ Doompi wraps [Pi](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) and
40
+ resolves a declared configuration into a session rather than asking you to wire one up.
41
+ The three choices are independent: adding a domain requires no knowledge of major modes,
42
+ and swapping a profile changes nothing about either.
43
+
44
+ | Choice | Decides | Declared in |
45
+ | -------------- | ------------------------------------ | --------------------- |
46
+ | **Major mode** | what the agent is wrapped in | `.doom/modes.yaml` |
47
+ | **Domains** | what it knows, and what it can reach | `.doom/domains.yaml` |
48
+ | **Profile** | who it speaks as | `.doom/profiles.yaml` |
49
+
50
+ A domain names plugins and an MCP allowlist together, so `--domains marketing` and
51
+ `--domains development` are the same agent with different knowledge and a different reach,
52
+ not two different agents. That is the lever for keeping context small, and
53
+ [`--explain`](#minimal-context) prices it before you commit.
54
+
55
+ ## What is actually different
56
+
57
+ **Compaction reads state, it does not summarize prose.** When the context fills, Doompi
58
+ does not guess at coordination state from the transcript. It reads the live plan, task
59
+ graph, and team snapshot, and commits them next to the summary as authoritative. The agent
60
+ comes out the other side knowing what it was doing, what is still running, and who is doing
61
+ what. See [Long runs](#long-runs).
62
+
63
+ **Spec-driven and meta-prompting systems change what the agent is told. Doompi changes what
64
+ it loads.** The two compose fine. This one is about the context window, not the prompt.
65
+
66
+ **One configuration serves two readers.** A human gets a keyboard surface that does not
67
+ move; an autonomous agent gets a small tool surface and a context window that compacts
68
+ itself.
69
+
70
+ ## Philosophy
71
+
72
+ **Give the agent fewer things to choose between.** [Major modes, domains, and
73
+ profiles](#major-modes-domains-profiles) decide what loads, so a session carries the skills
74
+ and MCP servers its domains named and nothing else. Whatever still overflows [compacts in
75
+ the background](#long-runs).
76
+
77
+ **Shift the work onto deterministic workflows.** Autonomous runs are [GitHub Actions
78
+ shaped](#workflows), with jobs, dependencies, steps, timeouts, and declared artifacts, so
79
+ the same job resolves the same way every time.
80
+
81
+ **Keep the keyboard ergonomic.** `SPC` is the whole surface, Spacemacs and Doom Emacs
82
+ style, and [it opens only when the draft is empty](#leader-space), so a half-written prompt
83
+ is never a casualty.
84
+
85
+ **Batteries included, without the bloat.** Plan mode, tasks, teams, a supervised runner,
86
+ voice, and workflows ship in the box, but [core is not a
87
+ layer](#core-is-not-a-layer) and every opinion waits behind a layer or a domain.
88
+
89
+ **One major mode, several minor modes.** A session runs under exactly one major mode, which
90
+ is what selects its layers. [Plan, loop, and workflow](#minor-modes) are minor modes: you
91
+ toggle them mid-session, they stack, and they report themselves on a shared status line.
92
+
93
+ ## Two ways to run
94
+
95
+ The launcher resolves your three choices per run and spawns Pi with them. Skills, agents,
96
+ MCP configs, and the persona prompt are assembled into a temporary directory that is
97
+ deleted on exit. Nothing is written back into the repository, and every session pays the
98
+ resolution cost.
99
+
100
+ `doompi sync` is the other way in, and the Doom Emacs one. Resolve once, write the
101
+ result where Pi looks, then run `pi` yourself.
102
+
103
+ ```bash
104
+ doompi init # seed ~/.pi/.doom, once per machine
105
+ doompi sync # resolve the selection into .pi/
106
+ pi # the agent
107
+
108
+ doompi sync --check # exit non-zero when the synced config is out of date
109
+ ```
110
+
111
+ A synced session takes `--major-mode`, `--domains`, `--profile`, and `--mute` the same way
112
+ the launcher does, and `/major-mode`, `/domains`, and `/profile` all switch in place: the
113
+ extension set is composed on every load rather than frozen at startup, so a reload is
114
+ enough.
115
+
116
+ Both paths compose the extension set from the same function, `assembleExtensions`, which
117
+ owns load order. Two things differ. A synced session forces `--auto-stop` off, and it
118
+ reads mute from `DOOMPI_MUTE` instead of an argument.
119
+
120
+ Syncing does not disturb the launcher. Pi merges the extensions a project declares with
121
+ the ones passed on the command line, so the synced entry stands down whenever it sees the
122
+ composed set already there, which is what the launcher and every detached subagent pass.
123
+
124
+ ## For humans
125
+
126
+ ### Leader Space
127
+
128
+ `@agimon-ai/doompi-ui` owns the leader state machine, rendering, conflict handling, and the
129
+ core bindings.
130
+
131
+ Space opens the leader **only when the draft is empty**. With text in the editor, space is
132
+ a space. `ctrl+space` opens the leader either way, and the draft survives the sequence, so
133
+ you never lose a half-written prompt to a keystroke. That is the space the human keeps.
134
+
135
+ Inside a sequence: `escape` cancels, `backspace` pops one segment, and any key that
136
+ matches nothing cancels. There is no partial state to get stuck in.
137
+
138
+ Core groups. Every level of the map renders in leader-key alphabetical order, so the table
139
+ below is the order you see:
140
+
141
+ | Key | Group | Bindings |
142
+ | --- | --------- | ---------------------------------------- |
143
+ | `e` | extension | `e` external editor, `t` tools browser |
144
+ | `h` | help | `h` hotkeys, `l` log metrics |
145
+ | `m` | models | `m` select, `n` next, `t` thinking level |
146
+ | `q` | quit | `q` exit |
147
+ | `s` | sessions | `f` fork, `n` new, `r` resume, `t` tree |
148
+
149
+ `t` is deliberately left out of core at the root and reserved for doom-task.
150
+
151
+ Optional feature extensions own the bindings for their own commands. The UI never
152
+ hardcodes a binding for a layer that may not be loaded, so a group appears only while its
153
+ extension is loaded:
154
+
155
+ | Chord | Source | Opens |
156
+ | -------------------- | ----------------------------- | ------------------------------ |
157
+ | `SPC a` | `@agimon-ai/doompi-team` | subagent fleet |
158
+ | `SPC h l` | `@agimon-ai/doompi-log` | log metrics |
159
+ | `SPC l s`, `SPC l l` | `@agimon-ai/doompi-loop` | start loops, list/stop loops |
160
+ | `SPC p p/c/d/f` | `@agimon-ai/doompi-plan` | plan normal/cancel/debug/fable |
161
+ | `SPC t t` | `@agimon-ai/doompi-task` | tasks |
162
+ | `SPC r r` | `@agimon-ai/doompi-runner` | background processes |
163
+ | `SPC v v` | `@agimon-ai/doompi-voice` | record or transcribe |
164
+ | `SPC w w/l/r` | `@agimon-ai/doompi-workflow` | launch/manage/recover |
165
+ | `SPC e f` | `@agimon-ai/doompi-file-edit` | session edits |
166
+ | `SPC e s` | `@agimon-ai/doompi` | skills catalog |
167
+ | `SPC e c` | `@agimon-ai/doompi-ui` | config panel (core binding) |
168
+
169
+ Contributions go through the public `@agimon-ai/doompi-ui/leader` API:
170
+
171
+ ```ts
172
+ registerDoomLeaderContribution(pi, {
173
+ source: '@agimon-ai/doompi-log',
174
+ bindings: [
175
+ {
176
+ id: 'log.metrics',
177
+ path: [
178
+ { key: 'h', label: 'help', order: 70 },
179
+ { key: 'l', label: 'logs', detail: 'telemetry' },
180
+ ],
181
+ command: { name: 'log-metrics' },
182
+ },
183
+ ],
184
+ });
185
+ ```
186
+
187
+ A path excludes the leading `SPC`. The UI turns this into `SPC h l`, dispatches
188
+ `/log-metrics` through the normal editor submission path, and preserves the draft. A
189
+ binding carries either a `command` descriptor or an `action` name, never both. Commands
190
+ stay owned by the extension that registered the slash command; actions route back to the
191
+ contributor through `registerDoomLeaderActionHandlers`, which is what doom-plan uses.
192
+
193
+ The map is deterministic because the registry is strict:
194
+
195
+ - Keys are a single lowercase alphanumeric character, paths are at most four segments.
196
+ - Shared group prefixes must agree on label, detail, and order, or the contribution is
197
+ rejected.
198
+ - Exact chord conflicts are rejected rather than silently overridden. A conflict in a core
199
+ binding throws; a conflict from a contributor produces a diagnostic and a warning.
200
+ - Re-registering the same `source` replaces that source's complete binding set. Registering
201
+ an empty set removes it.
202
+ - Rebuilds sort by source name then binding id, so load order does not affect the result.
203
+ - Options render in leader-key alphabetical order at every level. A segment's `order` is
204
+ group identity that shared prefixes must agree on, not a display position.
205
+
206
+ Registration runs over Pi's shared extension event bus with a 250 ms timeout. A timeout is
207
+ swallowed, so an extension loaded without the UI degrades quietly instead of failing.
208
+
209
+ ### Major modes, domains, profiles
210
+
211
+ Three choices, three files, committed to git. They are independent. Adding a domain
212
+ requires no knowledge of major modes, and swapping a profile changes nothing about either.
213
+
214
+ | Choice | Loads | Declared in |
215
+ | --------------- | ------------------------------------- | --------------------- |
216
+ | **Major modes** | a named set of layers | `.doom/modes.yaml` |
217
+ | **Domains** | plugins, meaning skills and MCP | `.doom/domains.yaml` |
218
+ | **Profiles** | a persona and the brand it speaks for | `.doom/profiles.yaml` |
219
+
220
+ **Layers are protection and steering.** A layer is a set of Pi extensions plus a set of
221
+ hook groups. The extensions add behavior the agent runs with; the hooks fire around its
222
+ tool calls and can block it, warn it, or steer it back. You define the set you want, along
223
+ the lines of `guardrails`, `lint`, `code-intel`, `team`, `plan-mode`, `runner`, and
224
+ `ask-user`. The hooks themselves live in `.doom/hooks.yaml`, one registry shared by every
225
+ frontend, where a group is either `core` and always loads, or is pulled in by whichever
226
+ layer wants it.
227
+
228
+ **A major mode is the one you actually pick.** You do not assemble layers one by one at the
229
+ prompt. You select one named major mode with `--major-mode <name>`, and
230
+ `.doom/modes.yaml` says which layers it contains. A session has exactly one, the way
231
+ an Emacs buffer has exactly one major mode.
232
+
233
+ The flag is `--major-mode` and not `--mode` because Pi already owns `--mode` for its output
234
+ mode (`text`, `json`, `rpc`), and for any other value it consumes the argument and ignores
235
+ it without a diagnostic. Use `--output-format` for Pi's output mode.
236
+
237
+ **Domains are plugins, and a plugin is skills plus MCP.** Selecting a domain decides which
238
+ plugins contribute their skills and subagents, which MCP servers the session can reach,
239
+ and whether the always-on shared skills apply. A domain can take a whole plugin or a named
240
+ subset of one. This is the choice that decides how much the agent can see, so it is also
241
+ the lever for keeping context small.
242
+
243
+ **Profiles are a persona and a brand.** `.doom/profiles.yaml` points at a directory under
244
+ `agents/<brand>/<person>/`, and doom concatenates that person's `profile.md`, `SOUL.md`,
245
+ and `AGENTS.md` into the system prompt: identity and the brand it represents, then voice,
246
+ then role and rules. A profile also carries environment defaults, and nothing else. It
247
+ cannot select domains, major modes, models, presets, or policy, and an exported value
248
+ always beats a profile default.
249
+
250
+ Switching is live. `/major-mode`, `/domains`, and `/profile` re-resolve into the running
251
+ session and reload. A domain or profile switch always applies in place. A major mode switch
252
+ applies in place too unless the new mode changes which extension packages load, since Pi
253
+ freezes the `--extension` set at construction; the picker tells you when a relaunch is
254
+ needed.
255
+
256
+ ### Minor modes
257
+
258
+ A major mode is chosen once per session and selects layers. Minor modes are the opposite:
259
+ you toggle them while the session runs, several can be on at once, and none of them changes
260
+ which extensions are loaded.
261
+
262
+ | Minor mode | Toggle | Owned by |
263
+ | ---------- | -------------------- | ---------------------------- |
264
+ | plan | `/plan`, `SPC p` | `@agimon-ai/doompi-plan` |
265
+ | loop | `/loop`, `SPC l` | `@agimon-ai/doompi-loop` |
266
+ | workflow | `/workflow`, `SPC w` | `@agimon-ai/doompi-workflow` |
267
+
268
+ Each one publishes a label to a shared `MODES` line rather than painting a row of its own,
269
+ so three enabled modes cost one line rather than three. The registry is
270
+ `@agimon-ai/doompi-extension-contracts/mode`.
271
+
272
+ ## For autonomous agents
273
+
274
+ ### Minimal context
275
+
276
+ Fewer options, better choices. Domains cut the skill list and the tool list together. A
277
+ domain that names three plugins gives the agent those plugins' skills and nothing else,
278
+ and one with an `mcp` allowlist reaches only the servers and proxy upstreams it names.
279
+
280
+ `--explain` prints what any combination costs before you launch it, and ends with the bill:
281
+
282
+ ```
283
+ $ doompi --domains development --explain
284
+ ...
285
+ skills: 24 (from 3 directories)
286
+
287
+ context cost (tokens)
288
+ skills prompt 3,772 always on
289
+ persona 0 always on
290
+ startup total 3,772
291
+ skill bodies 54,145 read on demand
292
+
293
+ Excludes MCP tool schemas, which the servers only report once connected,
294
+ and skills contributed by extensions, which register after startup.
295
+ ```
296
+
297
+ Every figure comes from files on disk, so two runs of the same selection print the same
298
+ numbers and you can reproduce them on your own repository rather than trusting these.
299
+
300
+ MCP tool schemas are the one cost this cannot price. They exist only after a server
301
+ connects, and pricing them would mean spawning every configured server on a command meant
302
+ to be instant. Scoping them is still a declared choice; the saving is just not counted here.
303
+
304
+ A domain without an `mcp` key admits everything, and one unscoped domain in the selection
305
+ unfilters the rest. Scoping applies only when every selected domain declares it.
306
+
307
+ A domain can also take a named subset of one plugin's skills, by name or glob.
308
+
309
+ ### Workflows
310
+
311
+ Long autonomous work runs as workflows, in the shape a GitHub Actions user already knows:
312
+ `on:`, `jobs:`, `needs:`, `steps:`, timeouts, and declared artifacts.
313
+
314
+ The payoff is that every step names the session it wants. A workflow is where
315
+ `--major-mode`, `--domains`, and `--profile` stop being things you type and become part of
316
+ the definition, so one run can hand each job exactly the context that job needs and nothing
317
+ else:
318
+
319
+ ```yaml
320
+ jobs:
321
+ implement:
322
+ needs: intake
323
+ steps:
324
+ - name: Implement
325
+ timeout-minutes: 180
326
+ artifacts: [implementation/report.md]
327
+ interactiveRun:
328
+ default: |
329
+ doompi --major-mode dev --domains development --auto-stop \
330
+ --cwd "$PWD" "$JOB_SYSTEM_PROMPT"
331
+
332
+ announce:
333
+ needs: implement
334
+ steps:
335
+ - name: Draft the release note
336
+ timeout-minutes: 30
337
+ artifacts: [marketing/release-note.md]
338
+ interactiveRun:
339
+ default: |
340
+ doompi --major-mode marketing --domains marketing \
341
+ --profile brand-voice --auto-stop \
342
+ --cwd "$PWD" "$JOB_SYSTEM_PROMPT"
343
+ ```
344
+
345
+ Two jobs, two different agents. `implement` runs under a major mode carrying lint and code
346
+ intelligence and a domain carrying coding skills. `announce` drops both, takes a domain
347
+ scoped to a handful of MCP servers, and adds a profile, so the release note comes out in a
348
+ named persona's voice rather than the agent's own. Neither job can drift into the other's
349
+ context, and the same job resolves the same way on every run.
350
+
351
+ The one real departure from GitHub Actions is `extends:`, which lets a job inherit shared
352
+ setup from a named template rather than repeating it.
353
+
354
+ The engine itself is not in this package. `@agimon-ai/doompi-workflow` provides the in-session
355
+ surface on `SPC w`, and its dispatcher exposes `list_workflows` to any session but scopes
356
+ `launch_workflow` to the root session, so a subagent can look but not spawn. The `workflow`
357
+ hook group is `core`, so it loads in any major mode.
358
+
359
+ ### Long runs
360
+
361
+ Tasks, teams, runners, and compaction share one working state, so a long autonomous run
362
+ does not lose its place.
363
+
364
+ - **Tasks** (`SPC t`) are a file-backed graph with dependencies and delegation, not a
365
+ scratch list.
366
+ - **Teams** (`SPC a`) run named subagents asynchronously against that same board,
367
+ sequentially or in parallel.
368
+ - **Runners** (`SPC r`) replace the bash tool and detach long commands, then reconcile
369
+ them afterwards.
370
+ - **Compaction** runs on a three-pass ladder in a worker thread, so the session never
371
+ blocks on it.
372
+
373
+ The integration is the point. When compaction summarizes, it does not guess at
374
+ coordination state: it reads the live plan, tasks, and team snapshot, and commits them
375
+ next to the summary as authoritative rather than leaving them to be reconstructed from
376
+ prose. Detached runners reconcile themselves once the context has been rewritten. The
377
+ agent comes out the other side knowing what it was doing, what is still running, and who
378
+ is doing what.
379
+
380
+ ## Core is not a layer
381
+
382
+ Telemetry, workflow orchestration, the dispatch loop, and editor plumbing ship
383
+ unconditionally and are absent from `modes.yaml` on purpose. They are the reason the
384
+ harness exists, so making them optional would only create broken configurations. Layers
385
+ are for opinions, not foundations.
386
+
387
+ ## Who owns what
388
+
389
+ Doom Pi is a meta-package. It depends on the Doom closure (`@agimon-ai/doompi-*`) and composes
390
+ it, and it depends on nothing that belongs to the repository consuming it. The Agiflow and
391
+ Agent Hooks extensions are consumer-owned: the repository declares them in its own
392
+ `.doom/modes.yaml` and installs them itself, and they load after the Doom packages.
393
+
394
+ That split decides where a specifier resolves. A package the repository declares resolves
395
+ from the repository root, walking its module chain; anything that does not resolve there
396
+ falls back to what ships with the installed meta-package. So a consumer can add a layer
397
+ without Doom Pi knowing the package exists, and Doom Pi can ship its own closure without
398
+ the consumer declaring it.
399
+
400
+ Package resources follow the same rule: the UI theme is shipped by `@agimon-ai/doompi-ui`
401
+ and the workflow-recovery skill by `@agimon-ai/doompi-workflow`, each declared in its own
402
+ manifest, so an installed package is discoverable without this checkout. Every Doom package
403
+ publishes through an explicit `files` allowlist, which keeps repository material such as
404
+ `docs/ideas/` out of any tarball.
405
+
406
+ A repository is recognised by a Doom or trusted Pi marker: a `.doom/` directory, or an
407
+ existing `.pi/settings.json`. No Nx, pnpm workspace, or plugins profile is required, so a
408
+ plain repository that installs the package can launch it.
409
+
410
+ ## Lazy config
411
+
412
+ Under the launcher, everything is resolved per run and nothing is written back into the
413
+ repository. Editing a YAML file is the entire change.
414
+
415
+ `doompi sync` trades that for a pinned setup: the same resolution runs once and lands in
416
+ `.pi/doom/`, and a Pi session reads it instead of recomputing it. Edit a YAML file and the
417
+ next session says the config changed, the way doom emacs asks you to re-run `doom sync`.
418
+
419
+ `doompi init` seeds `~/.pi/.doom` with all five file names, but only `config.yaml` from
420
+ there is read at runtime. Major modes, domains, profiles, and hooks are always read from the
421
+ repository `.doom/`, so the other four seeded files affect nothing beyond the inputs hash.
422
+
423
+ Either way the hook registry compiles to the files other frontends read before any harness
424
+ code runs, and `doompi sync` regenerates them.
425
+
426
+ ## Other frontends
427
+
428
+ Pi is the primary frontend. Claude Code, Codex, and Antigravity run through
429
+ `doompi compat <provider>` and share the same domain config as far as each can:
430
+
431
+ | | Pi | Claude Code | Codex | Antigravity |
432
+ | ------------------- | ----------------- | ----------------------------- | ------------------------ | ------------------- |
433
+ | domains to plugins | yes | yes | yes | yes |
434
+ | hooks | from the registry | generated `settings.json` | generated `hooks.json` | copied `hooks.json` |
435
+ | MCP servers | scoped | scoped | unscoped | scoped |
436
+ | MCP proxy upstreams | scoped | scoped | scoped | scoped |
437
+ | major mode | packages + hooks | shared hook groups | shared hook groups | shared hook groups |
438
+ | personas | system prompt | `--append-system-prompt-file` | `developer_instructions` | no |
439
+
440
+ Compatibility frontends use the selected major mode for shared hook state. Layer packages
441
+ and Pi extensions are loaded only by Pi.
442
+
443
+ Antigravity is the odd one. It reads its configuration from the workspace and from the
444
+ user's home directory rather than from arguments, so every selection is written to disk
445
+ before launch and reverted when it is no longer selected. Everything the harness writes is
446
+ tracked in a managed-state file, so a file you created by hand is never silently replaced.
447
+ Its hooks are copied from `.antigravity-local/hooks.json`, which is maintained by hand
448
+ rather than generated from the registry.
449
+
450
+ Where a concept has no equivalent, it is left out rather than approximated.
451
+
452
+ ## Files
453
+
454
+ All Doompi configuration lives in `.doom/`, committed to git.
455
+
456
+ ```
457
+ .doom/
458
+ config.yaml projectTrust, plus the selection sync pins
459
+ domains.yaml domains, plus aliases for shorthand bundles
460
+ modes.yaml layer definitions and the named major modes built from them
461
+ hooks.yaml canonical hooks for all three frontends
462
+ profiles.yaml persona and environment profiles
463
+
464
+ agents/<product>/<person>/ persona source, referenced never copied
465
+ ```
466
+
467
+ `doompi sync` writes into `.pi/`:
468
+
469
+ ```
470
+ .pi/settings.json committed; sync owns extensions, themes, and theme
471
+ .pi/doom/ generated and gitignored
472
+ state.json environment, resolved paths, and the inputs hash
473
+ mcp.json mcp-extension.ts agents/ persona.md doom-pi-dark.json
474
+ run/<pid>/ one session's live switches, never the baseline
475
+ harness-state.json that session's own state, owned by its process
476
+ ```
477
+
478
+ ### One owner for the state
479
+
480
+ The resolved matrix a session runs on is a file, not a set of variables.
481
+ `DOOMPI_STATE` points at it, and everything else the harness exports is derived from
482
+ it: a projection published for the readers that can only see an environment, which are bash
483
+ hooks, the shell launchers, `agent-hooks`, and any process spawned by any of them. Two
484
+ fields never appear there at all, because nothing outside `@agimon-ai/doompi-config` reads
485
+ them and every hook spawn would otherwise copy them: the plugin hook list and the profile's
486
+ environment defaults.
487
+
488
+ Ownership is per process, and that is the point. Doom Team subagents run detached, from an
489
+ environment snapshot, and can outlive the parent that spawned them. So a spawner writes the
490
+ child a file of its own in that run's directory, and any process that finds a file it does
491
+ not own copies it before its first write. A child can neither corrupt its parent's session
492
+ nor lose its own when the parent cleans up.
493
+
494
+ It also regenerates the two hook files the other frontends read before any harness code
495
+ runs, which live outside `.pi/`:
496
+
497
+ ```
498
+ .claude/settings.json the "hooks" key only; every other key is preserved
499
+ .codex-local/hooks.json the whole file
500
+ ```
501
+
502
+ Edit `hooks.yaml` and re-run `doompi sync` to regenerate both.
503
+
504
+ ## Selection
505
+
506
+ Use singular `--profile <name>` for one persona and its environment defaults. Use
507
+ `--domains <name[,name...]>` for plugin bundles. Both `--major-mode` and `--profile` take
508
+ exactly one name, reject a comma, and can be given only once. The removed `--layer`,
509
+ `--layers`, `--profiles`, and `--target` flags throw and point at the replacement, and so
510
+ does the removed `DOOMPI_LAYER` variable: a stale export is worth an error rather than a
511
+ session quietly starting on the default.
512
+
513
+ Defaults when you name nothing: major mode `copilot`, domains `default`. The `marketing`
514
+ major mode is the one exception and defaults to the `marketing` domain. That is the only
515
+ place where one choice influences another.
516
+
517
+ Environment equivalents are `DOOMPI_MAJOR_MODE`, `DOOMPI_DOMAINS`, and `DOOMPI_PROFILE`.
518
+ `DOOMPI_PRESET` and `DOOMPI_ADDITIONAL_DIRS` work the same way for `--preset` and
519
+ `--add-dir`. An empty `DOOMPI_DOMAINS` means no domains, not the default. No profile is
520
+ selected unless one is named.
521
+
522
+ There is one variable per axis. A nested run inherits its launcher's choice because the
523
+ launcher writes the resolved value into the child environment under the same name, so
524
+ anything you exported yourself is what a top-level run uses and what a spawned run
525
+ overrides. These used to be two variables, `DOOM_PI_*` for the selection and
526
+ `AGENT_HARNESS_*` for the resolved projection, with the second outranking the first. Any
527
+ surviving `AGENT_HARNESS_*` variable now throws and names its replacement, because a stale
528
+ export in a shell profile is worth an error.
529
+
530
+ `DOOMPI_LAYERS`, plural, is a different variable from `DOOMPI_LAYER`. It carries the
531
+ resolved layer components rather than the mode that selected them.
532
+
533
+ A repository can declare what it selects by default, which is what a bare `doompi sync`
534
+ pins. A flag still wins, then an exported variable, then this:
535
+
536
+ ```yaml
537
+ # .doom/config.yaml
538
+ selection:
539
+ majorMode: dev
540
+ domains: [development]
541
+ profile: house-voice
542
+ ```
543
+
544
+ Pi asks once before it trusts a project and loads `.pi` resources, so a synced session
545
+ prompts on first run regardless of `projectTrust`, which reaches Pi as a launcher flag.
546
+ Answer yes, or run `/trust`.
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));exports.__toESM=s;
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ const e=require(`../cli/cliApp.cjs`);require(`../cli/index.cjs`),e.runCli(process.argv.slice(2)).then(e=>{process.exitCode=e},e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(`[doompi] ${t}\n`),process.exitCode=1});
3
+ //# sourceMappingURL=cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.cjs","names":["runCli"],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CLI Entry Point for doom-pi\n *\n * The executable installed as the `doom-pi` binary, and the file the repository\n * launchers (pi.sh, claude.sh, codex.sh) invoke directly from source.\n */\n\nimport { runCli } from '../cli/index.ts';\n\nrunCli(process.argv.slice(2)).then(\n (exitCode) => {\n process.exitCode = exitCode;\n },\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[doompi] ${message}\\n`);\n process.exitCode = 1;\n },\n);\n"],"mappings":";iEAWAA,EAAAA,OAAO,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC,KAC3B,GAAa,CACZ,QAAQ,SAAW,GAEpB,GAAmB,CAClB,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,OAAO,MAAM,YAAY,EAAQ,IAAI,CAC7C,QAAQ,SAAW,GAEtB"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import{runCli as e}from"../cli/cliApp.mjs";import"../cli/index.mjs";e(process.argv.slice(2)).then(e=>{process.exitCode=e},e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(`[doompi] ${t}\n`),process.exitCode=1});export{};
3
+ //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CLI Entry Point for doom-pi\n *\n * The executable installed as the `doom-pi` binary, and the file the repository\n * launchers (pi.sh, claude.sh, codex.sh) invoke directly from source.\n */\n\nimport { runCli } from '../cli/index.ts';\n\nrunCli(process.argv.slice(2)).then(\n (exitCode) => {\n process.exitCode = exitCode;\n },\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[doompi] ${message}\\n`);\n process.exitCode = 1;\n },\n);\n"],"mappings":";oEAWA,EAAO,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC,KAC3B,GAAa,CACZ,QAAQ,SAAW,GAEpB,GAAmB,CAClB,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,OAAO,MAAM,YAAY,EAAQ,IAAI,CAC7C,QAAQ,SAAW,GAEtB"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ require(`../_virtual/_rolldown/runtime.cjs`),(0,require(`@agimon-ai/doompi-runner/bin/cli`).main)(process.argv.slice(2)).then(e=>{process.exitCode=e},e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(`[doom-runner] ${t}\n`),process.exitCode=1});
3
+ //# sourceMappingURL=doomRunner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomRunner.cjs","names":[],"sources":["../../src/bin/doomRunner.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CLI Entry Point for doom-runner\n *\n * The `doom-runner` binary lives in @agimon-ai/doompi-runner, but npm only\n * links a package's own bins. Installing doompi would therefore leave\n * doom-runner off PATH even though doompi depends on it and the packaged\n * doom-runner skill tells agents to call it by name. Re-declaring the bin here\n * is what makes `npm i -g @agimon-ai/doompi` install both executables.\n *\n * The runner's own entry only self-invokes when it is argv[1], which it is not\n * once this shim is the entry point, so main() is called explicitly.\n */\n\nimport { main } from '@agimon-ai/doompi-runner/bin/cli';\n\nmain(process.argv.slice(2)).then(\n (exitCode) => {\n process.exitCode = exitCode;\n },\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[doom-runner] ${message}\\n`);\n process.exitCode = 1;\n },\n);\n"],"mappings":";kGAiBK,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC,KACzB,GAAa,CACZ,QAAQ,SAAW,GAEpB,GAAmB,CAClB,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,OAAO,MAAM,iBAAiB,EAAQ,IAAI,CAClD,QAAQ,SAAW,GAEtB"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import{main as e}from"@agimon-ai/doompi-runner/bin/cli";e(process.argv.slice(2)).then(e=>{process.exitCode=e},e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(`[doom-runner] ${t}\n`),process.exitCode=1});export{};
3
+ //# sourceMappingURL=doomRunner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomRunner.mjs","names":[],"sources":["../../src/bin/doomRunner.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * CLI Entry Point for doom-runner\n *\n * The `doom-runner` binary lives in @agimon-ai/doompi-runner, but npm only\n * links a package's own bins. Installing doompi would therefore leave\n * doom-runner off PATH even though doompi depends on it and the packaged\n * doom-runner skill tells agents to call it by name. Re-declaring the bin here\n * is what makes `npm i -g @agimon-ai/doompi` install both executables.\n *\n * The runner's own entry only self-invokes when it is argv[1], which it is not\n * once this shim is the entry point, so main() is called explicitly.\n */\n\nimport { main } from '@agimon-ai/doompi-runner/bin/cli';\n\nmain(process.argv.slice(2)).then(\n (exitCode) => {\n process.exitCode = exitCode;\n },\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[doom-runner] ${message}\\n`);\n process.exitCode = 1;\n },\n);\n"],"mappings":";wDAiBA,EAAK,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC,KACzB,GAAa,CACZ,QAAQ,SAAW,GAEpB,GAAmB,CAClB,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,OAAO,MAAM,iBAAiB,EAAQ,IAAI,CAClD,QAAQ,SAAW,GAEtB"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../logSinkTelemetry.cjs`),n=require(`../config/harnessState.cjs`);require(`../config/index.cjs`);const r=require(`../utils/repository.cjs`);require(`../utils/index.cjs`);const i=require(`../services/harnessContext.cjs`);require(`../services/index.cjs`);const a=require(`../commands/compatibilityCommand.cjs`),o=require(`../commands/emitMcpCommand.cjs`),s=require(`../commands/explainCommand.cjs`),c=require(`../commands/initCommand.cjs`),l=require(`../commands/launchCommand.cjs`),u=require(`./options.cjs`),d=require(`../commands/syncCommand.cjs`);require(`../commands/index.cjs`);const f=require(`./help.cjs`);let p=require(`node:path`);p=e.__toESM(p,1);var m=class{commands=[];compatibilityCommand;initCommand;syncCommand;telemetry;constructor(e=t.createHarnessTelemetry()){this.telemetry=e,this.compatibilityCommand=new a.CompatibilityCommand(e),this.initCommand=new c.InitCommand,this.syncCommand=new d.SyncCommand,this.initializeCommands()}initializeCommands(){this.commands.push(new o.EmitMcpCommand),this.commands.push(new s.ExplainCommand),this.commands.push(new l.LaunchCommand)}selectCommand(e){let t=this.commands.find(t=>t.matches(e));if(!t)throw Error(`No command matched the given options`);return t}async runHarness(e){return this.telemetry.runInSpan(`doom_pi.run`,{"harness.major_mode":e.majorMode,"harness.domain_count":e.domains.length,"harness.agents":e.agents,"harness.mcp":e.mcp,"harness.hooks":e.hooks,...e.profile?{"harness.profile":e.profile}:{},...e.preset?{"harness.preset":e.preset}:{}},async()=>{let n=await i.buildHarnessContext(e,this.telemetry),r=this.selectCommand(n.options);try{return await r.execute(n,this.telemetry)}catch(e){throw await this.telemetry.recordError(t.HARNESS_EVENT.cliFailed,e),e}finally{await n.cleanup()}})}async run(e){if(this.initCommand.matches(e))return this.initCommand.execute(e);if(this.syncCommand.matches(e))return this.syncCommand.execute(e);if(this.compatibilityCommand.matches(e))return this.compatibilityCommand.execute(e);let i=u.parseHarnessArgs(e);if(i.help)return f.printHelp(),0;if(i.version)return process.stdout.write(`${f.HARNESS_VERSION}\n`),0;let a=n.readHarnessState(process.env,t.toFailureReporter(this.telemetry)).root,o=a?p.default.resolve(a):r.findRepositoryRoot(i.options.cwd);return this.runHarness({repoRoot:o,...i.options})}};async function h(e){let n=t.createHarnessTelemetry();try{return await new m(n).run(e)}finally{await n.shutdown()}}async function g(e){let n=t.createHarnessTelemetry();try{return await new m(n).runHarness(e)}finally{await n.shutdown()}}exports.CliApp=m,exports.runCli=h,exports.runHarness=g;
2
+ //# sourceMappingURL=cliApp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliApp.cjs","names":["createHarnessTelemetry","CompatibilityCommand","InitCommand","SyncCommand","EmitMcpCommand","ExplainCommand","LaunchCommand","buildHarnessContext","HARNESS_EVENT","parseHarnessArgs","HARNESS_VERSION","readHarnessState","toFailureReporter","path","findRepositoryRoot"],"sources":["../../src/cli/cliApp.ts"],"sourcesContent":["import path from 'node:path';\nimport {\n BaseCommand,\n CompatibilityCommand,\n EmitMcpCommand,\n ExplainCommand,\n InitCommand,\n LaunchCommand,\n SyncCommand,\n} from '../commands/index.ts';\nimport { readHarnessState } from '../config/index.ts';\nimport type { HarnessOptions } from '../interfaces/index.ts';\nimport { buildHarnessContext } from '../services/index.ts';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n toFailureReporter,\n type HarnessTelemetry,\n} from '../logSinkTelemetry.ts';\nimport { findRepositoryRoot } from '../utils/index.ts';\nimport { HARNESS_VERSION, printHelp } from './help.ts';\nimport { parseHarnessArgs } from './options.ts';\n\n/**\n * Main CLI Application\n *\n * Owns command registration and dispatch. Preparation is shared: the context\n * is built once and handed to whichever command claims the run.\n */\nexport class CliApp {\n private readonly commands: BaseCommand[] = [];\n private readonly compatibilityCommand: CompatibilityCommand;\n private readonly initCommand: InitCommand;\n private readonly syncCommand: SyncCommand;\n private readonly telemetry: HarnessTelemetry;\n\n // Fields are declared and assigned explicitly rather than as constructor\n // parameter properties: the launcher scripts run this file straight from\n // source under Node's strip-only TypeScript mode, which rejects them.\n constructor(telemetry: HarnessTelemetry = createHarnessTelemetry()) {\n this.telemetry = telemetry;\n this.compatibilityCommand = new CompatibilityCommand(telemetry);\n this.initCommand = new InitCommand();\n this.syncCommand = new SyncCommand();\n this.initializeCommands();\n }\n\n /**\n * Initialize all available commands.\n *\n * Order matters. The first match wins and LaunchCommand matches everything,\n * so the diagnostic commands have to come before it.\n */\n private initializeCommands(): void {\n this.commands.push(new EmitMcpCommand());\n this.commands.push(new ExplainCommand());\n this.commands.push(new LaunchCommand());\n }\n\n /** Picks the command the parsed options select. */\n selectCommand(options: HarnessOptions): BaseCommand {\n const command = this.commands.find((candidate) => candidate.matches(options));\n if (!command) throw new Error('No command matched the given options');\n return command;\n }\n\n /**\n * Builds the context, runs the selected command, and always cleans up.\n *\n * The whole run is one span so the sink shows preparation and the child\n * process as a single timeline: a slow launch is almost always a slow stage\n * inside here, and that is only visible when the stages share a trace.\n */\n async runHarness(options: HarnessOptions): Promise<number> {\n return this.telemetry.runInSpan(\n 'doom_pi.run',\n {\n 'harness.major_mode': options.majorMode,\n 'harness.domain_count': options.domains.length,\n 'harness.agents': options.agents,\n 'harness.mcp': options.mcp,\n 'harness.hooks': options.hooks,\n ...(options.profile ? { 'harness.profile': options.profile } : {}),\n ...(options.preset ? { 'harness.preset': options.preset } : {}),\n },\n async () => {\n const context = await buildHarnessContext(options, this.telemetry);\n const command = this.selectCommand(context.options);\n try {\n // Selection uses the same resolved options used to build the context.\n return await command.execute(context, this.telemetry);\n } catch (error) {\n await this.telemetry.recordError(HARNESS_EVENT.cliFailed, error);\n throw error;\n } finally {\n await context.cleanup();\n }\n },\n );\n }\n\n /** Entry point for raw process arguments. */\n async run(args: string[]): Promise<number> {\n if (this.initCommand.matches(args)) return this.initCommand.execute(args);\n // Config management rather than a launch: it resolves the matrix and writes\n // it out for plain Pi, so it never builds a launch context of its own.\n if (this.syncCommand.matches(args)) return this.syncCommand.execute(args);\n if (this.compatibilityCommand.matches(args)) return this.compatibilityCommand.execute(args);\n\n const parsed = parseHarnessArgs(args);\n if (parsed.help) {\n printHelp();\n return 0;\n }\n if (parsed.version) {\n process.stdout.write(`${HARNESS_VERSION}\\n`);\n return 0;\n }\n // An inherited root wins, which is how a nested run stays pinned to the\n // outer repository rather than re-deriving one from its own cwd.\n const inheritedRoot = readHarnessState(process.env, toFailureReporter(this.telemetry)).root;\n const repoRoot = inheritedRoot ? path.resolve(inheritedRoot) : findRepositoryRoot(parsed.options.cwd);\n return this.runHarness({ repoRoot, ...parsed.options });\n }\n}\n\n/**\n * Convenience wrapper kept so the binary and tests need no CliApp knowledge.\n *\n * Telemetry is shut down here rather than inside runHarness, because this is\n * the only scope that owns the process: flushing earlier would drop the records\n * a later command still emits.\n */\nexport async function runCli(args: string[]): Promise<number> {\n const telemetry = createHarnessTelemetry();\n try {\n return await new CliApp(telemetry).run(args);\n } finally {\n await telemetry.shutdown();\n }\n}\n\n/** Runs an already-resolved option set, skipping argument parsing. */\nexport async function runHarness(options: HarnessOptions): Promise<number> {\n const telemetry = createHarnessTelemetry();\n try {\n return await new CliApp(telemetry).runHarness(options);\n } finally {\n await telemetry.shutdown();\n }\n}\n"],"mappings":"mxBA6BA,IAAa,EAAb,KAAoB,CAClB,SAA2C,EAAE,CAC7C,qBACA,YACA,YACA,UAKA,YAAY,EAA8BA,EAAAA,wBAAwB,CAAE,CAClE,KAAK,UAAY,EACjB,KAAK,qBAAuB,IAAIC,EAAAA,qBAAqB,EAAU,CAC/D,KAAK,YAAc,IAAIC,EAAAA,YACvB,KAAK,YAAc,IAAIC,EAAAA,YACvB,KAAK,oBAAoB,CAS3B,oBAAmC,CACjC,KAAK,SAAS,KAAK,IAAIC,EAAAA,eAAiB,CACxC,KAAK,SAAS,KAAK,IAAIC,EAAAA,eAAiB,CACxC,KAAK,SAAS,KAAK,IAAIC,EAAAA,cAAgB,CAIzC,cAAc,EAAsC,CAClD,IAAM,EAAU,KAAK,SAAS,KAAM,GAAc,EAAU,QAAQ,EAAQ,CAAC,CAC7E,GAAI,CAAC,EAAS,MAAU,MAAM,uCAAuC,CACrE,OAAO,EAUT,MAAM,WAAW,EAA0C,CACzD,OAAO,KAAK,UAAU,UACpB,cACA,CACE,qBAAsB,EAAQ,UAC9B,uBAAwB,EAAQ,QAAQ,OACxC,iBAAkB,EAAQ,OAC1B,cAAe,EAAQ,IACvB,gBAAiB,EAAQ,MACzB,GAAI,EAAQ,QAAU,CAAE,kBAAmB,EAAQ,QAAS,CAAG,EAAE,CACjE,GAAI,EAAQ,OAAS,CAAE,iBAAkB,EAAQ,OAAQ,CAAG,EAAE,CAC/D,CACD,SAAY,CACV,IAAM,EAAU,MAAMC,EAAAA,oBAAoB,EAAS,KAAK,UAAU,CAC5D,EAAU,KAAK,cAAc,EAAQ,QAAQ,CACnD,GAAI,CAEF,OAAO,MAAM,EAAQ,QAAQ,EAAS,KAAK,UAAU,OAC9C,EAAO,CAEd,MADA,MAAM,KAAK,UAAU,YAAYC,EAAAA,cAAc,UAAW,EAAM,CAC1D,SACE,CACR,MAAM,EAAQ,SAAS,GAG5B,CAIH,MAAM,IAAI,EAAiC,CACzC,GAAI,KAAK,YAAY,QAAQ,EAAK,CAAE,OAAO,KAAK,YAAY,QAAQ,EAAK,CAGzE,GAAI,KAAK,YAAY,QAAQ,EAAK,CAAE,OAAO,KAAK,YAAY,QAAQ,EAAK,CACzE,GAAI,KAAK,qBAAqB,QAAQ,EAAK,CAAE,OAAO,KAAK,qBAAqB,QAAQ,EAAK,CAE3F,IAAM,EAASC,EAAAA,iBAAiB,EAAK,CACrC,GAAI,EAAO,KAET,OADA,EAAA,WAAW,CACJ,EAET,GAAI,EAAO,QAET,OADA,QAAQ,OAAO,MAAM,GAAGC,EAAAA,gBAAgB,IAAI,CACrC,EAIT,IAAM,EAAgBC,EAAAA,iBAAiB,QAAQ,IAAKC,EAAAA,kBAAkB,KAAK,UAAU,CAAC,CAAC,KACjF,EAAW,EAAgBC,EAAAA,QAAK,QAAQ,EAAc,CAAGC,EAAAA,mBAAmB,EAAO,QAAQ,IAAI,CACrG,OAAO,KAAK,WAAW,CAAE,WAAU,GAAG,EAAO,QAAS,CAAC,GAW3D,eAAsB,EAAO,EAAiC,CAC5D,IAAM,EAAYd,EAAAA,wBAAwB,CAC1C,GAAI,CACF,OAAO,MAAM,IAAI,EAAO,EAAU,CAAC,IAAI,EAAK,QACpC,CACR,MAAM,EAAU,UAAU,EAK9B,eAAsB,EAAW,EAA0C,CACzE,IAAM,EAAYA,EAAAA,wBAAwB,CAC1C,GAAI,CACF,OAAO,MAAM,IAAI,EAAO,EAAU,CAAC,WAAW,EAAQ,QAC9C,CACR,MAAM,EAAU,UAAU"}