@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
package/dist/types.d.cts CHANGED
@@ -1,132 +1,2 @@
1
- //#region src/types.d.ts
2
- declare const DOOM_CONFIG_TYPES: {
3
- readonly ConfigService: symbol;
4
- };
5
- type ProjectTrust = 'ask' | 'always' | 'never';
6
- type PlanningThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
7
- type VoiceEngine = 'auto' | 'whisper-cpp' | 'openai-whisper' | 'mlx-whisper';
8
- type VoiceTtsEngine = 'macos-say';
9
- interface PlanningAgentConfig {
10
- model?: string;
11
- thinking?: PlanningThinkingLevel;
12
- }
13
- interface PlanningModeConfig {
14
- main?: PlanningAgentConfig;
15
- subagents?: PlanningAgentConfig;
16
- plansDirectory?: string;
17
- }
18
- interface EditorConfig {
19
- command?: string;
20
- }
21
- interface VoiceModelConfig {
22
- path?: string;
23
- id?: string;
24
- }
25
- interface VoiceAdapterConfig {
26
- binary?: string;
27
- model: VoiceModelConfig;
28
- }
29
- interface VoiceTtsConfig {
30
- engine: VoiceTtsEngine;
31
- voice?: string;
32
- rate?: number;
33
- }
34
- interface VoiceAutoCaptureConfig {
35
- model: string;
36
- startPhrases?: string[];
37
- stopPhrases?: string[];
38
- tts: VoiceTtsConfig;
39
- }
40
- interface ResolvedVoiceAutoCaptureConfig {
41
- model: string;
42
- startPhrases: string[];
43
- stopPhrases: string[];
44
- tts: VoiceTtsConfig;
45
- }
46
- interface VoiceConfig {
47
- engine?: VoiceEngine;
48
- language?: string;
49
- recorder?: {
50
- binary?: string;
51
- device?: string;
52
- };
53
- adapters?: {
54
- 'whisper-cpp'?: VoiceAdapterConfig;
55
- 'openai-whisper'?: VoiceAdapterConfig;
56
- 'mlx-whisper'?: VoiceAdapterConfig;
57
- };
58
- autoCapture?: VoiceAutoCaptureConfig;
59
- }
60
- interface ResolvedVoiceConfig {
61
- engine: VoiceEngine;
62
- language: string;
63
- recorder: {
64
- binary?: string;
65
- device: string;
66
- };
67
- adapters: NonNullable<VoiceConfig['adapters']>;
68
- autoCapture?: ResolvedVoiceAutoCaptureConfig;
69
- }
70
- /**
71
- * The matrix a repository selects by default.
72
- *
73
- * Read by `doom-pi sync`, which pins it into the generated Pi config so a plain
74
- * `pi` session starts on the same matrix the repository declares. The launcher
75
- * keeps taking its selection from flags and the environment.
76
- */
77
- interface DoomSelectionConfig {
78
- majorMode?: string;
79
- domains?: string[];
80
- profile?: string;
81
- }
82
- interface DoomConfig {
83
- modes?: {
84
- planning?: PlanningModeConfig;
85
- };
86
- projectTrust: ProjectTrust;
87
- editor?: EditorConfig;
88
- voice?: VoiceConfig;
89
- selection?: DoomSelectionConfig;
90
- }
91
- interface PluginHookSource {
92
- pluginRoot: string;
93
- configPath: string;
94
- }
95
- interface HarnessState {
96
- root?: string;
97
- /** The one named major mode this session runs under. */
98
- majorMode: string;
99
- temporaryDirectory?: string;
100
- domains: string[];
101
- /** The layer components the major mode resolved to. */
102
- layers: string[];
103
- profile?: string;
104
- profileEnvironment: Record<string, string>;
105
- hookGroups?: string[];
106
- skillDirectories: string[];
107
- agentDirectories: string[];
108
- additionalDirectories: string[];
109
- childExtensions: string[];
110
- pluginDirectories: string[];
111
- pluginHooks: PluginHookSource[];
112
- mcpConfigPath?: string;
113
- personaFile?: string;
114
- workflowExtension?: string;
115
- allowProtectedWrites: boolean;
116
- hooks: boolean;
117
- agents: boolean;
118
- mcp: boolean;
119
- }
120
- type DeepReadonly<TValue> = TValue extends ((...args: never[]) => unknown) ? TValue : TValue extends readonly (infer TItem)[] ? readonly DeepReadonly<TItem>[] : TValue extends object ? { readonly [TKey in keyof TValue]: DeepReadonly<TValue[TKey]>; } : TValue;
121
- type DoomHarnessContext = DeepReadonly<HarnessState>;
122
- interface DoomConfigContext {
123
- readonly settings: DeepReadonly<DoomConfig>;
124
- readonly harness: DoomHarnessContext;
125
- readonly requiresRelaunch: boolean;
126
- }
127
- interface IDoomConfigService {
128
- load(repoRoot: string, homeDirectory?: string): DoomConfig;
129
- }
130
- //#endregion
131
- export { DOOM_CONFIG_TYPES, DeepReadonly, DoomConfig, DoomConfigContext, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine };
132
- //# sourceMappingURL=types.d.cts.map
1
+ import { DOOM_CONFIG_TYPES, DeepReadonly, DoomConfig, DoomConfigContext, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.cjs";
2
+ export { DOOM_CONFIG_TYPES, type DeepReadonly, type DoomConfig, type DoomConfigContext, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, type HarnessState, type IDoomConfigService, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginHookSource, type ProjectTrust, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine };
package/dist/types.d.mts CHANGED
@@ -1,132 +1,2 @@
1
- //#region src/types.d.ts
2
- declare const DOOM_CONFIG_TYPES: {
3
- readonly ConfigService: symbol;
4
- };
5
- type ProjectTrust = 'ask' | 'always' | 'never';
6
- type PlanningThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
7
- type VoiceEngine = 'auto' | 'whisper-cpp' | 'openai-whisper' | 'mlx-whisper';
8
- type VoiceTtsEngine = 'macos-say';
9
- interface PlanningAgentConfig {
10
- model?: string;
11
- thinking?: PlanningThinkingLevel;
12
- }
13
- interface PlanningModeConfig {
14
- main?: PlanningAgentConfig;
15
- subagents?: PlanningAgentConfig;
16
- plansDirectory?: string;
17
- }
18
- interface EditorConfig {
19
- command?: string;
20
- }
21
- interface VoiceModelConfig {
22
- path?: string;
23
- id?: string;
24
- }
25
- interface VoiceAdapterConfig {
26
- binary?: string;
27
- model: VoiceModelConfig;
28
- }
29
- interface VoiceTtsConfig {
30
- engine: VoiceTtsEngine;
31
- voice?: string;
32
- rate?: number;
33
- }
34
- interface VoiceAutoCaptureConfig {
35
- model: string;
36
- startPhrases?: string[];
37
- stopPhrases?: string[];
38
- tts: VoiceTtsConfig;
39
- }
40
- interface ResolvedVoiceAutoCaptureConfig {
41
- model: string;
42
- startPhrases: string[];
43
- stopPhrases: string[];
44
- tts: VoiceTtsConfig;
45
- }
46
- interface VoiceConfig {
47
- engine?: VoiceEngine;
48
- language?: string;
49
- recorder?: {
50
- binary?: string;
51
- device?: string;
52
- };
53
- adapters?: {
54
- 'whisper-cpp'?: VoiceAdapterConfig;
55
- 'openai-whisper'?: VoiceAdapterConfig;
56
- 'mlx-whisper'?: VoiceAdapterConfig;
57
- };
58
- autoCapture?: VoiceAutoCaptureConfig;
59
- }
60
- interface ResolvedVoiceConfig {
61
- engine: VoiceEngine;
62
- language: string;
63
- recorder: {
64
- binary?: string;
65
- device: string;
66
- };
67
- adapters: NonNullable<VoiceConfig['adapters']>;
68
- autoCapture?: ResolvedVoiceAutoCaptureConfig;
69
- }
70
- /**
71
- * The matrix a repository selects by default.
72
- *
73
- * Read by `doom-pi sync`, which pins it into the generated Pi config so a plain
74
- * `pi` session starts on the same matrix the repository declares. The launcher
75
- * keeps taking its selection from flags and the environment.
76
- */
77
- interface DoomSelectionConfig {
78
- majorMode?: string;
79
- domains?: string[];
80
- profile?: string;
81
- }
82
- interface DoomConfig {
83
- modes?: {
84
- planning?: PlanningModeConfig;
85
- };
86
- projectTrust: ProjectTrust;
87
- editor?: EditorConfig;
88
- voice?: VoiceConfig;
89
- selection?: DoomSelectionConfig;
90
- }
91
- interface PluginHookSource {
92
- pluginRoot: string;
93
- configPath: string;
94
- }
95
- interface HarnessState {
96
- root?: string;
97
- /** The one named major mode this session runs under. */
98
- majorMode: string;
99
- temporaryDirectory?: string;
100
- domains: string[];
101
- /** The layer components the major mode resolved to. */
102
- layers: string[];
103
- profile?: string;
104
- profileEnvironment: Record<string, string>;
105
- hookGroups?: string[];
106
- skillDirectories: string[];
107
- agentDirectories: string[];
108
- additionalDirectories: string[];
109
- childExtensions: string[];
110
- pluginDirectories: string[];
111
- pluginHooks: PluginHookSource[];
112
- mcpConfigPath?: string;
113
- personaFile?: string;
114
- workflowExtension?: string;
115
- allowProtectedWrites: boolean;
116
- hooks: boolean;
117
- agents: boolean;
118
- mcp: boolean;
119
- }
120
- type DeepReadonly<TValue> = TValue extends ((...args: never[]) => unknown) ? TValue : TValue extends readonly (infer TItem)[] ? readonly DeepReadonly<TItem>[] : TValue extends object ? { readonly [TKey in keyof TValue]: DeepReadonly<TValue[TKey]>; } : TValue;
121
- type DoomHarnessContext = DeepReadonly<HarnessState>;
122
- interface DoomConfigContext {
123
- readonly settings: DeepReadonly<DoomConfig>;
124
- readonly harness: DoomHarnessContext;
125
- readonly requiresRelaunch: boolean;
126
- }
127
- interface IDoomConfigService {
128
- load(repoRoot: string, homeDirectory?: string): DoomConfig;
129
- }
130
- //#endregion
131
- export { DOOM_CONFIG_TYPES, DeepReadonly, DoomConfig, DoomConfigContext, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine };
132
- //# sourceMappingURL=types.d.mts.map
1
+ import { DOOM_CONFIG_TYPES, DeepReadonly, DoomConfig, DoomConfigContext, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.mjs";
2
+ export { DOOM_CONFIG_TYPES, type DeepReadonly, type DoomConfig, type DoomConfigContext, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, type HarnessState, type IDoomConfigService, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginHookSource, type ProjectTrust, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine };
package/dist/types.mjs CHANGED
@@ -1,2 +1 @@
1
- const e={ConfigService:Symbol.for(`DoomConfig:ConfigService`)};export{e as DOOM_CONFIG_TYPES};
2
- //# sourceMappingURL=types.mjs.map
1
+ import{DOOM_CONFIG_TYPES as e}from"./types/config.mjs";export{e as DOOM_CONFIG_TYPES};
package/llms.txt ADDED
@@ -0,0 +1,9 @@
1
+ # Doom Pi Config
2
+
3
+ Package-owned guidance for Doom Pi's four configuration files and typed session context.
4
+
5
+ ## Resources
6
+
7
+ - [Package README](./README.md): Loading, precedence, domains, profiles, package layers, and public APIs.
8
+ - [Doom Pi Config skill](./skills/doom-pi-config/SKILL.md): Operational guidance for changing modes, domains, profiles, and runtime settings.
9
+ - [Configuration contract](./skills/doom-pi-config/references/config-contract.md): Authoritative file roles, merge rules, validation boundaries, and verification commands.
package/package.json CHANGED
@@ -1,13 +1,24 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-config",
3
- "version": "0.0.1-alpha.2",
3
+ "version": "0.0.1-alpha.21",
4
4
  "description": "Shared Doom configuration loading and dependency injection",
5
+ "keywords": [
6
+ "ai",
7
+ "coding-agent",
8
+ "developer-tools",
9
+ "doompi",
10
+ "pi-package"
11
+ ],
5
12
  "homepage": "https://agimon.ai",
6
13
  "license": "MIT",
7
14
  "author": "Vuong Ngo",
8
15
  "files": [
9
16
  "dist",
10
- "skills"
17
+ "llms.txt",
18
+ "README.md",
19
+ "skills/doom-pi-config/SKILL.md",
20
+ "skills/doom-pi-config/agents/openai.yaml",
21
+ "skills/doom-pi-config/references/config-contract.md"
11
22
  ],
12
23
  "type": "module",
13
24
  "main": "./dist/index.cjs",
@@ -119,10 +130,11 @@
119
130
  "inversify": "8.2.1",
120
131
  "reflect-metadata": "0.2.2",
121
132
  "yaml": "2.9.0",
122
- "@agimon-ai/doompi-telemetry": "0.0.1-alpha.2"
133
+ "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.21",
134
+ "@agimon-ai/doompi-telemetry": "0.0.1-alpha.21"
123
135
  },
124
136
  "devDependencies": {
125
- "@earendil-works/pi-coding-agent": "0.84.1",
137
+ "@earendil-works/pi-coding-agent": "0.84.2",
126
138
  "@types/node": "26.1.1",
127
139
  "@vitest/coverage-v8": "4.1.10",
128
140
  "tsdown": "0.22.14",
@@ -130,14 +142,14 @@
130
142
  "vitest": "4.1.10"
131
143
  },
132
144
  "peerDependencies": {
133
- "@earendil-works/pi-coding-agent": "0.84.1"
145
+ "@earendil-works/pi-coding-agent": "0.84.2"
134
146
  },
135
147
  "engines": {
136
148
  "node": ">=22.19.0"
137
149
  },
138
150
  "pi": {
139
151
  "extensions": [
140
- "./dist/extensions/pi.mjs"
152
+ "./dist/extensions/doom.mjs"
141
153
  ]
142
154
  },
143
155
  "scripts": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: doom-pi-config
3
- description: Configure and evolve Doom Pi major modes, layers, domains, profiles, and typed session configuration. Use for changes to .doom/modes.yaml, .doom/domains.yaml, .doom/profiles.yaml, .doom/hooks.yaml, their ~/.pi/.doom global counterparts, the @agimon-ai/doompi-config package, matrix switching commands, or requireDoomConfigContext consumers.
3
+ description: Configure and evolve Doom Pi runtime settings, major modes, layers, domains, profiles, and typed session configuration. Use for changes to .doom/config.yaml, .doom/modes.yaml, .doom/domains.yaml, .doom/profiles.yaml, their ~/.pi/.doom global counterparts, the @agimon-ai/doompi-config package, matrix switching commands, or requireDoomConfigContext consumers.
4
4
  ---
5
5
 
6
6
  # Doom Pi Config
@@ -18,8 +18,11 @@ Treat major modes, domains, and profiles as separate axes:
18
18
  3. Consume resolved session state through requireDoomConfigContext(ctx).harness.
19
19
  4. Keep process.env only as the parent-to-child transport and live-switch write boundary.
20
20
  5. After a matrix mutation, append a Doom config selection entry and call ctx.reload().
21
- 6. Write each plugin path in .doom/domains.yaml in full, relative to the config that declares it (repo root, or ~/.pi/.doom for the global copy).
22
- 7. Verify with Doom Config tests, Doom Pi tests, typecheck, ./pi.sh --domains <names> --explain, and an actual session smoke.
21
+ 6. Name plugins once under `plugins.entries`, or add a declaring-source-relative folder under `plugins.roots`; make domains reference catalog names, never path-like `plugins/foo` strings.
22
+ 7. Keep automatic folder discovery to direct-child plugins. Use an explicit entry for a deeper plugin path or a Git/npm source.
23
+ 8. Add declaring-source-relative persona folders under `profiles.roots`; a root is one profile or a direct-child container, never a recursive search.
24
+ 9. Use `profiles.entries` when a profile needs an explicit persona path or string environment defaults; explicit entries override discovery.
25
+ 10. Verify with Doom Config tests, DoomPi tests, typecheck, the built CLI's `--domains <names> --explain`, and an actual session smoke.
23
26
 
24
27
  Never cache resolved configuration at module scope. Context snapshots must be immutable and recreated after reload or session replacement.
25
28
 
@@ -2,12 +2,126 @@
2
2
 
3
3
  ## Sources
4
4
 
5
- - `.doom/modes.yaml` defines layers and the major modes built from them. A layer may contribute extension entry names, package extension specifiers, and hook group IDs. A major mode is a named set of layers, and a session runs under exactly one.
6
- - `.doom/domains.yaml` defines content bundles. A domain may contribute whole plugins or filtered plugin parts, an MCP allowlist, and shared-skill behavior. Aliases expand to domain names. Its optional `defaultDomains` array selects any number of domains when neither flags nor `DOOMPI_DOMAINS` names them.
7
- - `.doom/profiles.yaml` defines personas and environment defaults. Each persona path must remain inside `agents/`.
8
- - Every `.doom` document is read from `~/.pi/.doom/` first and `<repoRoot>/.doom/` second; a repository entry replaces the global one of the same name. Relative paths inside a document resolve against the config that declares it: the repository root, or `~/.pi/.doom` for the global copy.
5
+ - `.doom/config.yaml` defines runtime settings such as project trust, editor integration, planning, and voice behavior.
6
+ - `.doom/modes.yaml` defines layers and the major modes built from them. A layer may contribute extension entry names, package extension specifiers, and hook group IDs. Each major mode has a human-readable `description` and an ordered `layers` array, and a session runs under exactly one mode.
7
+ - `.doom/domains.yaml` defines a named plugin catalog and content bundles. A domain may contribute whole plugins or filtered plugin parts, an MCP allowlist, and shared-skill behavior. Aliases expand to domain names. Its optional `defaultDomains` array selects any number of domains when neither flags nor `DOOMPI_DOMAINS` names them.
8
+ - `.doom/profiles.yaml` defines a named profile catalog. Roots discover persona folders, while explicit entries can attach environment defaults.
9
+ - Each of these four documents is read from `~/.pi/.doom/` first and `<repoRoot>/.doom/` second; a repository entry replaces the global one of the same name. Relative paths inside a document resolve against the config that declares it: the repository root, or `~/.pi/.doom` for the global copy.
9
10
 
10
- Parsing and resolution belong to `@agimon-ai/doompi-config` (`majorModes.ts`), `domains.ts`, and `profiles.ts`. Environment transport belongs to `harnessState.ts`. Pi context integration belongs to `piContext.ts`.
11
+ Parsing and resolution belong to `@agimon-ai/doompi-config` (`config.ts`, `majorModes.ts`, `domains.ts`, and `profiles.ts`). Environment transport belongs to `harnessState.ts`. Pi context integration belongs to `piContext.ts`.
12
+
13
+ ## Major mode definitions
14
+
15
+ `doompi init` emits rich major-mode mappings:
16
+
17
+ ```yaml
18
+ layers:
19
+ guardrails:
20
+ extensions: [repositoryHooks, ./extensions/project-policy.ts]
21
+ team:
22
+ packages: ['@agimon-ai/doompi-team']
23
+ defaultMajorMode: copilot
24
+ majorMode:
25
+ copilot:
26
+ description: General-purpose coding mode with delegation.
27
+ layers: [guardrails, team]
28
+ ```
29
+
30
+ Bare `extensions` values select DoomPi built-ins. Path-like values beginning with `./` or
31
+ `../`, plus absolute paths, load Pi-compatible local scripts or extension directories.
32
+ They resolve from the repository root in project config and from `~/.pi/.doom` in global
33
+ config. Keep npm package specifiers and package-owned configuration under `packages`.
34
+ Path-like `packages` remain supported for compatibility with unpublished Pi packages.
35
+
36
+ Home and repository `layers` and `majorMode` records merge by name. Distinct names from both files remain available; a same-named repository entry replaces the complete home entry. Legacy array entries such as `copilot: [team]` are still accepted and normalized with a generated description, but new configuration should use the rich mapping emitted by `doompi init`.
37
+
38
+ ## Domain plugin catalog
39
+
40
+ ```yaml
41
+ defaultDomains: [default]
42
+ plugins:
43
+ roots: [plugins, ../shared-plugins]
44
+ entries:
45
+ local-tool:
46
+ source: local
47
+ path: vendor/local-tool
48
+ remote-tool:
49
+ source: url
50
+ url: https://github.com/acme/plugin-repository.git
51
+ path: plugins/remote-tool
52
+ ref: main
53
+ # sha: optional immutable commit
54
+ package-tool:
55
+ source: npm
56
+ package: '@acme/package-tool'
57
+ version: 1.2.3
58
+ # registry: https://registry.npmjs.org
59
+
60
+ domains:
61
+ default:
62
+ description: Default repository tools.
63
+ plugins:
64
+ - local-tool
65
+ - name: remote-tool
66
+ skills: [typescript]
67
+ agents: [reviewer]
68
+ hooks: false
69
+ mcp: true
70
+ aliases: {}
71
+ ```
72
+
73
+ A configured root can identify a supported marketplace manifest, one plugin root, or a
74
+ container whose direct-child folders are plugins. Do not recursively discover nested plugin
75
+ folders. The plugin ID is its manifest `name`, falling back to the directory name. A domain
76
+ must use that ID; legacy path-like references such as `plugins/foo` are rejected.
77
+
78
+ DoomPi automatically checks personal and repository Codex marketplace layouts. It does not
79
+ inspect Codex's private cache. Marketplace plugin names are always qualified as
80
+ `plugin@marketplace`; an explicit entry may deliberately override that qualified ID. Invalid
81
+ automatic entries become diagnostics, while malformed explicit entries and unknown domain
82
+ references are fatal.
83
+
84
+ The personal file loads before the repository file. Roots from both layers accumulate in
85
+ source order. Explicit entries, domains, and aliases merge by name, with a repository value
86
+ replacing the personal value. Every relative root and local path remains relative to its own
87
+ declaring file.
88
+
89
+ Git and npm entries are materialized by DoomPi into `~/.pi/.doom/plugin-cache`. Cache identity
90
+ includes the full source descriptor, and an existing cache is reused without refreshing a
91
+ mutable ref or unpinned package. Prefer a Git SHA or exact npm version; change the descriptor
92
+ (or remove its cache directory) to refresh deliberately. `--plugin-dir` stays session-local and
93
+ is not written into the catalog.
94
+
95
+ ## Profile catalog
96
+
97
+ ```yaml
98
+ profiles:
99
+ roots: [agents/acme, ../shared-personas]
100
+ entries:
101
+ writer:
102
+ persona: agents/special/writer
103
+ env:
104
+ BRAND: acme
105
+ TONE: concise
106
+ ```
107
+
108
+ A configured root may itself be a profile, or it may be a container whose direct-child
109
+ directories are profiles. A directory qualifies when it directly contains `profile.md`,
110
+ `SOUL.md`, or `AGENTS.md`. Its directory name becomes the profile name and its discovered
111
+ environment is empty. Discovery does not recurse: use another root or an explicit entry for
112
+ a deeper directory.
113
+
114
+ Home roots are inspected before repository roots and resolve against their declaring config.
115
+ Later roots replace an earlier discovered profile of the same name. Explicit entries override
116
+ discoveries; named entries merge home first and repository last. An explicit persona must be
117
+ relative to its declaring config and stay within either `agents/` or a profile root declared
118
+ in that same file. Persona directory and file symlinks may not escape those boundaries.
119
+
120
+ DoomPi concatenates non-empty `profile.md`, `SOUL.md`, and `AGENTS.md` content in that order.
121
+ Sync freshness includes final discovered profile identities, environment defaults, and persona
122
+ file content. Already exported environment values win over profile defaults. The legacy flat
123
+ form—profile names directly under `profiles`—remains accepted, but new and generated
124
+ configuration should use `profiles.roots` and `profiles.entries`.
11
125
 
12
126
  ## Typed context
13
127
 
@@ -36,8 +150,9 @@ Never mutate `config.harness`. Never cache `readHarnessState()` or resolved mani
36
150
  ## Verification
37
151
 
38
152
  ```sh
39
- pnpm nx test-unit @agimon-ai/doompi-config
153
+ pnpm nx test @agimon-ai/doompi-config
40
154
  pnpm nx typecheck @agimon-ai/doompi-config
41
- pnpm nx test-unit @agimon-ai/doompi
42
- ./pi.sh --domains development --explain
155
+ pnpm nx test @agimon-ai/doompi
156
+ pnpm nx build @agimon-ai/doompi
157
+ pnpm --filter @agimon-ai/doompi exec doompi --domains development --explain
43
158
  ```
@@ -1 +0,0 @@
1
- {"version":3,"file":"atomicJson.cjs","names":["path","randomUUID"],"sources":["../src/atomicJson.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Private atomic JSON writes.\n *\n * Write to a uniquely named temporary file in the destination directory, then\n * rename onto the target. Rename is atomic within a filesystem, so a reader\n * sees either the previous file or the complete new one and never a partial\n * write. The temporary name carries the pid and a random suffix, so two\n * processes writing the same target cannot collide on it.\n *\n * This prevents torn reads. It does NOT prevent lost updates: two writers doing\n * read-modify-write still clobber each other, because the rename only publishes\n * what the caller already computed. Harness state avoids that by giving every\n * process a file it owns rather than by locking.\n *\n * AVOID:\n * - Treating this as a lock\n * - Leaving the temporary file behind when the write fails\n */\n\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst TEMPORARY_SUFFIX = '.tmp';\n\n/** Writes JSON readable by its owner only, replacing the target atomically. */\nexport function writePrivateAtomicJson(filePath: string, value: unknown): void {\n fs.mkdirSync(path.dirname(filePath), { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n const temporaryPath = `${filePath}.${process.pid}.${randomUUID()}${TEMPORARY_SUFFIX}`;\n try {\n fs.writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, { mode: PRIVATE_FILE_MODE });\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n"],"mappings":"0OA4BA,SAAgB,EAAuB,EAAkB,EAAsB,CAC7E,EAAA,QAAG,UAAUA,EAAAA,QAAK,QAAQ,CAAQ,EAAG,CAAE,KAAM,IAAwB,UAAW,EAAK,CAAC,EACtF,IAAM,EAAgB,GAAG,EAAS,GAAG,QAAQ,IAAI,IAAA,EAAGC,EAAAA,WAAAA,CAAW,QAC/D,GAAI,CACF,EAAA,QAAG,cAAc,EAAe,GAAG,KAAK,UAAU,EAAO,KAAM,CAAC,EAAE,IAAK,CAAE,KAAM,GAAkB,CAAC,EAClG,EAAA,QAAG,WAAW,EAAe,CAAQ,CACvC,OAAS,EAAO,CAEd,MADA,EAAA,QAAG,OAAO,EAAe,CAAE,MAAO,EAAK,CAAC,EAClC,CACR,CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"atomicJson.d.cts","names":[],"sources":["../src/atomicJson.ts"],"mappings":";;iBA4BgB,uBAAuB,kBAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"atomicJson.d.mts","names":[],"sources":["../src/atomicJson.ts"],"mappings":";;iBA4BgB,uBAAuB,kBAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"atomicJson.mjs","names":[],"sources":["../src/atomicJson.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Private atomic JSON writes.\n *\n * Write to a uniquely named temporary file in the destination directory, then\n * rename onto the target. Rename is atomic within a filesystem, so a reader\n * sees either the previous file or the complete new one and never a partial\n * write. The temporary name carries the pid and a random suffix, so two\n * processes writing the same target cannot collide on it.\n *\n * This prevents torn reads. It does NOT prevent lost updates: two writers doing\n * read-modify-write still clobber each other, because the rename only publishes\n * what the caller already computed. Harness state avoids that by giving every\n * process a file it owns rather than by locking.\n *\n * AVOID:\n * - Treating this as a lock\n * - Leaving the temporary file behind when the write fails\n */\n\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst TEMPORARY_SUFFIX = '.tmp';\n\n/** Writes JSON readable by its owner only, replacing the target atomically. */\nexport function writePrivateAtomicJson(filePath: string, value: unknown): void {\n fs.mkdirSync(path.dirname(filePath), { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n const temporaryPath = `${filePath}.${process.pid}.${randomUUID()}${TEMPORARY_SUFFIX}`;\n try {\n fs.writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, { mode: PRIVATE_FILE_MODE });\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n"],"mappings":"yFA4BA,SAAgB,EAAuB,EAAkB,EAAsB,CAC7E,EAAG,UAAU,EAAK,QAAQ,CAAQ,EAAG,CAAE,KAAM,IAAwB,UAAW,EAAK,CAAC,EACtF,IAAM,EAAgB,GAAG,EAAS,GAAG,QAAQ,IAAI,GAAG,EAAW,QAC/D,GAAI,CACF,EAAG,cAAc,EAAe,GAAG,KAAK,UAAU,EAAO,KAAM,CAAC,EAAE,IAAK,CAAE,KAAM,GAAkB,CAAC,EAClG,EAAG,WAAW,EAAe,CAAQ,CACvC,OAAS,EAAO,CAEd,MADA,EAAG,OAAO,EAAe,CAAE,MAAO,EAAK,CAAC,EAClC,CACR,CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"piConfig.cjs","names":["fs","os","getAgentDir","path","CONFIG_DIR_NAME"],"sources":["../../src/config/piConfig.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { CONFIG_DIR_NAME, getAgentDir } from '@earendil-works/pi-coding-agent';\nimport type { PiConfig, PiConfigLoadOptions, PiConfigPaths } from './schema.ts';\n\nconst SETTINGS_FILE_NAME = 'settings.json';\nconst LEGACY_CONFIG_DIR_NAME = 'pi';\n\nfunction isObject(value: unknown): value is PiConfig {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction mergeConfig(base: PiConfig, override: PiConfig): PiConfig {\n const result: PiConfig = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = result[key];\n result[key] = isObject(current) && isObject(value) ? mergeConfig(current, value) : value;\n }\n return result;\n}\n\nfunction readConfig(filePath: string): PiConfig {\n if (!fs.existsSync(filePath)) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(filePath, 'utf8'));\n } catch (error) {\n throw new Error(`Could not parse Pi settings at ${filePath}`, { cause: error });\n }\n if (!isObject(parsed)) throw new Error(`Pi settings at ${filePath} must be a JSON object`);\n return parsed;\n}\n\nfunction readConfigPaths(paths: readonly string[]): PiConfig {\n return paths.reduce<PiConfig>((config, filePath) => mergeConfig(config, readConfig(filePath)), {});\n}\n\nfunction projectIsTrusted(value: PiConfigLoadOptions['isProjectTrusted']): boolean {\n return typeof value === 'function' ? value() : value;\n}\n\nexport function piConfigPaths(\n repoRoot: string,\n homeDirectory = os.homedir(),\n agentDirectory = homeDirectory === os.homedir() ? getAgentDir() : path.join(homeDirectory, CONFIG_DIR_NAME, 'agent'),\n): PiConfigPaths {\n return {\n canonicalUser: path.join(agentDirectory, SETTINGS_FILE_NAME),\n canonicalProject: path.join(repoRoot, CONFIG_DIR_NAME, SETTINGS_FILE_NAME),\n legacyUser: [path.join(homeDirectory, CONFIG_DIR_NAME, SETTINGS_FILE_NAME)],\n legacyProject: [path.join(repoRoot, LEGACY_CONFIG_DIR_NAME, SETTINGS_FILE_NAME)],\n };\n}\n\nexport function loadPiConfig(options: PiConfigLoadOptions): PiConfig {\n const paths = piConfigPaths(options.repoRoot, options.homeDirectory);\n const userPaths = [...paths.legacyUser, ...(options.userConfigPaths ?? []), paths.canonicalUser];\n const projectPaths = [...paths.legacyProject, ...(options.projectConfigPaths ?? []), paths.canonicalProject];\n const defaults = options.defaults ?? {};\n const user = readConfigPaths(userPaths);\n const trustedProject = projectIsTrusted(options.isProjectTrusted) ? readConfigPaths(projectPaths) : {};\n return [\n defaults,\n user,\n options.overlay ?? {},\n trustedProject,\n options.environment ?? {},\n options.cli ?? {},\n options.programmatic ?? {},\n ].reduce(mergeConfig, {});\n}\n"],"mappings":"ySAMA,MAAM,EAAqB,gBAG3B,SAAS,EAAS,EAAmC,CACnD,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAS,EAAY,EAAgB,EAA8B,CACjE,IAAM,EAAmB,CAAE,GAAG,CAAK,EACnC,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAQ,EAAG,CACnD,IAAM,EAAU,EAAO,GACvB,EAAO,GAAO,EAAS,CAAO,GAAK,EAAS,CAAK,EAAI,EAAY,EAAS,CAAK,EAAI,CACrF,CACA,OAAO,CACT,CAEA,SAAS,EAAW,EAA4B,CAC9C,GAAI,CAACA,EAAAA,QAAG,WAAW,CAAQ,EAAG,MAAO,CAAC,EACtC,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAMA,EAAAA,QAAG,aAAa,EAAU,MAAM,CAAC,CACvD,OAAS,EAAO,CACd,MAAU,MAAM,kCAAkC,IAAY,CAAE,MAAO,CAAM,CAAC,CAChF,CACA,GAAI,CAAC,EAAS,CAAM,EAAG,MAAU,MAAM,kBAAkB,EAAS,uBAAuB,EACzF,OAAO,CACT,CAEA,SAAS,EAAgB,EAAoC,CAC3D,OAAO,EAAM,QAAkB,EAAQ,IAAa,EAAY,EAAQ,EAAW,CAAQ,CAAC,EAAG,CAAC,CAAC,CACnG,CAEA,SAAS,EAAiB,EAAyD,CACjF,OAAO,OAAO,GAAU,WAAa,EAAM,EAAI,CACjD,CAEA,SAAgB,EACd,EACA,EAAgBC,EAAAA,QAAG,QAAQ,EAC3B,EAAiB,IAAkBA,EAAAA,QAAG,QAAQ,GAAA,EAAIC,EAAAA,YAAAA,CAAY,EAAIC,EAAAA,QAAK,KAAK,EAAeC,EAAAA,gBAAiB,OAAO,EACpG,CACf,MAAO,CACL,cAAeD,EAAAA,QAAK,KAAK,EAAgB,CAAkB,EAC3D,iBAAkBA,EAAAA,QAAK,KAAK,EAAUC,EAAAA,gBAAiB,CAAkB,EACzE,WAAY,CAACD,EAAAA,QAAK,KAAK,EAAeC,EAAAA,gBAAiB,CAAkB,CAAC,EAC1E,cAAe,CAACD,EAAAA,QAAK,KAAK,EAAU,KAAwB,CAAkB,CAAC,CACjF,CACF,CAEA,SAAgB,EAAa,EAAwC,CACnE,IAAM,EAAQ,EAAc,EAAQ,SAAU,EAAQ,aAAa,EAC7D,EAAY,CAAC,GAAG,EAAM,WAAY,GAAI,EAAQ,iBAAmB,CAAC,EAAI,EAAM,aAAa,EACzF,EAAe,CAAC,GAAG,EAAM,cAAe,GAAI,EAAQ,oBAAsB,CAAC,EAAI,EAAM,gBAAgB,EACrG,EAAW,EAAQ,UAAY,CAAC,EAChC,EAAO,EAAgB,CAAS,EAChC,EAAiB,EAAiB,EAAQ,gBAAgB,EAAI,EAAgB,CAAY,EAAI,CAAC,EACrG,MAAO,CACL,EACA,EACA,EAAQ,SAAW,CAAC,EACpB,EACA,EAAQ,aAAe,CAAC,EACxB,EAAQ,KAAO,CAAC,EAChB,EAAQ,cAAgB,CAAC,CAC3B,CAAC,CAAC,OAAO,EAAa,CAAC,CAAC,CAC1B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"piConfig.d.cts","names":[],"sources":["../../src/config/piConfig.ts"],"mappings":";;iBA0CgB,cACd,kBACA,wBACA,0BACC;iBASa,aAAa,SAAS,sBAAsB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"piConfig.d.mts","names":[],"sources":["../../src/config/piConfig.ts"],"mappings":";;iBA0CgB,cACd,kBACA,wBACA,0BACC;iBASa,aAAa,SAAS,sBAAsB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"piConfig.mjs","names":[],"sources":["../../src/config/piConfig.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { CONFIG_DIR_NAME, getAgentDir } from '@earendil-works/pi-coding-agent';\nimport type { PiConfig, PiConfigLoadOptions, PiConfigPaths } from './schema.ts';\n\nconst SETTINGS_FILE_NAME = 'settings.json';\nconst LEGACY_CONFIG_DIR_NAME = 'pi';\n\nfunction isObject(value: unknown): value is PiConfig {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction mergeConfig(base: PiConfig, override: PiConfig): PiConfig {\n const result: PiConfig = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = result[key];\n result[key] = isObject(current) && isObject(value) ? mergeConfig(current, value) : value;\n }\n return result;\n}\n\nfunction readConfig(filePath: string): PiConfig {\n if (!fs.existsSync(filePath)) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(filePath, 'utf8'));\n } catch (error) {\n throw new Error(`Could not parse Pi settings at ${filePath}`, { cause: error });\n }\n if (!isObject(parsed)) throw new Error(`Pi settings at ${filePath} must be a JSON object`);\n return parsed;\n}\n\nfunction readConfigPaths(paths: readonly string[]): PiConfig {\n return paths.reduce<PiConfig>((config, filePath) => mergeConfig(config, readConfig(filePath)), {});\n}\n\nfunction projectIsTrusted(value: PiConfigLoadOptions['isProjectTrusted']): boolean {\n return typeof value === 'function' ? value() : value;\n}\n\nexport function piConfigPaths(\n repoRoot: string,\n homeDirectory = os.homedir(),\n agentDirectory = homeDirectory === os.homedir() ? getAgentDir() : path.join(homeDirectory, CONFIG_DIR_NAME, 'agent'),\n): PiConfigPaths {\n return {\n canonicalUser: path.join(agentDirectory, SETTINGS_FILE_NAME),\n canonicalProject: path.join(repoRoot, CONFIG_DIR_NAME, SETTINGS_FILE_NAME),\n legacyUser: [path.join(homeDirectory, CONFIG_DIR_NAME, SETTINGS_FILE_NAME)],\n legacyProject: [path.join(repoRoot, LEGACY_CONFIG_DIR_NAME, SETTINGS_FILE_NAME)],\n };\n}\n\nexport function loadPiConfig(options: PiConfigLoadOptions): PiConfig {\n const paths = piConfigPaths(options.repoRoot, options.homeDirectory);\n const userPaths = [...paths.legacyUser, ...(options.userConfigPaths ?? []), paths.canonicalUser];\n const projectPaths = [...paths.legacyProject, ...(options.projectConfigPaths ?? []), paths.canonicalProject];\n const defaults = options.defaults ?? {};\n const user = readConfigPaths(userPaths);\n const trustedProject = projectIsTrusted(options.isProjectTrusted) ? readConfigPaths(projectPaths) : {};\n return [\n defaults,\n user,\n options.overlay ?? {},\n trustedProject,\n options.environment ?? {},\n options.cli ?? {},\n options.programmatic ?? {},\n ].reduce(mergeConfig, {});\n}\n"],"mappings":"0JAMA,MAAM,EAAqB,gBAG3B,SAAS,EAAS,EAAmC,CACnD,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAS,EAAY,EAAgB,EAA8B,CACjE,IAAM,EAAmB,CAAE,GAAG,CAAK,EACnC,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAQ,EAAG,CACnD,IAAM,EAAU,EAAO,GACvB,EAAO,GAAO,EAAS,CAAO,GAAK,EAAS,CAAK,EAAI,EAAY,EAAS,CAAK,EAAI,CACrF,CACA,OAAO,CACT,CAEA,SAAS,EAAW,EAA4B,CAC9C,GAAI,CAAC,EAAG,WAAW,CAAQ,EAAG,MAAO,CAAC,EACtC,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAM,EAAG,aAAa,EAAU,MAAM,CAAC,CACvD,OAAS,EAAO,CACd,MAAU,MAAM,kCAAkC,IAAY,CAAE,MAAO,CAAM,CAAC,CAChF,CACA,GAAI,CAAC,EAAS,CAAM,EAAG,MAAU,MAAM,kBAAkB,EAAS,uBAAuB,EACzF,OAAO,CACT,CAEA,SAAS,EAAgB,EAAoC,CAC3D,OAAO,EAAM,QAAkB,EAAQ,IAAa,EAAY,EAAQ,EAAW,CAAQ,CAAC,EAAG,CAAC,CAAC,CACnG,CAEA,SAAS,EAAiB,EAAyD,CACjF,OAAO,OAAO,GAAU,WAAa,EAAM,EAAI,CACjD,CAEA,SAAgB,EACd,EACA,EAAgB,EAAG,QAAQ,EAC3B,EAAiB,IAAkB,EAAG,QAAQ,EAAI,EAAY,EAAI,EAAK,KAAK,EAAe,EAAiB,OAAO,EACpG,CACf,MAAO,CACL,cAAe,EAAK,KAAK,EAAgB,CAAkB,EAC3D,iBAAkB,EAAK,KAAK,EAAU,EAAiB,CAAkB,EACzE,WAAY,CAAC,EAAK,KAAK,EAAe,EAAiB,CAAkB,CAAC,EAC1E,cAAe,CAAC,EAAK,KAAK,EAAU,KAAwB,CAAkB,CAAC,CACjF,CACF,CAEA,SAAgB,EAAa,EAAwC,CACnE,IAAM,EAAQ,EAAc,EAAQ,SAAU,EAAQ,aAAa,EAC7D,EAAY,CAAC,GAAG,EAAM,WAAY,GAAI,EAAQ,iBAAmB,CAAC,EAAI,EAAM,aAAa,EACzF,EAAe,CAAC,GAAG,EAAM,cAAe,GAAI,EAAQ,oBAAsB,CAAC,EAAI,EAAM,gBAAgB,EACrG,EAAW,EAAQ,UAAY,CAAC,EAChC,EAAO,EAAgB,CAAS,EAChC,EAAiB,EAAiB,EAAQ,gBAAgB,EAAI,EAAgB,CAAY,EAAI,CAAC,EACrG,MAAO,CACL,EACA,EACA,EAAQ,SAAW,CAAC,EACpB,EACA,EAAQ,aAAe,CAAC,EACxB,EAAQ,KAAO,CAAC,EAChB,EAAQ,cAAgB,CAAC,CAC3B,CAAC,CAAC,OAAO,EAAa,CAAC,CAAC,CAC1B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.cts","names":[],"sources":["../../src/config/schema.ts"],"mappings":";KAAY,WAAW;UAEN;EACf;;UAGe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA,WAAW;EACX,UAAU;EACV;EACA;EACA,eAAe;EACf,cAAc;EACd,MAAM;EACN;;UAGe;EACf,WAAW;EACX,eAAe;EACf,cAAc;EACd,MAAM;EACN"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.mts","names":[],"sources":["../../src/config/schema.ts"],"mappings":";KAAY,WAAW;UAEN;EACf;;UAGe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA,WAAW;EACX,UAAU;EACV;EACA;EACA,eAAe;EACf,cAAc;EACd,MAAM;EACN;;UAGe;EACf,WAAW;EACX,eAAe;EACf,cAAc;EACd,MAAM;EACN"}