@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.
- package/README.md +139 -14
- package/dist/adapters/atomicJson.cjs +2 -0
- package/dist/adapters/atomicJson.cjs.map +1 -0
- package/dist/adapters/atomicJson.d.cts +6 -0
- package/dist/adapters/atomicJson.d.cts.map +1 -0
- package/dist/adapters/atomicJson.d.mts +6 -0
- package/dist/adapters/atomicJson.d.mts.map +1 -0
- package/dist/adapters/atomicJson.mjs +2 -0
- package/dist/adapters/atomicJson.mjs.map +1 -0
- package/dist/adapters/config.cjs +2 -0
- package/dist/adapters/config.cjs.map +1 -0
- package/dist/adapters/config.d.cts +11 -0
- package/dist/adapters/config.d.cts.map +1 -0
- package/dist/adapters/config.d.mts +11 -0
- package/dist/adapters/config.d.mts.map +1 -0
- package/dist/adapters/config.mjs +2 -0
- package/dist/adapters/config.mjs.map +1 -0
- package/dist/adapters/configWriter.cjs +2 -0
- package/dist/adapters/configWriter.cjs.map +1 -0
- package/dist/adapters/configWriter.d.cts +52 -0
- package/dist/adapters/configWriter.d.cts.map +1 -0
- package/dist/adapters/configWriter.d.mts +52 -0
- package/dist/adapters/configWriter.d.mts.map +1 -0
- package/dist/adapters/configWriter.mjs +2 -0
- package/dist/adapters/configWriter.mjs.map +1 -0
- package/dist/adapters/domains.cjs +2 -0
- package/dist/adapters/domains.cjs.map +1 -0
- package/dist/adapters/domains.d.cts +25 -0
- package/dist/adapters/domains.d.cts.map +1 -0
- package/dist/adapters/domains.d.mts +25 -0
- package/dist/adapters/domains.d.mts.map +1 -0
- package/dist/adapters/domains.mjs +2 -0
- package/dist/adapters/domains.mjs.map +1 -0
- package/dist/adapters/harnessState.cjs +2 -0
- package/dist/adapters/harnessState.cjs.map +1 -0
- package/dist/adapters/harnessState.d.cts +50 -0
- package/dist/adapters/harnessState.d.cts.map +1 -0
- package/dist/adapters/harnessState.d.mts +50 -0
- package/dist/adapters/harnessState.d.mts.map +1 -0
- package/dist/adapters/harnessState.mjs +2 -0
- package/dist/adapters/harnessState.mjs.map +1 -0
- package/dist/adapters/harnessStore.cjs +2 -0
- package/dist/adapters/harnessStore.cjs.map +1 -0
- package/dist/adapters/harnessStore.d.cts +102 -0
- package/dist/adapters/harnessStore.d.cts.map +1 -0
- package/dist/adapters/harnessStore.d.mts +102 -0
- package/dist/adapters/harnessStore.d.mts.map +1 -0
- package/dist/adapters/harnessStore.mjs +2 -0
- package/dist/adapters/harnessStore.mjs.map +1 -0
- package/dist/adapters/init.cjs +178 -0
- package/dist/adapters/init.cjs.map +1 -0
- package/dist/adapters/init.d.cts +39 -0
- package/dist/adapters/init.d.cts.map +1 -0
- package/dist/adapters/init.d.mts +39 -0
- package/dist/adapters/init.d.mts.map +1 -0
- package/dist/adapters/init.mjs +178 -0
- package/dist/adapters/init.mjs.map +1 -0
- package/dist/adapters/layeredConfig.cjs +2 -0
- package/dist/adapters/layeredConfig.cjs.map +1 -0
- package/dist/adapters/layeredConfig.d.cts +49 -0
- package/dist/adapters/layeredConfig.d.cts.map +1 -0
- package/dist/adapters/layeredConfig.d.mts +49 -0
- package/dist/adapters/layeredConfig.d.mts.map +1 -0
- package/dist/adapters/layeredConfig.mjs +2 -0
- package/dist/adapters/layeredConfig.mjs.map +1 -0
- package/dist/adapters/majorModes.cjs +2 -0
- package/dist/adapters/majorModes.cjs.map +1 -0
- package/dist/adapters/majorModes.d.cts +88 -0
- package/dist/adapters/majorModes.d.cts.map +1 -0
- package/dist/adapters/majorModes.d.mts +88 -0
- package/dist/adapters/majorModes.d.mts.map +1 -0
- package/dist/adapters/majorModes.mjs +2 -0
- package/dist/adapters/majorModes.mjs.map +1 -0
- package/dist/adapters/pi/configExtension.cjs +2 -0
- package/dist/adapters/pi/configExtension.cjs.map +1 -0
- package/dist/adapters/pi/configExtension.d.cts +8 -0
- package/dist/adapters/pi/configExtension.d.cts.map +1 -0
- package/dist/adapters/pi/configExtension.d.mts +8 -0
- package/dist/adapters/pi/configExtension.d.mts.map +1 -0
- package/dist/adapters/pi/configExtension.mjs +2 -0
- package/dist/adapters/pi/configExtension.mjs.map +1 -0
- package/dist/adapters/pi/doomConfigExtension.cjs +2 -0
- package/dist/adapters/pi/doomConfigExtension.cjs.map +1 -0
- package/dist/adapters/pi/doomConfigExtension.d.cts +8 -0
- package/dist/adapters/pi/doomConfigExtension.d.cts.map +1 -0
- package/dist/adapters/pi/doomConfigExtension.d.mts +8 -0
- package/dist/adapters/pi/doomConfigExtension.d.mts.map +1 -0
- package/dist/adapters/pi/doomConfigExtension.mjs +2 -0
- package/dist/adapters/pi/doomConfigExtension.mjs.map +1 -0
- package/dist/adapters/pi/helpContribution.cjs +2 -0
- package/dist/adapters/pi/helpContribution.cjs.map +1 -0
- package/dist/adapters/pi/helpContribution.mjs +2 -0
- package/dist/adapters/pi/helpContribution.mjs.map +1 -0
- package/dist/adapters/pi/piContext.cjs +2 -0
- package/dist/adapters/pi/piContext.cjs.map +1 -0
- package/dist/adapters/pi/piContext.d.cts +20 -0
- package/dist/adapters/pi/piContext.d.cts.map +1 -0
- package/dist/adapters/pi/piContext.d.mts +20 -0
- package/dist/adapters/pi/piContext.d.mts.map +1 -0
- package/dist/adapters/pi/piContext.mjs +2 -0
- package/dist/adapters/pi/piContext.mjs.map +1 -0
- package/dist/adapters/piConfig.cjs +2 -0
- package/dist/adapters/piConfig.cjs.map +1 -0
- package/dist/adapters/piConfig.d.cts +8 -0
- package/dist/adapters/piConfig.d.cts.map +1 -0
- package/dist/adapters/piConfig.d.mts +8 -0
- package/dist/adapters/piConfig.d.mts.map +1 -0
- package/dist/adapters/piConfig.mjs +2 -0
- package/dist/adapters/piConfig.mjs.map +1 -0
- package/dist/adapters/pluginCatalog.cjs +2 -0
- package/dist/adapters/pluginCatalog.cjs.map +1 -0
- package/dist/adapters/pluginCatalog.d.cts +12 -0
- package/dist/adapters/pluginCatalog.d.cts.map +1 -0
- package/dist/adapters/pluginCatalog.d.mts +12 -0
- package/dist/adapters/pluginCatalog.d.mts.map +1 -0
- package/dist/adapters/pluginCatalog.mjs +2 -0
- package/dist/adapters/pluginCatalog.mjs.map +1 -0
- package/dist/adapters/profiles.cjs +4 -0
- package/dist/adapters/profiles.cjs.map +1 -0
- package/dist/adapters/profiles.d.cts +36 -0
- package/dist/adapters/profiles.d.cts.map +1 -0
- package/dist/adapters/profiles.d.mts +36 -0
- package/dist/adapters/profiles.d.mts.map +1 -0
- package/dist/adapters/profiles.mjs +4 -0
- package/dist/adapters/profiles.mjs.map +1 -0
- package/dist/atomicJson.cjs +1 -2
- package/dist/atomicJson.d.cts +2 -6
- package/dist/atomicJson.d.mts +2 -6
- package/dist/atomicJson.mjs +1 -2
- package/dist/config/piConfig.cjs +1 -2
- package/dist/config/piConfig.d.cts +2 -7
- package/dist/config/piConfig.d.mts +2 -7
- package/dist/config/piConfig.mjs +1 -2
- package/dist/config/schema.d.cts +2 -33
- package/dist/config/schema.d.mts +2 -33
- package/dist/config.cjs +1 -2
- package/dist/config.d.cts +3 -24
- package/dist/config.d.mts +3 -24
- package/dist/config.mjs +1 -2
- package/dist/configWriter.cjs +1 -2
- package/dist/configWriter.d.cts +2 -52
- package/dist/configWriter.d.mts +2 -52
- package/dist/configWriter.mjs +1 -2
- package/dist/container/doomConfigContainer.cjs +2 -0
- package/dist/container/doomConfigContainer.cjs.map +1 -0
- package/dist/container/doomConfigContainer.d.cts +12 -0
- package/dist/container/doomConfigContainer.d.cts.map +1 -0
- package/dist/container/doomConfigContainer.d.mts +12 -0
- package/dist/container/doomConfigContainer.d.mts.map +1 -0
- package/dist/container/doomConfigContainer.mjs +2 -0
- package/dist/container/doomConfigContainer.mjs.map +1 -0
- package/dist/container.cjs +1 -2
- package/dist/container.d.cts +2 -12
- package/dist/container.d.mts +2 -12
- package/dist/container.mjs +1 -2
- package/dist/domains.cjs +1 -2
- package/dist/domains.d.cts +6 -77
- package/dist/domains.d.mts +6 -77
- package/dist/domains.mjs +1 -2
- package/dist/extensions/doom.cjs +1 -2
- package/dist/extensions/doom.d.cts +2 -8
- package/dist/extensions/doom.d.mts +2 -8
- package/dist/extensions/doom.mjs +1 -2
- package/dist/extensions/pi.cjs +1 -2
- package/dist/extensions/pi.d.cts +2 -8
- package/dist/extensions/pi.d.mts +2 -8
- package/dist/extensions/pi.mjs +1 -2
- package/dist/harnessState.cjs +1 -2
- package/dist/harnessState.d.cts +2 -50
- package/dist/harnessState.d.mts +2 -50
- package/dist/harnessState.mjs +1 -2
- package/dist/harnessStore.cjs +1 -2
- package/dist/harnessStore.d.cts +2 -102
- package/dist/harnessStore.d.mts +2 -102
- package/dist/harnessStore.mjs +1 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +20 -16
- package/dist/index.d.mts +20 -16
- package/dist/index.mjs +1 -1
- package/dist/init.cjs +1 -76
- package/dist/init.d.cts +2 -33
- package/dist/init.d.mts +2 -33
- package/dist/init.mjs +1 -76
- package/dist/layeredConfig.cjs +1 -2
- package/dist/layeredConfig.d.cts +2 -49
- package/dist/layeredConfig.d.mts +2 -49
- package/dist/layeredConfig.mjs +1 -2
- package/dist/majorModes.cjs +1 -2
- package/dist/majorModes.d.cts +2 -75
- package/dist/majorModes.d.mts +2 -75
- package/dist/majorModes.mjs +1 -2
- package/dist/pi.cjs +1 -1
- package/dist/pi.d.cts +1 -1
- package/dist/pi.d.mts +1 -1
- package/dist/pi.mjs +1 -1
- package/dist/piContext.cjs +1 -2
- package/dist/piContext.d.cts +2 -19
- package/dist/piContext.d.mts +2 -19
- package/dist/piContext.mjs +1 -2
- package/dist/profiles.cjs +1 -4
- package/dist/profiles.d.cts +2 -35
- package/dist/profiles.d.mts +2 -35
- package/dist/profiles.mjs +1 -4
- package/dist/schemas/config/schema.d.cts +33 -0
- package/dist/schemas/config/schema.d.cts.map +1 -0
- package/dist/schemas/config/schema.d.mts +33 -0
- package/dist/schemas/config/schema.d.mts.map +1 -0
- package/dist/services/configPolicy.cjs +2 -0
- package/dist/services/configPolicy.cjs.map +1 -0
- package/dist/services/configPolicy.d.cts +19 -0
- package/dist/services/configPolicy.d.cts.map +1 -0
- package/dist/services/configPolicy.d.mts +19 -0
- package/dist/services/configPolicy.d.mts.map +1 -0
- package/dist/services/configPolicy.mjs +2 -0
- package/dist/services/configPolicy.mjs.map +1 -0
- package/dist/services/domains.cjs +2 -0
- package/dist/services/domains.cjs.map +1 -0
- package/dist/services/domains.d.cts +12 -0
- package/dist/services/domains.d.cts.map +1 -0
- package/dist/services/domains.d.mts +12 -0
- package/dist/services/domains.d.mts.map +1 -0
- package/dist/services/domains.mjs +2 -0
- package/dist/services/domains.mjs.map +1 -0
- package/dist/types/config.cjs +2 -0
- package/dist/types/config.cjs.map +1 -0
- package/dist/types/config.d.cts +136 -0
- package/dist/types/config.d.cts.map +1 -0
- package/dist/types/config.d.mts +136 -0
- package/dist/types/config.d.mts.map +1 -0
- package/dist/types/config.mjs +2 -0
- package/dist/types/config.mjs.map +1 -0
- package/dist/types/domains.d.cts +89 -0
- package/dist/types/domains.d.cts.map +1 -0
- package/dist/types/domains.d.mts +89 -0
- package/dist/types/domains.d.mts.map +1 -0
- package/dist/types.cjs +1 -2
- package/dist/types.d.cts +2 -132
- package/dist/types.d.mts +2 -132
- package/dist/types.mjs +1 -2
- package/llms.txt +9 -0
- package/package.json +18 -6
- package/skills/doom-pi-config/SKILL.md +6 -3
- package/skills/doom-pi-config/references/config-contract.md +123 -8
- package/dist/atomicJson.cjs.map +0 -1
- package/dist/atomicJson.d.cts.map +0 -1
- package/dist/atomicJson.d.mts.map +0 -1
- package/dist/atomicJson.mjs.map +0 -1
- package/dist/config/piConfig.cjs.map +0 -1
- package/dist/config/piConfig.d.cts.map +0 -1
- package/dist/config/piConfig.d.mts.map +0 -1
- package/dist/config/piConfig.mjs.map +0 -1
- package/dist/config/schema.d.cts.map +0 -1
- package/dist/config/schema.d.mts.map +0 -1
- package/dist/config.cjs.map +0 -1
- package/dist/config.d.cts.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/config.mjs.map +0 -1
- package/dist/configWriter.cjs.map +0 -1
- package/dist/configWriter.d.cts.map +0 -1
- package/dist/configWriter.d.mts.map +0 -1
- package/dist/configWriter.mjs.map +0 -1
- package/dist/container.cjs.map +0 -1
- package/dist/container.d.cts.map +0 -1
- package/dist/container.d.mts.map +0 -1
- package/dist/container.mjs.map +0 -1
- package/dist/domains.cjs.map +0 -1
- package/dist/domains.d.cts.map +0 -1
- package/dist/domains.d.mts.map +0 -1
- package/dist/domains.mjs.map +0 -1
- package/dist/extensions/doom.cjs.map +0 -1
- package/dist/extensions/doom.d.cts.map +0 -1
- package/dist/extensions/doom.d.mts.map +0 -1
- package/dist/extensions/doom.mjs.map +0 -1
- package/dist/extensions/pi.cjs.map +0 -1
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/pi.d.mts.map +0 -1
- package/dist/extensions/pi.mjs.map +0 -1
- package/dist/harnessState.cjs.map +0 -1
- package/dist/harnessState.d.cts.map +0 -1
- package/dist/harnessState.d.mts.map +0 -1
- package/dist/harnessState.mjs.map +0 -1
- package/dist/harnessStore.cjs.map +0 -1
- package/dist/harnessStore.d.cts.map +0 -1
- package/dist/harnessStore.d.mts.map +0 -1
- package/dist/harnessStore.mjs.map +0 -1
- package/dist/init.cjs.map +0 -1
- package/dist/init.d.cts.map +0 -1
- package/dist/init.d.mts.map +0 -1
- package/dist/init.mjs.map +0 -1
- package/dist/layeredConfig.cjs.map +0 -1
- package/dist/layeredConfig.d.cts.map +0 -1
- package/dist/layeredConfig.d.mts.map +0 -1
- package/dist/layeredConfig.mjs.map +0 -1
- package/dist/majorModes.cjs.map +0 -1
- package/dist/majorModes.d.cts.map +0 -1
- package/dist/majorModes.d.mts.map +0 -1
- package/dist/majorModes.mjs.map +0 -1
- package/dist/piContext.cjs.map +0 -1
- package/dist/piContext.d.cts.map +0 -1
- package/dist/piContext.d.mts.map +0 -1
- package/dist/piContext.mjs.map +0 -1
- package/dist/profiles.cjs.map +0 -1
- package/dist/profiles.d.cts.map +0 -1
- package/dist/profiles.d.mts.map +0 -1
- package/dist/profiles.mjs.map +0 -1
- package/dist/types.cjs.map +0 -1
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts.map +0 -1
- package/dist/types.mjs.map +0 -1
package/dist/types.d.cts
CHANGED
|
@@ -1,132 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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-
|
|
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.
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
22
|
-
7.
|
|
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/
|
|
6
|
-
- `.doom/
|
|
7
|
-
- `.doom/
|
|
8
|
-
-
|
|
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
|
|
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
|
|
153
|
+
pnpm nx test @agimon-ai/doompi-config
|
|
40
154
|
pnpm nx typecheck @agimon-ai/doompi-config
|
|
41
|
-
pnpm nx test
|
|
42
|
-
|
|
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
|
```
|
package/dist/atomicJson.cjs.map
DELETED
|
@@ -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"}
|
package/dist/atomicJson.mjs.map
DELETED
|
@@ -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"}
|