@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
@@ -0,0 +1,63 @@
1
+ import { HarnessOptions } from "../interfaces/harness.cjs";
2
+ import { HarnessContext } from "../services/harnessContext.cjs";
3
+ import { BaseCommand } from "./baseCommand.cjs";
4
+
5
+ //#region src/commands/explainCommand.d.ts
6
+ /**
7
+ * What the selection costs before the first prompt, in tokens.
8
+ *
9
+ * MCP tool schemas are deliberately absent: they come from the servers at
10
+ * connect time, and pricing them here would mean spawning every configured
11
+ * server and running a handshake on a command that is meant to be instant.
12
+ * `startupTokens` is therefore a floor, not a total, and the rendering says so.
13
+ */
14
+ interface MatrixCost {
15
+ /** The always-on skill block Pi puts in the system prompt. */
16
+ skillPromptTokens: number;
17
+ /** Skill bodies on disk, read only when a skill is invoked. */
18
+ skillBodyTokens: number;
19
+ /** The persona prompt, when a profile selected one. */
20
+ personaTokens: number;
21
+ }
22
+ interface MatrixExplanation {
23
+ majorMode: string;
24
+ profile?: string;
25
+ persona?: string;
26
+ domains: string[];
27
+ plugins: string[];
28
+ layers: string[];
29
+ hookGroups: string[];
30
+ hooksEnabled: boolean;
31
+ skillDirectories: string[];
32
+ skillCount: number;
33
+ agentCount: number;
34
+ agentDirectories: string[];
35
+ mcpConfigPath?: string;
36
+ mcpServers: string[];
37
+ mcpProxyUpstreams?: string[];
38
+ mcpFiltered: boolean;
39
+ cost?: MatrixCost;
40
+ }
41
+ /**
42
+ * Renders the resolved matrix for --explain. Composition spans three config
43
+ * files, so this answers "why is that loaded" in one command instead of a
44
+ * manual trace through domains, major modes, and plugin subsets.
45
+ */
46
+ declare function explainMatrix(explanation: MatrixExplanation): string;
47
+ /** Prints the fully resolved matrix instead of launching Pi. */
48
+ declare class ExplainCommand extends BaseCommand {
49
+ readonly name = "explain";
50
+ matches(options: HarnessOptions): boolean;
51
+ /**
52
+ * Prices the selection from files on disk.
53
+ *
54
+ * `extensionSources` is empty because extensions publish their skill
55
+ * directories over the session event bus, which has not started here. The
56
+ * rendering names that gap rather than presenting the figure as a total.
57
+ */
58
+ private cost;
59
+ execute(context: HarnessContext): Promise<number>;
60
+ }
61
+ //#endregion
62
+ export { ExplainCommand, MatrixCost, MatrixExplanation, explainMatrix };
63
+ //# sourceMappingURL=explainCommand.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainCommand.d.cts","names":[],"sources":["../../src/commands/explainCommand.ts"],"mappings":";;;;;;;;AAgBA;;;;;UAAiB,UAAA;EAMf;EAJA,iBAAA;EAIa;EAFb,eAAA;EAKgC;EAHhC,aAAA;AAAA;AAAA,UAGe,iBAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,UAAA;EACA,UAAA;EACA,gBAAA;EACA,aAAA;EACA,UAAA;EACA,iBAAA;EACA,WAAA;EACA,IAAA,GAAO,UAAA;AAAA;;AAaT;;;;iBAAgB,aAAA,CAAc,WAAA,EAAa,iBAAA;AA4E3C;AAAA,cAAa,cAAA,SAAuB,WAAA;EAAA,SACzB,IAAA;EAET,OAAA,CAAQ,OAAA,EAAS,cAAA;EAwCM;;;;;;;EAAA,QA7BT,IAAA;EA6BR,OAAA,CAAQ,OAAA,EAAS,cAAA,GAAiB,OAAA;AAAA"}
@@ -0,0 +1,63 @@
1
+ import { HarnessOptions } from "../interfaces/harness.mjs";
2
+ import { HarnessContext } from "../services/harnessContext.mjs";
3
+ import { BaseCommand } from "./baseCommand.mjs";
4
+
5
+ //#region src/commands/explainCommand.d.ts
6
+ /**
7
+ * What the selection costs before the first prompt, in tokens.
8
+ *
9
+ * MCP tool schemas are deliberately absent: they come from the servers at
10
+ * connect time, and pricing them here would mean spawning every configured
11
+ * server and running a handshake on a command that is meant to be instant.
12
+ * `startupTokens` is therefore a floor, not a total, and the rendering says so.
13
+ */
14
+ interface MatrixCost {
15
+ /** The always-on skill block Pi puts in the system prompt. */
16
+ skillPromptTokens: number;
17
+ /** Skill bodies on disk, read only when a skill is invoked. */
18
+ skillBodyTokens: number;
19
+ /** The persona prompt, when a profile selected one. */
20
+ personaTokens: number;
21
+ }
22
+ interface MatrixExplanation {
23
+ majorMode: string;
24
+ profile?: string;
25
+ persona?: string;
26
+ domains: string[];
27
+ plugins: string[];
28
+ layers: string[];
29
+ hookGroups: string[];
30
+ hooksEnabled: boolean;
31
+ skillDirectories: string[];
32
+ skillCount: number;
33
+ agentCount: number;
34
+ agentDirectories: string[];
35
+ mcpConfigPath?: string;
36
+ mcpServers: string[];
37
+ mcpProxyUpstreams?: string[];
38
+ mcpFiltered: boolean;
39
+ cost?: MatrixCost;
40
+ }
41
+ /**
42
+ * Renders the resolved matrix for --explain. Composition spans three config
43
+ * files, so this answers "why is that loaded" in one command instead of a
44
+ * manual trace through domains, major modes, and plugin subsets.
45
+ */
46
+ declare function explainMatrix(explanation: MatrixExplanation): string;
47
+ /** Prints the fully resolved matrix instead of launching Pi. */
48
+ declare class ExplainCommand extends BaseCommand {
49
+ readonly name = "explain";
50
+ matches(options: HarnessOptions): boolean;
51
+ /**
52
+ * Prices the selection from files on disk.
53
+ *
54
+ * `extensionSources` is empty because extensions publish their skill
55
+ * directories over the session event bus, which has not started here. The
56
+ * rendering names that gap rather than presenting the figure as a total.
57
+ */
58
+ private cost;
59
+ execute(context: HarnessContext): Promise<number>;
60
+ }
61
+ //#endregion
62
+ export { ExplainCommand, MatrixCost, MatrixExplanation, explainMatrix };
63
+ //# sourceMappingURL=explainCommand.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainCommand.d.mts","names":[],"sources":["../../src/commands/explainCommand.ts"],"mappings":";;;;;;;;AAgBA;;;;;UAAiB,UAAA;EAMf;EAJA,iBAAA;EAIa;EAFb,eAAA;EAKgC;EAHhC,aAAA;AAAA;AAAA,UAGe,iBAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,UAAA;EACA,UAAA;EACA,gBAAA;EACA,aAAA;EACA,UAAA;EACA,iBAAA;EACA,WAAA;EACA,IAAA,GAAO,UAAA;AAAA;;AAaT;;;;iBAAgB,aAAA,CAAc,WAAA,EAAa,iBAAA;AA4E3C;AAAA,cAAa,cAAA,SAAuB,WAAA;EAAA,SACzB,IAAA;EAET,OAAA,CAAQ,OAAA,EAAS,cAAA;EAwCM;;;;;;;EAAA,QA7BT,IAAA;EA6BR,OAAA,CAAQ,OAAA,EAAS,cAAA,GAAiB,OAAA;AAAA"}
@@ -0,0 +1,21 @@
1
+ import{BaseCommand as e}from"./baseCommand.mjs";import{buildSkillCatalog as t,counter as n}from"../services/skillCatalog.mjs";import r from"node:path";import i from"node:fs";import{buildPersonaPrompt as a}from"@agimon-ai/doompi-config";function o(e){return JSON.parse(i.readFileSync(e,`utf8`)).mcpServers??{}}function s(e){let t=(e,t,n=`(none)`)=>`${e}:\n${t.length===0?` ${n}`:t.map(e=>` ${e}`).join(`
2
+ `)}\n`;return[`doompi resolved matrix
3
+
4
+ `,`major mode: ${e.majorMode}\n\n`,t(`profile`,e.profile?[e.profile]:[],`(none)`),`
5
+ `,t(`persona`,e.persona?[e.persona]:[],`(none)`),`
6
+ `,t(`domains (content)`,e.domains),`
7
+ `,t(`layers (behavior, from the major mode)`,e.layers,`core only`),`
8
+ `,t(`hook groups from layers`,e.hookGroups,e.hooksEnabled?`(core groups only)`:`(hooks disabled)`),`
9
+ `,t(`plugins`,e.plugins.map(e=>r.basename(e))),`
10
+ `,t(`skill directories`,e.skillDirectories.map(e=>r.relative(process.cwd(),e))),`
11
+ `,t(e.mcpFiltered?`mcp servers (filtered by domain allowlist)`:`mcp servers (unfiltered)`,e.mcpServers,`(mcp disabled)`),`
12
+ `,e.mcpProxyUpstreams?t(`mcp proxy upstreams (filtered)`,e.mcpProxyUpstreams):`mcp proxy upstreams:
13
+ (unfiltered, every upstream in mcp-config.yaml)
14
+ `,`
15
+ `,`skills: ${e.skillCount} (from ${e.skillDirectories.length} directories)\n`,`agents: ${e.agentCount}\n`,`mcp config: ${e.mcpConfigPath??`(disabled)`}\n`,e.cost?l(e.cost):``].join(``)}function c(e,t,n=``){let r=` ${e.padEnd(16)}${t.toLocaleString(`en-US`).padStart(9)}`;return`${n?`${r} ${n}`:r}\n`}function l(e){let t=e.skillPromptTokens+e.personaTokens;return[`
16
+ context cost (tokens)
17
+ `,c(`skills prompt`,e.skillPromptTokens,`always on`),c(`persona`,e.personaTokens,`always on`),c(`startup total`,t),c(`skill bodies`,e.skillBodyTokens,`read on demand`),`
18
+ Excludes MCP tool schemas, which the servers only report once connected,
19
+ `,` and skills contributed by extensions, which register after startup.
20
+ `].join(``)}var u=class extends e{name=`explain`;matches(e){return e.explain}async cost(e){let{options:r,resources:i}=e;try{let[o,s]=await Promise.all([t({repoRoot:r.repoRoot,activeSkillDirectories:i.skillDirectories,extensionSources:[]}),n()]),c=e.personaDirectory?a(e.personaRoot??r.repoRoot,e.personaDirectory):void 0;return{skillPromptTokens:o.promptTokens,skillBodyTokens:o.bodyTokens,personaTokens:c?s(c):0}}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`[doompi] ${this.name}: could not price the selection: ${t}\n`);return}}async execute(e){let{options:t,resources:n,plugins:r,mcpAllowlist:i}=e,a=await this.cost(e);return process.stdout.write(s({cost:a,majorMode:t.majorMode,profile:e.profile,persona:e.personaDirectory,domains:t.domains,plugins:r.map(e=>e.directory),layers:e.selectedLayers,hookGroups:e.hookGroups,hooksEnabled:t.hooks,skillDirectories:n.skillDirectories,skillCount:n.skillCount,agentCount:n.agentCount,agentDirectories:n.agentDirectories,mcpConfigPath:n.mcpConfigPath,mcpServers:n.mcpConfigPath?Object.keys(o(n.mcpConfigPath)):[],mcpProxyUpstreams:i?.proxy,mcpFiltered:!!i})),0}};export{u as ExplainCommand,s as explainMatrix};
21
+ //# sourceMappingURL=explainCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainCommand.mjs","names":[],"sources":["../../src/commands/explainCommand.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { buildPersonaPrompt } from '@agimon-ai/doompi-config';\nimport type { HarnessOptions } from '../interfaces/index.ts';\nimport type { HarnessContext } from '../services/index.ts';\nimport { buildSkillCatalog, counter } from '../services/skillCatalog.ts';\nimport { BaseCommand } from './baseCommand.ts';\n\n/**\n * What the selection costs before the first prompt, in tokens.\n *\n * MCP tool schemas are deliberately absent: they come from the servers at\n * connect time, and pricing them here would mean spawning every configured\n * server and running a handshake on a command that is meant to be instant.\n * `startupTokens` is therefore a floor, not a total, and the rendering says so.\n */\nexport interface MatrixCost {\n /** The always-on skill block Pi puts in the system prompt. */\n skillPromptTokens: number;\n /** Skill bodies on disk, read only when a skill is invoked. */\n skillBodyTokens: number;\n /** The persona prompt, when a profile selected one. */\n personaTokens: number;\n}\n\nexport interface MatrixExplanation {\n majorMode: string;\n profile?: string;\n persona?: string;\n domains: string[];\n plugins: string[];\n layers: string[];\n hookGroups: string[];\n hooksEnabled: boolean;\n skillDirectories: string[];\n skillCount: number;\n agentCount: number;\n agentDirectories: string[];\n mcpConfigPath?: string;\n mcpServers: string[];\n mcpProxyUpstreams?: string[];\n mcpFiltered: boolean;\n cost?: MatrixCost;\n}\n\nfunction readMcpServers(configPath: string): Record<string, unknown> {\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8')) as { mcpServers?: Record<string, unknown> };\n return config.mcpServers ?? {};\n}\n\n/**\n * Renders the resolved matrix for --explain. Composition spans three config\n * files, so this answers \"why is that loaded\" in one command instead of a\n * manual trace through domains, major modes, and plugin subsets.\n */\nexport function explainMatrix(explanation: MatrixExplanation): string {\n const section = (label: string, values: string[], empty = '(none)'): string =>\n `${label}:\\n${values.length === 0 ? ` ${empty}` : values.map((value) => ` ${value}`).join('\\n')}\\n`;\n\n return [\n `doompi resolved matrix\\n\\n`,\n `major mode: ${explanation.majorMode}\\n\\n`,\n section('profile', explanation.profile ? [explanation.profile] : [], '(none)'),\n '\\n',\n section('persona', explanation.persona ? [explanation.persona] : [], '(none)'),\n '\\n',\n section('domains (content)', explanation.domains),\n '\\n',\n section('layers (behavior, from the major mode)', explanation.layers, 'core only'),\n '\\n',\n section(\n 'hook groups from layers',\n explanation.hookGroups,\n explanation.hooksEnabled ? '(core groups only)' : '(hooks disabled)',\n ),\n '\\n',\n section(\n 'plugins',\n explanation.plugins.map((directory) => path.basename(directory)),\n ),\n '\\n',\n section(\n 'skill directories',\n explanation.skillDirectories.map((directory) => path.relative(process.cwd(), directory)),\n ),\n '\\n',\n section(\n explanation.mcpFiltered ? 'mcp servers (filtered by domain allowlist)' : 'mcp servers (unfiltered)',\n explanation.mcpServers,\n '(mcp disabled)',\n ),\n '\\n',\n explanation.mcpProxyUpstreams\n ? section('mcp proxy upstreams (filtered)', explanation.mcpProxyUpstreams)\n : 'mcp proxy upstreams:\\n (unfiltered, every upstream in mcp-config.yaml)\\n',\n '\\n',\n `skills: ${explanation.skillCount} (from ${explanation.skillDirectories.length} directories)\\n`,\n `agents: ${explanation.agentCount}\\n`,\n `mcp config: ${explanation.mcpConfigPath ?? '(disabled)'}\\n`,\n explanation.cost ? renderCost(explanation.cost) : '',\n ].join('');\n}\n\nconst TOKEN_COLUMN = 9;\n\nfunction tokenLine(label: string, tokens: number, note = ''): string {\n const row = ` ${label.padEnd(16)}${tokens.toLocaleString('en-US').padStart(TOKEN_COLUMN)}`;\n return `${note ? `${row} ${note}` : row}\\n`;\n}\n\n/**\n * The bill, rendered last so the sections above keep their order.\n *\n * Every figure is derived from files on disk, so two runs of the same selection\n * print the same numbers and a reader can reproduce them without trusting this\n * output.\n */\nfunction renderCost(cost: MatrixCost): string {\n const startup = cost.skillPromptTokens + cost.personaTokens;\n return [\n '\\ncontext cost (tokens)\\n',\n tokenLine('skills prompt', cost.skillPromptTokens, 'always on'),\n tokenLine('persona', cost.personaTokens, 'always on'),\n tokenLine('startup total', startup),\n tokenLine('skill bodies', cost.skillBodyTokens, 'read on demand'),\n '\\n Excludes MCP tool schemas, which the servers only report once connected,\\n',\n ' and skills contributed by extensions, which register after startup.\\n',\n ].join('');\n}\n\n/** Prints the fully resolved matrix instead of launching Pi. */\nexport class ExplainCommand extends BaseCommand {\n readonly name = 'explain';\n\n matches(options: HarnessOptions): boolean {\n return options.explain;\n }\n\n /**\n * Prices the selection from files on disk.\n *\n * `extensionSources` is empty because extensions publish their skill\n * directories over the session event bus, which has not started here. The\n * rendering names that gap rather than presenting the figure as a total.\n */\n private async cost(context: HarnessContext): Promise<MatrixCost | undefined> {\n const { options, resources } = context;\n try {\n const [catalog, countTokens] = await Promise.all([\n buildSkillCatalog({\n repoRoot: options.repoRoot,\n activeSkillDirectories: resources.skillDirectories,\n extensionSources: [],\n }),\n counter(),\n ]);\n const persona = context.personaDirectory\n ? buildPersonaPrompt(context.personaRoot ?? options.repoRoot, context.personaDirectory)\n : undefined;\n return {\n skillPromptTokens: catalog.promptTokens,\n skillBodyTokens: catalog.bodyTokens,\n personaTokens: persona ? countTokens(persona) : 0,\n };\n } catch (error) {\n // Pricing reads the skill files, so an unreadable one must not take the\n // whole explanation down: the resolved matrix is the point, the bill is\n // the extra. Reported rather than swallowed.\n const detail = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[doompi] ${this.name}: could not price the selection: ${detail}\\n`);\n return undefined;\n }\n }\n\n async execute(context: HarnessContext): Promise<number> {\n const { options, resources, plugins, mcpAllowlist } = context;\n const cost = await this.cost(context);\n\n process.stdout.write(\n explainMatrix({\n cost,\n majorMode: options.majorMode,\n profile: context.profile,\n persona: context.personaDirectory,\n domains: options.domains,\n plugins: plugins.map((entry) => entry.directory),\n layers: context.selectedLayers,\n hookGroups: context.hookGroups,\n hooksEnabled: options.hooks,\n skillDirectories: resources.skillDirectories,\n skillCount: resources.skillCount,\n agentCount: resources.agentCount,\n agentDirectories: resources.agentDirectories,\n mcpConfigPath: resources.mcpConfigPath,\n // Read back from the generated config so this reports what Pi will\n // actually load, not what the allowlist intended.\n mcpServers: resources.mcpConfigPath ? Object.keys(readMcpServers(resources.mcpConfigPath)) : [],\n mcpProxyUpstreams: mcpAllowlist?.proxy,\n mcpFiltered: Boolean(mcpAllowlist),\n }),\n );\n return 0;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./baseCommand.cjs`),t=require(`./compatibilityCommand.cjs`),n=require(`./emitMcpCommand.cjs`),r=require(`./explainCommand.cjs`),i=require(`./initCommand.cjs`),a=require(`./launchCommand.cjs`),o=require(`./syncCommand.cjs`);exports.BaseCommand=e.BaseCommand,exports.CompatibilityCommand=t.CompatibilityCommand,exports.EmitMcpCommand=n.EmitMcpCommand,exports.ExplainCommand=r.ExplainCommand,exports.InitCommand=i.InitCommand,exports.LaunchCommand=a.LaunchCommand,exports.SyncCommand=o.SyncCommand,exports.collectDrift=o.collectDrift,exports.explainMatrix=r.explainMatrix,exports.formatSyncResult=o.formatSyncResult,exports.recordedEnvironment=o.recordedEnvironment,exports.selectionEnvironment=o.selectionEnvironment,exports.toSelection=o.toSelection;
@@ -0,0 +1,8 @@
1
+ import { BaseCommand } from "./baseCommand.cjs";
2
+ import { CompatibilityCommand } from "./compatibilityCommand.cjs";
3
+ import { EmitMcpCommand } from "./emitMcpCommand.cjs";
4
+ import { ExplainCommand, MatrixExplanation, explainMatrix } from "./explainCommand.cjs";
5
+ import { InitCommand } from "./initCommand.cjs";
6
+ import { LaunchCommand } from "./launchCommand.cjs";
7
+ import { SyncCommand, SyncResult, collectDrift, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection } from "./syncCommand.cjs";
8
+ export { BaseCommand, CompatibilityCommand, EmitMcpCommand, ExplainCommand, InitCommand, LaunchCommand, type MatrixExplanation, SyncCommand, type SyncResult, collectDrift, explainMatrix, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection };
@@ -0,0 +1,8 @@
1
+ import { BaseCommand } from "./baseCommand.mjs";
2
+ import { CompatibilityCommand } from "./compatibilityCommand.mjs";
3
+ import { EmitMcpCommand } from "./emitMcpCommand.mjs";
4
+ import { ExplainCommand, MatrixExplanation, explainMatrix } from "./explainCommand.mjs";
5
+ import { InitCommand } from "./initCommand.mjs";
6
+ import { LaunchCommand } from "./launchCommand.mjs";
7
+ import { SyncCommand, SyncResult, collectDrift, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection } from "./syncCommand.mjs";
8
+ export { BaseCommand, CompatibilityCommand, EmitMcpCommand, ExplainCommand, InitCommand, LaunchCommand, type MatrixExplanation, SyncCommand, type SyncResult, collectDrift, explainMatrix, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection };
@@ -0,0 +1 @@
1
+ import{BaseCommand as e}from"./baseCommand.mjs";import{CompatibilityCommand as t}from"./compatibilityCommand.mjs";import{EmitMcpCommand as n}from"./emitMcpCommand.mjs";import{ExplainCommand as r,explainMatrix as i}from"./explainCommand.mjs";import{InitCommand as a}from"./initCommand.mjs";import{LaunchCommand as o}from"./launchCommand.mjs";import{SyncCommand as s,collectDrift as c,formatSyncResult as l,recordedEnvironment as u,selectionEnvironment as d,toSelection as f}from"./syncCommand.mjs";export{e as BaseCommand,t as CompatibilityCommand,n as EmitMcpCommand,r as ExplainCommand,a as InitCommand,o as LaunchCommand,s as SyncCommand,c as collectDrift,i as explainMatrix,l as formatSyncResult,u as recordedEnvironment,d as selectionEnvironment,f as toSelection};
@@ -0,0 +1,3 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`);let t=require(`node:os`);t=e.__toESM(t,1);let n=require(`@agimon-ai/doompi-config`);const r=`--force`;function i(e){return e.length===0?`(none)`:e.join(`, `)}function a(e){let t=[`Doom config directory: ${e.directory}`,`Created: ${i(e.created)}`,`Preserved: ${i(e.preserved)}`];return e.replaced.length>0&&t.push(`Replaced: ${i(e.replaced)}`),t.join(`
2
+ `)}var o=class{name=`init`;matches(e){return e[0]===this.name}async execute(e,i=t.default.homedir(),o=process.stdout){let s=e.slice(1),c=s.find(e=>e!==r);if(c!==void 0)throw Error(`doompi init does not accept ${c}`);let l=(0,n.initializeGlobalDoomConfig)(i,{force:s.includes(r)});return o.write(`${a(l)}\n`),0}};exports.InitCommand=o;
3
+ //# sourceMappingURL=initCommand.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initCommand.cjs","names":["os"],"sources":["../../src/commands/initCommand.ts"],"sourcesContent":["import os from 'node:os';\nimport { initializeGlobalDoomConfig, type GlobalDoomInitResult } from '@agimon-ai/doompi-config';\n\nconst INIT_COMMAND = 'init';\nconst EMPTY_FILE_LIST = '(none)';\nconst FORCE_FLAG = '--force';\n\ntype InitOutput = Pick<NodeJS.WritableStream, 'write'>;\n\nfunction formatFileNames(fileNames: readonly string[]): string {\n return fileNames.length === 0 ? EMPTY_FILE_LIST : fileNames.join(', ');\n}\n\nfunction formatInitResult(result: GlobalDoomInitResult): string {\n const lines = [\n `Doom config directory: ${result.directory}`,\n `Created: ${formatFileNames(result.created)}`,\n `Preserved: ${formatFileNames(result.preserved)}`,\n ];\n // Only meaningful under --force, and silence would hide a destructive run.\n if (result.replaced.length > 0) lines.push(`Replaced: ${formatFileNames(result.replaced)}`);\n return lines.join('\\n');\n}\n\n/** Handles the repository-independent `doom-pi init` command. */\nexport class InitCommand {\n readonly name = INIT_COMMAND;\n\n matches(args: string[]): boolean {\n return args[0] === this.name;\n }\n\n async execute(args: string[], homeDirectory = os.homedir(), output: InitOutput = process.stdout): Promise<number> {\n const flags = args.slice(1);\n const unknown = flags.find((flag) => flag !== FORCE_FLAG);\n if (unknown !== undefined) throw new Error(`doompi init does not accept ${unknown}`);\n\n const result = initializeGlobalDoomConfig(homeDirectory, { force: flags.includes(FORCE_FLAG) });\n output.write(`${formatInitResult(result)}\\n`);\n return 0;\n }\n}\n"],"mappings":"4MAGA,MAEM,EAAa,UAInB,SAAS,EAAgB,EAAsC,CAC7D,OAAO,EAAU,SAAW,EAAI,SAAkB,EAAU,KAAK,KAAK,CAGxE,SAAS,EAAiB,EAAsC,CAC9D,IAAM,EAAQ,CACZ,0BAA0B,EAAO,YACjC,YAAY,EAAgB,EAAO,QAAQ,GAC3C,cAAc,EAAgB,EAAO,UAAU,GAChD,CAGD,OADI,EAAO,SAAS,OAAS,GAAG,EAAM,KAAK,aAAa,EAAgB,EAAO,SAAS,GAAG,CACpF,EAAM,KAAK;EAAK,CAIzB,IAAa,EAAb,KAAyB,CACvB,KAAgB,OAEhB,QAAQ,EAAyB,CAC/B,OAAO,EAAK,KAAO,KAAK,KAG1B,MAAM,QAAQ,EAAgB,EAAgBA,EAAAA,QAAG,SAAS,CAAE,EAAqB,QAAQ,OAAyB,CAChH,IAAM,EAAQ,EAAK,MAAM,EAAE,CACrB,EAAU,EAAM,KAAM,GAAS,IAAS,EAAW,CACzD,GAAI,IAAY,IAAA,GAAW,MAAU,MAAM,+BAA+B,IAAU,CAEpF,IAAM,GAAA,EAAA,EAAA,4BAAoC,EAAe,CAAE,MAAO,EAAM,SAAS,EAAW,CAAE,CAAC,CAE/F,OADA,EAAO,MAAM,GAAG,EAAiB,EAAO,CAAC,IAAI,CACtC"}
@@ -0,0 +1,11 @@
1
+ //#region src/commands/initCommand.d.ts
2
+ type InitOutput = Pick<NodeJS.WritableStream, 'write'>;
3
+ /** Handles the repository-independent `doom-pi init` command. */
4
+ declare class InitCommand {
5
+ readonly name = "init";
6
+ matches(args: string[]): boolean;
7
+ execute(args: string[], homeDirectory?: string, output?: InitOutput): Promise<number>;
8
+ }
9
+ //#endregion
10
+ export { InitCommand };
11
+ //# sourceMappingURL=initCommand.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initCommand.d.cts","names":[],"sources":["../../src/commands/initCommand.ts"],"mappings":";KAOK,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,cAAA;;cAkBjB,WAAA;EAAA,SACF,IAAA;EAET,OAAA,CAAQ,IAAA;EAIF,OAAA,CAAQ,IAAA,YAAgB,aAAA,WAA8B,MAAA,GAAQ,UAAA,GAA8B,OAAA;AAAA"}
@@ -0,0 +1,11 @@
1
+ //#region src/commands/initCommand.d.ts
2
+ type InitOutput = Pick<NodeJS.WritableStream, 'write'>;
3
+ /** Handles the repository-independent `doom-pi init` command. */
4
+ declare class InitCommand {
5
+ readonly name = "init";
6
+ matches(args: string[]): boolean;
7
+ execute(args: string[], homeDirectory?: string, output?: InitOutput): Promise<number>;
8
+ }
9
+ //#endregion
10
+ export { InitCommand };
11
+ //# sourceMappingURL=initCommand.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initCommand.d.mts","names":[],"sources":["../../src/commands/initCommand.ts"],"mappings":";KAOK,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,cAAA;;cAkBjB,WAAA;EAAA,SACF,IAAA;EAET,OAAA,CAAQ,IAAA;EAIF,OAAA,CAAQ,IAAA,YAAgB,aAAA,WAA8B,MAAA,GAAQ,UAAA,GAA8B,OAAA;AAAA"}
@@ -0,0 +1,3 @@
1
+ import e from"node:os";import{initializeGlobalDoomConfig as t}from"@agimon-ai/doompi-config";const n=`--force`;function r(e){return e.length===0?`(none)`:e.join(`, `)}function i(e){let t=[`Doom config directory: ${e.directory}`,`Created: ${r(e.created)}`,`Preserved: ${r(e.preserved)}`];return e.replaced.length>0&&t.push(`Replaced: ${r(e.replaced)}`),t.join(`
2
+ `)}var a=class{name=`init`;matches(e){return e[0]===this.name}async execute(r,a=e.homedir(),o=process.stdout){let s=r.slice(1),c=s.find(e=>e!==n);if(c!==void 0)throw Error(`doompi init does not accept ${c}`);let l=t(a,{force:s.includes(n)});return o.write(`${i(l)}\n`),0}};export{a as InitCommand};
3
+ //# sourceMappingURL=initCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initCommand.mjs","names":[],"sources":["../../src/commands/initCommand.ts"],"sourcesContent":["import os from 'node:os';\nimport { initializeGlobalDoomConfig, type GlobalDoomInitResult } from '@agimon-ai/doompi-config';\n\nconst INIT_COMMAND = 'init';\nconst EMPTY_FILE_LIST = '(none)';\nconst FORCE_FLAG = '--force';\n\ntype InitOutput = Pick<NodeJS.WritableStream, 'write'>;\n\nfunction formatFileNames(fileNames: readonly string[]): string {\n return fileNames.length === 0 ? EMPTY_FILE_LIST : fileNames.join(', ');\n}\n\nfunction formatInitResult(result: GlobalDoomInitResult): string {\n const lines = [\n `Doom config directory: ${result.directory}`,\n `Created: ${formatFileNames(result.created)}`,\n `Preserved: ${formatFileNames(result.preserved)}`,\n ];\n // Only meaningful under --force, and silence would hide a destructive run.\n if (result.replaced.length > 0) lines.push(`Replaced: ${formatFileNames(result.replaced)}`);\n return lines.join('\\n');\n}\n\n/** Handles the repository-independent `doom-pi init` command. */\nexport class InitCommand {\n readonly name = INIT_COMMAND;\n\n matches(args: string[]): boolean {\n return args[0] === this.name;\n }\n\n async execute(args: string[], homeDirectory = os.homedir(), output: InitOutput = process.stdout): Promise<number> {\n const flags = args.slice(1);\n const unknown = flags.find((flag) => flag !== FORCE_FLAG);\n if (unknown !== undefined) throw new Error(`doompi init does not accept ${unknown}`);\n\n const result = initializeGlobalDoomConfig(homeDirectory, { force: flags.includes(FORCE_FLAG) });\n output.write(`${formatInitResult(result)}\\n`);\n return 0;\n }\n}\n"],"mappings":"6FAGA,MAEM,EAAa,UAInB,SAAS,EAAgB,EAAsC,CAC7D,OAAO,EAAU,SAAW,EAAI,SAAkB,EAAU,KAAK,KAAK,CAGxE,SAAS,EAAiB,EAAsC,CAC9D,IAAM,EAAQ,CACZ,0BAA0B,EAAO,YACjC,YAAY,EAAgB,EAAO,QAAQ,GAC3C,cAAc,EAAgB,EAAO,UAAU,GAChD,CAGD,OADI,EAAO,SAAS,OAAS,GAAG,EAAM,KAAK,aAAa,EAAgB,EAAO,SAAS,GAAG,CACpF,EAAM,KAAK;EAAK,CAIzB,IAAa,EAAb,KAAyB,CACvB,KAAgB,OAEhB,QAAQ,EAAyB,CAC/B,OAAO,EAAK,KAAO,KAAK,KAG1B,MAAM,QAAQ,EAAgB,EAAgB,EAAG,SAAS,CAAE,EAAqB,QAAQ,OAAyB,CAChH,IAAM,EAAQ,EAAK,MAAM,EAAE,CACrB,EAAU,EAAM,KAAM,GAAS,IAAS,EAAW,CACzD,GAAI,IAAY,IAAA,GAAW,MAAU,MAAM,+BAA+B,IAAU,CAEpF,IAAM,EAAS,EAA2B,EAAe,CAAE,MAAO,EAAM,SAAS,EAAW,CAAE,CAAC,CAE/F,OADA,EAAO,MAAM,GAAG,EAAiB,EAAO,CAAC,IAAI,CACtC"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./baseCommand.cjs`),n=require(`../logSinkTelemetry.cjs`),r=require(`../config/projectTrust.cjs`);require(`../config/index.cjs`);const i=require(`../utils/json.cjs`),a=require(`../utils/moduleResolution.cjs`);require(`../utils/index.cjs`);const o=require(`../services/compatibility/process.cjs`),s=require(`../services/extensionAssembler.cjs`);require(`../services/index.cjs`);let c=require(`cross-spawn`);c=e.__toESM(c,1);const l=`vibe-lint`,u=`pipe`;function d(e){let t;try{t=JSON.parse(e)}catch(e){throw Error(`Expected a JSON vibe-lint invocation on stdin`,{cause:e})}if(!i.isRecord(t)||typeof t.prompt!=`string`||typeof t.systemPrompt!=`string`)throw Error(`A vibe-lint invocation requires string prompt and systemPrompt fields`);if(t.maxTokens!==void 0&&typeof t.maxTokens!=`number`)throw Error(`A vibe-lint invocation maxTokens field must be a number`);if(t.screenshotPaths!==void 0&&(!Array.isArray(t.screenshotPaths)||!t.screenshotPaths.every(e=>typeof e==`string`)))throw Error(`A vibe-lint invocation screenshotPaths field must be an array of strings`);return{prompt:t.prompt,systemPrompt:t.systemPrompt,maxTokens:t.maxTokens,screenshotPaths:t.screenshotPaths}}function f(e,t){return[...e,`--print`,...r.hasProjectTrustOption(e)?[]:[`--approve`],`--no-session`,`--system-prompt`,t.systemPrompt,...(t.screenshotPaths??[]).map(e=>`@${e}`),t.prompt]}function p(e){return`${JSON.stringify({content:e.trim()})}\n`}function m(e,t){return[`--no-themes`,`--theme`,t,...e]}async function h(){let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(String(t)));return Buffer.concat(e).toString(`utf-8`)}var g=class extends t.BaseCommand{name=`launch`;matches(e){return!0}async execute(e,t){let{options:i,environment:g}=e,_=s.assembleExtensions({agents:i.agents,autoStop:i.autoStop,mute:i.mute,preset:i.preset,mcpEntry:e.mcpEntry,personaEntry:e.personaEntry,workflowExtension:e.workflowExtension,layers:e.selectedLayers,majorModesConfig:e.majorModesConfig}),v=s.assembleChildExtensions({agents:!1,autoStop:!1,mute:!0,preset:i.preset,mcpEntry:e.mcpEntry,personaEntry:e.personaEntry,layers:e.selectedLayers,majorModesConfig:e.majorModesConfig});g.DOOMPI_CHILD_EXTENSIONS=JSON.stringify(v);let y;try{y=r.loadDoomConfig(i.repoRoot)}catch(e){throw await t.recordError(n.HARNESS_EVENT.configLoadFailed,e,{"harness.phase":`load_config`}),e}t.recordEvent(n.HARNESS_EVENT.projectTrustResolved,{"harness.project_trust":y.projectTrust,"harness.project_trust.overridden":r.hasProjectTrustOption(i.piArgs)});let b=r.applyProjectTrust(i.piArgs,y);b=m(b,e.defaultThemePath);for(let e of _)b=[`--extension`,e,...b];if(i.outputFormat===l){let e=d(await h());b=f(b,e)}let x=Date.now(),S=(0,c.default)(process.execPath,[a.piCliPath(),...b],{cwd:i.cwd,env:g,stdio:i.outputFormat===l?[`ignore`,u,u]:`inherit`}),C=``;if(i.outputFormat===l){if(!S.stdout||!S.stderr)throw Error(`Failed to open Pi output streams`);S.stdout.on(`data`,e=>{C+=e.toString()}),S.stderr.on(`data`,e=>{process.stderr.write(e)})}let w=o.forwardSignals(S),T=await t.runInSpan(`doom_pi.pi_session`,{"harness.extension.count":_.length,"harness.mode":i.outputFormat},()=>o.waitForExit(S)).catch(async e=>{throw await t.recordError(n.HARNESS_EVENT.launchFailed,e,{"harness.duration_ms":Date.now()-x}),e}).finally(w);return t.recordEvent(n.HARNESS_EVENT.launchCompleted,{"harness.exit_code":T,"harness.duration_ms":Date.now()-x,"harness.mode":i.outputFormat??`default`}),i.outputFormat===l&&T===0&&process.stdout.write(p(C)),T}};exports.LaunchCommand=g,exports.buildVibeLintPiArgs=f,exports.formatVibeLintResponse=p,exports.overridePiThemes=m,exports.parseVibeLintInvocation=d;
2
+ //# sourceMappingURL=launchCommand.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchCommand.cjs","names":["isRecord","hasProjectTrustOption","BaseCommand","assembleExtensions","assembleChildExtensions","loadDoomConfig","HARNESS_EVENT","applyProjectTrust","piCliPath","forwardSignals","waitForExit"],"sources":["../../src/commands/launchCommand.ts"],"sourcesContent":["import spawn from 'cross-spawn';\nimport { applyProjectTrust, hasProjectTrustOption, loadDoomConfig, type DoomConfig } from '../config/index.ts';\nimport type { HarnessOptions } from '../interfaces/index.ts';\nimport { HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { type HarnessContext, assembleChildExtensions, assembleExtensions } from '../services/index.ts';\nimport { forwardSignals, waitForExit } from '../services/compatibility/process.ts';\nimport { isRecord, piCliPath } from '../utils/index.ts';\nimport { BaseCommand } from './baseCommand.ts';\n\nconst VIBE_LINT_FORMAT = 'vibe-lint';\nconst PRINT_OPTION = '--print';\nconst APPROVE_OPTION = '--approve';\nconst NO_SESSION_OPTION = '--no-session';\nconst SYSTEM_PROMPT_OPTION = '--system-prompt';\nconst THEME_OPTION = '--theme';\nconst NO_THEMES_OPTION = '--no-themes';\nconst EXTENSION_OPTION = '--extension';\nconst IGNORE_STDIO = 'ignore';\nconst PIPE_STDIO = 'pipe';\nconst INHERIT_STDIO = 'inherit';\n\nexport interface VibeLintInvocation {\n prompt: string;\n systemPrompt: string;\n maxTokens?: number;\n screenshotPaths?: string[];\n}\n\nexport function parseVibeLintInvocation(input: string): VibeLintInvocation {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new Error('Expected a JSON vibe-lint invocation on stdin', { cause: error });\n }\n\n if (!isRecord(parsed) || typeof parsed.prompt !== 'string' || typeof parsed.systemPrompt !== 'string') {\n throw new Error('A vibe-lint invocation requires string prompt and systemPrompt fields');\n }\n if (parsed.maxTokens !== undefined && typeof parsed.maxTokens !== 'number') {\n throw new Error('A vibe-lint invocation maxTokens field must be a number');\n }\n if (\n parsed.screenshotPaths !== undefined &&\n (!Array.isArray(parsed.screenshotPaths) || !parsed.screenshotPaths.every((value) => typeof value === 'string'))\n ) {\n throw new Error('A vibe-lint invocation screenshotPaths field must be an array of strings');\n }\n\n return {\n prompt: parsed.prompt,\n systemPrompt: parsed.systemPrompt,\n maxTokens: parsed.maxTokens,\n screenshotPaths: parsed.screenshotPaths as string[] | undefined,\n };\n}\n\nexport function buildVibeLintPiArgs(piArgs: string[], invocation: VibeLintInvocation): string[] {\n return [\n ...piArgs,\n PRINT_OPTION,\n ...(!hasProjectTrustOption(piArgs) ? [APPROVE_OPTION] : []),\n // Reviews are disposable and must not appear in Pi's resume history.\n NO_SESSION_OPTION,\n SYSTEM_PROMPT_OPTION,\n invocation.systemPrompt,\n ...(invocation.screenshotPaths ?? []).map((screenshotPath) => `@${screenshotPath}`),\n invocation.prompt,\n ];\n}\n\nexport function formatVibeLintResponse(content: string): string {\n return `${JSON.stringify({ content: content.trim() })}\\n`;\n}\n\n/** Ignores configured themes and loads only themes explicitly passed to the launcher. */\nexport function overridePiThemes(piArgs: string[], themePath: string): string[] {\n return [NO_THEMES_OPTION, THEME_OPTION, themePath, ...piArgs];\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n }\n return Buffer.concat(chunks).toString('utf-8');\n}\n\n/**\n * Spawns Pi with the resolved extensions, environment, and theme.\n *\n * This is the default command: it matches whenever no diagnostic flag claimed\n * the run.\n */\nexport class LaunchCommand extends BaseCommand {\n readonly name = 'launch';\n\n matches(_options: HarnessOptions): boolean {\n return true;\n }\n\n async execute(context: HarnessContext, telemetry: HarnessTelemetry): Promise<number> {\n const { options, environment } = context;\n\n const extensions = assembleExtensions({\n agents: options.agents,\n autoStop: options.autoStop,\n mute: options.mute,\n preset: options.preset,\n mcpEntry: context.mcpEntry,\n personaEntry: context.personaEntry,\n workflowExtension: context.workflowExtension,\n layers: context.selectedLayers,\n majorModesConfig: context.majorModesConfig,\n });\n const childExtensions = assembleChildExtensions({\n agents: false,\n autoStop: false,\n mute: true,\n preset: options.preset,\n mcpEntry: context.mcpEntry,\n personaEntry: context.personaEntry,\n layers: context.selectedLayers,\n majorModesConfig: context.majorModesConfig,\n });\n environment.DOOMPI_CHILD_EXTENSIONS = JSON.stringify(childExtensions);\n\n // A malformed .doom/config.yaml aborts the launch, and the message only\n // reaches the terminal that ran it, so record it before it propagates.\n let doomConfig: DoomConfig;\n try {\n doomConfig = loadDoomConfig(options.repoRoot);\n } catch (error) {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, { 'harness.phase': 'load_config' });\n throw error;\n }\n\n // Whether a session ran with repository approval is the single most useful\n // fact when reconstructing what an agent was allowed to do.\n void telemetry.recordEvent(HARNESS_EVENT.projectTrustResolved, {\n 'harness.project_trust': doomConfig.projectTrust,\n 'harness.project_trust.overridden': hasProjectTrustOption(options.piArgs),\n });\n\n let piArgs = applyProjectTrust(options.piArgs, doomConfig);\n piArgs = overridePiThemes(piArgs, context.defaultThemePath);\n for (const extension of extensions) piArgs = [EXTENSION_OPTION, extension, ...piArgs];\n\n if (options.outputFormat === VIBE_LINT_FORMAT) {\n const invocation = parseVibeLintInvocation(await readStdin());\n piArgs = buildVibeLintPiArgs(piArgs, invocation);\n }\n\n const startedAt = Date.now();\n const child = spawn(process.execPath, [piCliPath(), ...piArgs], {\n cwd: options.cwd,\n env: environment,\n stdio: options.outputFormat === VIBE_LINT_FORMAT ? [IGNORE_STDIO, PIPE_STDIO, PIPE_STDIO] : INHERIT_STDIO,\n });\n let stdout = '';\n if (options.outputFormat === VIBE_LINT_FORMAT) {\n if (!child.stdout || !child.stderr) throw new Error('Failed to open Pi output streams');\n child.stdout.on('data', (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: string | Buffer) => {\n process.stderr.write(chunk);\n });\n }\n\n // Shared with the compatibility providers, so a second Ctrl-C still reaches\n // the child and SIGHUP and SIGQUIT are forwarded too.\n const stopForwarding = forwardSignals(child);\n const result = await telemetry\n .runInSpan(\n 'doom_pi.pi_session',\n {\n 'harness.extension.count': extensions.length,\n 'harness.mode': options.outputFormat,\n },\n () => waitForExit(child),\n )\n .catch(async (error: unknown) => {\n // A spawn error means Pi never started, which is invisible to the\n // session telemetry the child would otherwise have reported.\n await telemetry.recordError(HARNESS_EVENT.launchFailed, error, {\n 'harness.duration_ms': Date.now() - startedAt,\n });\n throw error;\n })\n .finally(stopForwarding);\n\n void telemetry.recordEvent(HARNESS_EVENT.launchCompleted, {\n 'harness.exit_code': result,\n 'harness.duration_ms': Date.now() - startedAt,\n 'harness.mode': options.outputFormat ?? 'default',\n });\n\n if (options.outputFormat === VIBE_LINT_FORMAT && result === 0) {\n process.stdout.write(formatVibeLintResponse(stdout));\n }\n return result;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { HarnessOptions } from "../interfaces/harness.cjs";
2
+ import { HarnessTelemetry } from "../logSinkTelemetry.cjs";
3
+ import { HarnessContext } from "../services/harnessContext.cjs";
4
+ import { BaseCommand } from "./baseCommand.cjs";
5
+
6
+ //#region src/commands/launchCommand.d.ts
7
+ interface VibeLintInvocation {
8
+ prompt: string;
9
+ systemPrompt: string;
10
+ maxTokens?: number;
11
+ screenshotPaths?: string[];
12
+ }
13
+ declare function parseVibeLintInvocation(input: string): VibeLintInvocation;
14
+ declare function buildVibeLintPiArgs(piArgs: string[], invocation: VibeLintInvocation): string[];
15
+ declare function formatVibeLintResponse(content: string): string;
16
+ /** Ignores configured themes and loads only themes explicitly passed to the launcher. */
17
+ declare function overridePiThemes(piArgs: string[], themePath: string): string[];
18
+ /**
19
+ * Spawns Pi with the resolved extensions, environment, and theme.
20
+ *
21
+ * This is the default command: it matches whenever no diagnostic flag claimed
22
+ * the run.
23
+ */
24
+ declare class LaunchCommand extends BaseCommand {
25
+ readonly name = "launch";
26
+ matches(_options: HarnessOptions): boolean;
27
+ execute(context: HarnessContext, telemetry: HarnessTelemetry): Promise<number>;
28
+ }
29
+ //#endregion
30
+ export { LaunchCommand, VibeLintInvocation, buildVibeLintPiArgs, formatVibeLintResponse, overridePiThemes, parseVibeLintInvocation };
31
+ //# sourceMappingURL=launchCommand.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchCommand.d.cts","names":[],"sources":["../../src/commands/launchCommand.ts"],"mappings":";;;;;;UAqBiB,kBAAA;EACf,MAAA;EACA,YAAA;EACA,SAAA;EACA,eAAA;AAAA;AAAA,iBAGc,uBAAA,CAAwB,KAAA,WAAgB,kBAAA;AAAA,iBA6BxC,mBAAA,CAAoB,MAAA,YAAkB,UAAA,EAAY,kBAAA;AAAA,iBAclD,sBAAA,CAAuB,OAAA;;iBAKvB,gBAAA,CAAiB,MAAA,YAAkB,SAAA;;;AAhDnD;;;;cAkEa,aAAA,SAAsB,WAAA;EAAA,SACxB,IAAA;EAET,OAAA,CAAQ,QAAA,EAAU,cAAA;EAIZ,OAAA,CAAQ,OAAA,EAAS,cAAA,EAAgB,SAAA,EAAW,gBAAA,GAAmB,OAAA;AAAA"}
@@ -0,0 +1,31 @@
1
+ import { HarnessOptions } from "../interfaces/harness.mjs";
2
+ import { HarnessTelemetry } from "../logSinkTelemetry.mjs";
3
+ import { HarnessContext } from "../services/harnessContext.mjs";
4
+ import { BaseCommand } from "./baseCommand.mjs";
5
+
6
+ //#region src/commands/launchCommand.d.ts
7
+ interface VibeLintInvocation {
8
+ prompt: string;
9
+ systemPrompt: string;
10
+ maxTokens?: number;
11
+ screenshotPaths?: string[];
12
+ }
13
+ declare function parseVibeLintInvocation(input: string): VibeLintInvocation;
14
+ declare function buildVibeLintPiArgs(piArgs: string[], invocation: VibeLintInvocation): string[];
15
+ declare function formatVibeLintResponse(content: string): string;
16
+ /** Ignores configured themes and loads only themes explicitly passed to the launcher. */
17
+ declare function overridePiThemes(piArgs: string[], themePath: string): string[];
18
+ /**
19
+ * Spawns Pi with the resolved extensions, environment, and theme.
20
+ *
21
+ * This is the default command: it matches whenever no diagnostic flag claimed
22
+ * the run.
23
+ */
24
+ declare class LaunchCommand extends BaseCommand {
25
+ readonly name = "launch";
26
+ matches(_options: HarnessOptions): boolean;
27
+ execute(context: HarnessContext, telemetry: HarnessTelemetry): Promise<number>;
28
+ }
29
+ //#endregion
30
+ export { LaunchCommand, VibeLintInvocation, buildVibeLintPiArgs, formatVibeLintResponse, overridePiThemes, parseVibeLintInvocation };
31
+ //# sourceMappingURL=launchCommand.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchCommand.d.mts","names":[],"sources":["../../src/commands/launchCommand.ts"],"mappings":";;;;;;UAqBiB,kBAAA;EACf,MAAA;EACA,YAAA;EACA,SAAA;EACA,eAAA;AAAA;AAAA,iBAGc,uBAAA,CAAwB,KAAA,WAAgB,kBAAA;AAAA,iBA6BxC,mBAAA,CAAoB,MAAA,YAAkB,UAAA,EAAY,kBAAA;AAAA,iBAclD,sBAAA,CAAuB,OAAA;;iBAKvB,gBAAA,CAAiB,MAAA,YAAkB,SAAA;;;AAhDnD;;;;cAkEa,aAAA,SAAsB,WAAA;EAAA,SACxB,IAAA;EAET,OAAA,CAAQ,QAAA,EAAU,cAAA;EAIZ,OAAA,CAAQ,OAAA,EAAS,cAAA,EAAgB,SAAA,EAAW,gBAAA,GAAmB,OAAA;AAAA"}
@@ -0,0 +1,2 @@
1
+ import{BaseCommand as e}from"./baseCommand.mjs";import{HARNESS_EVENT as t}from"../logSinkTelemetry.mjs";import{applyProjectTrust as n,hasProjectTrustOption as r,loadDoomConfig as i}from"../config/projectTrust.mjs";import"../config/index.mjs";import{isRecord as a}from"../utils/json.mjs";import{piCliPath as o}from"../utils/moduleResolution.mjs";import"../utils/index.mjs";import{forwardSignals as s,waitForExit as c}from"../services/compatibility/process.mjs";import{assembleChildExtensions as l,assembleExtensions as u}from"../services/extensionAssembler.mjs";import"../services/index.mjs";import d from"cross-spawn";const f=`vibe-lint`,p=`pipe`;function m(e){let t;try{t=JSON.parse(e)}catch(e){throw Error(`Expected a JSON vibe-lint invocation on stdin`,{cause:e})}if(!a(t)||typeof t.prompt!=`string`||typeof t.systemPrompt!=`string`)throw Error(`A vibe-lint invocation requires string prompt and systemPrompt fields`);if(t.maxTokens!==void 0&&typeof t.maxTokens!=`number`)throw Error(`A vibe-lint invocation maxTokens field must be a number`);if(t.screenshotPaths!==void 0&&(!Array.isArray(t.screenshotPaths)||!t.screenshotPaths.every(e=>typeof e==`string`)))throw Error(`A vibe-lint invocation screenshotPaths field must be an array of strings`);return{prompt:t.prompt,systemPrompt:t.systemPrompt,maxTokens:t.maxTokens,screenshotPaths:t.screenshotPaths}}function h(e,t){return[...e,`--print`,...r(e)?[]:[`--approve`],`--no-session`,`--system-prompt`,t.systemPrompt,...(t.screenshotPaths??[]).map(e=>`@${e}`),t.prompt]}function g(e){return`${JSON.stringify({content:e.trim()})}\n`}function _(e,t){return[`--no-themes`,`--theme`,t,...e]}async function v(){let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(String(t)));return Buffer.concat(e).toString(`utf-8`)}var y=class extends e{name=`launch`;matches(e){return!0}async execute(e,a){let{options:y,environment:b}=e,x=u({agents:y.agents,autoStop:y.autoStop,mute:y.mute,preset:y.preset,mcpEntry:e.mcpEntry,personaEntry:e.personaEntry,workflowExtension:e.workflowExtension,layers:e.selectedLayers,majorModesConfig:e.majorModesConfig}),S=l({agents:!1,autoStop:!1,mute:!0,preset:y.preset,mcpEntry:e.mcpEntry,personaEntry:e.personaEntry,layers:e.selectedLayers,majorModesConfig:e.majorModesConfig});b.DOOMPI_CHILD_EXTENSIONS=JSON.stringify(S);let C;try{C=i(y.repoRoot)}catch(e){throw await a.recordError(t.configLoadFailed,e,{"harness.phase":`load_config`}),e}a.recordEvent(t.projectTrustResolved,{"harness.project_trust":C.projectTrust,"harness.project_trust.overridden":r(y.piArgs)});let w=n(y.piArgs,C);w=_(w,e.defaultThemePath);for(let e of x)w=[`--extension`,e,...w];if(y.outputFormat===f){let e=m(await v());w=h(w,e)}let T=Date.now(),E=d(process.execPath,[o(),...w],{cwd:y.cwd,env:b,stdio:y.outputFormat===f?[`ignore`,p,p]:`inherit`}),D=``;if(y.outputFormat===f){if(!E.stdout||!E.stderr)throw Error(`Failed to open Pi output streams`);E.stdout.on(`data`,e=>{D+=e.toString()}),E.stderr.on(`data`,e=>{process.stderr.write(e)})}let O=s(E),k=await a.runInSpan(`doom_pi.pi_session`,{"harness.extension.count":x.length,"harness.mode":y.outputFormat},()=>c(E)).catch(async e=>{throw await a.recordError(t.launchFailed,e,{"harness.duration_ms":Date.now()-T}),e}).finally(O);return a.recordEvent(t.launchCompleted,{"harness.exit_code":k,"harness.duration_ms":Date.now()-T,"harness.mode":y.outputFormat??`default`}),y.outputFormat===f&&k===0&&process.stdout.write(g(D)),k}};export{y as LaunchCommand,h as buildVibeLintPiArgs,g as formatVibeLintResponse,_ as overridePiThemes,m as parseVibeLintInvocation};
2
+ //# sourceMappingURL=launchCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchCommand.mjs","names":[],"sources":["../../src/commands/launchCommand.ts"],"sourcesContent":["import spawn from 'cross-spawn';\nimport { applyProjectTrust, hasProjectTrustOption, loadDoomConfig, type DoomConfig } from '../config/index.ts';\nimport type { HarnessOptions } from '../interfaces/index.ts';\nimport { HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { type HarnessContext, assembleChildExtensions, assembleExtensions } from '../services/index.ts';\nimport { forwardSignals, waitForExit } from '../services/compatibility/process.ts';\nimport { isRecord, piCliPath } from '../utils/index.ts';\nimport { BaseCommand } from './baseCommand.ts';\n\nconst VIBE_LINT_FORMAT = 'vibe-lint';\nconst PRINT_OPTION = '--print';\nconst APPROVE_OPTION = '--approve';\nconst NO_SESSION_OPTION = '--no-session';\nconst SYSTEM_PROMPT_OPTION = '--system-prompt';\nconst THEME_OPTION = '--theme';\nconst NO_THEMES_OPTION = '--no-themes';\nconst EXTENSION_OPTION = '--extension';\nconst IGNORE_STDIO = 'ignore';\nconst PIPE_STDIO = 'pipe';\nconst INHERIT_STDIO = 'inherit';\n\nexport interface VibeLintInvocation {\n prompt: string;\n systemPrompt: string;\n maxTokens?: number;\n screenshotPaths?: string[];\n}\n\nexport function parseVibeLintInvocation(input: string): VibeLintInvocation {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new Error('Expected a JSON vibe-lint invocation on stdin', { cause: error });\n }\n\n if (!isRecord(parsed) || typeof parsed.prompt !== 'string' || typeof parsed.systemPrompt !== 'string') {\n throw new Error('A vibe-lint invocation requires string prompt and systemPrompt fields');\n }\n if (parsed.maxTokens !== undefined && typeof parsed.maxTokens !== 'number') {\n throw new Error('A vibe-lint invocation maxTokens field must be a number');\n }\n if (\n parsed.screenshotPaths !== undefined &&\n (!Array.isArray(parsed.screenshotPaths) || !parsed.screenshotPaths.every((value) => typeof value === 'string'))\n ) {\n throw new Error('A vibe-lint invocation screenshotPaths field must be an array of strings');\n }\n\n return {\n prompt: parsed.prompt,\n systemPrompt: parsed.systemPrompt,\n maxTokens: parsed.maxTokens,\n screenshotPaths: parsed.screenshotPaths as string[] | undefined,\n };\n}\n\nexport function buildVibeLintPiArgs(piArgs: string[], invocation: VibeLintInvocation): string[] {\n return [\n ...piArgs,\n PRINT_OPTION,\n ...(!hasProjectTrustOption(piArgs) ? [APPROVE_OPTION] : []),\n // Reviews are disposable and must not appear in Pi's resume history.\n NO_SESSION_OPTION,\n SYSTEM_PROMPT_OPTION,\n invocation.systemPrompt,\n ...(invocation.screenshotPaths ?? []).map((screenshotPath) => `@${screenshotPath}`),\n invocation.prompt,\n ];\n}\n\nexport function formatVibeLintResponse(content: string): string {\n return `${JSON.stringify({ content: content.trim() })}\\n`;\n}\n\n/** Ignores configured themes and loads only themes explicitly passed to the launcher. */\nexport function overridePiThemes(piArgs: string[], themePath: string): string[] {\n return [NO_THEMES_OPTION, THEME_OPTION, themePath, ...piArgs];\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n }\n return Buffer.concat(chunks).toString('utf-8');\n}\n\n/**\n * Spawns Pi with the resolved extensions, environment, and theme.\n *\n * This is the default command: it matches whenever no diagnostic flag claimed\n * the run.\n */\nexport class LaunchCommand extends BaseCommand {\n readonly name = 'launch';\n\n matches(_options: HarnessOptions): boolean {\n return true;\n }\n\n async execute(context: HarnessContext, telemetry: HarnessTelemetry): Promise<number> {\n const { options, environment } = context;\n\n const extensions = assembleExtensions({\n agents: options.agents,\n autoStop: options.autoStop,\n mute: options.mute,\n preset: options.preset,\n mcpEntry: context.mcpEntry,\n personaEntry: context.personaEntry,\n workflowExtension: context.workflowExtension,\n layers: context.selectedLayers,\n majorModesConfig: context.majorModesConfig,\n });\n const childExtensions = assembleChildExtensions({\n agents: false,\n autoStop: false,\n mute: true,\n preset: options.preset,\n mcpEntry: context.mcpEntry,\n personaEntry: context.personaEntry,\n layers: context.selectedLayers,\n majorModesConfig: context.majorModesConfig,\n });\n environment.DOOMPI_CHILD_EXTENSIONS = JSON.stringify(childExtensions);\n\n // A malformed .doom/config.yaml aborts the launch, and the message only\n // reaches the terminal that ran it, so record it before it propagates.\n let doomConfig: DoomConfig;\n try {\n doomConfig = loadDoomConfig(options.repoRoot);\n } catch (error) {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, { 'harness.phase': 'load_config' });\n throw error;\n }\n\n // Whether a session ran with repository approval is the single most useful\n // fact when reconstructing what an agent was allowed to do.\n void telemetry.recordEvent(HARNESS_EVENT.projectTrustResolved, {\n 'harness.project_trust': doomConfig.projectTrust,\n 'harness.project_trust.overridden': hasProjectTrustOption(options.piArgs),\n });\n\n let piArgs = applyProjectTrust(options.piArgs, doomConfig);\n piArgs = overridePiThemes(piArgs, context.defaultThemePath);\n for (const extension of extensions) piArgs = [EXTENSION_OPTION, extension, ...piArgs];\n\n if (options.outputFormat === VIBE_LINT_FORMAT) {\n const invocation = parseVibeLintInvocation(await readStdin());\n piArgs = buildVibeLintPiArgs(piArgs, invocation);\n }\n\n const startedAt = Date.now();\n const child = spawn(process.execPath, [piCliPath(), ...piArgs], {\n cwd: options.cwd,\n env: environment,\n stdio: options.outputFormat === VIBE_LINT_FORMAT ? [IGNORE_STDIO, PIPE_STDIO, PIPE_STDIO] : INHERIT_STDIO,\n });\n let stdout = '';\n if (options.outputFormat === VIBE_LINT_FORMAT) {\n if (!child.stdout || !child.stderr) throw new Error('Failed to open Pi output streams');\n child.stdout.on('data', (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: string | Buffer) => {\n process.stderr.write(chunk);\n });\n }\n\n // Shared with the compatibility providers, so a second Ctrl-C still reaches\n // the child and SIGHUP and SIGQUIT are forwarded too.\n const stopForwarding = forwardSignals(child);\n const result = await telemetry\n .runInSpan(\n 'doom_pi.pi_session',\n {\n 'harness.extension.count': extensions.length,\n 'harness.mode': options.outputFormat,\n },\n () => waitForExit(child),\n )\n .catch(async (error: unknown) => {\n // A spawn error means Pi never started, which is invisible to the\n // session telemetry the child would otherwise have reported.\n await telemetry.recordError(HARNESS_EVENT.launchFailed, error, {\n 'harness.duration_ms': Date.now() - startedAt,\n });\n throw error;\n })\n .finally(stopForwarding);\n\n void telemetry.recordEvent(HARNESS_EVENT.launchCompleted, {\n 'harness.exit_code': result,\n 'harness.duration_ms': Date.now() - startedAt,\n 'harness.mode': options.outputFormat ?? 'default',\n });\n\n if (options.outputFormat === VIBE_LINT_FORMAT && result === 0) {\n process.stdout.write(formatVibeLintResponse(stdout));\n }\n return result;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../cli/matrixOptions.cjs`),n=require(`../config/projectTrust.cjs`);require(`../config/index.cjs`);const r=require(`../utils/moduleResolution.cjs`),i=require(`../utils/repository.cjs`);require(`../utils/index.cjs`);const a=require(`../services/extensionAssembler.cjs`),o=require(`../services/harnessContext.cjs`),s=require(`../services/syncState.cjs`),c=require(`../services/piSettings.cjs`),l=require(`../cli/options.cjs`),u=require(`../services/extensionCompiler.cjs`);let d=require(`node:path`);d=e.__toESM(d,1);let f=require(`node:fs`);f=e.__toESM(f,1);let p=require(`node:child_process`),m=require(`@agimon-ai/doompi-config`),h=require(`@agimon-ai/doompi-config/majorModes`),g=require(`@agimon-ai/doompi-ui/theme`);const _=`--check`,v=d.default.join(`tools`,`harness`,`emit-hooks.mjs`),y=`cache`,b=`doom`,x=`(none)`,S=[`DOOMPI_`],C=[`CLAUDE_PROJECT_DIR`,`CODEX_REPO_ROOT`,`ORIGINAL_REPO_PATH`,`MCP_UI_VIEWER`],w=new Set([`DOOMPI_CHILD_EXTENSIONS`,`DOOMPI_COMPOSED`,`DOOMPI_MUTE`,`DOOMPI_TEMP_DIR`,m.HARNESS_STATE_POINTER,`PI_SUBAGENT_PI_BINARY`]);function T(e){let t={};for(let[n,r]of Object.entries(e))r===void 0||w.has(n)||(C.includes(n)||S.some(e=>n.startsWith(e)))&&(t[n]=r);return t}function E(e,r){let{selection:i}=n.loadDoomConfig(e);return i?{...r,...i.majorMode&&!r.DOOMPI_MAJOR_MODE?{[t.DOOMPI_MAJOR_MODE_ENV]:i.majorMode}:{},...i.profile&&!r.DOOMPI_PROFILE?{[t.DOOMPI_PROFILE_ENV]:i.profile}:{},...i.domains&&r.DOOMPI_DOMAINS===void 0?{[t.DOOMPI_DOMAINS_ENV]:i.domains.join(`,`)}:{}}:r}function D(e){return{majorMode:e.majorMode,domains:e.domains,profile:e.profile,preset:e.preset}}function O(e,t,n){if(!n)return[`no sync state: run doompi sync`];let i=[],o=n.selection;(o.majorMode!==t.majorMode||o.profile!==t.profile||o.preset!==t.preset||o.domains.join(`,`)!==t.domains.join(`,`))&&i.push(`selection changed since the last sync`),s.computeInputsHash(e,o)!==n.inputsHash&&i.push(`.doom configuration changed`),JSON.stringify(s.recordResolvedEntries((0,h.loadMajorModesConfig)(e),a.createLayerResolvers(e)))!==JSON.stringify(n.resolved)&&i.push(`resolved extension paths changed`);let l=c.readPiSettings(e);return c.serializePiSettings(c.mergePiSettings(l,e,{extensionEntry:r.ownEntry(b),themePath:n.baseline.themePath,themeName:n.baseline.themeName}))!==c.serializePiSettings(l)&&i.push(`.pi/settings.json is out of date`),i}function k(e,t){let n=d.default.join(e,v);if(!f.default.existsSync(n))return;let r=(0,p.spawnSync)(process.execPath,[n,`--write`],{cwd:e,encoding:`utf8`});if(r.status===0){t.write(`hooks: regenerated for Claude Code and Codex
2
+ `);return}t.write(`hooks: emit-hooks failed (${r.stderr?.trim()||`exit ${String(r.status)}`})\n`)}function A(e,t){let{selection:n}=e;return[`mode: ${n.majorMode}`,`domains: ${n.domains.join(`, `)||x}`,`profile: ${n.profile??x}`,`skills: ${e.skillCount}`,`agents: ${e.agentCount}`,`mcp: ${e.mcpServers.join(`, `)||x}`,`state: ${e.statePath}`,`settings: ${e.settingsPath}`,``,`Run pi from the repository root to use it.`,...t===`always`?[`Pi asks once before loading project extensions: answer yes, or run /trust in the session.`]:[],``].join(`
3
+ `)}var j=class{name=`sync`;matches(e){return e[0]===this.name}async execute(e,t=process.env,r=process.cwd(),a=process.stdout){let o=e.includes(_),c=e.slice(1).filter(e=>e!==_),u=t.DOOMPI_ROOT,f=u?d.default.resolve(u):i.findRepositoryRoot(r),p=l.parseHarnessArgs(c,E(f,t),r),m=D(p.options);if(o){let e=O(f,m,s.readSyncState(f));return e.length===0?(a.write(`doompi sync is up to date
4
+ `),0):(a.write(`doompi sync is out of date:\n${e.map(e=>` ${e}`).join(`
5
+ `)}\n`),1)}let h=await this.stage(f,p.options);return k(f,a),a.write(A(h,n.loadDoomConfig(f).projectTrust)),0}async stage(e,t){let n=s.syncDirectory(e),i=new Set([`run`,y]);for(let e of f.default.existsSync(n)?f.default.readdirSync(n):[])i.has(e)||f.default.rmSync(d.default.join(n,e),{recursive:!0,force:!0});let l=await o.buildHarnessContext({...t,repoRoot:e,cwd:e,resourceDirectory:n}),p=D(t),h=s.recordResolvedEntries(l.majorModesConfig,a.createLayerResolvers(e)),_=await u.compileResolvedEntries(h,d.default.join(n,y)),v={version:4,root:e,inputsHash:s.computeInputsHash(e,p),selection:p,env:T(l.environment),fileState:{profileEnvironment:(0,m.loadHarnessState)(l.environment).state.profileEnvironment,pluginHooks:l.resources.pluginHooks},resolved:h,compiled:_,baseline:{mcpConfigPath:l.resources.mcpConfigPath,personaFile:l.environment.DOOMPI_PERSONA_FILE,themePath:l.defaultThemePath,themeName:g.DEFAULT_THEME_NAME}};return{statePath:await s.writeSyncState(e,v),settingsPath:c.writePiSettings(e,{extensionEntry:r.ownEntry(b),themePath:v.baseline.themePath,themeName:v.baseline.themeName}),selection:p,mcpServers:v.baseline.mcpConfigPath?s.readMcpServerNames(v.baseline.mcpConfigPath):[],skillCount:l.resources.skillCount,agentCount:l.resources.agentCount}}};exports.SyncCommand=j,exports.collectDrift=O,exports.formatSyncResult=A,exports.recordedEnvironment=T,exports.selectionEnvironment=E,exports.toSelection=D;
6
+ //# sourceMappingURL=syncCommand.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncCommand.cjs","names":["path","HARNESS_STATE_POINTER","loadDoomConfig","DOOMPI_MAJOR_MODE_ENV","DOOMPI_PROFILE_ENV","DOOMPI_DOMAINS_ENV","computeInputsHash","recordResolvedEntries","createLayerResolvers","readPiSettings","serializePiSettings","mergePiSettings","ownEntry","fs","findRepositoryRoot","parseHarnessArgs","readSyncState","syncDirectory","buildHarnessContext","compileResolvedEntries","DEFAULT_THEME_NAME","writeSyncState","writePiSettings","readMcpServerNames"],"sources":["../../src/commands/syncCommand.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { DOOMPI_DOMAINS_ENV, DOOMPI_MAJOR_MODE_ENV, DOOMPI_PROFILE_ENV } from '../cli/matrixOptions.ts';\nimport { parseHarnessArgs } from '../cli/options.ts';\nimport {\n DEFAULT_THEME_NAME,\n HARNESS_STATE_POINTER,\n loadDoomConfig,\n loadHarnessState,\n loadMajorModesConfig,\n} from '../config/index.ts';\nimport type { HarnessOptions } from '../interfaces/index.ts';\nimport { buildHarnessContext } from '../services/harnessContext.ts';\nimport { createLayerResolvers } from '../services/extensionAssembler.ts';\nimport { compileResolvedEntries } from '../services/extensionCompiler.ts';\nimport { mergePiSettings, readPiSettings, serializePiSettings, writePiSettings } from '../services/piSettings.ts';\nimport {\n computeInputsHash,\n readMcpServerNames,\n readSyncState,\n recordResolvedEntries,\n SYNC_STATE_VERSION,\n syncDirectory,\n writeSyncState,\n type SyncSelection,\n type SyncState,\n} from '../services/syncState.ts';\nimport { findRepositoryRoot, ownEntry } from '../utils/index.ts';\n\n/**\n * `doom-pi sync`: resolve the matrix once and write it where plain Pi finds it.\n *\n * The doom-emacs split. Everything that needs a real Node process (module\n * resolution, staging skills and agents, generating the MCP config) happens\n * here, and the doom-pi extension then only reads what this produced. The\n * launcher is untouched and keeps resolving the same matrix per run.\n */\n\nconst SYNC_COMMAND = 'sync';\nconst CHECK_OPTION = '--check';\nconst HARNESS_ROOT_ENV = 'DOOMPI_ROOT';\nconst PERSONA_FILE_ENV = 'DOOMPI_PERSONA_FILE';\nconst HOOK_EMITTER = path.join('tools', 'harness', 'emit-hooks.mjs');\nconst RUN_DIRECTORY = 'run';\n/** Compiled extension bundles, keyed by content hash. */\nconst EXTENSION_CACHE_DIRECTORY = 'cache';\nconst DOOM_ENTRY = 'doom';\nconst TRUST_ALWAYS = 'always';\nconst NONE = '(none)';\n\n/**\n * Harness variables worth recording, by prefix or exact name.\n *\n * An allowlist rather than the whole environment: the state file is a snapshot\n * of resolved configuration, and dumping `process.env` into it would write\n * every credential the sync happened to run with onto disk.\n */\nconst RECORDED_PREFIXES = ['DOOMPI_'];\nconst RECORDED_KEYS = ['CLAUDE_PROJECT_DIR', 'CODEX_REPO_ROOT', 'ORIGINAL_REPO_PATH', 'MCP_UI_VIEWER'];\n/**\n * Launcher-only values a synced session must not inherit.\n *\n * The child extension list is recomposed on every load, and the subagent binary\n * points at `pi.sh`, which a session started as plain `pi` should not shell out\n * to: Doom Team resolves Pi's own CLI when the variable is absent.\n */\nconst EXCLUDED_KEYS = new Set([\n 'DOOMPI_CHILD_EXTENSIONS',\n 'DOOMPI_COMPOSED',\n 'DOOMPI_MUTE',\n 'DOOMPI_TEMP_DIR',\n // A pointer to the syncing process's own state file. Recording it would hand\n // every later session a path to a state that died with this one.\n HARNESS_STATE_POINTER,\n 'PI_SUBAGENT_PI_BINARY',\n]);\n\ntype SyncOutput = Pick<NodeJS.WritableStream, 'write'>;\n\nexport interface SyncResult {\n statePath: string;\n settingsPath: string;\n selection: SyncSelection;\n mcpServers: string[];\n skillCount: number;\n agentCount: number;\n}\n\nexport function recordedEnvironment(environment: NodeJS.ProcessEnv): Record<string, string> {\n const recorded: Record<string, string> = {};\n for (const [key, value] of Object.entries(environment)) {\n if (value === undefined || EXCLUDED_KEYS.has(key)) continue;\n if (RECORDED_KEYS.includes(key) || RECORDED_PREFIXES.some((prefix) => key.startsWith(prefix))) {\n recorded[key] = value;\n }\n }\n return recorded;\n}\n\n/**\n * Layers the repository's declared selection under the usual resolution.\n *\n * `.doom/config.yaml` holds what the repository selects by default, the way\n * init.el does for doom-emacs. Seeding the environment the parser reads keeps\n * the precedence the launcher already documents: an explicit flag wins, then an\n * exported variable, then the declared default.\n */\nexport function selectionEnvironment(repoRoot: string, environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const { selection } = loadDoomConfig(repoRoot);\n if (!selection) return environment;\n return {\n ...environment,\n ...(selection.majorMode && !environment[DOOMPI_MAJOR_MODE_ENV]\n ? { [DOOMPI_MAJOR_MODE_ENV]: selection.majorMode }\n : {}),\n ...(selection.profile && !environment[DOOMPI_PROFILE_ENV] ? { [DOOMPI_PROFILE_ENV]: selection.profile } : {}),\n ...(selection.domains && environment[DOOMPI_DOMAINS_ENV] === undefined\n ? { [DOOMPI_DOMAINS_ENV]: selection.domains.join(',') }\n : {}),\n };\n}\n\nexport function toSelection(\n options: Pick<HarnessOptions, 'majorMode' | 'domains' | 'profile' | 'preset'>,\n): SyncSelection {\n return {\n majorMode: options.majorMode,\n domains: options.domains,\n profile: options.profile,\n preset: options.preset,\n };\n}\n\n/** Differences between what a sync would produce and what is on disk. */\nexport function collectDrift(repoRoot: string, selection: SyncSelection, state: SyncState | undefined): string[] {\n if (!state) return ['no sync state: run doompi sync'];\n const drift: string[] = [];\n const recorded = state.selection;\n if (\n recorded.majorMode !== selection.majorMode ||\n recorded.profile !== selection.profile ||\n recorded.preset !== selection.preset ||\n recorded.domains.join(',') !== selection.domains.join(',')\n ) {\n drift.push('selection changed since the last sync');\n }\n // Hashed against the recorded selection, not the requested one, so a\n // selection change is reported once rather than as two findings.\n if (computeInputsHash(repoRoot, recorded) !== state.inputsHash) drift.push('.doom configuration changed');\n // Re-resolving is what catches a dependency upgrade moving a package, which\n // the inputs hash deliberately does not read.\n if (\n JSON.stringify(recordResolvedEntries(loadMajorModesConfig(repoRoot), createLayerResolvers(repoRoot))) !==\n JSON.stringify(state.resolved)\n ) {\n drift.push('resolved extension paths changed');\n }\n const settings = readPiSettings(repoRoot);\n const merged = mergePiSettings(settings, repoRoot, {\n extensionEntry: ownEntry(DOOM_ENTRY),\n themePath: state.baseline.themePath,\n themeName: state.baseline.themeName,\n });\n if (serializePiSettings(merged) !== serializePiSettings(settings)) drift.push('.pi/settings.json is out of date');\n return drift;\n}\n\n/** Regenerates the hook files the other frontends read before any harness code runs. */\nfunction emitFrontendHooks(repoRoot: string, output: SyncOutput): void {\n const emitter = path.join(repoRoot, HOOK_EMITTER);\n if (!fs.existsSync(emitter)) return;\n const result = spawnSync(process.execPath, [emitter, '--write'], { cwd: repoRoot, encoding: 'utf8' });\n if (result.status === 0) {\n output.write('hooks: regenerated for Claude Code and Codex\\n');\n return;\n }\n output.write(`hooks: emit-hooks failed (${result.stderr?.trim() || `exit ${String(result.status)}`})\\n`);\n}\n\nexport function formatSyncResult(result: SyncResult, projectTrust: string): string {\n const { selection } = result;\n return [\n `mode: ${selection.majorMode}`,\n `domains: ${selection.domains.join(', ') || NONE}`,\n `profile: ${selection.profile ?? NONE}`,\n `skills: ${result.skillCount}`,\n `agents: ${result.agentCount}`,\n `mcp: ${result.mcpServers.join(', ') || NONE}`,\n `state: ${result.statePath}`,\n `settings: ${result.settingsPath}`,\n '',\n 'Run pi from the repository root to use it.',\n // projectTrust only reaches Pi as a launcher flag, so a synced session has\n // to be told once that it will be asked.\n ...(projectTrust === TRUST_ALWAYS\n ? ['Pi asks once before loading project extensions: answer yes, or run /trust in the session.']\n : []),\n '',\n ].join('\\n');\n}\n\n/** Resolves the matrix, stages it into `.pi/doom`, and points Pi at the result. */\nexport class SyncCommand {\n readonly name = SYNC_COMMAND;\n\n matches(args: string[]): boolean {\n return args[0] === this.name;\n }\n\n async execute(\n args: string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n output: SyncOutput = process.stdout,\n ): Promise<number> {\n const check = args.includes(CHECK_OPTION);\n const rest = args.slice(1).filter((argument) => argument !== CHECK_OPTION);\n const inheritedRoot = environment[HARNESS_ROOT_ENV];\n const repoRoot = inheritedRoot ? path.resolve(inheritedRoot) : findRepositoryRoot(currentDirectory);\n const parsed = parseHarnessArgs(rest, selectionEnvironment(repoRoot, environment), currentDirectory);\n const selection = toSelection(parsed.options);\n\n if (check) {\n const drift = collectDrift(repoRoot, selection, readSyncState(repoRoot));\n if (drift.length === 0) {\n output.write('doompi sync is up to date\\n');\n return 0;\n }\n output.write(`doompi sync is out of date:\\n${drift.map((entry) => ` ${entry}`).join('\\n')}\\n`);\n return 1;\n }\n\n const result = await this.stage(repoRoot, parsed.options);\n emitFrontendHooks(repoRoot, output);\n output.write(formatSyncResult(result, loadDoomConfig(repoRoot).projectTrust));\n return 0;\n }\n\n private async stage(repoRoot: string, options: Omit<HarnessOptions, 'repoRoot'>): Promise<SyncResult> {\n const directory = syncDirectory(repoRoot);\n // A full regeneration, so nothing a previous selection staged survives. Two\n // exceptions: the per-session run directories, because another Pi session\n // may be using one right now, and the compiled extension cache, whose names\n // carry a content hash and so stay valid across selections.\n const preserved = new Set([RUN_DIRECTORY, EXTENSION_CACHE_DIRECTORY]);\n for (const entry of fs.existsSync(directory) ? fs.readdirSync(directory) : []) {\n if (!preserved.has(entry)) fs.rmSync(path.join(directory, entry), { recursive: true, force: true });\n }\n\n const context = await buildHarnessContext({\n ...options,\n repoRoot,\n // Sync describes the repository, not the directory it was invoked from.\n cwd: repoRoot,\n resourceDirectory: directory,\n });\n const selection = toSelection(options);\n // Pi would otherwise transpile every TypeScript extension through jiti on\n // each launch. Resolution already knows the whole list, so it is bundled to\n // plain ESM once here and imported natively for the rest of its life.\n const resolved = recordResolvedEntries(context.majorModesConfig, createLayerResolvers(repoRoot));\n const compiled = await compileResolvedEntries(resolved, path.join(directory, EXTENSION_CACHE_DIRECTORY));\n const state: SyncState = {\n version: SYNC_STATE_VERSION,\n root: repoRoot,\n inputsHash: computeInputsHash(repoRoot, selection),\n selection,\n env: recordedEnvironment(context.environment),\n // Read back from the session file the context just wrote, which is the\n // only place these two live now.\n fileState: {\n profileEnvironment: loadHarnessState(context.environment).state.profileEnvironment,\n pluginHooks: context.resources.pluginHooks,\n },\n resolved,\n compiled,\n baseline: {\n mcpConfigPath: context.resources.mcpConfigPath,\n personaFile: context.environment[PERSONA_FILE_ENV],\n themePath: context.defaultThemePath,\n themeName: DEFAULT_THEME_NAME,\n },\n };\n\n return {\n statePath: await writeSyncState(repoRoot, state),\n settingsPath: writePiSettings(repoRoot, {\n extensionEntry: ownEntry(DOOM_ENTRY),\n themePath: state.baseline.themePath,\n themeName: state.baseline.themeName,\n }),\n selection,\n mcpServers: state.baseline.mcpConfigPath ? readMcpServerNames(state.baseline.mcpConfigPath) : [],\n skillCount: context.resources.skillCount,\n agentCount: context.resources.agentCount,\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { HarnessOptions } from "../interfaces/harness.cjs";
2
+ import { SyncSelection, SyncState } from "../services/syncState.cjs";
3
+
4
+ //#region src/commands/syncCommand.d.ts
5
+ type SyncOutput = Pick<NodeJS.WritableStream, 'write'>;
6
+ interface SyncResult {
7
+ statePath: string;
8
+ settingsPath: string;
9
+ selection: SyncSelection;
10
+ mcpServers: string[];
11
+ skillCount: number;
12
+ agentCount: number;
13
+ }
14
+ declare function recordedEnvironment(environment: NodeJS.ProcessEnv): Record<string, string>;
15
+ /**
16
+ * Layers the repository's declared selection under the usual resolution.
17
+ *
18
+ * `.doom/config.yaml` holds what the repository selects by default, the way
19
+ * init.el does for doom-emacs. Seeding the environment the parser reads keeps
20
+ * the precedence the launcher already documents: an explicit flag wins, then an
21
+ * exported variable, then the declared default.
22
+ */
23
+ declare function selectionEnvironment(repoRoot: string, environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
24
+ declare function toSelection(options: Pick<HarnessOptions, 'majorMode' | 'domains' | 'profile' | 'preset'>): SyncSelection;
25
+ /** Differences between what a sync would produce and what is on disk. */
26
+ declare function collectDrift(repoRoot: string, selection: SyncSelection, state: SyncState | undefined): string[];
27
+ declare function formatSyncResult(result: SyncResult, projectTrust: string): string;
28
+ /** Resolves the matrix, stages it into `.pi/doom`, and points Pi at the result. */
29
+ declare class SyncCommand {
30
+ readonly name = "sync";
31
+ matches(args: string[]): boolean;
32
+ execute(args: string[], environment?: NodeJS.ProcessEnv, currentDirectory?: string, output?: SyncOutput): Promise<number>;
33
+ private stage;
34
+ }
35
+ //#endregion
36
+ export { SyncCommand, SyncResult, collectDrift, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection };
37
+ //# sourceMappingURL=syncCommand.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncCommand.d.cts","names":[],"sources":["../../src/commands/syncCommand.ts"],"mappings":";;;;KA8EK,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,cAAA;AAAA,UAEb,UAAA;EACf,SAAA;EACA,YAAA;EACA,SAAA,EAAW,aAAA;EACX,UAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,iBAGc,mBAAA,CAAoB,WAAA,EAAa,MAAA,CAAO,UAAA,GAAa,MAAA;;AATrE;;;;;;;iBA4BgB,oBAAA,CAAqB,QAAA,UAAkB,WAAA,EAAa,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA;AAAA,iBAe/E,WAAA,CACd,OAAA,EAAS,IAAA,CAAK,cAAA,oDACb,aAAA;;iBAUa,YAAA,CAAa,QAAA,UAAkB,SAAA,EAAW,aAAA,EAAe,KAAA,EAAO,SAAA;AAAA,iBA6ChE,gBAAA,CAAiB,MAAA,EAAQ,UAAA,EAAY,YAAA;;cAuBxC,WAAA;EAAA,SACF,IAAA;EAET,OAAA,CAAQ,IAAA;EAIF,OAAA,CACJ,IAAA,YACA,WAAA,GAAa,MAAA,CAAO,UAAA,EACpB,gBAAA,WACA,MAAA,GAAQ,UAAA,GACP,OAAA;EAAA,QAwBW,KAAA;AAAA"}
@@ -0,0 +1,37 @@
1
+ import { HarnessOptions } from "../interfaces/harness.mjs";
2
+ import { SyncSelection, SyncState } from "../services/syncState.mjs";
3
+
4
+ //#region src/commands/syncCommand.d.ts
5
+ type SyncOutput = Pick<NodeJS.WritableStream, 'write'>;
6
+ interface SyncResult {
7
+ statePath: string;
8
+ settingsPath: string;
9
+ selection: SyncSelection;
10
+ mcpServers: string[];
11
+ skillCount: number;
12
+ agentCount: number;
13
+ }
14
+ declare function recordedEnvironment(environment: NodeJS.ProcessEnv): Record<string, string>;
15
+ /**
16
+ * Layers the repository's declared selection under the usual resolution.
17
+ *
18
+ * `.doom/config.yaml` holds what the repository selects by default, the way
19
+ * init.el does for doom-emacs. Seeding the environment the parser reads keeps
20
+ * the precedence the launcher already documents: an explicit flag wins, then an
21
+ * exported variable, then the declared default.
22
+ */
23
+ declare function selectionEnvironment(repoRoot: string, environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
24
+ declare function toSelection(options: Pick<HarnessOptions, 'majorMode' | 'domains' | 'profile' | 'preset'>): SyncSelection;
25
+ /** Differences between what a sync would produce and what is on disk. */
26
+ declare function collectDrift(repoRoot: string, selection: SyncSelection, state: SyncState | undefined): string[];
27
+ declare function formatSyncResult(result: SyncResult, projectTrust: string): string;
28
+ /** Resolves the matrix, stages it into `.pi/doom`, and points Pi at the result. */
29
+ declare class SyncCommand {
30
+ readonly name = "sync";
31
+ matches(args: string[]): boolean;
32
+ execute(args: string[], environment?: NodeJS.ProcessEnv, currentDirectory?: string, output?: SyncOutput): Promise<number>;
33
+ private stage;
34
+ }
35
+ //#endregion
36
+ export { SyncCommand, SyncResult, collectDrift, formatSyncResult, recordedEnvironment, selectionEnvironment, toSelection };
37
+ //# sourceMappingURL=syncCommand.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncCommand.d.mts","names":[],"sources":["../../src/commands/syncCommand.ts"],"mappings":";;;;KA8EK,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,cAAA;AAAA,UAEb,UAAA;EACf,SAAA;EACA,YAAA;EACA,SAAA,EAAW,aAAA;EACX,UAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,iBAGc,mBAAA,CAAoB,WAAA,EAAa,MAAA,CAAO,UAAA,GAAa,MAAA;;AATrE;;;;;;;iBA4BgB,oBAAA,CAAqB,QAAA,UAAkB,WAAA,EAAa,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA;AAAA,iBAe/E,WAAA,CACd,OAAA,EAAS,IAAA,CAAK,cAAA,oDACb,aAAA;;iBAUa,YAAA,CAAa,QAAA,UAAkB,SAAA,EAAW,aAAA,EAAe,KAAA,EAAO,SAAA;AAAA,iBA6ChE,gBAAA,CAAiB,MAAA,EAAQ,UAAA,EAAY,YAAA;;cAuBxC,WAAA;EAAA,SACF,IAAA;EAET,OAAA,CAAQ,IAAA;EAIF,OAAA,CACJ,IAAA,YACA,WAAA,GAAa,MAAA,CAAO,UAAA,EACpB,gBAAA,WACA,MAAA,GAAQ,UAAA,GACP,OAAA;EAAA,QAwBW,KAAA;AAAA"}
@@ -0,0 +1,6 @@
1
+ import{DOOMPI_DOMAINS_ENV as e,DOOMPI_MAJOR_MODE_ENV as t,DOOMPI_PROFILE_ENV as n}from"../cli/matrixOptions.mjs";import{loadDoomConfig as r}from"../config/projectTrust.mjs";import{HARNESS_STATE_POINTER as i,loadHarnessState as a}from"../config/harnessState.mjs";import{DEFAULT_THEME_NAME as o,loadMajorModesConfig as s}from"../config/index.mjs";import{ownEntry as c}from"../utils/moduleResolution.mjs";import{findRepositoryRoot as l}from"../utils/repository.mjs";import"../utils/index.mjs";import{createLayerResolvers as u}from"../services/extensionAssembler.mjs";import{buildHarnessContext as d}from"../services/harnessContext.mjs";import{computeInputsHash as f,readMcpServerNames as p,readSyncState as m,recordResolvedEntries as h,syncDirectory as g,writeSyncState as _}from"../services/syncState.mjs";import{mergePiSettings as v,readPiSettings as y,serializePiSettings as b,writePiSettings as x}from"../services/piSettings.mjs";import{parseHarnessArgs as S}from"../cli/options.mjs";import{compileResolvedEntries as C}from"../services/extensionCompiler.mjs";import w from"node:path";import T from"node:fs";import{spawnSync as E}from"node:child_process";const D=`--check`,O=w.join(`tools`,`harness`,`emit-hooks.mjs`),k=`cache`,A=`doom`,j=`(none)`,M=[`DOOMPI_`],N=[`CLAUDE_PROJECT_DIR`,`CODEX_REPO_ROOT`,`ORIGINAL_REPO_PATH`,`MCP_UI_VIEWER`],P=new Set([`DOOMPI_CHILD_EXTENSIONS`,`DOOMPI_COMPOSED`,`DOOMPI_MUTE`,`DOOMPI_TEMP_DIR`,i,`PI_SUBAGENT_PI_BINARY`]);function F(e){let t={};for(let[n,r]of Object.entries(e))r===void 0||P.has(n)||(N.includes(n)||M.some(e=>n.startsWith(e)))&&(t[n]=r);return t}function I(i,a){let{selection:o}=r(i);return o?{...a,...o.majorMode&&!a.DOOMPI_MAJOR_MODE?{[t]:o.majorMode}:{},...o.profile&&!a.DOOMPI_PROFILE?{[n]:o.profile}:{},...o.domains&&a.DOOMPI_DOMAINS===void 0?{[e]:o.domains.join(`,`)}:{}}:a}function L(e){return{majorMode:e.majorMode,domains:e.domains,profile:e.profile,preset:e.preset}}function R(e,t,n){if(!n)return[`no sync state: run doompi sync`];let r=[],i=n.selection;(i.majorMode!==t.majorMode||i.profile!==t.profile||i.preset!==t.preset||i.domains.join(`,`)!==t.domains.join(`,`))&&r.push(`selection changed since the last sync`),f(e,i)!==n.inputsHash&&r.push(`.doom configuration changed`),JSON.stringify(h(s(e),u(e)))!==JSON.stringify(n.resolved)&&r.push(`resolved extension paths changed`);let a=y(e);return b(v(a,e,{extensionEntry:c(A),themePath:n.baseline.themePath,themeName:n.baseline.themeName}))!==b(a)&&r.push(`.pi/settings.json is out of date`),r}function z(e,t){let n=w.join(e,O);if(!T.existsSync(n))return;let r=E(process.execPath,[n,`--write`],{cwd:e,encoding:`utf8`});if(r.status===0){t.write(`hooks: regenerated for Claude Code and Codex
2
+ `);return}t.write(`hooks: emit-hooks failed (${r.stderr?.trim()||`exit ${String(r.status)}`})\n`)}function B(e,t){let{selection:n}=e;return[`mode: ${n.majorMode}`,`domains: ${n.domains.join(`, `)||j}`,`profile: ${n.profile??j}`,`skills: ${e.skillCount}`,`agents: ${e.agentCount}`,`mcp: ${e.mcpServers.join(`, `)||j}`,`state: ${e.statePath}`,`settings: ${e.settingsPath}`,``,`Run pi from the repository root to use it.`,...t===`always`?[`Pi asks once before loading project extensions: answer yes, or run /trust in the session.`]:[],``].join(`
3
+ `)}var V=class{name=`sync`;matches(e){return e[0]===this.name}async execute(e,t=process.env,n=process.cwd(),i=process.stdout){let a=e.includes(D),o=e.slice(1).filter(e=>e!==D),s=t.DOOMPI_ROOT,c=s?w.resolve(s):l(n),u=S(o,I(c,t),n),d=L(u.options);if(a){let e=R(c,d,m(c));return e.length===0?(i.write(`doompi sync is up to date
4
+ `),0):(i.write(`doompi sync is out of date:\n${e.map(e=>` ${e}`).join(`
5
+ `)}\n`),1)}let f=await this.stage(c,u.options);return z(c,i),i.write(B(f,r(c).projectTrust)),0}async stage(e,t){let n=g(e),r=new Set([`run`,k]);for(let e of T.existsSync(n)?T.readdirSync(n):[])r.has(e)||T.rmSync(w.join(n,e),{recursive:!0,force:!0});let i=await d({...t,repoRoot:e,cwd:e,resourceDirectory:n}),s=L(t),l=h(i.majorModesConfig,u(e)),m=await C(l,w.join(n,k)),v={version:4,root:e,inputsHash:f(e,s),selection:s,env:F(i.environment),fileState:{profileEnvironment:a(i.environment).state.profileEnvironment,pluginHooks:i.resources.pluginHooks},resolved:l,compiled:m,baseline:{mcpConfigPath:i.resources.mcpConfigPath,personaFile:i.environment.DOOMPI_PERSONA_FILE,themePath:i.defaultThemePath,themeName:o}};return{statePath:await _(e,v),settingsPath:x(e,{extensionEntry:c(A),themePath:v.baseline.themePath,themeName:v.baseline.themeName}),selection:s,mcpServers:v.baseline.mcpConfigPath?p(v.baseline.mcpConfigPath):[],skillCount:i.resources.skillCount,agentCount:i.resources.agentCount}}};export{V as SyncCommand,R as collectDrift,B as formatSyncResult,F as recordedEnvironment,I as selectionEnvironment,L as toSelection};
6
+ //# sourceMappingURL=syncCommand.mjs.map