@agimon-ai/doompi-config 0.0.1-alpha.2 → 0.0.1-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/README.md +139 -14
  2. package/dist/adapters/atomicJson.cjs +2 -0
  3. package/dist/adapters/atomicJson.cjs.map +1 -0
  4. package/dist/adapters/atomicJson.d.cts +6 -0
  5. package/dist/adapters/atomicJson.d.cts.map +1 -0
  6. package/dist/adapters/atomicJson.d.mts +6 -0
  7. package/dist/adapters/atomicJson.d.mts.map +1 -0
  8. package/dist/adapters/atomicJson.mjs +2 -0
  9. package/dist/adapters/atomicJson.mjs.map +1 -0
  10. package/dist/adapters/config.cjs +2 -0
  11. package/dist/adapters/config.cjs.map +1 -0
  12. package/dist/adapters/config.d.cts +11 -0
  13. package/dist/adapters/config.d.cts.map +1 -0
  14. package/dist/adapters/config.d.mts +11 -0
  15. package/dist/adapters/config.d.mts.map +1 -0
  16. package/dist/adapters/config.mjs +2 -0
  17. package/dist/adapters/config.mjs.map +1 -0
  18. package/dist/adapters/configWriter.cjs +2 -0
  19. package/dist/adapters/configWriter.cjs.map +1 -0
  20. package/dist/adapters/configWriter.d.cts +52 -0
  21. package/dist/adapters/configWriter.d.cts.map +1 -0
  22. package/dist/adapters/configWriter.d.mts +52 -0
  23. package/dist/adapters/configWriter.d.mts.map +1 -0
  24. package/dist/adapters/configWriter.mjs +2 -0
  25. package/dist/adapters/configWriter.mjs.map +1 -0
  26. package/dist/adapters/domains.cjs +2 -0
  27. package/dist/adapters/domains.cjs.map +1 -0
  28. package/dist/adapters/domains.d.cts +25 -0
  29. package/dist/adapters/domains.d.cts.map +1 -0
  30. package/dist/adapters/domains.d.mts +25 -0
  31. package/dist/adapters/domains.d.mts.map +1 -0
  32. package/dist/adapters/domains.mjs +2 -0
  33. package/dist/adapters/domains.mjs.map +1 -0
  34. package/dist/adapters/harnessState.cjs +2 -0
  35. package/dist/adapters/harnessState.cjs.map +1 -0
  36. package/dist/adapters/harnessState.d.cts +50 -0
  37. package/dist/adapters/harnessState.d.cts.map +1 -0
  38. package/dist/adapters/harnessState.d.mts +50 -0
  39. package/dist/adapters/harnessState.d.mts.map +1 -0
  40. package/dist/adapters/harnessState.mjs +2 -0
  41. package/dist/adapters/harnessState.mjs.map +1 -0
  42. package/dist/adapters/harnessStore.cjs +2 -0
  43. package/dist/adapters/harnessStore.cjs.map +1 -0
  44. package/dist/adapters/harnessStore.d.cts +102 -0
  45. package/dist/adapters/harnessStore.d.cts.map +1 -0
  46. package/dist/adapters/harnessStore.d.mts +102 -0
  47. package/dist/adapters/harnessStore.d.mts.map +1 -0
  48. package/dist/adapters/harnessStore.mjs +2 -0
  49. package/dist/adapters/harnessStore.mjs.map +1 -0
  50. package/dist/adapters/init.cjs +178 -0
  51. package/dist/adapters/init.cjs.map +1 -0
  52. package/dist/adapters/init.d.cts +39 -0
  53. package/dist/adapters/init.d.cts.map +1 -0
  54. package/dist/adapters/init.d.mts +39 -0
  55. package/dist/adapters/init.d.mts.map +1 -0
  56. package/dist/adapters/init.mjs +178 -0
  57. package/dist/adapters/init.mjs.map +1 -0
  58. package/dist/adapters/layeredConfig.cjs +2 -0
  59. package/dist/adapters/layeredConfig.cjs.map +1 -0
  60. package/dist/adapters/layeredConfig.d.cts +49 -0
  61. package/dist/adapters/layeredConfig.d.cts.map +1 -0
  62. package/dist/adapters/layeredConfig.d.mts +49 -0
  63. package/dist/adapters/layeredConfig.d.mts.map +1 -0
  64. package/dist/adapters/layeredConfig.mjs +2 -0
  65. package/dist/adapters/layeredConfig.mjs.map +1 -0
  66. package/dist/adapters/majorModes.cjs +2 -0
  67. package/dist/adapters/majorModes.cjs.map +1 -0
  68. package/dist/adapters/majorModes.d.cts +88 -0
  69. package/dist/adapters/majorModes.d.cts.map +1 -0
  70. package/dist/adapters/majorModes.d.mts +88 -0
  71. package/dist/adapters/majorModes.d.mts.map +1 -0
  72. package/dist/adapters/majorModes.mjs +2 -0
  73. package/dist/adapters/majorModes.mjs.map +1 -0
  74. package/dist/adapters/pi/configExtension.cjs +2 -0
  75. package/dist/adapters/pi/configExtension.cjs.map +1 -0
  76. package/dist/adapters/pi/configExtension.d.cts +8 -0
  77. package/dist/adapters/pi/configExtension.d.cts.map +1 -0
  78. package/dist/adapters/pi/configExtension.d.mts +8 -0
  79. package/dist/adapters/pi/configExtension.d.mts.map +1 -0
  80. package/dist/adapters/pi/configExtension.mjs +2 -0
  81. package/dist/adapters/pi/configExtension.mjs.map +1 -0
  82. package/dist/adapters/pi/doomConfigExtension.cjs +2 -0
  83. package/dist/adapters/pi/doomConfigExtension.cjs.map +1 -0
  84. package/dist/adapters/pi/doomConfigExtension.d.cts +8 -0
  85. package/dist/adapters/pi/doomConfigExtension.d.cts.map +1 -0
  86. package/dist/adapters/pi/doomConfigExtension.d.mts +8 -0
  87. package/dist/adapters/pi/doomConfigExtension.d.mts.map +1 -0
  88. package/dist/adapters/pi/doomConfigExtension.mjs +2 -0
  89. package/dist/adapters/pi/doomConfigExtension.mjs.map +1 -0
  90. package/dist/adapters/pi/helpContribution.cjs +2 -0
  91. package/dist/adapters/pi/helpContribution.cjs.map +1 -0
  92. package/dist/adapters/pi/helpContribution.mjs +2 -0
  93. package/dist/adapters/pi/helpContribution.mjs.map +1 -0
  94. package/dist/adapters/pi/piContext.cjs +2 -0
  95. package/dist/adapters/pi/piContext.cjs.map +1 -0
  96. package/dist/adapters/pi/piContext.d.cts +20 -0
  97. package/dist/adapters/pi/piContext.d.cts.map +1 -0
  98. package/dist/adapters/pi/piContext.d.mts +20 -0
  99. package/dist/adapters/pi/piContext.d.mts.map +1 -0
  100. package/dist/adapters/pi/piContext.mjs +2 -0
  101. package/dist/adapters/pi/piContext.mjs.map +1 -0
  102. package/dist/adapters/piConfig.cjs +2 -0
  103. package/dist/adapters/piConfig.cjs.map +1 -0
  104. package/dist/adapters/piConfig.d.cts +8 -0
  105. package/dist/adapters/piConfig.d.cts.map +1 -0
  106. package/dist/adapters/piConfig.d.mts +8 -0
  107. package/dist/adapters/piConfig.d.mts.map +1 -0
  108. package/dist/adapters/piConfig.mjs +2 -0
  109. package/dist/adapters/piConfig.mjs.map +1 -0
  110. package/dist/adapters/pluginCatalog.cjs +2 -0
  111. package/dist/adapters/pluginCatalog.cjs.map +1 -0
  112. package/dist/adapters/pluginCatalog.d.cts +12 -0
  113. package/dist/adapters/pluginCatalog.d.cts.map +1 -0
  114. package/dist/adapters/pluginCatalog.d.mts +12 -0
  115. package/dist/adapters/pluginCatalog.d.mts.map +1 -0
  116. package/dist/adapters/pluginCatalog.mjs +2 -0
  117. package/dist/adapters/pluginCatalog.mjs.map +1 -0
  118. package/dist/adapters/profiles.cjs +4 -0
  119. package/dist/adapters/profiles.cjs.map +1 -0
  120. package/dist/adapters/profiles.d.cts +36 -0
  121. package/dist/adapters/profiles.d.cts.map +1 -0
  122. package/dist/adapters/profiles.d.mts +36 -0
  123. package/dist/adapters/profiles.d.mts.map +1 -0
  124. package/dist/adapters/profiles.mjs +4 -0
  125. package/dist/adapters/profiles.mjs.map +1 -0
  126. package/dist/atomicJson.cjs +1 -2
  127. package/dist/atomicJson.d.cts +2 -6
  128. package/dist/atomicJson.d.mts +2 -6
  129. package/dist/atomicJson.mjs +1 -2
  130. package/dist/config/piConfig.cjs +1 -2
  131. package/dist/config/piConfig.d.cts +2 -7
  132. package/dist/config/piConfig.d.mts +2 -7
  133. package/dist/config/piConfig.mjs +1 -2
  134. package/dist/config/schema.d.cts +2 -33
  135. package/dist/config/schema.d.mts +2 -33
  136. package/dist/config.cjs +1 -2
  137. package/dist/config.d.cts +3 -24
  138. package/dist/config.d.mts +3 -24
  139. package/dist/config.mjs +1 -2
  140. package/dist/configWriter.cjs +1 -2
  141. package/dist/configWriter.d.cts +2 -52
  142. package/dist/configWriter.d.mts +2 -52
  143. package/dist/configWriter.mjs +1 -2
  144. package/dist/container/doomConfigContainer.cjs +2 -0
  145. package/dist/container/doomConfigContainer.cjs.map +1 -0
  146. package/dist/container/doomConfigContainer.d.cts +12 -0
  147. package/dist/container/doomConfigContainer.d.cts.map +1 -0
  148. package/dist/container/doomConfigContainer.d.mts +12 -0
  149. package/dist/container/doomConfigContainer.d.mts.map +1 -0
  150. package/dist/container/doomConfigContainer.mjs +2 -0
  151. package/dist/container/doomConfigContainer.mjs.map +1 -0
  152. package/dist/container.cjs +1 -2
  153. package/dist/container.d.cts +2 -12
  154. package/dist/container.d.mts +2 -12
  155. package/dist/container.mjs +1 -2
  156. package/dist/domains.cjs +1 -2
  157. package/dist/domains.d.cts +6 -77
  158. package/dist/domains.d.mts +6 -77
  159. package/dist/domains.mjs +1 -2
  160. package/dist/extensions/doom.cjs +1 -2
  161. package/dist/extensions/doom.d.cts +2 -8
  162. package/dist/extensions/doom.d.mts +2 -8
  163. package/dist/extensions/doom.mjs +1 -2
  164. package/dist/extensions/pi.cjs +1 -2
  165. package/dist/extensions/pi.d.cts +2 -8
  166. package/dist/extensions/pi.d.mts +2 -8
  167. package/dist/extensions/pi.mjs +1 -2
  168. package/dist/harnessState.cjs +1 -2
  169. package/dist/harnessState.d.cts +2 -50
  170. package/dist/harnessState.d.mts +2 -50
  171. package/dist/harnessState.mjs +1 -2
  172. package/dist/harnessStore.cjs +1 -2
  173. package/dist/harnessStore.d.cts +2 -102
  174. package/dist/harnessStore.d.mts +2 -102
  175. package/dist/harnessStore.mjs +1 -2
  176. package/dist/index.cjs +1 -1
  177. package/dist/index.d.cts +20 -16
  178. package/dist/index.d.mts +20 -16
  179. package/dist/index.mjs +1 -1
  180. package/dist/init.cjs +1 -76
  181. package/dist/init.d.cts +2 -33
  182. package/dist/init.d.mts +2 -33
  183. package/dist/init.mjs +1 -76
  184. package/dist/layeredConfig.cjs +1 -2
  185. package/dist/layeredConfig.d.cts +2 -49
  186. package/dist/layeredConfig.d.mts +2 -49
  187. package/dist/layeredConfig.mjs +1 -2
  188. package/dist/majorModes.cjs +1 -2
  189. package/dist/majorModes.d.cts +2 -75
  190. package/dist/majorModes.d.mts +2 -75
  191. package/dist/majorModes.mjs +1 -2
  192. package/dist/pi.cjs +1 -1
  193. package/dist/pi.d.cts +1 -1
  194. package/dist/pi.d.mts +1 -1
  195. package/dist/pi.mjs +1 -1
  196. package/dist/piContext.cjs +1 -2
  197. package/dist/piContext.d.cts +2 -19
  198. package/dist/piContext.d.mts +2 -19
  199. package/dist/piContext.mjs +1 -2
  200. package/dist/profiles.cjs +1 -4
  201. package/dist/profiles.d.cts +2 -35
  202. package/dist/profiles.d.mts +2 -35
  203. package/dist/profiles.mjs +1 -4
  204. package/dist/schemas/config/schema.d.cts +33 -0
  205. package/dist/schemas/config/schema.d.cts.map +1 -0
  206. package/dist/schemas/config/schema.d.mts +33 -0
  207. package/dist/schemas/config/schema.d.mts.map +1 -0
  208. package/dist/services/configPolicy.cjs +2 -0
  209. package/dist/services/configPolicy.cjs.map +1 -0
  210. package/dist/services/configPolicy.d.cts +19 -0
  211. package/dist/services/configPolicy.d.cts.map +1 -0
  212. package/dist/services/configPolicy.d.mts +19 -0
  213. package/dist/services/configPolicy.d.mts.map +1 -0
  214. package/dist/services/configPolicy.mjs +2 -0
  215. package/dist/services/configPolicy.mjs.map +1 -0
  216. package/dist/services/domains.cjs +2 -0
  217. package/dist/services/domains.cjs.map +1 -0
  218. package/dist/services/domains.d.cts +12 -0
  219. package/dist/services/domains.d.cts.map +1 -0
  220. package/dist/services/domains.d.mts +12 -0
  221. package/dist/services/domains.d.mts.map +1 -0
  222. package/dist/services/domains.mjs +2 -0
  223. package/dist/services/domains.mjs.map +1 -0
  224. package/dist/types/config.cjs +2 -0
  225. package/dist/types/config.cjs.map +1 -0
  226. package/dist/types/config.d.cts +136 -0
  227. package/dist/types/config.d.cts.map +1 -0
  228. package/dist/types/config.d.mts +136 -0
  229. package/dist/types/config.d.mts.map +1 -0
  230. package/dist/types/config.mjs +2 -0
  231. package/dist/types/config.mjs.map +1 -0
  232. package/dist/types/domains.d.cts +89 -0
  233. package/dist/types/domains.d.cts.map +1 -0
  234. package/dist/types/domains.d.mts +89 -0
  235. package/dist/types/domains.d.mts.map +1 -0
  236. package/dist/types.cjs +1 -2
  237. package/dist/types.d.cts +2 -132
  238. package/dist/types.d.mts +2 -132
  239. package/dist/types.mjs +1 -2
  240. package/llms.txt +9 -0
  241. package/package.json +18 -6
  242. package/skills/doom-pi-config/SKILL.md +6 -3
  243. package/skills/doom-pi-config/references/config-contract.md +123 -8
  244. package/dist/atomicJson.cjs.map +0 -1
  245. package/dist/atomicJson.d.cts.map +0 -1
  246. package/dist/atomicJson.d.mts.map +0 -1
  247. package/dist/atomicJson.mjs.map +0 -1
  248. package/dist/config/piConfig.cjs.map +0 -1
  249. package/dist/config/piConfig.d.cts.map +0 -1
  250. package/dist/config/piConfig.d.mts.map +0 -1
  251. package/dist/config/piConfig.mjs.map +0 -1
  252. package/dist/config/schema.d.cts.map +0 -1
  253. package/dist/config/schema.d.mts.map +0 -1
  254. package/dist/config.cjs.map +0 -1
  255. package/dist/config.d.cts.map +0 -1
  256. package/dist/config.d.mts.map +0 -1
  257. package/dist/config.mjs.map +0 -1
  258. package/dist/configWriter.cjs.map +0 -1
  259. package/dist/configWriter.d.cts.map +0 -1
  260. package/dist/configWriter.d.mts.map +0 -1
  261. package/dist/configWriter.mjs.map +0 -1
  262. package/dist/container.cjs.map +0 -1
  263. package/dist/container.d.cts.map +0 -1
  264. package/dist/container.d.mts.map +0 -1
  265. package/dist/container.mjs.map +0 -1
  266. package/dist/domains.cjs.map +0 -1
  267. package/dist/domains.d.cts.map +0 -1
  268. package/dist/domains.d.mts.map +0 -1
  269. package/dist/domains.mjs.map +0 -1
  270. package/dist/extensions/doom.cjs.map +0 -1
  271. package/dist/extensions/doom.d.cts.map +0 -1
  272. package/dist/extensions/doom.d.mts.map +0 -1
  273. package/dist/extensions/doom.mjs.map +0 -1
  274. package/dist/extensions/pi.cjs.map +0 -1
  275. package/dist/extensions/pi.d.cts.map +0 -1
  276. package/dist/extensions/pi.d.mts.map +0 -1
  277. package/dist/extensions/pi.mjs.map +0 -1
  278. package/dist/harnessState.cjs.map +0 -1
  279. package/dist/harnessState.d.cts.map +0 -1
  280. package/dist/harnessState.d.mts.map +0 -1
  281. package/dist/harnessState.mjs.map +0 -1
  282. package/dist/harnessStore.cjs.map +0 -1
  283. package/dist/harnessStore.d.cts.map +0 -1
  284. package/dist/harnessStore.d.mts.map +0 -1
  285. package/dist/harnessStore.mjs.map +0 -1
  286. package/dist/init.cjs.map +0 -1
  287. package/dist/init.d.cts.map +0 -1
  288. package/dist/init.d.mts.map +0 -1
  289. package/dist/init.mjs.map +0 -1
  290. package/dist/layeredConfig.cjs.map +0 -1
  291. package/dist/layeredConfig.d.cts.map +0 -1
  292. package/dist/layeredConfig.d.mts.map +0 -1
  293. package/dist/layeredConfig.mjs.map +0 -1
  294. package/dist/majorModes.cjs.map +0 -1
  295. package/dist/majorModes.d.cts.map +0 -1
  296. package/dist/majorModes.d.mts.map +0 -1
  297. package/dist/majorModes.mjs.map +0 -1
  298. package/dist/piContext.cjs.map +0 -1
  299. package/dist/piContext.d.cts.map +0 -1
  300. package/dist/piContext.d.mts.map +0 -1
  301. package/dist/piContext.mjs.map +0 -1
  302. package/dist/profiles.cjs.map +0 -1
  303. package/dist/profiles.d.cts.map +0 -1
  304. package/dist/profiles.d.mts.map +0 -1
  305. package/dist/profiles.mjs.map +0 -1
  306. package/dist/types.cjs.map +0 -1
  307. package/dist/types.d.cts.map +0 -1
  308. package/dist/types.d.mts.map +0 -1
  309. package/dist/types.mjs.map +0 -1
@@ -1,6 +1,2 @@
1
- //#region src/atomicJson.d.ts
2
- /** Writes JSON readable by its owner only, replacing the target atomically. */
3
- declare function writePrivateAtomicJson(filePath: string, value: unknown): void;
4
- //#endregion
5
- export { writePrivateAtomicJson };
6
- //# sourceMappingURL=atomicJson.d.cts.map
1
+ import { writePrivateAtomicJson } from "./adapters/atomicJson.cjs";
2
+ export { writePrivateAtomicJson };
@@ -1,6 +1,2 @@
1
- //#region src/atomicJson.d.ts
2
- /** Writes JSON readable by its owner only, replacing the target atomically. */
3
- declare function writePrivateAtomicJson(filePath: string, value: unknown): void;
4
- //#endregion
5
- export { writePrivateAtomicJson };
6
- //# sourceMappingURL=atomicJson.d.mts.map
1
+ import { writePrivateAtomicJson } from "./adapters/atomicJson.mjs";
2
+ export { writePrivateAtomicJson };
@@ -1,2 +1 @@
1
- import e from"node:fs";import t from"node:path";import{randomUUID as n}from"node:crypto";function r(r,i){e.mkdirSync(t.dirname(r),{mode:448,recursive:!0});let a=`${r}.${process.pid}.${n()}.tmp`;try{e.writeFileSync(a,`${JSON.stringify(i,null,2)}\n`,{mode:384}),e.renameSync(a,r)}catch(t){throw e.rmSync(a,{force:!0}),t}}export{r as writePrivateAtomicJson};
2
- //# sourceMappingURL=atomicJson.mjs.map
1
+ import{writePrivateAtomicJson as e}from"./adapters/atomicJson.mjs";export{e as writePrivateAtomicJson};
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:fs");t=e.__toESM(t,1);let n=require("node:os");n=e.__toESM(n,1);let r=require("node:path");r=e.__toESM(r,1);let i=require("@earendil-works/pi-coding-agent");const a=`settings.json`;function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];n[e]=o(t)&&o(r)?s(t,r):r}return n}function c(e){if(!t.default.existsSync(e))return{};let n;try{n=JSON.parse(t.default.readFileSync(e,`utf8`))}catch(t){throw Error(`Could not parse Pi settings at ${e}`,{cause:t})}if(!o(n))throw Error(`Pi settings at ${e} must be a JSON object`);return n}function l(e){return e.reduce((e,t)=>s(e,c(t)),{})}function u(e){return typeof e==`function`?e():e}function d(e,t=n.default.homedir(),o=t===n.default.homedir()?(0,i.getAgentDir)():r.default.join(t,i.CONFIG_DIR_NAME,`agent`)){return{canonicalUser:r.default.join(o,a),canonicalProject:r.default.join(e,i.CONFIG_DIR_NAME,a),legacyUser:[r.default.join(t,i.CONFIG_DIR_NAME,a)],legacyProject:[r.default.join(e,`pi`,a)]}}function f(e){let t=d(e.repoRoot,e.homeDirectory),n=[...t.legacyUser,...e.userConfigPaths??[],t.canonicalUser],r=[...t.legacyProject,...e.projectConfigPaths??[],t.canonicalProject],i=e.defaults??{},a=l(n),o=u(e.isProjectTrusted)?l(r):{};return[i,a,e.overlay??{},o,e.environment??{},e.cli??{},e.programmatic??{}].reduce(s,{})}exports.loadPiConfig=f,exports.piConfigPaths=d;
2
- //# sourceMappingURL=piConfig.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../adapters/piConfig.cjs");exports.loadPiConfig=e.loadPiConfig,exports.loadPiConfigAsync=e.loadPiConfigAsync,exports.piConfigPaths=e.piConfigPaths;
@@ -1,7 +1,2 @@
1
- import { PiConfig, PiConfigLoadOptions, PiConfigPaths } from "./schema.cjs";
2
- //#region src/config/piConfig.d.ts
3
- declare function piConfigPaths(repoRoot: string, homeDirectory?: string, agentDirectory?: string): PiConfigPaths;
4
- declare function loadPiConfig(options: PiConfigLoadOptions): PiConfig;
5
- //#endregion
6
- export { loadPiConfig, piConfigPaths };
7
- //# sourceMappingURL=piConfig.d.cts.map
1
+ import { loadPiConfig, loadPiConfigAsync, piConfigPaths } from "../adapters/piConfig.cjs";
2
+ export { loadPiConfig, loadPiConfigAsync, piConfigPaths };
@@ -1,7 +1,2 @@
1
- import { PiConfig, PiConfigLoadOptions, PiConfigPaths } from "./schema.mjs";
2
- //#region src/config/piConfig.d.ts
3
- declare function piConfigPaths(repoRoot: string, homeDirectory?: string, agentDirectory?: string): PiConfigPaths;
4
- declare function loadPiConfig(options: PiConfigLoadOptions): PiConfig;
5
- //#endregion
6
- export { loadPiConfig, piConfigPaths };
7
- //# sourceMappingURL=piConfig.d.mts.map
1
+ import { loadPiConfig, loadPiConfigAsync, piConfigPaths } from "../adapters/piConfig.mjs";
2
+ export { loadPiConfig, loadPiConfigAsync, piConfigPaths };
@@ -1,2 +1 @@
1
- import e from"node:fs";import t from"node:os";import n from"node:path";import{CONFIG_DIR_NAME as r,getAgentDir as i}from"@earendil-works/pi-coding-agent";const a=`settings.json`;function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];n[e]=o(t)&&o(r)?s(t,r):r}return n}function c(t){if(!e.existsSync(t))return{};let n;try{n=JSON.parse(e.readFileSync(t,`utf8`))}catch(e){throw Error(`Could not parse Pi settings at ${t}`,{cause:e})}if(!o(n))throw Error(`Pi settings at ${t} must be a JSON object`);return n}function l(e){return e.reduce((e,t)=>s(e,c(t)),{})}function u(e){return typeof e==`function`?e():e}function d(e,o=t.homedir(),s=o===t.homedir()?i():n.join(o,r,`agent`)){return{canonicalUser:n.join(s,a),canonicalProject:n.join(e,r,a),legacyUser:[n.join(o,r,a)],legacyProject:[n.join(e,`pi`,a)]}}function f(e){let t=d(e.repoRoot,e.homeDirectory),n=[...t.legacyUser,...e.userConfigPaths??[],t.canonicalUser],r=[...t.legacyProject,...e.projectConfigPaths??[],t.canonicalProject],i=e.defaults??{},a=l(n),o=u(e.isProjectTrusted)?l(r):{};return[i,a,e.overlay??{},o,e.environment??{},e.cli??{},e.programmatic??{}].reduce(s,{})}export{f as loadPiConfig,d as piConfigPaths};
2
- //# sourceMappingURL=piConfig.mjs.map
1
+ import{loadPiConfig as e,loadPiConfigAsync as t,piConfigPaths as n}from"../adapters/piConfig.mjs";export{e as loadPiConfig,t as loadPiConfigAsync,n as piConfigPaths};
@@ -1,33 +1,2 @@
1
- //#region src/config/schema.d.ts
2
- type PiConfig = Record<string, unknown>;
3
- interface DoomAdapterSettings {
4
- projectTrust?: 'ask' | 'always' | 'never';
5
- }
6
- interface PiConfigPaths {
7
- canonicalUser: string;
8
- canonicalProject: string;
9
- legacyUser: readonly string[];
10
- legacyProject: readonly string[];
11
- }
12
- interface PiConfigLoadOptions {
13
- repoRoot: string;
14
- homeDirectory?: string;
15
- defaults?: PiConfig;
16
- overlay?: PiConfig;
17
- userConfigPaths?: readonly string[];
18
- projectConfigPaths?: readonly string[];
19
- programmatic?: PiConfig;
20
- environment?: PiConfig;
21
- cli?: PiConfig;
22
- isProjectTrusted: boolean | (() => boolean);
23
- }
24
- interface ConfigAdapterRegistrationOptions {
25
- defaults?: PiConfig;
26
- programmatic?: PiConfig;
27
- environment?: PiConfig;
28
- cli?: PiConfig;
29
- homeDirectory?: string;
30
- }
31
- //#endregion
32
- export { ConfigAdapterRegistrationOptions, DoomAdapterSettings, PiConfig, PiConfigLoadOptions, PiConfigPaths };
33
- //# sourceMappingURL=schema.d.cts.map
1
+ import { ConfigAdapterRegistrationOptions, DoomAdapterSettings, PiConfig, PiConfigLoadOptions, PiConfigPaths } from "../schemas/config/schema.cjs";
2
+ export type { ConfigAdapterRegistrationOptions, DoomAdapterSettings, PiConfig, PiConfigLoadOptions, PiConfigPaths };
@@ -1,33 +1,2 @@
1
- //#region src/config/schema.d.ts
2
- type PiConfig = Record<string, unknown>;
3
- interface DoomAdapterSettings {
4
- projectTrust?: 'ask' | 'always' | 'never';
5
- }
6
- interface PiConfigPaths {
7
- canonicalUser: string;
8
- canonicalProject: string;
9
- legacyUser: readonly string[];
10
- legacyProject: readonly string[];
11
- }
12
- interface PiConfigLoadOptions {
13
- repoRoot: string;
14
- homeDirectory?: string;
15
- defaults?: PiConfig;
16
- overlay?: PiConfig;
17
- userConfigPaths?: readonly string[];
18
- projectConfigPaths?: readonly string[];
19
- programmatic?: PiConfig;
20
- environment?: PiConfig;
21
- cli?: PiConfig;
22
- isProjectTrusted: boolean | (() => boolean);
23
- }
24
- interface ConfigAdapterRegistrationOptions {
25
- defaults?: PiConfig;
26
- programmatic?: PiConfig;
27
- environment?: PiConfig;
28
- cli?: PiConfig;
29
- homeDirectory?: string;
30
- }
31
- //#endregion
32
- export { ConfigAdapterRegistrationOptions, DoomAdapterSettings, PiConfig, PiConfigLoadOptions, PiConfigPaths };
33
- //# sourceMappingURL=schema.d.mts.map
1
+ import { ConfigAdapterRegistrationOptions, DoomAdapterSettings, PiConfig, PiConfigLoadOptions, PiConfigPaths } from "../schemas/config/schema.mjs";
2
+ export type { ConfigAdapterRegistrationOptions, DoomAdapterSettings, PiConfig, PiConfigLoadOptions, PiConfigPaths };
package/dist/config.cjs CHANGED
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./_virtual/_rolldown/runtime.cjs");let t=require("node:fs");t=e.__toESM(t,1);let n=require("node:os");n=e.__toESM(n,1);let r=require("node:path");r=e.__toESM(r,1);let i=require("yaml");const a=`.doom`,o=`config.yaml`,s=`auto`,c=[`modes`,`projectTrust`,`editor`,`voice`,`selection`],l=[`majorMode`,`domains`,`profile`],ee=[`planning`],u=[`main`,`subagents`,`plansDirectory`],d=[`model`,`thinking`],f=[`command`],p=[`engine`,`language`,`recorder`,`adapters`,`autoCapture`],te=[`binary`,`device`],m=`whisper-cpp`,h=`openai-whisper`,g=`mlx-whisper`,_=[m,h,g],v=[`binary`,`model`],ne=[`path`,`id`],re=[`model`,`startPhrases`,`stopPhrases`,`tts`],y=[`engine`,`voice`,`rate`],b=/^[^/\s]+\/[^/\s]+(?:\/[^/\s]+)*$/u,x=/[\p{P}\p{S}]+/gu,S=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],C=[s,m,h,g],w=[`macos-say`],T=new Set(S),E=new Set([`ask`,`always`,`never`]),D=new Set(C),O=new Set(w);function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function A(e,t,n,r){let i=Object.keys(e).filter(e=>!t.includes(e));if(i.length>0)throw Error(`Doom config at ${r} has unsupported ${n} field(s): ${i.join(`, `)}`)}function j(e,t,n){if(e!==void 0){if(typeof e!=`string`||e.trim().length===0)throw Error(`Doom config at ${n} requires ${t} to be a non-empty string`);return e.trim()}}function M(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e<=31||e===127))return!0}return!1}function N(e,t,n,r){let i=j(e,t,n);if(i){if(i.length>r)throw Error(`Doom config at ${n} requires ${t} to be at most ${r} characters`);if(M(i))throw Error(`Doom config at ${n} does not allow control characters in ${t}`);return i}}function P(e,t){let n=`voice.autoCapture.model`,r=j(e,n,t);if(!r||!b.test(r))throw Error(`Doom config at ${t} requires ${n} in provider/model-id form`);return r}function F(e){return e.normalize(`NFKC`).toLocaleLowerCase(`en-US`).replace(x,` `).replace(/\s+/gu,` `).trim()}function I(e,t,n){if(e===void 0)return;if(!Array.isArray(e)||e.some(e=>typeof e!=`string`))throw Error(`Doom config at ${n} requires ${t} to be an array of strings`);if(e.length>16)throw Error(`Doom config at ${n} requires ${t} to contain at most 16 phrases`);let r=e.map(e=>e.trim()),i=new Set;for(let e of r){if(e.length===0)throw Error(`Doom config at ${n} requires ${t} to contain non-empty strings`);if(e.length>64)throw Error(`Doom config at ${n} requires ${t} phrases to be at most 64 characters`);if(M(e))throw Error(`Doom config at ${n} does not allow control characters in ${t}`);let r=F(e);if(!r)throw Error(`Doom config at ${n} requires ${t} to contain words`);if(i.has(r))throw Error(`Doom config at ${n} does not allow normalized duplicates in ${t}`);i.add(r)}return r}function L(e,t){let n=`voice.autoCapture.tts`;if(!k(e))throw Error(`Doom config at ${t} requires ${n} to be an object`);if(A(e,y,n,t),typeof e.engine!=`string`||!O.has(e.engine))throw Error(`Doom config at ${t} requires ${n}.engine to be one of: ${[...O].join(`, `)}`);let r=N(e.voice,`${n}.voice`,t,64),i=e.rate;if(i!==void 0&&(typeof i!=`number`||!Number.isInteger(i)||i<80||i>500))throw Error(`Doom config at ${t} requires ${n}.rate to be an integer from 80 to 500`);return{engine:e.engine,...r?{voice:r}:{},...i===void 0?{}:{rate:i}}}function R(e,t){if(e===void 0)return;let n=`voice.autoCapture`;if(!k(e))throw Error(`Doom config at ${t} requires ${n} to be an object`);A(e,re,n,t);let r=I(e.startPhrases,`${n}.startPhrases`,t),i=I(e.stopPhrases,`${n}.stopPhrases`,t),a=new Set((r??[]).map(F));if((i??[]).some(e=>a.has(F(e))))throw Error(`Doom config at ${t} does not allow a phrase in both startPhrases and stopPhrases`);return{model:P(e.model,t),...r?{startPhrases:r}:{},...i?{stopPhrases:i}:{},tts:L(e.tts,t)}}function z(e,t,n){if(e===void 0)return;if(!k(e))throw Error(`Doom config at ${n} requires ${t} to be an object`);A(e,d,t,n);let r=e.thinking;if(r!==void 0&&(typeof r!=`string`||!T.has(r)))throw Error(`Doom config at ${n} requires ${t}.thinking to be one of: ${[...T].join(`, `)}`);let i=j(e.model,`${t}.model`,n);return{...i?{model:i}:{},...r?{thinking:r}:{}}}function B(e,t,n=`modes.planning`){if(!k(e))throw Error(`Doom config at ${t} requires ${n} to be an object`);return A(e,u,n,t),{main:z(e.main,`${n}.main`,t),subagents:z(e.subagents,`${n}.subagents`,t),plansDirectory:j(e.plansDirectory,`${n}.plansDirectory`,t)}}function V(e,t,n,r){if(!k(e))throw Error(`Doom config at ${n} requires ${t} to be an object`);A(e,ne,t,n);let i=j(e.path,`${t}.path`,n),a=j(e.id,`${t}.id`,n);if(!!i==!!a)throw Error(`Doom config at ${n} requires exactly one of ${t}.path or ${t}.id`);if(a&&!r)throw Error(`Doom config at ${n} does not support ${t}.id for whisper-cpp`);return{...i?{path:i}:{},...a?{id:a}:{}}}function H(e,t,n,r){if(e===void 0)return;if(!k(e))throw Error(`Doom config at ${n} requires ${t} to be an object`);A(e,v,t,n);let i=j(e.binary,`${t}.binary`,n);return{...i?{binary:i}:{},model:V(e.model,`${t}.model`,n,r)}}function U(e,t){if(e===void 0)return;if(!k(e))throw Error(`Doom config at ${t} requires voice to be an object`);A(e,p,`voice`,t);let n={};if(e.engine!==void 0){if(typeof e.engine!=`string`||!D.has(e.engine))throw Error(`Doom config at ${t} requires voice.engine to be one of: ${[...D].join(`, `)}`);n.engine=e.engine}let r=j(e.language,`voice.language`,t);if(r&&(n.language=r),e.recorder!==void 0){if(!k(e.recorder))throw Error(`Doom config at ${t} requires voice.recorder to be an object`);A(e.recorder,te,`voice.recorder`,t),n.recorder={};let r=j(e.recorder.binary,`voice.recorder.binary`,t),i=j(e.recorder.device,`voice.recorder.device`,t);r&&(n.recorder.binary=r),i&&(n.recorder.device=i)}if(e.adapters!==void 0){if(!k(e.adapters))throw Error(`Doom config at ${t} requires voice.adapters to be an object`);A(e.adapters,_,`voice.adapters`,t),n.adapters={[m]:H(e.adapters[m],`voice.adapters.${m}`,t,!1),[h]:H(e.adapters[h],`voice.adapters.${h}`,t,!0),[g]:H(e.adapters[g],`voice.adapters.${g}`,t,!0)}}let i=R(e.autoCapture,t);return i&&(n.autoCapture=i),n}function W(e,t){if(e===void 0)return;if(!k(e))throw Error(`Doom config at ${t} requires selection to be an object`);A(e,l,`selection`,t);let n=e.domains;if(n!==void 0&&(!Array.isArray(n)||n.some(e=>typeof e!=`string`)))throw Error(`Doom config at ${t} requires selection.domains to be an array of strings`);return{majorMode:j(e.majorMode,`selection.majorMode`,t),domains:n,profile:j(e.profile,`selection.profile`,t)}}function G(e,t){if(e!==void 0){if(!k(e))throw Error(`Doom config at ${t} requires editor to be an object`);return A(e,f,`editor`,t),{command:j(e.command,`editor.command`,t)}}}function K(e,t){let n;try{n=(0,i.parse)(e)??{}}catch(e){throw Error(`Could not parse Doom config at ${t}`,{cause:e})}if(!k(n))throw Error(`Doom config at ${t} must be a YAML object`);A(n,c,`root`,t);let r;if(n.modes!==void 0){if(!k(n.modes))throw Error(`Doom config at ${t} requires modes to be an object`);A(n.modes,ee,`modes`,t),r=n.modes.planning===void 0?{}:{planning:B(n.modes.planning,t)}}let a=n.projectTrust===void 0?`ask`:n.projectTrust;if(typeof a!=`string`||!E.has(a))throw Error(`Doom config at ${t} projectTrust must be ask, always, or never`);return{modes:r,projectTrust:a,editor:G(n.editor,t),voice:U(n.voice,t),selection:W(n.selection,t)}}function q(e){return t.default.existsSync(e)?K(t.default.readFileSync(e,`utf8`),e):{projectTrust:`ask`}}function J(e,t){return e||t?{...e,...t}:void 0}function Y(e,t){if(t.voice?.autoCapture)throw Error(`Repository Doom config voice.autoCapture is global-only; configure it in ~/.pi/.doom/config.yaml`);let n=e.modes?.planning,r=t.modes?.planning,i=n||r?{main:J(n?.main,r?.main),subagents:J(n?.subagents,r?.subagents),plansDirectory:r?.plansDirectory??n?.plansDirectory}:void 0,a=ie(e.voice,t.voice);return{modes:i?{planning:i}:void 0,projectTrust:t.projectTrust,editor:e.editor,voice:a,selection:e.selection||t.selection?{...e.selection,...t.selection}:void 0}}function X(e,t){if(!(!e&&!t))return{...e,...t,model:t?.model??e.model}}function ie(e,t){if(!(!e&&!t))return{...e,...t,recorder:e?.recorder||t?.recorder?{...e?.recorder,...t?.recorder}:void 0,adapters:e?.adapters||t?.adapters?{[m]:X(e?.adapters?.[m],t?.adapters?.[m]),[h]:X(e?.adapters?.[h],t?.adapters?.[h]),[g]:X(e?.adapters?.[g],t?.adapters?.[g])}:void 0,...e?.autoCapture?{autoCapture:e.autoCapture}:{}}}function ae(e){return{engine:e.engine??s,language:e.language??`auto`,recorder:{...e.recorder,device:e.recorder?.device??`none:default`},adapters:e.adapters??{},...e.autoCapture?{autoCapture:{...e.autoCapture,startPhrases:[...e.autoCapture.startPhrases??[]],stopPhrases:[...e.autoCapture.stopPhrases??[]],tts:{...e.autoCapture.tts}}}:{}}}function Z(e=n.default.homedir()){return r.default.join(e,`.pi`,a)}function Q(e=n.default.homedir()){return r.default.join(Z(e),o)}function oe(e,t,i=n.default.homedir()){if(!e)return r.default.join(i,`.pi`,`plans`);if(e===`~`)return i;if(e.startsWith(`~/`))return r.default.resolve(i,e.slice(2));if(e.startsWith(`~`))throw Error(`Doom planning plansDirectory supports only '~' or '~/' home aliases`);return r.default.isAbsolute(e)?r.default.normalize(e):r.default.resolve(t,e)}function $(e){return r.default.join(e,a,o)}function se(e,t=n.default.homedir()){return Y(q(Q(t)),q($(e)))}exports.DOOM_PLANNING_THINKING_LEVELS=S,exports.DOOM_VOICE_ENGINES=C,exports.DOOM_VOICE_TTS_ENGINES=w,exports.globalDoomConfigDirectory=Z,exports.globalDoomConfigPath=Q,exports.loadDoomConfig=se,exports.mergeDoomConfigs=Y,exports.parseDoomConfig=K,exports.parsePlanningModeConfig=B,exports.repositoryDoomConfigPath=$,exports.resolvePlanningPlansDirectory=oe,exports.resolveVoiceConfig=ae;
2
- //# sourceMappingURL=config.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/configPolicy.cjs"),t=require("./adapters/config.cjs");exports.DOOM_PLANNING_THINKING_LEVELS=e.DOOM_PLANNING_THINKING_LEVELS,exports.DOOM_VOICE_ENGINES=e.DOOM_VOICE_ENGINES,exports.DOOM_VOICE_TTS_ENGINES=e.DOOM_VOICE_TTS_ENGINES,exports.globalDoomConfigDirectory=t.globalDoomConfigDirectory,exports.globalDoomConfigPath=t.globalDoomConfigPath,exports.loadDoomConfig=t.loadDoomConfig,exports.loadDoomConfigAsync=t.loadDoomConfigAsync,exports.mergeDoomConfigs=e.mergeDoomConfigs,exports.parseDoomConfig=e.parseDoomConfig,exports.parsePlanningModeConfig=e.parsePlanningModeConfig,exports.repositoryDoomConfigPath=t.repositoryDoomConfigPath,exports.resolvePlanningPlansDirectory=t.resolvePlanningPlansDirectory,exports.resolveVoiceConfig=e.resolveVoiceConfig;
package/dist/config.d.cts CHANGED
@@ -1,24 +1,3 @@
1
- import { DoomConfig, PlanningModeConfig, ResolvedVoiceConfig, VoiceConfig } from "./types.cjs";
2
- //#region src/config.d.ts
3
- /**
4
- * The accepted values, in the order a picker should offer them.
5
- *
6
- * Exported because the config UI has to offer exactly what the parser accepts,
7
- * and a second hand-written list in the contributing package would drift. The
8
- * validating Sets below are built from these for the same reason.
9
- */
10
- declare const DOOM_PLANNING_THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
11
- declare const DOOM_VOICE_ENGINES: readonly ["auto", "whisper-cpp", "openai-whisper", "mlx-whisper"];
12
- declare const DOOM_VOICE_TTS_ENGINES: readonly ["macos-say"];
13
- declare function parsePlanningModeConfig(value: unknown, filePath: string, location?: string): PlanningModeConfig;
14
- declare function parseDoomConfig(content: string, filePath: string): DoomConfig;
15
- declare function mergeDoomConfigs(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig;
16
- declare function resolveVoiceConfig(config: VoiceConfig): ResolvedVoiceConfig;
17
- declare function globalDoomConfigDirectory(homeDirectory?: string): string;
18
- declare function globalDoomConfigPath(homeDirectory?: string): string;
19
- declare function resolvePlanningPlansDirectory(configured: string | undefined, repoRoot: string, homeDirectory?: string): string;
20
- declare function repositoryDoomConfigPath(repoRoot: string): string;
21
- declare function loadDoomConfig(repoRoot: string, homeDirectory?: string): DoomConfig;
22
- //#endregion
23
- export { DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory, resolveVoiceConfig };
24
- //# sourceMappingURL=config.d.cts.map
1
+ import { globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "./adapters/config.cjs";
2
+ import { DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, resolveVoiceConfig } from "./services/configPolicy.cjs";
3
+ export { DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory, resolveVoiceConfig };
package/dist/config.d.mts CHANGED
@@ -1,24 +1,3 @@
1
- import { DoomConfig, PlanningModeConfig, ResolvedVoiceConfig, VoiceConfig } from "./types.mjs";
2
- //#region src/config.d.ts
3
- /**
4
- * The accepted values, in the order a picker should offer them.
5
- *
6
- * Exported because the config UI has to offer exactly what the parser accepts,
7
- * and a second hand-written list in the contributing package would drift. The
8
- * validating Sets below are built from these for the same reason.
9
- */
10
- declare const DOOM_PLANNING_THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
11
- declare const DOOM_VOICE_ENGINES: readonly ["auto", "whisper-cpp", "openai-whisper", "mlx-whisper"];
12
- declare const DOOM_VOICE_TTS_ENGINES: readonly ["macos-say"];
13
- declare function parsePlanningModeConfig(value: unknown, filePath: string, location?: string): PlanningModeConfig;
14
- declare function parseDoomConfig(content: string, filePath: string): DoomConfig;
15
- declare function mergeDoomConfigs(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig;
16
- declare function resolveVoiceConfig(config: VoiceConfig): ResolvedVoiceConfig;
17
- declare function globalDoomConfigDirectory(homeDirectory?: string): string;
18
- declare function globalDoomConfigPath(homeDirectory?: string): string;
19
- declare function resolvePlanningPlansDirectory(configured: string | undefined, repoRoot: string, homeDirectory?: string): string;
20
- declare function repositoryDoomConfigPath(repoRoot: string): string;
21
- declare function loadDoomConfig(repoRoot: string, homeDirectory?: string): DoomConfig;
22
- //#endregion
23
- export { DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory, resolveVoiceConfig };
24
- //# sourceMappingURL=config.d.mts.map
1
+ import { globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "./adapters/config.mjs";
2
+ import { DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, resolveVoiceConfig } from "./services/configPolicy.mjs";
3
+ export { DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory, resolveVoiceConfig };
package/dist/config.mjs CHANGED
@@ -1,2 +1 @@
1
- import e from"node:fs";import t from"node:os";import n from"node:path";import{parse as r}from"yaml";const i=`.doom`,a=`config.yaml`,o=`auto`,s=[`modes`,`projectTrust`,`editor`,`voice`,`selection`],c=[`majorMode`,`domains`,`profile`],ee=[`planning`],te=[`main`,`subagents`,`plansDirectory`],ne=[`model`,`thinking`],l=[`command`],u=[`engine`,`language`,`recorder`,`adapters`,`autoCapture`],d=[`binary`,`device`],f=`whisper-cpp`,p=`openai-whisper`,m=`mlx-whisper`,h=[f,p,m],g=[`binary`,`model`],_=[`path`,`id`],v=[`model`,`startPhrases`,`stopPhrases`,`tts`],y=[`engine`,`voice`,`rate`],b=/^[^/\s]+\/[^/\s]+(?:\/[^/\s]+)*$/u,x=/[\p{P}\p{S}]+/gu,S=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],C=[o,f,p,m],w=[`macos-say`],T=new Set(S),E=new Set([`ask`,`always`,`never`]),D=new Set(C),O=new Set(w);function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function A(e,t,n,r){let i=Object.keys(e).filter(e=>!t.includes(e));if(i.length>0)throw Error(`Doom config at ${r} has unsupported ${n} field(s): ${i.join(`, `)}`)}function j(e,t,n){if(e!==void 0){if(typeof e!=`string`||e.trim().length===0)throw Error(`Doom config at ${n} requires ${t} to be a non-empty string`);return e.trim()}}function M(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e<=31||e===127))return!0}return!1}function N(e,t,n,r){let i=j(e,t,n);if(i){if(i.length>r)throw Error(`Doom config at ${n} requires ${t} to be at most ${r} characters`);if(M(i))throw Error(`Doom config at ${n} does not allow control characters in ${t}`);return i}}function P(e,t){let n=`voice.autoCapture.model`,r=j(e,n,t);if(!r||!b.test(r))throw Error(`Doom config at ${t} requires ${n} in provider/model-id form`);return r}function F(e){return e.normalize(`NFKC`).toLocaleLowerCase(`en-US`).replace(x,` `).replace(/\s+/gu,` `).trim()}function I(e,t,n){if(e===void 0)return;if(!Array.isArray(e)||e.some(e=>typeof e!=`string`))throw Error(`Doom config at ${n} requires ${t} to be an array of strings`);if(e.length>16)throw Error(`Doom config at ${n} requires ${t} to contain at most 16 phrases`);let r=e.map(e=>e.trim()),i=new Set;for(let e of r){if(e.length===0)throw Error(`Doom config at ${n} requires ${t} to contain non-empty strings`);if(e.length>64)throw Error(`Doom config at ${n} requires ${t} phrases to be at most 64 characters`);if(M(e))throw Error(`Doom config at ${n} does not allow control characters in ${t}`);let r=F(e);if(!r)throw Error(`Doom config at ${n} requires ${t} to contain words`);if(i.has(r))throw Error(`Doom config at ${n} does not allow normalized duplicates in ${t}`);i.add(r)}return r}function L(e,t){let n=`voice.autoCapture.tts`;if(!k(e))throw Error(`Doom config at ${t} requires ${n} to be an object`);if(A(e,y,n,t),typeof e.engine!=`string`||!O.has(e.engine))throw Error(`Doom config at ${t} requires ${n}.engine to be one of: ${[...O].join(`, `)}`);let r=N(e.voice,`${n}.voice`,t,64),i=e.rate;if(i!==void 0&&(typeof i!=`number`||!Number.isInteger(i)||i<80||i>500))throw Error(`Doom config at ${t} requires ${n}.rate to be an integer from 80 to 500`);return{engine:e.engine,...r?{voice:r}:{},...i===void 0?{}:{rate:i}}}function R(e,t){if(e===void 0)return;let n=`voice.autoCapture`;if(!k(e))throw Error(`Doom config at ${t} requires ${n} to be an object`);A(e,v,n,t);let r=I(e.startPhrases,`${n}.startPhrases`,t),i=I(e.stopPhrases,`${n}.stopPhrases`,t),a=new Set((r??[]).map(F));if((i??[]).some(e=>a.has(F(e))))throw Error(`Doom config at ${t} does not allow a phrase in both startPhrases and stopPhrases`);return{model:P(e.model,t),...r?{startPhrases:r}:{},...i?{stopPhrases:i}:{},tts:L(e.tts,t)}}function z(e,t,n){if(e===void 0)return;if(!k(e))throw Error(`Doom config at ${n} requires ${t} to be an object`);A(e,ne,t,n);let r=e.thinking;if(r!==void 0&&(typeof r!=`string`||!T.has(r)))throw Error(`Doom config at ${n} requires ${t}.thinking to be one of: ${[...T].join(`, `)}`);let i=j(e.model,`${t}.model`,n);return{...i?{model:i}:{},...r?{thinking:r}:{}}}function B(e,t,n=`modes.planning`){if(!k(e))throw Error(`Doom config at ${t} requires ${n} to be an object`);return A(e,te,n,t),{main:z(e.main,`${n}.main`,t),subagents:z(e.subagents,`${n}.subagents`,t),plansDirectory:j(e.plansDirectory,`${n}.plansDirectory`,t)}}function V(e,t,n,r){if(!k(e))throw Error(`Doom config at ${n} requires ${t} to be an object`);A(e,_,t,n);let i=j(e.path,`${t}.path`,n),a=j(e.id,`${t}.id`,n);if(!!i==!!a)throw Error(`Doom config at ${n} requires exactly one of ${t}.path or ${t}.id`);if(a&&!r)throw Error(`Doom config at ${n} does not support ${t}.id for whisper-cpp`);return{...i?{path:i}:{},...a?{id:a}:{}}}function H(e,t,n,r){if(e===void 0)return;if(!k(e))throw Error(`Doom config at ${n} requires ${t} to be an object`);A(e,g,t,n);let i=j(e.binary,`${t}.binary`,n);return{...i?{binary:i}:{},model:V(e.model,`${t}.model`,n,r)}}function U(e,t){if(e===void 0)return;if(!k(e))throw Error(`Doom config at ${t} requires voice to be an object`);A(e,u,`voice`,t);let n={};if(e.engine!==void 0){if(typeof e.engine!=`string`||!D.has(e.engine))throw Error(`Doom config at ${t} requires voice.engine to be one of: ${[...D].join(`, `)}`);n.engine=e.engine}let r=j(e.language,`voice.language`,t);if(r&&(n.language=r),e.recorder!==void 0){if(!k(e.recorder))throw Error(`Doom config at ${t} requires voice.recorder to be an object`);A(e.recorder,d,`voice.recorder`,t),n.recorder={};let r=j(e.recorder.binary,`voice.recorder.binary`,t),i=j(e.recorder.device,`voice.recorder.device`,t);r&&(n.recorder.binary=r),i&&(n.recorder.device=i)}if(e.adapters!==void 0){if(!k(e.adapters))throw Error(`Doom config at ${t} requires voice.adapters to be an object`);A(e.adapters,h,`voice.adapters`,t),n.adapters={[f]:H(e.adapters[f],`voice.adapters.${f}`,t,!1),[p]:H(e.adapters[p],`voice.adapters.${p}`,t,!0),[m]:H(e.adapters[m],`voice.adapters.${m}`,t,!0)}}let i=R(e.autoCapture,t);return i&&(n.autoCapture=i),n}function W(e,t){if(e===void 0)return;if(!k(e))throw Error(`Doom config at ${t} requires selection to be an object`);A(e,c,`selection`,t);let n=e.domains;if(n!==void 0&&(!Array.isArray(n)||n.some(e=>typeof e!=`string`)))throw Error(`Doom config at ${t} requires selection.domains to be an array of strings`);return{majorMode:j(e.majorMode,`selection.majorMode`,t),domains:n,profile:j(e.profile,`selection.profile`,t)}}function G(e,t){if(e!==void 0){if(!k(e))throw Error(`Doom config at ${t} requires editor to be an object`);return A(e,l,`editor`,t),{command:j(e.command,`editor.command`,t)}}}function K(e,t){let n;try{n=r(e)??{}}catch(e){throw Error(`Could not parse Doom config at ${t}`,{cause:e})}if(!k(n))throw Error(`Doom config at ${t} must be a YAML object`);A(n,s,`root`,t);let i;if(n.modes!==void 0){if(!k(n.modes))throw Error(`Doom config at ${t} requires modes to be an object`);A(n.modes,ee,`modes`,t),i=n.modes.planning===void 0?{}:{planning:B(n.modes.planning,t)}}let a=n.projectTrust===void 0?`ask`:n.projectTrust;if(typeof a!=`string`||!E.has(a))throw Error(`Doom config at ${t} projectTrust must be ask, always, or never`);return{modes:i,projectTrust:a,editor:G(n.editor,t),voice:U(n.voice,t),selection:W(n.selection,t)}}function q(t){return e.existsSync(t)?K(e.readFileSync(t,`utf8`),t):{projectTrust:`ask`}}function J(e,t){return e||t?{...e,...t}:void 0}function Y(e,t){if(t.voice?.autoCapture)throw Error(`Repository Doom config voice.autoCapture is global-only; configure it in ~/.pi/.doom/config.yaml`);let n=e.modes?.planning,r=t.modes?.planning,i=n||r?{main:J(n?.main,r?.main),subagents:J(n?.subagents,r?.subagents),plansDirectory:r?.plansDirectory??n?.plansDirectory}:void 0,a=re(e.voice,t.voice);return{modes:i?{planning:i}:void 0,projectTrust:t.projectTrust,editor:e.editor,voice:a,selection:e.selection||t.selection?{...e.selection,...t.selection}:void 0}}function X(e,t){if(!(!e&&!t))return{...e,...t,model:t?.model??e.model}}function re(e,t){if(!(!e&&!t))return{...e,...t,recorder:e?.recorder||t?.recorder?{...e?.recorder,...t?.recorder}:void 0,adapters:e?.adapters||t?.adapters?{[f]:X(e?.adapters?.[f],t?.adapters?.[f]),[p]:X(e?.adapters?.[p],t?.adapters?.[p]),[m]:X(e?.adapters?.[m],t?.adapters?.[m])}:void 0,...e?.autoCapture?{autoCapture:e.autoCapture}:{}}}function ie(e){return{engine:e.engine??o,language:e.language??`auto`,recorder:{...e.recorder,device:e.recorder?.device??`none:default`},adapters:e.adapters??{},...e.autoCapture?{autoCapture:{...e.autoCapture,startPhrases:[...e.autoCapture.startPhrases??[]],stopPhrases:[...e.autoCapture.stopPhrases??[]],tts:{...e.autoCapture.tts}}}:{}}}function Z(e=t.homedir()){return n.join(e,`.pi`,i)}function Q(e=t.homedir()){return n.join(Z(e),a)}function ae(e,r,i=t.homedir()){if(!e)return n.join(i,`.pi`,`plans`);if(e===`~`)return i;if(e.startsWith(`~/`))return n.resolve(i,e.slice(2));if(e.startsWith(`~`))throw Error(`Doom planning plansDirectory supports only '~' or '~/' home aliases`);return n.isAbsolute(e)?n.normalize(e):n.resolve(r,e)}function $(e){return n.join(e,i,a)}function oe(e,n=t.homedir()){return Y(q(Q(n)),q($(e)))}export{S as DOOM_PLANNING_THINKING_LEVELS,C as DOOM_VOICE_ENGINES,w as DOOM_VOICE_TTS_ENGINES,Z as globalDoomConfigDirectory,Q as globalDoomConfigPath,oe as loadDoomConfig,Y as mergeDoomConfigs,K as parseDoomConfig,B as parsePlanningModeConfig,$ as repositoryDoomConfigPath,ae as resolvePlanningPlansDirectory,ie as resolveVoiceConfig};
2
- //# sourceMappingURL=config.mjs.map
1
+ import{DOOM_PLANNING_THINKING_LEVELS as e,DOOM_VOICE_ENGINES as t,DOOM_VOICE_TTS_ENGINES as n,mergeDoomConfigs as r,parseDoomConfig as i,parsePlanningModeConfig as a,resolveVoiceConfig as o}from"./services/configPolicy.mjs";import{globalDoomConfigDirectory as s,globalDoomConfigPath as c,loadDoomConfig as l,loadDoomConfigAsync as u,repositoryDoomConfigPath as d,resolvePlanningPlansDirectory as f}from"./adapters/config.mjs";export{e as DOOM_PLANNING_THINKING_LEVELS,t as DOOM_VOICE_ENGINES,n as DOOM_VOICE_TTS_ENGINES,s as globalDoomConfigDirectory,c as globalDoomConfigPath,l as loadDoomConfig,u as loadDoomConfigAsync,r as mergeDoomConfigs,i as parseDoomConfig,a as parsePlanningModeConfig,d as repositoryDoomConfigPath,f as resolvePlanningPlansDirectory,o as resolveVoiceConfig};
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./_virtual/_rolldown/runtime.cjs"),t=require("./config.cjs");let n=require("node:path");n=e.__toESM(n,1);let r=require("yaml"),i=require("node:crypto"),a=require("node:fs/promises");a=e.__toESM(a,1);async function o(e){try{return await a.default.readFile(e,`utf8`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return``;throw e}}function s(e){if(typeof e!=`object`||!e)return!1;let t=e.items;return Array.isArray(t)&&t.length===0}function c(e,t){for(let n=t.length-1;n>0;--n){let r=t.slice(0,n);if(e.hasIn(r)){if(!s(e.getIn(r,!0)))return;e.deleteIn(r)}}}async function l(e,s,l={}){if(s.length===0)return;let u=await o(e),d=(0,r.parseDocument)(u,{keepSourceTokens:!0});if(d.errors.length>0)throw Error(`Could not parse Doom config at ${e}`);for(let e of s){let t=[...e.keyPath];if(e.value!==void 0){d.setIn(t,e.value);continue}d.hasIn(t)&&(d.deleteIn(t),l.prune!==!1&&c(d,t))}let f=d.toString();t.parseDoomConfig(f,e),await a.default.mkdir(n.default.dirname(e),{mode:448,recursive:!0});let p=`${e}.${process.pid}.${(0,i.randomUUID)()}.tmp`;try{await a.default.writeFile(p,f,{encoding:`utf8`,mode:384}),await a.default.rename(p,e)}catch(e){throw await a.default.rm(p,{force:!0}),e}}async function u(e,t,n){await l(e,[{keyPath:t,value:n}])}async function d(e,t){await l(e,[{keyPath:t}])}exports.setDoomConfigValue=u,exports.unsetDoomConfigValue=d,exports.writeDoomConfigValues=l;
2
- //# sourceMappingURL=configWriter.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/configWriter.cjs");exports.setDoomConfigValue=e.setDoomConfigValue,exports.unsetDoomConfigValue=e.unsetDoomConfigValue,exports.writeDoomConfigValues=e.writeDoomConfigValues;
@@ -1,52 +1,2 @@
1
- //#region src/configWriter.d.ts
2
- /**
3
- * Writes into the global Doom config file, one key path at a time.
4
- *
5
- * Extracted from doom-file-edit, which owned the only writer in the repo and had
6
- * it hard-coded to `editor.command`. Several extensions now edit their own
7
- * settings from the config panel, and every one of them needs the same four
8
- * properties: keep the user's comments, never publish a file the parser would
9
- * reject, never leave a half-written file behind, and apply a set of related
10
- * edits together.
11
- *
12
- * That last one is not a convenience. `voice.adapters.<engine>.model` accepts a
13
- * path or an id but not both, so switching between them is a set and an unset
14
- * that must land in the same write, or the file is briefly invalid.
15
- *
16
- * Atomicity is the same rename trick as `atomicJson.ts` next door, and carries
17
- * the same caveat: it prevents torn reads, not lost updates. Two sessions with
18
- * the panel open still clobber each other, because the rename only publishes
19
- * what the caller already computed.
20
- *
21
- * AVOID:
22
- * - Treating this as a lock
23
- * - Writing an empty string; the parser rejects blank values, so clearing a key
24
- * means removing it
25
- */
26
- interface DoomConfigEdit {
27
- /** Key path into the document, e.g. `['voice', 'adapters', 'mlx-whisper', 'model', 'id']`. */
28
- readonly keyPath: readonly string[];
29
- /** The value to write. `undefined` removes the key. */
30
- readonly value?: string;
31
- }
32
- interface WriteDoomConfigOptions {
33
- /**
34
- * Remove ancestors left holding nothing. Defaults to true, and is not
35
- * cosmetic: an adapter left as `{}` fails validation, because the parser
36
- * requires a model once the adapter exists at all.
37
- */
38
- readonly prune?: boolean;
39
- }
40
- /**
41
- * Applies every edit as one document mutation, or throws having written nothing.
42
- *
43
- * Validation runs against the serialized result rather than each edit, so a pair
44
- * of edits only valid together is accepted, and a single edit that breaks an
45
- * invariant elsewhere is still caught.
46
- */
47
- declare function writeDoomConfigValues(filePath: string, edits: readonly DoomConfigEdit[], options?: WriteDoomConfigOptions): Promise<void>;
48
- declare function setDoomConfigValue(filePath: string, keyPath: readonly string[], value: string): Promise<void>;
49
- declare function unsetDoomConfigValue(filePath: string, keyPath: readonly string[]): Promise<void>;
50
- //#endregion
51
- export { DoomConfigEdit, WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues };
52
- //# sourceMappingURL=configWriter.d.cts.map
1
+ import { DoomConfigEdit, WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues } from "./adapters/configWriter.cjs";
2
+ export { type DoomConfigEdit, type WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues };
@@ -1,52 +1,2 @@
1
- //#region src/configWriter.d.ts
2
- /**
3
- * Writes into the global Doom config file, one key path at a time.
4
- *
5
- * Extracted from doom-file-edit, which owned the only writer in the repo and had
6
- * it hard-coded to `editor.command`. Several extensions now edit their own
7
- * settings from the config panel, and every one of them needs the same four
8
- * properties: keep the user's comments, never publish a file the parser would
9
- * reject, never leave a half-written file behind, and apply a set of related
10
- * edits together.
11
- *
12
- * That last one is not a convenience. `voice.adapters.<engine>.model` accepts a
13
- * path or an id but not both, so switching between them is a set and an unset
14
- * that must land in the same write, or the file is briefly invalid.
15
- *
16
- * Atomicity is the same rename trick as `atomicJson.ts` next door, and carries
17
- * the same caveat: it prevents torn reads, not lost updates. Two sessions with
18
- * the panel open still clobber each other, because the rename only publishes
19
- * what the caller already computed.
20
- *
21
- * AVOID:
22
- * - Treating this as a lock
23
- * - Writing an empty string; the parser rejects blank values, so clearing a key
24
- * means removing it
25
- */
26
- interface DoomConfigEdit {
27
- /** Key path into the document, e.g. `['voice', 'adapters', 'mlx-whisper', 'model', 'id']`. */
28
- readonly keyPath: readonly string[];
29
- /** The value to write. `undefined` removes the key. */
30
- readonly value?: string;
31
- }
32
- interface WriteDoomConfigOptions {
33
- /**
34
- * Remove ancestors left holding nothing. Defaults to true, and is not
35
- * cosmetic: an adapter left as `{}` fails validation, because the parser
36
- * requires a model once the adapter exists at all.
37
- */
38
- readonly prune?: boolean;
39
- }
40
- /**
41
- * Applies every edit as one document mutation, or throws having written nothing.
42
- *
43
- * Validation runs against the serialized result rather than each edit, so a pair
44
- * of edits only valid together is accepted, and a single edit that breaks an
45
- * invariant elsewhere is still caught.
46
- */
47
- declare function writeDoomConfigValues(filePath: string, edits: readonly DoomConfigEdit[], options?: WriteDoomConfigOptions): Promise<void>;
48
- declare function setDoomConfigValue(filePath: string, keyPath: readonly string[], value: string): Promise<void>;
49
- declare function unsetDoomConfigValue(filePath: string, keyPath: readonly string[]): Promise<void>;
50
- //#endregion
51
- export { DoomConfigEdit, WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues };
52
- //# sourceMappingURL=configWriter.d.mts.map
1
+ import { DoomConfigEdit, WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues } from "./adapters/configWriter.mjs";
2
+ export { type DoomConfigEdit, type WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues };
@@ -1,2 +1 @@
1
- import{parseDoomConfig as e}from"./config.mjs";import t from"node:path";import{parseDocument as n}from"yaml";import{randomUUID as r}from"node:crypto";import i from"node:fs/promises";async function a(e){try{return await i.readFile(e,`utf8`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return``;throw e}}function o(e){if(typeof e!=`object`||!e)return!1;let t=e.items;return Array.isArray(t)&&t.length===0}function s(e,t){for(let n=t.length-1;n>0;--n){let r=t.slice(0,n);if(e.hasIn(r)){if(!o(e.getIn(r,!0)))return;e.deleteIn(r)}}}async function c(o,c,l={}){if(c.length===0)return;let u=await a(o),d=n(u,{keepSourceTokens:!0});if(d.errors.length>0)throw Error(`Could not parse Doom config at ${o}`);for(let e of c){let t=[...e.keyPath];if(e.value!==void 0){d.setIn(t,e.value);continue}d.hasIn(t)&&(d.deleteIn(t),l.prune!==!1&&s(d,t))}let f=d.toString();e(f,o),await i.mkdir(t.dirname(o),{mode:448,recursive:!0});let p=`${o}.${process.pid}.${r()}.tmp`;try{await i.writeFile(p,f,{encoding:`utf8`,mode:384}),await i.rename(p,o)}catch(e){throw await i.rm(p,{force:!0}),e}}async function l(e,t,n){await c(e,[{keyPath:t,value:n}])}async function u(e,t){await c(e,[{keyPath:t}])}export{l as setDoomConfigValue,u as unsetDoomConfigValue,c as writeDoomConfigValues};
2
- //# sourceMappingURL=configWriter.mjs.map
1
+ import{setDoomConfigValue as e,unsetDoomConfigValue as t,writeDoomConfigValues as n}from"./adapters/configWriter.mjs";export{e as setDoomConfigValue,t as unsetDoomConfigValue,n as writeDoomConfigValues};
@@ -0,0 +1,2 @@
1
+ const e=require("../adapters/config.cjs"),t=require("../types/config.cjs"),n=require("../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.cjs");require("reflect-metadata");let r=require("inversify"),i=class{load(t,n){return e.loadDoomConfig(t,n)}};i=n.default([(0,r.injectable)()],i);function a(){return new r.ContainerModule(({bind:e})=>{e(t.DOOM_CONFIG_TYPES.ConfigService).to(i).inSingletonScope()})}function o(){let e=new r.Container;return e.bind(t.DOOM_CONFIG_TYPES.ConfigService).to(i).inSingletonScope(),e}Object.defineProperty(exports,"DoomConfigService",{enumerable:!0,get:function(){return i}}),exports.createDoomConfigContainer=o,exports.createDoomConfigModule=a;
2
+ //# sourceMappingURL=doomConfigContainer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomConfigContainer.cjs","names":["loadDoomConfig","injectable","ContainerModule","DOOM_CONFIG_TYPES","Container"],"sources":["../../src/container/doomConfigContainer.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { Container, ContainerModule, injectable } from 'inversify';\nimport { loadDoomConfig } from '../adapters/config.ts';\nimport { DOOM_CONFIG_TYPES, type DoomConfig, type IDoomConfigService } from '../types/config.ts';\n\n@injectable()\nexport class DoomConfigService implements IDoomConfigService {\n load(repoRoot: string, homeDirectory?: string): DoomConfig {\n return loadDoomConfig(repoRoot, homeDirectory);\n }\n}\nexport function createDoomConfigModule(): ContainerModule {\n return new ContainerModule(({ bind }) => {\n bind<IDoomConfigService>(DOOM_CONFIG_TYPES.ConfigService).to(DoomConfigService).inSingletonScope();\n });\n}\nexport function createDoomConfigContainer(): Container {\n const container = new Container();\n container.bind<IDoomConfigService>(DOOM_CONFIG_TYPES.ConfigService).to(DoomConfigService).inSingletonScope();\n return container;\n}\n"],"mappings":"kNAMa,EAAN,KAAsD,CAC3D,KAAK,EAAkB,EAAoC,CACzD,OAAOA,EAAAA,eAAe,EAAU,CAAa,CAC/C,CACF,EALCC,EAAAA,EAAAA,QAAAA,EAAAA,EAAAA,EAAAA,WAAAA,CAAW,CAAA,EAAA,CAAA,EAMZ,SAAgB,GAA0C,CACxD,OAAO,IAAIC,EAAAA,iBAAiB,CAAE,UAAW,CACvC,EAAyBC,EAAAA,kBAAkB,aAAa,CAAC,CAAC,GAAG,CAAiB,CAAC,CAAC,iBAAiB,CACnG,CAAC,CACH,CACA,SAAgB,GAAuC,CACrD,IAAM,EAAY,IAAIC,EAAAA,UAEtB,OADA,EAAU,KAAyBD,EAAAA,kBAAkB,aAAa,CAAC,CAAC,GAAG,CAAiB,CAAC,CAAC,iBAAiB,EACpG,CACT"}
@@ -0,0 +1,12 @@
1
+ import { DoomConfig, IDoomConfigService } from "../types/config.cjs";
2
+ import "reflect-metadata";
3
+ import { Container, ContainerModule } from "inversify";
4
+ //#region src/container/doomConfigContainer.d.ts
5
+ declare class DoomConfigService implements IDoomConfigService {
6
+ load(repoRoot: string, homeDirectory?: string): DoomConfig;
7
+ }
8
+ declare function createDoomConfigModule(): ContainerModule;
9
+ declare function createDoomConfigContainer(): Container;
10
+ //#endregion
11
+ export { DoomConfigService, createDoomConfigContainer, createDoomConfigModule };
12
+ //# sourceMappingURL=doomConfigContainer.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomConfigContainer.d.cts","names":[],"sources":["../../src/container/doomConfigContainer.ts"],"mappings":";;;;cAMa,6BAA6B;EACxC,KAAK,kBAAkB,yBAAyB;;iBAIlC,0BAA0B;iBAK1B,6BAA6B"}
@@ -0,0 +1,12 @@
1
+ import { DoomConfig, IDoomConfigService } from "../types/config.mjs";
2
+ import "reflect-metadata";
3
+ import { Container, ContainerModule } from "inversify";
4
+ //#region src/container/doomConfigContainer.d.ts
5
+ declare class DoomConfigService implements IDoomConfigService {
6
+ load(repoRoot: string, homeDirectory?: string): DoomConfig;
7
+ }
8
+ declare function createDoomConfigModule(): ContainerModule;
9
+ declare function createDoomConfigContainer(): Container;
10
+ //#endregion
11
+ export { DoomConfigService, createDoomConfigContainer, createDoomConfigModule };
12
+ //# sourceMappingURL=doomConfigContainer.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomConfigContainer.d.mts","names":[],"sources":["../../src/container/doomConfigContainer.ts"],"mappings":";;;;cAMa,6BAA6B;EACxC,KAAK,kBAAkB,yBAAyB;;iBAIlC,0BAA0B;iBAK1B,6BAA6B"}
@@ -0,0 +1,2 @@
1
+ import{loadDoomConfig as e}from"../adapters/config.mjs";import{DOOM_CONFIG_TYPES as t}from"../types/config.mjs";import n from"../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.mjs";import"reflect-metadata";import{Container as r,ContainerModule as i,injectable as a}from"inversify";let o=class{load(t,n){return e(t,n)}};o=n([a()],o);function s(){return new i(({bind:e})=>{e(t.ConfigService).to(o).inSingletonScope()})}function c(){let e=new r;return e.bind(t.ConfigService).to(o).inSingletonScope(),e}export{o as DoomConfigService,c as createDoomConfigContainer,s as createDoomConfigModule};
2
+ //# sourceMappingURL=doomConfigContainer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomConfigContainer.mjs","names":[],"sources":["../../src/container/doomConfigContainer.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { Container, ContainerModule, injectable } from 'inversify';\nimport { loadDoomConfig } from '../adapters/config.ts';\nimport { DOOM_CONFIG_TYPES, type DoomConfig, type IDoomConfigService } from '../types/config.ts';\n\n@injectable()\nexport class DoomConfigService implements IDoomConfigService {\n load(repoRoot: string, homeDirectory?: string): DoomConfig {\n return loadDoomConfig(repoRoot, homeDirectory);\n }\n}\nexport function createDoomConfigModule(): ContainerModule {\n return new ContainerModule(({ bind }) => {\n bind<IDoomConfigService>(DOOM_CONFIG_TYPES.ConfigService).to(DoomConfigService).inSingletonScope();\n });\n}\nexport function createDoomConfigContainer(): Container {\n const container = new Container();\n container.bind<IDoomConfigService>(DOOM_CONFIG_TYPES.ConfigService).to(DoomConfigService).inSingletonScope();\n return container;\n}\n"],"mappings":"sSAMO,IAAM,EAAN,KAAsD,CAC3D,KAAK,EAAkB,EAAoC,CACzD,OAAO,EAAe,EAAU,CAAa,CAC/C,CACF,EALC,EAAA,EAAA,CAAA,EAAW,CAAA,EAAA,CAAA,EAMZ,SAAgB,GAA0C,CACxD,OAAO,IAAI,GAAiB,CAAE,UAAW,CACvC,EAAyB,EAAkB,aAAa,CAAC,CAAC,GAAG,CAAiB,CAAC,CAAC,iBAAiB,CACnG,CAAC,CACH,CACA,SAAgB,GAAuC,CACrD,IAAM,EAAY,IAAI,EAEtB,OADA,EAAU,KAAyB,EAAkB,aAAa,CAAC,CAAC,GAAG,CAAiB,CAAC,CAAC,iBAAiB,EACpG,CACT"}
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./config.cjs"),t=require("./types.cjs"),n=require("./_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.cjs");require("reflect-metadata");let r=require("inversify"),i=class{load(t,n){return e.loadDoomConfig(t,n)}};i=n.default([(0,r.injectable)()],i);function a(){return new r.ContainerModule(({bind:e})=>{e(t.DOOM_CONFIG_TYPES.ConfigService).to(i).inSingletonScope()})}function o(){let e=new r.Container;return e.bind(t.DOOM_CONFIG_TYPES.ConfigService).to(i).inSingletonScope(),e}Object.defineProperty(exports,"DoomConfigService",{enumerable:!0,get:function(){return i}}),exports.createDoomConfigContainer=o,exports.createDoomConfigModule=a;
2
- //# sourceMappingURL=container.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./container/doomConfigContainer.cjs");Object.defineProperty(exports,"DoomConfigService",{enumerable:!0,get:function(){return e.DoomConfigService}}),exports.createDoomConfigContainer=e.createDoomConfigContainer,exports.createDoomConfigModule=e.createDoomConfigModule;
@@ -1,12 +1,2 @@
1
- import { DoomConfig, IDoomConfigService } from "./types.cjs";
2
- import "reflect-metadata";
3
- import { Container, ContainerModule } from "inversify";
4
- //#region src/container.d.ts
5
- declare class DoomConfigService implements IDoomConfigService {
6
- load(repoRoot: string, homeDirectory?: string): DoomConfig;
7
- }
8
- declare function createDoomConfigModule(): ContainerModule;
9
- declare function createDoomConfigContainer(): Container;
10
- //#endregion
11
- export { DoomConfigService, createDoomConfigContainer, createDoomConfigModule };
12
- //# sourceMappingURL=container.d.cts.map
1
+ import { DoomConfigService, createDoomConfigContainer, createDoomConfigModule } from "./container/doomConfigContainer.cjs";
2
+ export { DoomConfigService, createDoomConfigContainer, createDoomConfigModule };
@@ -1,12 +1,2 @@
1
- import { DoomConfig, IDoomConfigService } from "./types.mjs";
2
- import "reflect-metadata";
3
- import { Container, ContainerModule } from "inversify";
4
- //#region src/container.d.ts
5
- declare class DoomConfigService implements IDoomConfigService {
6
- load(repoRoot: string, homeDirectory?: string): DoomConfig;
7
- }
8
- declare function createDoomConfigModule(): ContainerModule;
9
- declare function createDoomConfigContainer(): Container;
10
- //#endregion
11
- export { DoomConfigService, createDoomConfigContainer, createDoomConfigModule };
12
- //# sourceMappingURL=container.d.mts.map
1
+ import { DoomConfigService, createDoomConfigContainer, createDoomConfigModule } from "./container/doomConfigContainer.mjs";
2
+ export { DoomConfigService, createDoomConfigContainer, createDoomConfigModule };
@@ -1,2 +1 @@
1
- import{loadDoomConfig as e}from"./config.mjs";import{DOOM_CONFIG_TYPES as t}from"./types.mjs";import n from"./_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.mjs";import"reflect-metadata";import{Container as r,ContainerModule as i,injectable as a}from"inversify";let o=class{load(t,n){return e(t,n)}};o=n([a()],o);function s(){return new i(({bind:e})=>{e(t.ConfigService).to(o).inSingletonScope()})}function c(){let e=new r;return e.bind(t.ConfigService).to(o).inSingletonScope(),e}export{o as DoomConfigService,c as createDoomConfigContainer,s as createDoomConfigModule};
2
- //# sourceMappingURL=container.mjs.map
1
+ import{DoomConfigService as e,createDoomConfigContainer as t,createDoomConfigModule as n}from"./container/doomConfigContainer.mjs";export{e as DoomConfigService,t as createDoomConfigContainer,n as createDoomConfigModule};
package/dist/domains.cjs CHANGED
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./_virtual/_rolldown/runtime.cjs"),t=require("./layeredConfig.cjs");let n=require("node:fs");n=e.__toESM(n,1);let r=require("node:os");r=e.__toESM(r,1);let i=require("node:path");i=e.__toESM(i,1);const a=`.doom/domains.yaml`;function o(e){if(!Array.isArray(e)||e.some(e=>typeof e!=`string`||!e.trim()))throw Error(`defaultDomains in ${a} must be an array of non-empty strings`);return[...new Set(e.map(e=>e.trim()))]}function s(e,n=r.default.homedir()){let i=t.readDoomConfigSources(`domains.yaml`,e,n),s={},c;for(let e of i)Object.assign(s,e.document.aliases??{}),Object.hasOwn(e.document,`defaultDomains`)&&(c=o(e.document.defaultDomains));let u=t.mergeNamedSources(i,e=>e.domains);if(c){for(let e of l({domains:u,aliases:s},c))if(!Object.hasOwn(u,e))throw Error(`Unknown default domain "${e}" in ${a}`)}return{domains:u,aliases:s,...c?{defaultDomains:c}:{}}}function c(e,t){let n=s(e,t);return[...new Set([...Object.keys(n.domains),...Object.keys(n.aliases)])].sort()}function l(e,t){return t.flatMap(e=>e.split(`,`).map(e=>e.trim()).filter(Boolean)).flatMap(t=>e.aliases[t]??[t])}function u(e){return e.match(/^\/domains\s+(?:[^\s,]+,)*([^\s,]*)$/)?.[1]}function d(e,t){let n=t.toLowerCase();return e.filter(e=>e.toLowerCase().startsWith(n)).map(e=>({value:e,label:e}))}function f(e,t,n){let r=s(e,n),i=l(r,t);return i.length===0||i.some(e=>r.domains[e]?.sharedSkills!==!1)}function p(e,t,r,a){let o=s(e,a),c=[],u=new Set;for(let e of l(o,t)){let t=o.domains[e];if(!t)throw Error(`Unknown domain: ${e}`);for(let e of t.plugins??[]){let r=typeof e!=`string`,a=i.default.resolve(t.baseDirectory,r?e.dir:e);if(!n.default.existsSync(a))throw Error(`Domain plugin does not exist: ${a}`);u.has(a)||(u.add(a),c.push(r?{directory:a,skills:e.skills,agents:e.agents,hooks:e.hooks,mcp:e.mcp}:{directory:a}))}}for(let e of r){if(!n.default.existsSync(e))throw Error(`Plugin directory does not exist: ${e}`);let t=i.default.resolve(e);u.has(t)||(u.add(t),c.push({directory:t}))}return c}function m(e,t,n,r){return p(e,t,n,r).map(e=>e.directory)}exports.DOOM_DIR=t.DOOM_DIR,exports.domainCompletionItems=d,exports.domainCompletionPrefix=u,exports.expandDomainNames=l,exports.listDomainNames=c,exports.loadDomains=s,exports.resolvePluginDirectories=m,exports.resolvePluginEntries=p,exports.resolveSharedSkills=f;
2
- //# sourceMappingURL=domains.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/domains.cjs"),t=require("./adapters/layeredConfig.cjs"),n=require("./adapters/pluginCatalog.cjs"),r=require("./adapters/domains.cjs");exports.DOOM_DIR=t.DOOM_DIR,exports.MARKETPLACE_MANIFEST_RELATIVE_PATHS=n.MARKETPLACE_MANIFEST_RELATIVE_PATHS,exports.domainCompletionItems=e.domainCompletionItems,exports.domainCompletionPrefix=e.domainCompletionPrefix,exports.expandDomainNames=e.expandDomainNames,exports.findPluginManifestPath=n.findPluginManifestPath,exports.isRemotePluginSource=n.isRemotePluginSource,exports.listDomainNames=r.listDomainNames,exports.loadDomains=r.loadDomains,exports.pluginDirectoryForSource=n.pluginDirectoryForSource,exports.resolvePluginDirectories=r.resolvePluginDirectories,exports.resolvePluginEntries=r.resolvePluginEntries,exports.resolveSharedSkills=r.resolveSharedSkills;
@@ -1,77 +1,6 @@
1
- import { DOOM_DIR } from "./layeredConfig.cjs";
2
- //#region src/domains.d.ts
3
- /** A plugin entry is a whole plugin dir, or a subset of one. */
4
- type DomainPlugin = string | {
5
- dir: string;
6
- skills?: string[];
7
- agents?: string[];
8
- hooks?: boolean;
9
- mcp?: boolean;
10
- };
11
- interface DomainMcpAllowlist {
12
- /** Server names kept from the repo-level .mcp.json. */
13
- servers?: string[];
14
- /** Upstream server names kept in the agiflow-proxy config. */
15
- proxy?: string[];
16
- }
17
- interface DomainDefinition {
18
- /**
19
- * Plugin directories, each one relative to the config that declares it: the
20
- * repository root for `.doom/domains.yaml`, the global `.doom` directory for
21
- * `~/.pi/.doom/domains.yaml`. The path is written out in full, so a plugin
22
- * does not have to live under `plugins/`.
23
- */
24
- plugins?: DomainPlugin[];
25
- mcp?: DomainMcpAllowlist;
26
- /** Prepend .claude/skills. Defaults to true. */
27
- sharedSkills?: boolean;
28
- }
29
- /** A domain plus the root its plugin paths resolve against. */
30
- interface ResolvedDomain extends DomainDefinition {
31
- baseDirectory: string;
32
- }
33
- interface DomainManifest {
34
- domains: Record<string, ResolvedDomain>;
35
- aliases: Record<string, string[]>;
36
- /** Domains selected when neither flags nor the environment name any. */
37
- defaultDomains?: string[];
38
- }
39
- /**
40
- * Reads domains from the global and repository configs, repository last.
41
- *
42
- * Either file alone is a complete manifest. A repository domain replaces the
43
- * global domain of the same name outright, and a repository defaultDomains
44
- * list replaces the global list when present.
45
- */
46
- declare function loadDomains(repoRoot: string, homeDirectory?: string): DomainManifest;
47
- declare function listDomainNames(repoRoot: string, homeDirectory?: string): string[];
48
- /** Splits comma-joined selections and expands aliases into concrete domain names. */
49
- declare function expandDomainNames(manifest: DomainManifest, domainNames: readonly string[]): string[];
50
- declare function domainCompletionPrefix(textBeforeCursor: string): string | undefined;
51
- declare function domainCompletionItems(domainNames: string[], query: string): Array<{
52
- value: string;
53
- label: string;
54
- }>;
55
- /** A resolved plugin directory plus any subset filter the domain applied. */
56
- interface PluginEntry {
57
- directory: string;
58
- /** Skill names to keep. Omit to keep every skill in the plugin. */
59
- skills?: string[];
60
- /** Agent names to keep. Omit to keep every agent in the plugin. */
61
- agents?: string[];
62
- hooks?: boolean;
63
- mcp?: boolean;
64
- }
65
- /**
66
- * Whether to prepend .claude/skills.
67
- *
68
- * Shared skills are included unless every selected domain opts out, so mixing a
69
- * trimmed domain with an untrimmed one cannot strip the untrimmed one's skills.
70
- */
71
- declare function resolveSharedSkills(repoRoot: string, domainNames: string[], homeDirectory?: string): boolean;
72
- /** Resolves domains to plugin entries, preserving each plugin's subset filter. */
73
- declare function resolvePluginEntries(repoRoot: string, domainNames: string[], explicitDirectories: string[], homeDirectory?: string): PluginEntry[];
74
- declare function resolvePluginDirectories(repoRoot: string, domainNames: string[], explicitDirectories: string[], homeDirectory?: string): string[];
75
- //#endregion
76
- export { DOOM_DIR, DomainDefinition, DomainManifest, DomainMcpAllowlist, DomainPlugin, PluginEntry, ResolvedDomain, domainCompletionItems, domainCompletionPrefix, expandDomainNames, listDomainNames, loadDomains, resolvePluginDirectories, resolvePluginEntries, resolveSharedSkills };
77
- //# sourceMappingURL=domains.d.cts.map
1
+ import { DomainDefinition, DomainManifest, DomainMcpAllowlist, DomainPlugin, GitPluginSource, LocalPluginSource, NpmPluginSource, PluginCatalog, PluginCatalogEntry, PluginEntry, PluginManifestMetadata, PluginSkillDiscovery, PluginSource, ResolvedDomain } from "./types/domains.cjs";
2
+ import { DOOM_DIR } from "./adapters/layeredConfig.cjs";
3
+ import { listDomainNames, loadDomains, resolvePluginDirectories, resolvePluginEntries, resolveSharedSkills } from "./adapters/domains.cjs";
4
+ import { MARKETPLACE_MANIFEST_RELATIVE_PATHS, findPluginManifestPath, isRemotePluginSource, pluginDirectoryForSource } from "./adapters/pluginCatalog.cjs";
5
+ import { domainCompletionItems, domainCompletionPrefix, expandDomainNames } from "./services/domains.cjs";
6
+ export { DOOM_DIR, type DomainDefinition, type DomainManifest, type DomainMcpAllowlist, type DomainPlugin, type GitPluginSource, type LocalPluginSource, MARKETPLACE_MANIFEST_RELATIVE_PATHS, type NpmPluginSource, type PluginCatalog, type PluginCatalogEntry, type PluginEntry, type PluginManifestMetadata, type PluginSkillDiscovery, type PluginSource, type ResolvedDomain, domainCompletionItems, domainCompletionPrefix, expandDomainNames, findPluginManifestPath, isRemotePluginSource, listDomainNames, loadDomains, pluginDirectoryForSource, resolvePluginDirectories, resolvePluginEntries, resolveSharedSkills };