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