@agimon-ai/po 0.0.0-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 +755 -0
- package/assets/banner.png +0 -0
- package/assets/banner.svg +25 -0
- package/assets/favicon.svg +15 -0
- package/assets/logo-light.png +0 -0
- package/assets/logo-light.svg +25 -0
- package/assets/logo.png +0 -0
- package/assets/logo.svg +25 -0
- package/assets/mascot.png +0 -0
- package/assets/mascot.svg +25 -0
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/antigravity.cjs +5 -0
- package/dist/antigravity.d.mts +2 -0
- package/dist/antigravity.mjs +2 -0
- package/dist/apiContracts.cjs +11 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +52 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +7 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/baseCommand.cjs +3 -0
- package/dist/baseCommand.d.mts +2 -0
- package/dist/baseCommand.mjs +2 -0
- package/dist/bin/cli.cjs +24 -0
- package/dist/bin/cli.cjs.map +1 -0
- package/dist/bin/cli.d.mts +1 -0
- package/dist/bin/cli.mjs +25 -0
- package/dist/bin/cli.mjs.map +1 -0
- package/dist/bin/doomRunner.cjs +33 -0
- package/dist/bin/doomRunner.cjs.map +1 -0
- package/dist/bin/doomRunner.d.mts +4 -0
- package/dist/bin/doomRunner.d.mts.map +1 -0
- package/dist/bin/doomRunner.mjs +32 -0
- package/dist/bin/doomRunner.mjs.map +1 -0
- package/dist/bin/serve.cjs +30 -0
- package/dist/bin/serve.cjs.map +1 -0
- package/dist/bin/serve.d.mts +1 -0
- package/dist/bin/serve.mjs +31 -0
- package/dist/bin/serve.mjs.map +1 -0
- package/dist/builders/cli/extensionAssembler/index.cjs +342 -0
- package/dist/builders/cli/extensionAssembler/index.cjs.map +1 -0
- package/dist/builders/cli/extensionAssembler/index.d.mts +85 -0
- package/dist/builders/cli/extensionAssembler/index.d.mts.map +1 -0
- package/dist/builders/cli/extensionAssembler/index.mjs +335 -0
- package/dist/builders/cli/extensionAssembler/index.mjs.map +1 -0
- package/dist/catalog/index.json +430 -0
- package/dist/cli.cjs +28 -0
- package/dist/cli.d.mts +11 -0
- package/dist/cli.mjs +11 -0
- package/dist/cliApp.cjs +6 -0
- package/dist/cliApp.d.mts +2 -0
- package/dist/cliApp.mjs +2 -0
- package/dist/codex.cjs +8 -0
- package/dist/codex.d.mts +2 -0
- package/dist/codex.mjs +2 -0
- package/dist/commands.cjs +18 -0
- package/dist/commands.d.mts +9 -0
- package/dist/commands.mjs +9 -0
- package/dist/compatibility.cjs +27 -0
- package/dist/compatibility.d.mts +6 -0
- package/dist/compatibility.mjs +6 -0
- package/dist/compatibilityCommand.cjs +4 -0
- package/dist/compatibilityCommand.d.mts +2 -0
- package/dist/compatibilityCommand.mjs +2 -0
- package/dist/compatibilityContext.cjs +3 -0
- package/dist/compatibilityContext.d.mts +2 -0
- package/dist/compatibilityContext.mjs +2 -0
- package/dist/compatibilityOptions.cjs +5 -0
- package/dist/compatibilityOptions.d.mts +2 -0
- package/dist/compatibilityOptions.mjs +2 -0
- package/dist/config.cjs +163 -0
- package/dist/config.d.mts +7 -0
- package/dist/config.mjs +7 -0
- package/dist/doctorCommand.cjs +5 -0
- package/dist/doctorCommand.d.mts +2 -0
- package/dist/doctorCommand.mjs +2 -0
- package/dist/emitMcpCommand.cjs +4 -0
- package/dist/emitMcpCommand.d.mts +2 -0
- package/dist/emitMcpCommand.mjs +2 -0
- package/dist/explainCommand.cjs +5 -0
- package/dist/explainCommand.d.mts +2 -0
- package/dist/explainCommand.mjs +2 -0
- package/dist/extensions/server.cjs +39 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +34 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/harnessContext.cjs +5 -0
- package/dist/harnessContext.d.mts +2 -0
- package/dist/harnessContext.mjs +2 -0
- package/dist/harnessState.cjs +19 -0
- package/dist/harnessState.d.mts +2 -0
- package/dist/harnessState.mjs +2 -0
- package/dist/help.cjs +12 -0
- package/dist/help.d.mts +6 -0
- package/dist/help.mjs +6 -0
- package/dist/index.cjs +306 -0
- package/dist/index.d.mts +40 -0
- package/dist/index.mjs +37 -0
- package/dist/initCommand.cjs +4 -0
- package/dist/initCommand.d.mts +2 -0
- package/dist/initCommand.mjs +2 -0
- package/dist/matrixOptions.cjs +28 -0
- package/dist/matrixOptions.d.mts +2 -0
- package/dist/matrixOptions.mjs +2 -0
- package/dist/matrixSwitcher.cjs +11 -0
- package/dist/matrixSwitcher.d.mts +3 -0
- package/dist/matrixSwitcher.mjs +3 -0
- package/dist/mcpFilter.cjs +9 -0
- package/dist/mcpFilter.d.mts +1 -0
- package/dist/mcpFilter.mjs +2 -0
- package/dist/options.cjs +3 -0
- package/dist/options.d.mts +2 -0
- package/dist/options.mjs +2 -0
- package/dist/process.cjs +12 -0
- package/dist/process.d.mts +2 -0
- package/dist/process.mjs +2 -0
- package/dist/projectTrust.cjs +6 -0
- package/dist/projectTrust.d.mts +2 -0
- package/dist/projectTrust.mjs +2 -0
- package/dist/repository.cjs +5 -0
- package/dist/repository.d.mts +2 -0
- package/dist/repository.mjs +2 -0
- package/dist/resourceCollector.cjs +9 -0
- package/dist/resourceCollector.d.mts +1 -0
- package/dist/resourceCollector.mjs +2 -0
- package/dist/router.cjs +6 -0
- package/dist/router.d.mts +2 -0
- package/dist/router.mjs +2 -0
- package/dist/services.cjs +97 -0
- package/dist/services.d.mts +12 -0
- package/dist/services.mjs +12 -0
- package/dist/shared.cjs +18 -0
- package/dist/shared.d.mts +2 -0
- package/dist/shared.mjs +2 -0
- package/dist/src/bin/agentDirectory.cjs +27 -0
- package/dist/src/bin/agentDirectory.cjs.map +1 -0
- package/dist/src/bin/agentDirectory.mjs +26 -0
- package/dist/src/bin/agentDirectory.mjs.map +1 -0
- package/dist/src/builders/apiContractExport/index.cjs +126 -0
- package/dist/src/builders/apiContractExport/index.cjs.map +1 -0
- package/dist/src/builders/apiContractExport/index.mjs +123 -0
- package/dist/src/builders/apiContractExport/index.mjs.map +1 -0
- package/dist/src/builders/cli/entryResolution.cjs +39 -0
- package/dist/src/builders/cli/entryResolution.cjs.map +1 -0
- package/dist/src/builders/cli/entryResolution.mjs +35 -0
- package/dist/src/builders/cli/entryResolution.mjs.map +1 -0
- package/dist/src/builders/cli/harnessContext.cjs +175 -0
- package/dist/src/builders/cli/harnessContext.cjs.map +1 -0
- package/dist/src/builders/cli/harnessContext.d.mts +48 -0
- package/dist/src/builders/cli/harnessContext.d.mts.map +1 -0
- package/dist/src/builders/cli/harnessContext.mjs +167 -0
- package/dist/src/builders/cli/harnessContext.mjs.map +1 -0
- package/dist/src/builders/cli/sessionComposition.cjs +27 -0
- package/dist/src/builders/cli/sessionComposition.cjs.map +1 -0
- package/dist/src/builders/cli/sessionComposition.mjs +26 -0
- package/dist/src/builders/cli/sessionComposition.mjs.map +1 -0
- package/dist/src/builders/hooks/index.cjs +238 -0
- package/dist/src/builders/hooks/index.cjs.map +1 -0
- package/dist/src/builders/hooks/index.mjs +231 -0
- package/dist/src/builders/hooks/index.mjs.map +1 -0
- package/dist/src/builders/native/index.cjs +176 -0
- package/dist/src/builders/native/index.cjs.map +1 -0
- package/dist/src/builders/native/index.d.mts +36 -0
- package/dist/src/builders/native/index.d.mts.map +1 -0
- package/dist/src/builders/native/index.mjs +170 -0
- package/dist/src/builders/native/index.mjs.map +1 -0
- package/dist/src/builders/server/backgroundSync.cjs +333 -0
- package/dist/src/builders/server/backgroundSync.cjs.map +1 -0
- package/dist/src/builders/server/backgroundSync.mjs +320 -0
- package/dist/src/builders/server/backgroundSync.mjs.map +1 -0
- package/dist/src/builders/server/computerUseBinding.cjs +273 -0
- package/dist/src/builders/server/computerUseBinding.cjs.map +1 -0
- package/dist/src/builders/server/computerUseBinding.mjs +269 -0
- package/dist/src/builders/server/computerUseBinding.mjs.map +1 -0
- package/dist/src/builders/server/computerUseRecordings.cjs +188 -0
- package/dist/src/builders/server/computerUseRecordings.cjs.map +1 -0
- package/dist/src/builders/server/computerUseRecordings.mjs +184 -0
- package/dist/src/builders/server/computerUseRecordings.mjs.map +1 -0
- package/dist/src/builders/server/defaultWorkspace.cjs +38 -0
- package/dist/src/builders/server/defaultWorkspace.cjs.map +1 -0
- package/dist/src/builders/server/defaultWorkspace.mjs +35 -0
- package/dist/src/builders/server/defaultWorkspace.mjs.map +1 -0
- package/dist/src/builders/server/idleRestart.cjs +149 -0
- package/dist/src/builders/server/idleRestart.cjs.map +1 -0
- package/dist/src/builders/server/idleRestart.mjs +136 -0
- package/dist/src/builders/server/idleRestart.mjs.map +1 -0
- package/dist/src/builders/server/index.cjs +63 -0
- package/dist/src/builders/server/index.cjs.map +1 -0
- package/dist/src/builders/server/index.mjs +60 -0
- package/dist/src/builders/server/index.mjs.map +1 -0
- package/dist/src/builders/server/logSink.cjs +57 -0
- package/dist/src/builders/server/logSink.cjs.map +1 -0
- package/dist/src/builders/server/logSink.mjs +57 -0
- package/dist/src/builders/server/logSink.mjs.map +1 -0
- package/dist/src/builders/server/mcpApp.cjs +152 -0
- package/dist/src/builders/server/mcpApp.cjs.map +1 -0
- package/dist/src/builders/server/mcpApp.d.mts +18 -0
- package/dist/src/builders/server/mcpApp.d.mts.map +1 -0
- package/dist/src/builders/server/mcpApp.mjs +147 -0
- package/dist/src/builders/server/mcpApp.mjs.map +1 -0
- package/dist/src/builders/server/mcpAppBuild.cjs +111 -0
- package/dist/src/builders/server/mcpAppBuild.cjs.map +1 -0
- package/dist/src/builders/server/mcpAppBuild.d.mts +24 -0
- package/dist/src/builders/server/mcpAppBuild.d.mts.map +1 -0
- package/dist/src/builders/server/mcpAppBuild.mjs +105 -0
- package/dist/src/builders/server/mcpAppBuild.mjs.map +1 -0
- package/dist/src/builders/server/mcpBundle.cjs +87 -0
- package/dist/src/builders/server/mcpBundle.cjs.map +1 -0
- package/dist/src/builders/server/mcpBundle.d.mts +23 -0
- package/dist/src/builders/server/mcpBundle.d.mts.map +1 -0
- package/dist/src/builders/server/mcpBundle.mjs +84 -0
- package/dist/src/builders/server/mcpBundle.mjs.map +1 -0
- package/dist/src/builders/server/packageReloadCheck.cjs +62 -0
- package/dist/src/builders/server/packageReloadCheck.cjs.map +1 -0
- package/dist/src/builders/server/packageReloadCheck.mjs +61 -0
- package/dist/src/builders/server/packageReloadCheck.mjs.map +1 -0
- package/dist/src/builders/server/packageUrl.cjs +210 -0
- package/dist/src/builders/server/packageUrl.cjs.map +1 -0
- package/dist/src/builders/server/packageUrl.mjs +203 -0
- package/dist/src/builders/server/packageUrl.mjs.map +1 -0
- package/dist/src/builders/server/runtime.cjs +1428 -0
- package/dist/src/builders/server/runtime.cjs.map +1 -0
- package/dist/src/builders/server/runtime.mjs +1420 -0
- package/dist/src/builders/server/runtime.mjs.map +1 -0
- package/dist/src/builders/server/runtimeResources.cjs +72 -0
- package/dist/src/builders/server/runtimeResources.cjs.map +1 -0
- package/dist/src/builders/server/runtimeResources.mjs +71 -0
- package/dist/src/builders/server/runtimeResources.mjs.map +1 -0
- package/dist/src/builders/server/selectionStatus.cjs +12 -0
- package/dist/src/builders/server/selectionStatus.cjs.map +1 -0
- package/dist/src/builders/server/selectionStatus.mjs +12 -0
- package/dist/src/builders/server/selectionStatus.mjs.map +1 -0
- package/dist/src/builders/server/sessionArguments.cjs +63 -0
- package/dist/src/builders/server/sessionArguments.cjs.map +1 -0
- package/dist/src/builders/server/sessionArguments.mjs +62 -0
- package/dist/src/builders/server/sessionArguments.mjs.map +1 -0
- package/dist/src/builders/server/shutdown.cjs +16 -0
- package/dist/src/builders/server/shutdown.cjs.map +1 -0
- package/dist/src/builders/server/shutdown.mjs +16 -0
- package/dist/src/builders/server/shutdown.mjs.map +1 -0
- package/dist/src/builders/server/webTemplateDecision.cjs +34 -0
- package/dist/src/builders/server/webTemplateDecision.cjs.map +1 -0
- package/dist/src/builders/server/webTemplateDecision.mjs +32 -0
- package/dist/src/builders/server/webTemplateDecision.mjs.map +1 -0
- package/dist/src/builders/server/workspaceCheckout.cjs +31 -0
- package/dist/src/builders/server/workspaceCheckout.cjs.map +1 -0
- package/dist/src/builders/server/workspaceCheckout.mjs +29 -0
- package/dist/src/builders/server/workspaceCheckout.mjs.map +1 -0
- package/dist/src/builders/web/bundle.cjs +225 -0
- package/dist/src/builders/web/bundle.cjs.map +1 -0
- package/dist/src/builders/web/bundle.d.mts +65 -0
- package/dist/src/builders/web/bundle.d.mts.map +1 -0
- package/dist/src/builders/web/bundle.mjs +221 -0
- package/dist/src/builders/web/bundle.mjs.map +1 -0
- package/dist/src/builders/web/bundleAssetPolicy.cjs +96 -0
- package/dist/src/builders/web/bundleAssetPolicy.cjs.map +1 -0
- package/dist/src/builders/web/bundleAssetPolicy.d.mts +22 -0
- package/dist/src/builders/web/bundleAssetPolicy.d.mts.map +1 -0
- package/dist/src/builders/web/bundleAssetPolicy.mjs +95 -0
- package/dist/src/builders/web/bundleAssetPolicy.mjs.map +1 -0
- package/dist/src/builders/web/index.cjs +361 -0
- package/dist/src/builders/web/index.cjs.map +1 -0
- package/dist/src/builders/web/index.d.mts +109 -0
- package/dist/src/builders/web/index.d.mts.map +1 -0
- package/dist/src/builders/web/index.mjs +342 -0
- package/dist/src/builders/web/index.mjs.map +1 -0
- package/dist/src/builders/web/webDevRoots.cjs +27 -0
- package/dist/src/builders/web/webDevRoots.cjs.map +1 -0
- package/dist/src/builders/web/webDevRoots.d.mts +22 -0
- package/dist/src/builders/web/webDevRoots.d.mts.map +1 -0
- package/dist/src/builders/web/webDevRoots.mjs +25 -0
- package/dist/src/builders/web/webDevRoots.mjs.map +1 -0
- package/dist/src/builders/web/webPluginGenerate.cjs +188 -0
- package/dist/src/builders/web/webPluginGenerate.cjs.map +1 -0
- package/dist/src/builders/web/webPluginGenerate.d.mts +56 -0
- package/dist/src/builders/web/webPluginGenerate.d.mts.map +1 -0
- package/dist/src/builders/web/webPluginGenerate.mjs +178 -0
- package/dist/src/builders/web/webPluginGenerate.mjs.map +1 -0
- package/dist/src/builders/web/webPluginManifest.cjs +128 -0
- package/dist/src/builders/web/webPluginManifest.cjs.map +1 -0
- package/dist/src/builders/web/webPluginManifest.d.mts +64 -0
- package/dist/src/builders/web/webPluginManifest.d.mts.map +1 -0
- package/dist/src/builders/web/webPluginManifest.mjs +118 -0
- package/dist/src/builders/web/webPluginManifest.mjs.map +1 -0
- package/dist/src/builders/web/webPluginScan.cjs +57 -0
- package/dist/src/builders/web/webPluginScan.cjs.map +1 -0
- package/dist/src/builders/web/webPluginScan.d.mts +19 -0
- package/dist/src/builders/web/webPluginScan.d.mts.map +1 -0
- package/dist/src/builders/web/webPluginScan.mjs +54 -0
- package/dist/src/builders/web/webPluginScan.mjs.map +1 -0
- package/dist/src/builders/web/webPluginVite.cjs +255 -0
- package/dist/src/builders/web/webPluginVite.cjs.map +1 -0
- package/dist/src/builders/web/webPluginVite.d.mts +64 -0
- package/dist/src/builders/web/webPluginVite.d.mts.map +1 -0
- package/dist/src/builders/web/webPluginVite.mjs +242 -0
- package/dist/src/builders/web/webPluginVite.mjs.map +1 -0
- package/dist/src/cli/cliApp.cjs +187 -0
- package/dist/src/cli/cliApp.cjs.map +1 -0
- package/dist/src/cli/cliApp.d.mts +32 -0
- package/dist/src/cli/cliApp.d.mts.map +1 -0
- package/dist/src/cli/cliApp.mjs +184 -0
- package/dist/src/cli/cliApp.mjs.map +1 -0
- package/dist/src/cli/commands/api-export/index.cjs +66 -0
- package/dist/src/cli/commands/api-export/index.cjs.map +1 -0
- package/dist/src/cli/commands/api-export/index.mjs +62 -0
- package/dist/src/cli/commands/api-export/index.mjs.map +1 -0
- package/dist/src/cli/commands/baseCommand.cjs +16 -0
- package/dist/src/cli/commands/baseCommand.cjs.map +1 -0
- package/dist/src/cli/commands/baseCommand.d.mts +24 -0
- package/dist/src/cli/commands/baseCommand.d.mts.map +1 -0
- package/dist/src/cli/commands/baseCommand.mjs +16 -0
- package/dist/src/cli/commands/baseCommand.mjs.map +1 -0
- package/dist/src/cli/commands/compat/context.cjs +115 -0
- package/dist/src/cli/commands/compat/context.cjs.map +1 -0
- package/dist/src/cli/commands/compat/context.d.mts +22 -0
- package/dist/src/cli/commands/compat/context.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/context.mjs +110 -0
- package/dist/src/cli/commands/compat/context.mjs.map +1 -0
- package/dist/src/cli/commands/compat/help.cjs +26 -0
- package/dist/src/cli/commands/compat/help.cjs.map +1 -0
- package/dist/src/cli/commands/compat/help.d.mts +4 -0
- package/dist/src/cli/commands/compat/help.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/help.mjs +25 -0
- package/dist/src/cli/commands/compat/help.mjs.map +1 -0
- package/dist/src/cli/commands/compat/index.cjs +73 -0
- package/dist/src/cli/commands/compat/index.cjs.map +1 -0
- package/dist/src/cli/commands/compat/index.d.mts +14 -0
- package/dist/src/cli/commands/compat/index.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/index.mjs +70 -0
- package/dist/src/cli/commands/compat/index.mjs.map +1 -0
- package/dist/src/cli/commands/compat/options.cjs +88 -0
- package/dist/src/cli/commands/compat/options.cjs.map +1 -0
- package/dist/src/cli/commands/compat/options.d.mts +15 -0
- package/dist/src/cli/commands/compat/options.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/options.mjs +86 -0
- package/dist/src/cli/commands/compat/options.mjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/antigravity.cjs +294 -0
- package/dist/src/cli/commands/compat/providers/antigravity.cjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/antigravity.d.mts +9 -0
- package/dist/src/cli/commands/compat/providers/antigravity.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/providers/antigravity.mjs +289 -0
- package/dist/src/cli/commands/compat/providers/antigravity.mjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/codex.cjs +178 -0
- package/dist/src/cli/commands/compat/providers/codex.cjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/codex.d.mts +17 -0
- package/dist/src/cli/commands/compat/providers/codex.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/providers/codex.mjs +170 -0
- package/dist/src/cli/commands/compat/providers/codex.mjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/index.cjs +65 -0
- package/dist/src/cli/commands/compat/providers/index.cjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/index.d.mts +15 -0
- package/dist/src/cli/commands/compat/providers/index.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/providers/index.mjs +45 -0
- package/dist/src/cli/commands/compat/providers/index.mjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/process.cjs +172 -0
- package/dist/src/cli/commands/compat/providers/process.cjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/process.d.mts +33 -0
- package/dist/src/cli/commands/compat/providers/process.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/providers/process.mjs +159 -0
- package/dist/src/cli/commands/compat/providers/process.mjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/shared.cjs +76 -0
- package/dist/src/cli/commands/compat/providers/shared.cjs.map +1 -0
- package/dist/src/cli/commands/compat/providers/shared.d.mts +40 -0
- package/dist/src/cli/commands/compat/providers/shared.d.mts.map +1 -0
- package/dist/src/cli/commands/compat/providers/shared.mjs +61 -0
- package/dist/src/cli/commands/compat/providers/shared.mjs.map +1 -0
- package/dist/src/cli/commands/compat/types.d.mts +31 -0
- package/dist/src/cli/commands/compat/types.d.mts.map +1 -0
- package/dist/src/cli/commands/doctor/help.cjs +19 -0
- package/dist/src/cli/commands/doctor/help.cjs.map +1 -0
- package/dist/src/cli/commands/doctor/help.d.mts +4 -0
- package/dist/src/cli/commands/doctor/help.d.mts.map +1 -0
- package/dist/src/cli/commands/doctor/help.mjs +19 -0
- package/dist/src/cli/commands/doctor/help.mjs.map +1 -0
- package/dist/src/cli/commands/doctor/index.cjs +118 -0
- package/dist/src/cli/commands/doctor/index.cjs.map +1 -0
- package/dist/src/cli/commands/doctor/index.d.mts +33 -0
- package/dist/src/cli/commands/doctor/index.d.mts.map +1 -0
- package/dist/src/cli/commands/doctor/index.mjs +113 -0
- package/dist/src/cli/commands/doctor/index.mjs.map +1 -0
- package/dist/src/cli/commands/emit-mcp/index.cjs +32 -0
- package/dist/src/cli/commands/emit-mcp/index.cjs.map +1 -0
- package/dist/src/cli/commands/emit-mcp/index.d.mts +19 -0
- package/dist/src/cli/commands/emit-mcp/index.d.mts.map +1 -0
- package/dist/src/cli/commands/emit-mcp/index.mjs +31 -0
- package/dist/src/cli/commands/emit-mcp/index.mjs.map +1 -0
- package/dist/src/cli/commands/explain/index.cjs +155 -0
- package/dist/src/cli/commands/explain/index.cjs.map +1 -0
- package/dist/src/cli/commands/explain/index.d.mts +57 -0
- package/dist/src/cli/commands/explain/index.d.mts.map +1 -0
- package/dist/src/cli/commands/explain/index.mjs +150 -0
- package/dist/src/cli/commands/explain/index.mjs.map +1 -0
- package/dist/src/cli/commands/init/constants.cjs +11 -0
- package/dist/src/cli/commands/init/constants.cjs.map +1 -0
- package/dist/src/cli/commands/init/constants.mjs +11 -0
- package/dist/src/cli/commands/init/constants.mjs.map +1 -0
- package/dist/src/cli/commands/init/help.cjs +17 -0
- package/dist/src/cli/commands/init/help.cjs.map +1 -0
- package/dist/src/cli/commands/init/help.d.mts +4 -0
- package/dist/src/cli/commands/init/help.d.mts.map +1 -0
- package/dist/src/cli/commands/init/help.mjs +17 -0
- package/dist/src/cli/commands/init/help.mjs.map +1 -0
- package/dist/src/cli/commands/init/index.cjs +67 -0
- package/dist/src/cli/commands/init/index.cjs.map +1 -0
- package/dist/src/cli/commands/init/index.d.mts +12 -0
- package/dist/src/cli/commands/init/index.d.mts.map +1 -0
- package/dist/src/cli/commands/init/index.mjs +63 -0
- package/dist/src/cli/commands/init/index.mjs.map +1 -0
- package/dist/src/cli/commands/init/presenter.cjs +140 -0
- package/dist/src/cli/commands/init/presenter.cjs.map +1 -0
- package/dist/src/cli/commands/init/presenter.d.mts +8 -0
- package/dist/src/cli/commands/init/presenter.d.mts.map +1 -0
- package/dist/src/cli/commands/init/presenter.mjs +140 -0
- package/dist/src/cli/commands/init/presenter.mjs.map +1 -0
- package/dist/src/cli/commands/sync/help.cjs +34 -0
- package/dist/src/cli/commands/sync/help.cjs.map +1 -0
- package/dist/src/cli/commands/sync/help.d.mts +4 -0
- package/dist/src/cli/commands/sync/help.d.mts.map +1 -0
- package/dist/src/cli/commands/sync/help.mjs +34 -0
- package/dist/src/cli/commands/sync/help.mjs.map +1 -0
- package/dist/src/cli/commands/sync/index.cjs +215 -0
- package/dist/src/cli/commands/sync/index.cjs.map +1 -0
- package/dist/src/cli/commands/sync/index.d.mts +20 -0
- package/dist/src/cli/commands/sync/index.d.mts.map +1 -0
- package/dist/src/cli/commands/sync/index.mjs +206 -0
- package/dist/src/cli/commands/sync/index.mjs.map +1 -0
- package/dist/src/cli/commands/sync/presenter.cjs +58 -0
- package/dist/src/cli/commands/sync/presenter.cjs.map +1 -0
- package/dist/src/cli/commands/sync/presenter.d.mts +16 -0
- package/dist/src/cli/commands/sync/presenter.d.mts.map +1 -0
- package/dist/src/cli/commands/sync/presenter.mjs +57 -0
- package/dist/src/cli/commands/sync/presenter.mjs.map +1 -0
- package/dist/src/cli/commands/sync/workflow.cjs +16 -0
- package/dist/src/cli/commands/sync/workflow.cjs.map +1 -0
- package/dist/src/cli/commands/sync/workflow.mjs +16 -0
- package/dist/src/cli/commands/sync/workflow.mjs.map +1 -0
- package/dist/src/cli/commands/web/index.cjs +88 -0
- package/dist/src/cli/commands/web/index.cjs.map +1 -0
- package/dist/src/cli/commands/web/index.mjs +85 -0
- package/dist/src/cli/commands/web/index.mjs.map +1 -0
- package/dist/src/cli/harnessOptions.cjs +70 -0
- package/dist/src/cli/harnessOptions.cjs.map +1 -0
- package/dist/src/cli/harnessOptions.d.mts +26 -0
- package/dist/src/cli/harnessOptions.d.mts.map +1 -0
- package/dist/src/cli/harnessOptions.mjs +66 -0
- package/dist/src/cli/harnessOptions.mjs.map +1 -0
- package/dist/src/cli/help.cjs +82 -0
- package/dist/src/cli/help.cjs.map +1 -0
- package/dist/src/cli/help.d.mts +10 -0
- package/dist/src/cli/help.d.mts.map +1 -0
- package/dist/src/cli/help.mjs +78 -0
- package/dist/src/cli/help.mjs.map +1 -0
- package/dist/src/cli/matrixOptions.cjs +178 -0
- package/dist/src/cli/matrixOptions.cjs.map +1 -0
- package/dist/src/cli/matrixOptions.d.mts +90 -0
- package/dist/src/cli/matrixOptions.d.mts.map +1 -0
- package/dist/src/cli/matrixOptions.mjs +151 -0
- package/dist/src/cli/matrixOptions.mjs.map +1 -0
- package/dist/src/cli/options.cjs +281 -0
- package/dist/src/cli/options.cjs.map +1 -0
- package/dist/src/cli/options.d.mts +5 -0
- package/dist/src/cli/options.d.mts.map +1 -0
- package/dist/src/cli/options.mjs +279 -0
- package/dist/src/cli/options.mjs.map +1 -0
- package/dist/src/cli/router.cjs +57 -0
- package/dist/src/cli/router.cjs.map +1 -0
- package/dist/src/cli/router.d.mts +32 -0
- package/dist/src/cli/router.d.mts.map +1 -0
- package/dist/src/cli/router.mjs +54 -0
- package/dist/src/cli/router.mjs.map +1 -0
- package/dist/src/cli/server/options.cjs +71 -0
- package/dist/src/cli/server/options.cjs.map +1 -0
- package/dist/src/cli/server/options.mjs +70 -0
- package/dist/src/cli/server/options.mjs.map +1 -0
- package/dist/src/cli/server/processGuards.cjs +83 -0
- package/dist/src/cli/server/processGuards.cjs.map +1 -0
- package/dist/src/cli/server/processGuards.mjs +79 -0
- package/dist/src/cli/server/processGuards.mjs.map +1 -0
- package/dist/src/cli/server/run.cjs +69 -0
- package/dist/src/cli/server/run.cjs.map +1 -0
- package/dist/src/cli/server/run.mjs +66 -0
- package/dist/src/cli/server/run.mjs.map +1 -0
- package/dist/src/composition/harnessState/index.cjs +48 -0
- package/dist/src/composition/harnessState/index.cjs.map +1 -0
- package/dist/src/composition/harnessState/index.d.mts +19 -0
- package/dist/src/composition/harnessState/index.d.mts.map +1 -0
- package/dist/src/composition/harnessState/index.mjs +34 -0
- package/dist/src/composition/harnessState/index.mjs.map +1 -0
- package/dist/src/composition/layerPackageInstaller/index.cjs +651 -0
- package/dist/src/composition/layerPackageInstaller/index.cjs.map +1 -0
- package/dist/src/composition/layerPackageInstaller/index.d.mts +74 -0
- package/dist/src/composition/layerPackageInstaller/index.d.mts.map +1 -0
- package/dist/src/composition/layerPackageInstaller/index.mjs +637 -0
- package/dist/src/composition/layerPackageInstaller/index.mjs.map +1 -0
- package/dist/src/composition/poHomeMigration/index.cjs +234 -0
- package/dist/src/composition/poHomeMigration/index.cjs.map +1 -0
- package/dist/src/composition/poHomeMigration/index.d.mts +12 -0
- package/dist/src/composition/poHomeMigration/index.d.mts.map +1 -0
- package/dist/src/composition/poHomeMigration/index.mjs +226 -0
- package/dist/src/composition/poHomeMigration/index.mjs.map +1 -0
- package/dist/src/composition/projectTrust/index.cjs +51 -0
- package/dist/src/composition/projectTrust/index.cjs.map +1 -0
- package/dist/src/composition/projectTrust/index.d.mts +22 -0
- package/dist/src/composition/projectTrust/index.d.mts.map +1 -0
- package/dist/src/composition/projectTrust/index.mjs +48 -0
- package/dist/src/composition/projectTrust/index.mjs.map +1 -0
- package/dist/src/composition/repository/index.cjs +68 -0
- package/dist/src/composition/repository/index.cjs.map +1 -0
- package/dist/src/composition/repository/index.d.mts +22 -0
- package/dist/src/composition/repository/index.d.mts.map +1 -0
- package/dist/src/composition/repository/index.mjs +63 -0
- package/dist/src/composition/repository/index.mjs.map +1 -0
- package/dist/src/composition/syncPrune/index.cjs +85 -0
- package/dist/src/composition/syncPrune/index.cjs.map +1 -0
- package/dist/src/composition/syncPrune/index.d.mts +33 -0
- package/dist/src/composition/syncPrune/index.d.mts.map +1 -0
- package/dist/src/composition/syncPrune/index.mjs +82 -0
- package/dist/src/composition/syncPrune/index.mjs.map +1 -0
- package/dist/src/composition/syncService/index.cjs +808 -0
- package/dist/src/composition/syncService/index.cjs.map +1 -0
- package/dist/src/composition/syncService/index.d.mts +65 -0
- package/dist/src/composition/syncService/index.d.mts.map +1 -0
- package/dist/src/composition/syncService/index.mjs +792 -0
- package/dist/src/composition/syncService/index.mjs.map +1 -0
- package/dist/src/composition/syncService/localBuilds.cjs +367 -0
- package/dist/src/composition/syncService/localBuilds.cjs.map +1 -0
- package/dist/src/composition/syncService/localBuilds.mjs +358 -0
- package/dist/src/composition/syncService/localBuilds.mjs.map +1 -0
- package/dist/src/composition/transitionLayers.cjs +17 -0
- package/dist/src/composition/transitionLayers.cjs.map +1 -0
- package/dist/src/composition/transitionLayers.d.mts +6 -0
- package/dist/src/composition/transitionLayers.d.mts.map +1 -0
- package/dist/src/composition/transitionLayers.mjs +16 -0
- package/dist/src/composition/transitionLayers.mjs.map +1 -0
- package/dist/src/composition/types/harness.d.mts +52 -0
- package/dist/src/composition/types/harness.d.mts.map +1 -0
- package/dist/src/extensions/setupDiagnostics.cjs +65 -0
- package/dist/src/extensions/setupDiagnostics.cjs.map +1 -0
- package/dist/src/extensions/setupDiagnostics.mjs +64 -0
- package/dist/src/extensions/setupDiagnostics.mjs.map +1 -0
- package/dist/utils.cjs +4 -0
- package/dist/utils.d.mts +2 -0
- package/dist/utils.mjs +2 -0
- package/dist/webBuilder.cjs +59 -0
- package/dist/webBuilder.d.mts +9 -0
- package/dist/webBuilder.mjs +9 -0
- package/docs/server/api-export.md +86 -0
- package/docs/server/api.md +144 -0
- package/docs/server/getting-started.md +114 -0
- package/docs/server/index.md +67 -0
- package/docs/server/ipc.md +97 -0
- package/docs/server/lifecycle.md +108 -0
- package/docs/server/security.md +101 -0
- package/llms.txt +12 -0
- package/package.json +295 -0
- package/src/prompts/po-author-extension/SKILL.md +35 -0
- package/src/prompts/po-author-extension/references/extension-contract.md +134 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["os","globalDoomConfigDirectory","path","resolveDoomConfigurationRoot","HARNESS_STATE_POINTER","PO_MAJOR_MODE_ENV","PO_DOMAINS_ENV","PO_PROFILE_ENV","SyncProgress","formatSyncResult","loadMajorModesConfigLenient","missingLayerPackageSpecifiers","createLayerResolvers","globalWebPluginRoots","readGlobalWebBuildStatus","readGlobalNativeBuildStatus","loadDoomConfigLenient","runSyncService","syncParentPid","syncExitCode"],"sources":["../../../../../src/cli/commands/sync/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { globalDoomConfigDirectory } from '@agimon-ai/po-config/config';\nimport { loadMajorModesConfigLenient } from '@agimon-ai/po-config/majorModes';\nimport type { ConfigDiagnostic } from '@agimon-ai/po-config/types';\n\nimport { createLayerResolvers } from '../../../builders/cli/extensionAssembler';\nimport { readGlobalNativeBuildStatus } from '../../../builders/native';\nimport { syncParentPid } from '../../../builders/server/backgroundSync';\nimport { readGlobalWebBuildStatus } from '../../../builders/web';\nimport { HARNESS_STATE_POINTER } from '../../../composition/harnessState';\nimport { missingLayerPackageSpecifiers } from '../../../composition/layerPackageInstaller';\nimport { loadDoomConfigLenient } from '../../../composition/projectTrust';\nimport { resolveDoomConfigurationRoot } from '../../../composition/repository';\nimport {\n formatSyncResult,\n globalWebPluginRoots,\n runSync as runSyncService,\n type SyncDeps,\n type SyncEvent,\n syncExitCode,\n} from '../../../composition/syncService';\nimport { PO_DOMAINS_ENV, PO_MAJOR_MODE_ENV, PO_PROFILE_ENV } from '../../matrixOptions';\nimport { SyncProgress, type SyncProgressOutput, type SyncStepDone } from './presenter';\n\n/**\n * `po sync`: install what every root's configuration names and ensure the global builds.\n *\n * The roots are the Po home, every registered workspace and the current repository, which\n * sync registers unless `--global` is given. The server composes every session live from\n * configuration and installed packages, so sync only makes sure the packages are there\n * and the one global web build (and the MCP app build) for the current plugin set exists.\n * Then, when no other Po host runs, it prunes old builds and the package store.\n */\n\nconst SYNC_COMMAND = 'sync';\nconst CHECK_OPTION = '--check';\nconst GLOBAL_OPTION = '--global';\nconst JSON_OPTION = '--json';\nconst SYNC_OPTIONS = new Set([CHECK_OPTION, GLOBAL_OPTION, JSON_OPTION]);\nconst HARNESS_ROOT_ENV = 'PO_ROOT';\nconst PRIVATE_DIRECTORY_MODE = 0o700;\n\nexport interface SyncRoots {\n globalOnly: boolean;\n globalRoot: string;\n sourceRoot: string;\n targetRoot: string;\n}\n\n/** Resolves the configuration source and the root whose packages are installed. */\nexport function resolveSyncRoots(\n args: readonly string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n homeDirectory = environment.HOME ?? os.homedir(),\n): SyncRoots {\n const globalRoot = globalDoomConfigDirectory(homeDirectory);\n const inheritedRoot = environment[HARNESS_ROOT_ENV];\n const sourceRoot = inheritedRoot\n ? path.resolve(inheritedRoot)\n : resolveDoomConfigurationRoot(currentDirectory, homeDirectory);\n const globalOnly = args.includes(GLOBAL_OPTION);\n return { globalOnly, globalRoot, sourceRoot, targetRoot: globalOnly ? globalRoot : sourceRoot };\n}\n\nconst GLOBAL_SCOPE_INHERITED_KEYS = [\n HARNESS_ROOT_ENV,\n HARNESS_STATE_POINTER,\n PO_MAJOR_MODE_ENV,\n PO_DOMAINS_ENV,\n PO_PROFILE_ENV,\n] as const;\n\n/** Removes workspace-only state before a global root is resolved. */\nexport function environmentForSyncScope(environment: NodeJS.ProcessEnv, globalOnly: boolean): NodeJS.ProcessEnv {\n if (!globalOnly) return environment;\n const scoped = { ...environment };\n for (const key of GLOBAL_SCOPE_INHERITED_KEYS) delete scoped[key];\n return scoped;\n}\n\ntype SyncOutput = SyncProgressOutput;\n\nexport interface SyncCommandOptions {\n /** Test/embedding override; normal CLI execution uses the process home. */\n homeDirectory?: string;\n /** Test seams for the install, build and bundle steps and the lock. */\n deps?: Partial<SyncDeps>;\n}\n\n/**\n * Reports the config keys sync chose to ignore.\n *\n * Never fatal. A key nobody recognises is usually a config written for another\n * version of a layer, and refusing to build over it is worse than proceeding\n * without it. The strict check lives in `po doctor`.\n */\nfunction writeConfigDiagnostics(diagnostics: readonly ConfigDiagnostic[], output: SyncOutput): void {\n if (diagnostics.length === 0) return;\n const lines = diagnostics.map((entry) => ` ${entry.filePath}: ${entry.path}`).join('\\n');\n output.write(\n `config: ignored ${String(diagnostics.length)} unsupported key(s); run po doctor for the strict check\\n${lines}\\n`,\n );\n}\n\n/** Renders service events through the step presenter, as text for a terminal or a pipe. */\nfunction textRenderer(output: SyncOutput): (event: SyncEvent) => void {\n const progress = new SyncProgress(output);\n const open = new Map<string, SyncStepDone>();\n return (event) => {\n if (event.type === 'start') open.set(event.label, progress.start(event.label, event.message));\n else if (event.type === 'done') {\n open.get(event.label)?.(event.summary);\n open.delete(event.label);\n } else if (event.type === 'line') progress.line(event.label, event.message);\n else output.write(formatSyncResult(event.result));\n };\n}\n\nfunction jsonLine(output: SyncOutput, value: unknown): void {\n output.write(`${JSON.stringify(value)}\\n`);\n}\n\n/**\n * What `--check` and `po doctor` report.\n *\n * Problems are missing packages, in this root and in the global configuration every session\n * also loads, and a missing global web or native build. Warnings are roots the web build leaves out\n * (another admitted workspace whose configuration cannot be composed): worth saying, but\n * not something this sync can fix, so they never make the check fail.\n */\nexport function syncReadiness(\n targetRoot: string,\n homeDirectory: string,\n environment: NodeJS.ProcessEnv,\n): { packages: string[]; web: string[]; native: string[]; warnings: string[] } {\n const missingIn = (root: string): string[] => {\n const config = loadMajorModesConfigLenient(root, homeDirectory, environment).config;\n return missingLayerPackageSpecifiers(config, Object.keys(config.layers), createLayerResolvers(root, environment));\n };\n const globalRoot = globalDoomConfigDirectory(homeDirectory);\n const packages = [\n ...missingIn(targetRoot).map((specifier) => `configured package is not installed: ${specifier}`),\n ...(path.resolve(targetRoot) === path.resolve(globalRoot)\n ? []\n : missingIn(globalRoot).map(\n (specifier) => `global package is not installed: ${specifier} (run po sync --global)`,\n )),\n ];\n // Plugin roots resolve from installed packages, so the build key means nothing until they are.\n if (packages.length > 0) return { packages, web: [], native: [], warnings: [] };\n const warnings: string[] = [];\n const pluginRoots = globalWebPluginRoots(targetRoot, homeDirectory, environment, (message) => warnings.push(message));\n const status = readGlobalWebBuildStatus({ poHome: globalRoot, pluginRoots, environment });\n const web =\n status.status === 'missing'\n ? [`global web build ${status.key} is missing`]\n : status.status === 'failed'\n ? [`global web build cannot be resolved: ${status.reason}`]\n : [];\n const nativeStatus = readGlobalNativeBuildStatus({ poHome: globalRoot, pluginRoots });\n const native =\n nativeStatus.status === 'missing'\n ? [`global native build ${nativeStatus.key} is missing`]\n : nativeStatus.status === 'failed'\n ? [`global native build cannot be resolved: ${nativeStatus.reason}`]\n : [];\n return { packages, web, native, warnings };\n}\n\n/**\n * Installs every root's configured packages, then ensures the global web build and the MCP app build.\n *\n * Exit codes: 0 when the sync is ok or had nothing to do, 1 when it failed or only partly\n * succeeded, 75 when another sync holds the lock. With `--json`, each progress event is one\n * JSON line and the final line is the `SyncReport`.\n */\nexport async function synchronize(\n args: string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n output: SyncOutput = process.stdout,\n commandOptions: SyncCommandOptions = {},\n): Promise<number> {\n const unknown = args.slice(1).filter((argument) => !SYNC_OPTIONS.has(argument));\n if (unknown.length > 0) throw new Error(`Unknown po sync option(s): ${unknown.join(' ')}`);\n const check = args.includes(CHECK_OPTION);\n const json = args.includes(JSON_OPTION);\n const homeDirectory = commandOptions.homeDirectory ?? environment.HOME ?? os.homedir();\n const { globalOnly, globalRoot, sourceRoot, targetRoot } = resolveSyncRoots(\n args,\n environment,\n currentDirectory,\n homeDirectory,\n );\n const scopedEnvironment = environmentForSyncScope(environment, globalOnly);\n if (globalOnly && !check) fs.mkdirSync(globalRoot, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n // Sync tolerates keys it does not recognise so a config written against a\n // different version cannot break a build. `po doctor` reports them.\n const modes = loadMajorModesConfigLenient(sourceRoot, homeDirectory, scopedEnvironment);\n const diagnostics = [...loadDoomConfigLenient(sourceRoot, homeDirectory).diagnostics, ...modes.diagnostics];\n if (json && diagnostics.length > 0) jsonLine(output, { type: 'config', diagnostics });\n else if (!json) writeConfigDiagnostics(diagnostics, output);\n\n if (check) {\n const readiness = syncReadiness(targetRoot, homeDirectory, scopedEnvironment);\n for (const warning of readiness.warnings) output.write(`warning: ${warning}\\n`);\n const problems = [...readiness.packages, ...readiness.web, ...readiness.native];\n if (problems.length === 0) {\n output.write('po sync is up to date\\n');\n return 0;\n }\n output.write(`po sync is out of date:\\n${problems.map((entry) => ` ${entry}`).join('\\n')}\\n`);\n return 1;\n }\n\n const report = await runSyncService(\n {\n homeDirectory,\n environment: scopedEnvironment,\n globalRoot,\n // --global covers every root but registers no repository.\n ...(globalOnly ? {} : { repoRoot: sourceRoot }),\n // A host's background job leaves a rerun marker when the lock is held instead of failing.\n origin: syncParentPid(environment) === undefined ? 'cli' : 'background',\n onEvent: json ? (event) => jsonLine(output, event) : textRenderer(output),\n },\n commandOptions.deps,\n );\n if (json) jsonLine(output, { type: 'report', report });\n else for (const error of report.errors) output.write(`error: ${error}\\n`);\n return syncExitCode(report.status);\n}\n\n/** Compatibility API. Executables call the command function directly. */\nexport class SyncCommand {\n readonly name = SYNC_COMMAND;\n private readonly homeDirectory: string | undefined;\n\n constructor(options: SyncCommandOptions = {}) {\n this.homeDirectory = options.homeDirectory;\n }\n\n matches(args: string[]): boolean {\n return args[0] === this.name;\n }\n\n async execute(\n args: string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n output: SyncOutput = process.stdout,\n ): Promise<number> {\n return synchronize(args, environment, currentDirectory, output, { homeDirectory: this.homeDirectory });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SyncDeps } from "../../../composition/syncService/index.mjs";
|
|
2
|
+
import { SyncProgressOutput } from "./presenter.mjs";
|
|
3
|
+
//#region src/cli/commands/sync/index.d.ts
|
|
4
|
+
type SyncOutput = SyncProgressOutput;
|
|
5
|
+
export interface SyncCommandOptions {
|
|
6
|
+
/** Test/embedding override; normal CLI execution uses the process home. */
|
|
7
|
+
homeDirectory?: string;
|
|
8
|
+
/** Test seams for the install, build and bundle steps and the lock. */
|
|
9
|
+
deps?: Partial<SyncDeps>;
|
|
10
|
+
}
|
|
11
|
+
/** Compatibility API. Executables call the command function directly. */
|
|
12
|
+
export declare class SyncCommand {
|
|
13
|
+
readonly name = "sync";
|
|
14
|
+
private readonly homeDirectory;
|
|
15
|
+
constructor(options?: SyncCommandOptions);
|
|
16
|
+
matches(args: string[]): boolean;
|
|
17
|
+
execute(args: string[], environment?: NodeJS.ProcessEnv, currentDirectory?: string, output?: SyncOutput): Promise<number>;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../../src/cli/commands/sync/index.ts"],"mappings":";;;KAoFK,aAAa;iBAED;;EAEf;;EAEA,OAAO,QAAQ;;;qBAoJJ;WACF;mBACQ;EAEjB,YAAY,UAAS;EAIrB,QAAQ;EAIF,QACJ,gBACA,cAAa,OAAO,YACpB,2BACA,SAAQ,aACP"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { PO_DOMAINS_ENV, PO_MAJOR_MODE_ENV, PO_PROFILE_ENV } from "../../matrixOptions.mjs";
|
|
2
|
+
import { HARNESS_STATE_POINTER } from "../../../composition/harnessState/index.mjs";
|
|
3
|
+
import { resolveDoomConfigurationRoot } from "../../../composition/repository/index.mjs";
|
|
4
|
+
import { createLayerResolvers } from "../../../../builders/cli/extensionAssembler/index.mjs";
|
|
5
|
+
import { readGlobalWebBuildStatus } from "../../../builders/web/index.mjs";
|
|
6
|
+
import { readGlobalNativeBuildStatus } from "../../../builders/native/index.mjs";
|
|
7
|
+
import { missingLayerPackageSpecifiers } from "../../../composition/layerPackageInstaller/index.mjs";
|
|
8
|
+
import { formatSyncResult, globalWebPluginRoots, runSync, syncExitCode } from "../../../composition/syncService/index.mjs";
|
|
9
|
+
import { syncParentPid } from "../../../builders/server/backgroundSync.mjs";
|
|
10
|
+
import { loadDoomConfigLenient as loadDoomConfigLenient$1 } from "../../../composition/projectTrust/index.mjs";
|
|
11
|
+
import { SyncProgress } from "./presenter.mjs";
|
|
12
|
+
import fs from "node:fs";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import { globalDoomConfigDirectory } from "@agimon-ai/po-config/config";
|
|
16
|
+
import { loadMajorModesConfigLenient } from "@agimon-ai/po-config/majorModes";
|
|
17
|
+
//#region src/cli/commands/sync/index.ts
|
|
18
|
+
/**
|
|
19
|
+
* `po sync`: install what every root's configuration names and ensure the global builds.
|
|
20
|
+
*
|
|
21
|
+
* The roots are the Po home, every registered workspace and the current repository, which
|
|
22
|
+
* sync registers unless `--global` is given. The server composes every session live from
|
|
23
|
+
* configuration and installed packages, so sync only makes sure the packages are there
|
|
24
|
+
* and the one global web build (and the MCP app build) for the current plugin set exists.
|
|
25
|
+
* Then, when no other Po host runs, it prunes old builds and the package store.
|
|
26
|
+
*/
|
|
27
|
+
const SYNC_COMMAND = "sync";
|
|
28
|
+
const CHECK_OPTION = "--check";
|
|
29
|
+
const GLOBAL_OPTION = "--global";
|
|
30
|
+
const JSON_OPTION = "--json";
|
|
31
|
+
const SYNC_OPTIONS = /* @__PURE__ */ new Set([
|
|
32
|
+
CHECK_OPTION,
|
|
33
|
+
GLOBAL_OPTION,
|
|
34
|
+
JSON_OPTION
|
|
35
|
+
]);
|
|
36
|
+
const HARNESS_ROOT_ENV = "PO_ROOT";
|
|
37
|
+
const PRIVATE_DIRECTORY_MODE = 448;
|
|
38
|
+
/** Resolves the configuration source and the root whose packages are installed. */
|
|
39
|
+
function resolveSyncRoots(args, environment = process.env, currentDirectory = process.cwd(), homeDirectory = environment.HOME ?? os.homedir()) {
|
|
40
|
+
const globalRoot = globalDoomConfigDirectory(homeDirectory);
|
|
41
|
+
const inheritedRoot = environment[HARNESS_ROOT_ENV];
|
|
42
|
+
const sourceRoot = inheritedRoot ? path.resolve(inheritedRoot) : resolveDoomConfigurationRoot(currentDirectory, homeDirectory);
|
|
43
|
+
const globalOnly = args.includes(GLOBAL_OPTION);
|
|
44
|
+
return {
|
|
45
|
+
globalOnly,
|
|
46
|
+
globalRoot,
|
|
47
|
+
sourceRoot,
|
|
48
|
+
targetRoot: globalOnly ? globalRoot : sourceRoot
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const GLOBAL_SCOPE_INHERITED_KEYS = [
|
|
52
|
+
HARNESS_ROOT_ENV,
|
|
53
|
+
HARNESS_STATE_POINTER,
|
|
54
|
+
PO_MAJOR_MODE_ENV,
|
|
55
|
+
PO_DOMAINS_ENV,
|
|
56
|
+
PO_PROFILE_ENV
|
|
57
|
+
];
|
|
58
|
+
/** Removes workspace-only state before a global root is resolved. */
|
|
59
|
+
function environmentForSyncScope(environment, globalOnly) {
|
|
60
|
+
if (!globalOnly) return environment;
|
|
61
|
+
const scoped = { ...environment };
|
|
62
|
+
for (const key of GLOBAL_SCOPE_INHERITED_KEYS) delete scoped[key];
|
|
63
|
+
return scoped;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reports the config keys sync chose to ignore.
|
|
67
|
+
*
|
|
68
|
+
* Never fatal. A key nobody recognises is usually a config written for another
|
|
69
|
+
* version of a layer, and refusing to build over it is worse than proceeding
|
|
70
|
+
* without it. The strict check lives in `po doctor`.
|
|
71
|
+
*/
|
|
72
|
+
function writeConfigDiagnostics(diagnostics, output) {
|
|
73
|
+
if (diagnostics.length === 0) return;
|
|
74
|
+
const lines = diagnostics.map((entry) => ` ${entry.filePath}: ${entry.path}`).join("\n");
|
|
75
|
+
output.write(`config: ignored ${String(diagnostics.length)} unsupported key(s); run po doctor for the strict check\n${lines}\n`);
|
|
76
|
+
}
|
|
77
|
+
/** Renders service events through the step presenter, as text for a terminal or a pipe. */
|
|
78
|
+
function textRenderer(output) {
|
|
79
|
+
const progress = new SyncProgress(output);
|
|
80
|
+
const open = /* @__PURE__ */ new Map();
|
|
81
|
+
return (event) => {
|
|
82
|
+
if (event.type === "start") open.set(event.label, progress.start(event.label, event.message));
|
|
83
|
+
else if (event.type === "done") {
|
|
84
|
+
open.get(event.label)?.(event.summary);
|
|
85
|
+
open.delete(event.label);
|
|
86
|
+
} else if (event.type === "line") progress.line(event.label, event.message);
|
|
87
|
+
else output.write(formatSyncResult(event.result));
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function jsonLine(output, value) {
|
|
91
|
+
output.write(`${JSON.stringify(value)}\n`);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* What `--check` and `po doctor` report.
|
|
95
|
+
*
|
|
96
|
+
* Problems are missing packages, in this root and in the global configuration every session
|
|
97
|
+
* also loads, and a missing global web or native build. Warnings are roots the web build leaves out
|
|
98
|
+
* (another admitted workspace whose configuration cannot be composed): worth saying, but
|
|
99
|
+
* not something this sync can fix, so they never make the check fail.
|
|
100
|
+
*/
|
|
101
|
+
function syncReadiness(targetRoot, homeDirectory, environment) {
|
|
102
|
+
const missingIn = (root) => {
|
|
103
|
+
const config = loadMajorModesConfigLenient(root, homeDirectory, environment).config;
|
|
104
|
+
return missingLayerPackageSpecifiers(config, Object.keys(config.layers), createLayerResolvers(root, environment));
|
|
105
|
+
};
|
|
106
|
+
const globalRoot = globalDoomConfigDirectory(homeDirectory);
|
|
107
|
+
const packages = [...missingIn(targetRoot).map((specifier) => `configured package is not installed: ${specifier}`), ...path.resolve(targetRoot) === path.resolve(globalRoot) ? [] : missingIn(globalRoot).map((specifier) => `global package is not installed: ${specifier} (run po sync --global)`)];
|
|
108
|
+
if (packages.length > 0) return {
|
|
109
|
+
packages,
|
|
110
|
+
web: [],
|
|
111
|
+
native: [],
|
|
112
|
+
warnings: []
|
|
113
|
+
};
|
|
114
|
+
const warnings = [];
|
|
115
|
+
const pluginRoots = globalWebPluginRoots(targetRoot, homeDirectory, environment, (message) => warnings.push(message));
|
|
116
|
+
const status = readGlobalWebBuildStatus({
|
|
117
|
+
poHome: globalRoot,
|
|
118
|
+
pluginRoots,
|
|
119
|
+
environment
|
|
120
|
+
});
|
|
121
|
+
const web = status.status === "missing" ? [`global web build ${status.key} is missing`] : status.status === "failed" ? [`global web build cannot be resolved: ${status.reason}`] : [];
|
|
122
|
+
const nativeStatus = readGlobalNativeBuildStatus({
|
|
123
|
+
poHome: globalRoot,
|
|
124
|
+
pluginRoots
|
|
125
|
+
});
|
|
126
|
+
return {
|
|
127
|
+
packages,
|
|
128
|
+
web,
|
|
129
|
+
native: nativeStatus.status === "missing" ? [`global native build ${nativeStatus.key} is missing`] : nativeStatus.status === "failed" ? [`global native build cannot be resolved: ${nativeStatus.reason}`] : [],
|
|
130
|
+
warnings
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Installs every root's configured packages, then ensures the global web build and the MCP app build.
|
|
135
|
+
*
|
|
136
|
+
* Exit codes: 0 when the sync is ok or had nothing to do, 1 when it failed or only partly
|
|
137
|
+
* succeeded, 75 when another sync holds the lock. With `--json`, each progress event is one
|
|
138
|
+
* JSON line and the final line is the `SyncReport`.
|
|
139
|
+
*/
|
|
140
|
+
async function synchronize(args, environment = process.env, currentDirectory = process.cwd(), output = process.stdout, commandOptions = {}) {
|
|
141
|
+
const unknown = args.slice(1).filter((argument) => !SYNC_OPTIONS.has(argument));
|
|
142
|
+
if (unknown.length > 0) throw new Error(`Unknown po sync option(s): ${unknown.join(" ")}`);
|
|
143
|
+
const check = args.includes(CHECK_OPTION);
|
|
144
|
+
const json = args.includes(JSON_OPTION);
|
|
145
|
+
const homeDirectory = commandOptions.homeDirectory ?? environment.HOME ?? os.homedir();
|
|
146
|
+
const { globalOnly, globalRoot, sourceRoot, targetRoot } = resolveSyncRoots(args, environment, currentDirectory, homeDirectory);
|
|
147
|
+
const scopedEnvironment = environmentForSyncScope(environment, globalOnly);
|
|
148
|
+
if (globalOnly && !check) fs.mkdirSync(globalRoot, {
|
|
149
|
+
recursive: true,
|
|
150
|
+
mode: PRIVATE_DIRECTORY_MODE
|
|
151
|
+
});
|
|
152
|
+
const modes = loadMajorModesConfigLenient(sourceRoot, homeDirectory, scopedEnvironment);
|
|
153
|
+
const diagnostics = [...loadDoomConfigLenient$1(sourceRoot, homeDirectory).diagnostics, ...modes.diagnostics];
|
|
154
|
+
if (json && diagnostics.length > 0) jsonLine(output, {
|
|
155
|
+
type: "config",
|
|
156
|
+
diagnostics
|
|
157
|
+
});
|
|
158
|
+
else if (!json) writeConfigDiagnostics(diagnostics, output);
|
|
159
|
+
if (check) {
|
|
160
|
+
const readiness = syncReadiness(targetRoot, homeDirectory, scopedEnvironment);
|
|
161
|
+
for (const warning of readiness.warnings) output.write(`warning: ${warning}\n`);
|
|
162
|
+
const problems = [
|
|
163
|
+
...readiness.packages,
|
|
164
|
+
...readiness.web,
|
|
165
|
+
...readiness.native
|
|
166
|
+
];
|
|
167
|
+
if (problems.length === 0) {
|
|
168
|
+
output.write("po sync is up to date\n");
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
output.write(`po sync is out of date:\n${problems.map((entry) => ` ${entry}`).join("\n")}\n`);
|
|
172
|
+
return 1;
|
|
173
|
+
}
|
|
174
|
+
const report = await runSync({
|
|
175
|
+
homeDirectory,
|
|
176
|
+
environment: scopedEnvironment,
|
|
177
|
+
globalRoot,
|
|
178
|
+
...globalOnly ? {} : { repoRoot: sourceRoot },
|
|
179
|
+
origin: syncParentPid(environment) === void 0 ? "cli" : "background",
|
|
180
|
+
onEvent: json ? (event) => jsonLine(output, event) : textRenderer(output)
|
|
181
|
+
}, commandOptions.deps);
|
|
182
|
+
if (json) jsonLine(output, {
|
|
183
|
+
type: "report",
|
|
184
|
+
report
|
|
185
|
+
});
|
|
186
|
+
else for (const error of report.errors) output.write(`error: ${error}\n`);
|
|
187
|
+
return syncExitCode(report.status);
|
|
188
|
+
}
|
|
189
|
+
/** Compatibility API. Executables call the command function directly. */
|
|
190
|
+
var SyncCommand = class {
|
|
191
|
+
name = SYNC_COMMAND;
|
|
192
|
+
homeDirectory;
|
|
193
|
+
constructor(options = {}) {
|
|
194
|
+
this.homeDirectory = options.homeDirectory;
|
|
195
|
+
}
|
|
196
|
+
matches(args) {
|
|
197
|
+
return args[0] === this.name;
|
|
198
|
+
}
|
|
199
|
+
async execute(args, environment = process.env, currentDirectory = process.cwd(), output = process.stdout) {
|
|
200
|
+
return synchronize(args, environment, currentDirectory, output, { homeDirectory: this.homeDirectory });
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
//#endregion
|
|
204
|
+
export { SyncCommand, environmentForSyncScope, resolveSyncRoots, syncReadiness, synchronize };
|
|
205
|
+
|
|
206
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["loadDoomConfigLenient","runSyncService"],"sources":["../../../../../src/cli/commands/sync/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { globalDoomConfigDirectory } from '@agimon-ai/po-config/config';\nimport { loadMajorModesConfigLenient } from '@agimon-ai/po-config/majorModes';\nimport type { ConfigDiagnostic } from '@agimon-ai/po-config/types';\n\nimport { createLayerResolvers } from '../../../builders/cli/extensionAssembler';\nimport { readGlobalNativeBuildStatus } from '../../../builders/native';\nimport { syncParentPid } from '../../../builders/server/backgroundSync';\nimport { readGlobalWebBuildStatus } from '../../../builders/web';\nimport { HARNESS_STATE_POINTER } from '../../../composition/harnessState';\nimport { missingLayerPackageSpecifiers } from '../../../composition/layerPackageInstaller';\nimport { loadDoomConfigLenient } from '../../../composition/projectTrust';\nimport { resolveDoomConfigurationRoot } from '../../../composition/repository';\nimport {\n formatSyncResult,\n globalWebPluginRoots,\n runSync as runSyncService,\n type SyncDeps,\n type SyncEvent,\n syncExitCode,\n} from '../../../composition/syncService';\nimport { PO_DOMAINS_ENV, PO_MAJOR_MODE_ENV, PO_PROFILE_ENV } from '../../matrixOptions';\nimport { SyncProgress, type SyncProgressOutput, type SyncStepDone } from './presenter';\n\n/**\n * `po sync`: install what every root's configuration names and ensure the global builds.\n *\n * The roots are the Po home, every registered workspace and the current repository, which\n * sync registers unless `--global` is given. The server composes every session live from\n * configuration and installed packages, so sync only makes sure the packages are there\n * and the one global web build (and the MCP app build) for the current plugin set exists.\n * Then, when no other Po host runs, it prunes old builds and the package store.\n */\n\nconst SYNC_COMMAND = 'sync';\nconst CHECK_OPTION = '--check';\nconst GLOBAL_OPTION = '--global';\nconst JSON_OPTION = '--json';\nconst SYNC_OPTIONS = new Set([CHECK_OPTION, GLOBAL_OPTION, JSON_OPTION]);\nconst HARNESS_ROOT_ENV = 'PO_ROOT';\nconst PRIVATE_DIRECTORY_MODE = 0o700;\n\nexport interface SyncRoots {\n globalOnly: boolean;\n globalRoot: string;\n sourceRoot: string;\n targetRoot: string;\n}\n\n/** Resolves the configuration source and the root whose packages are installed. */\nexport function resolveSyncRoots(\n args: readonly string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n homeDirectory = environment.HOME ?? os.homedir(),\n): SyncRoots {\n const globalRoot = globalDoomConfigDirectory(homeDirectory);\n const inheritedRoot = environment[HARNESS_ROOT_ENV];\n const sourceRoot = inheritedRoot\n ? path.resolve(inheritedRoot)\n : resolveDoomConfigurationRoot(currentDirectory, homeDirectory);\n const globalOnly = args.includes(GLOBAL_OPTION);\n return { globalOnly, globalRoot, sourceRoot, targetRoot: globalOnly ? globalRoot : sourceRoot };\n}\n\nconst GLOBAL_SCOPE_INHERITED_KEYS = [\n HARNESS_ROOT_ENV,\n HARNESS_STATE_POINTER,\n PO_MAJOR_MODE_ENV,\n PO_DOMAINS_ENV,\n PO_PROFILE_ENV,\n] as const;\n\n/** Removes workspace-only state before a global root is resolved. */\nexport function environmentForSyncScope(environment: NodeJS.ProcessEnv, globalOnly: boolean): NodeJS.ProcessEnv {\n if (!globalOnly) return environment;\n const scoped = { ...environment };\n for (const key of GLOBAL_SCOPE_INHERITED_KEYS) delete scoped[key];\n return scoped;\n}\n\ntype SyncOutput = SyncProgressOutput;\n\nexport interface SyncCommandOptions {\n /** Test/embedding override; normal CLI execution uses the process home. */\n homeDirectory?: string;\n /** Test seams for the install, build and bundle steps and the lock. */\n deps?: Partial<SyncDeps>;\n}\n\n/**\n * Reports the config keys sync chose to ignore.\n *\n * Never fatal. A key nobody recognises is usually a config written for another\n * version of a layer, and refusing to build over it is worse than proceeding\n * without it. The strict check lives in `po doctor`.\n */\nfunction writeConfigDiagnostics(diagnostics: readonly ConfigDiagnostic[], output: SyncOutput): void {\n if (diagnostics.length === 0) return;\n const lines = diagnostics.map((entry) => ` ${entry.filePath}: ${entry.path}`).join('\\n');\n output.write(\n `config: ignored ${String(diagnostics.length)} unsupported key(s); run po doctor for the strict check\\n${lines}\\n`,\n );\n}\n\n/** Renders service events through the step presenter, as text for a terminal or a pipe. */\nfunction textRenderer(output: SyncOutput): (event: SyncEvent) => void {\n const progress = new SyncProgress(output);\n const open = new Map<string, SyncStepDone>();\n return (event) => {\n if (event.type === 'start') open.set(event.label, progress.start(event.label, event.message));\n else if (event.type === 'done') {\n open.get(event.label)?.(event.summary);\n open.delete(event.label);\n } else if (event.type === 'line') progress.line(event.label, event.message);\n else output.write(formatSyncResult(event.result));\n };\n}\n\nfunction jsonLine(output: SyncOutput, value: unknown): void {\n output.write(`${JSON.stringify(value)}\\n`);\n}\n\n/**\n * What `--check` and `po doctor` report.\n *\n * Problems are missing packages, in this root and in the global configuration every session\n * also loads, and a missing global web or native build. Warnings are roots the web build leaves out\n * (another admitted workspace whose configuration cannot be composed): worth saying, but\n * not something this sync can fix, so they never make the check fail.\n */\nexport function syncReadiness(\n targetRoot: string,\n homeDirectory: string,\n environment: NodeJS.ProcessEnv,\n): { packages: string[]; web: string[]; native: string[]; warnings: string[] } {\n const missingIn = (root: string): string[] => {\n const config = loadMajorModesConfigLenient(root, homeDirectory, environment).config;\n return missingLayerPackageSpecifiers(config, Object.keys(config.layers), createLayerResolvers(root, environment));\n };\n const globalRoot = globalDoomConfigDirectory(homeDirectory);\n const packages = [\n ...missingIn(targetRoot).map((specifier) => `configured package is not installed: ${specifier}`),\n ...(path.resolve(targetRoot) === path.resolve(globalRoot)\n ? []\n : missingIn(globalRoot).map(\n (specifier) => `global package is not installed: ${specifier} (run po sync --global)`,\n )),\n ];\n // Plugin roots resolve from installed packages, so the build key means nothing until they are.\n if (packages.length > 0) return { packages, web: [], native: [], warnings: [] };\n const warnings: string[] = [];\n const pluginRoots = globalWebPluginRoots(targetRoot, homeDirectory, environment, (message) => warnings.push(message));\n const status = readGlobalWebBuildStatus({ poHome: globalRoot, pluginRoots, environment });\n const web =\n status.status === 'missing'\n ? [`global web build ${status.key} is missing`]\n : status.status === 'failed'\n ? [`global web build cannot be resolved: ${status.reason}`]\n : [];\n const nativeStatus = readGlobalNativeBuildStatus({ poHome: globalRoot, pluginRoots });\n const native =\n nativeStatus.status === 'missing'\n ? [`global native build ${nativeStatus.key} is missing`]\n : nativeStatus.status === 'failed'\n ? [`global native build cannot be resolved: ${nativeStatus.reason}`]\n : [];\n return { packages, web, native, warnings };\n}\n\n/**\n * Installs every root's configured packages, then ensures the global web build and the MCP app build.\n *\n * Exit codes: 0 when the sync is ok or had nothing to do, 1 when it failed or only partly\n * succeeded, 75 when another sync holds the lock. With `--json`, each progress event is one\n * JSON line and the final line is the `SyncReport`.\n */\nexport async function synchronize(\n args: string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n output: SyncOutput = process.stdout,\n commandOptions: SyncCommandOptions = {},\n): Promise<number> {\n const unknown = args.slice(1).filter((argument) => !SYNC_OPTIONS.has(argument));\n if (unknown.length > 0) throw new Error(`Unknown po sync option(s): ${unknown.join(' ')}`);\n const check = args.includes(CHECK_OPTION);\n const json = args.includes(JSON_OPTION);\n const homeDirectory = commandOptions.homeDirectory ?? environment.HOME ?? os.homedir();\n const { globalOnly, globalRoot, sourceRoot, targetRoot } = resolveSyncRoots(\n args,\n environment,\n currentDirectory,\n homeDirectory,\n );\n const scopedEnvironment = environmentForSyncScope(environment, globalOnly);\n if (globalOnly && !check) fs.mkdirSync(globalRoot, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n // Sync tolerates keys it does not recognise so a config written against a\n // different version cannot break a build. `po doctor` reports them.\n const modes = loadMajorModesConfigLenient(sourceRoot, homeDirectory, scopedEnvironment);\n const diagnostics = [...loadDoomConfigLenient(sourceRoot, homeDirectory).diagnostics, ...modes.diagnostics];\n if (json && diagnostics.length > 0) jsonLine(output, { type: 'config', diagnostics });\n else if (!json) writeConfigDiagnostics(diagnostics, output);\n\n if (check) {\n const readiness = syncReadiness(targetRoot, homeDirectory, scopedEnvironment);\n for (const warning of readiness.warnings) output.write(`warning: ${warning}\\n`);\n const problems = [...readiness.packages, ...readiness.web, ...readiness.native];\n if (problems.length === 0) {\n output.write('po sync is up to date\\n');\n return 0;\n }\n output.write(`po sync is out of date:\\n${problems.map((entry) => ` ${entry}`).join('\\n')}\\n`);\n return 1;\n }\n\n const report = await runSyncService(\n {\n homeDirectory,\n environment: scopedEnvironment,\n globalRoot,\n // --global covers every root but registers no repository.\n ...(globalOnly ? {} : { repoRoot: sourceRoot }),\n // A host's background job leaves a rerun marker when the lock is held instead of failing.\n origin: syncParentPid(environment) === undefined ? 'cli' : 'background',\n onEvent: json ? (event) => jsonLine(output, event) : textRenderer(output),\n },\n commandOptions.deps,\n );\n if (json) jsonLine(output, { type: 'report', report });\n else for (const error of report.errors) output.write(`error: ${error}\\n`);\n return syncExitCode(report.status);\n}\n\n/** Compatibility API. Executables call the command function directly. */\nexport class SyncCommand {\n readonly name = SYNC_COMMAND;\n private readonly homeDirectory: string | undefined;\n\n constructor(options: SyncCommandOptions = {}) {\n this.homeDirectory = options.homeDirectory;\n }\n\n matches(args: string[]): boolean {\n return args[0] === this.name;\n }\n\n async execute(\n args: string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n output: SyncOutput = process.stdout,\n ): Promise<number> {\n return synchronize(args, environment, currentDirectory, output, { homeDirectory: this.homeDirectory });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,MAAM,cAAc;AACpB,MAAM,+BAAe,IAAI,IAAI;CAAC;CAAc;CAAe;AAAW,CAAC;AACvE,MAAM,mBAAmB;AACzB,MAAM,yBAAyB;;AAU/B,SAAgB,iBACd,MACA,cAAiC,QAAQ,KACzC,mBAAmB,QAAQ,IAAI,GAC/B,gBAAgB,YAAY,QAAQ,GAAG,QAAQ,GACpC;CACX,MAAM,aAAa,0BAA0B,aAAa;CAC1D,MAAM,gBAAgB,YAAY;CAClC,MAAM,aAAa,gBACf,KAAK,QAAQ,aAAa,IAC1B,6BAA6B,kBAAkB,aAAa;CAChE,MAAM,aAAa,KAAK,SAAS,aAAa;CAC9C,OAAO;EAAE;EAAY;EAAY;EAAY,YAAY,aAAa,aAAa;CAAW;AAChG;AAEA,MAAM,8BAA8B;CAClC;CACA;CACA;CACA;CACA;AACF;;AAGA,SAAgB,wBAAwB,aAAgC,YAAwC;CAC9G,IAAI,CAAC,YAAY,OAAO;CACxB,MAAM,SAAS,EAAE,GAAG,YAAY;CAChC,KAAK,MAAM,OAAO,6BAA6B,OAAO,OAAO;CAC7D,OAAO;AACT;;;;;;;;AAkBA,SAAS,uBAAuB,aAA0C,QAA0B;CAClG,IAAI,YAAY,WAAW,GAAG;CAC9B,MAAM,QAAQ,YAAY,KAAK,UAAU,KAAK,MAAM,SAAS,IAAI,MAAM,MAAM,CAAC,CAAC,KAAK,IAAI;CACxF,OAAO,MACL,qBAAqB,OAAO,YAAY,MAAM,EAAE,2DAA2D,MAAM,GACnH;AACF;;AAGA,SAAS,aAAa,QAAgD;CACpE,MAAM,WAAW,IAAI,aAAa,MAAM;CACxC,MAAM,uBAAO,IAAI,IAA0B;CAC3C,QAAQ,UAAU;EAChB,IAAI,MAAM,SAAS,SAAS,KAAK,IAAI,MAAM,OAAO,SAAS,MAAM,MAAM,OAAO,MAAM,OAAO,CAAC;OACvF,IAAI,MAAM,SAAS,QAAQ;GAC9B,KAAK,IAAI,MAAM,KAAK,CAAC,GAAG,MAAM,OAAO;GACrC,KAAK,OAAO,MAAM,KAAK;EACzB,OAAO,IAAI,MAAM,SAAS,QAAQ,SAAS,KAAK,MAAM,OAAO,MAAM,OAAO;OACrE,OAAO,MAAM,iBAAiB,MAAM,MAAM,CAAC;CAClD;AACF;AAEA,SAAS,SAAS,QAAoB,OAAsB;CAC1D,OAAO,MAAM,GAAG,KAAK,UAAU,KAAK,EAAE,GAAG;AAC3C;;;;;;;;;AAUA,SAAgB,cACd,YACA,eACA,aAC6E;CAC7E,MAAM,aAAa,SAA2B;EAC5C,MAAM,SAAS,4BAA4B,MAAM,eAAe,WAAW,CAAC,CAAC;EAC7E,OAAO,8BAA8B,QAAQ,OAAO,KAAK,OAAO,MAAM,GAAG,qBAAqB,MAAM,WAAW,CAAC;CAClH;CACA,MAAM,aAAa,0BAA0B,aAAa;CAC1D,MAAM,WAAW,CACf,GAAG,UAAU,UAAU,CAAC,CAAC,KAAK,cAAc,wCAAwC,WAAW,GAC/F,GAAI,KAAK,QAAQ,UAAU,MAAM,KAAK,QAAQ,UAAU,IACpD,CAAC,IACD,UAAU,UAAU,CAAC,CAAC,KACnB,cAAc,oCAAoC,UAAU,wBAC/D,CACN;CAEA,IAAI,SAAS,SAAS,GAAG,OAAO;EAAE;EAAU,KAAK,CAAC;EAAG,QAAQ,CAAC;EAAG,UAAU,CAAC;CAAE;CAC9E,MAAM,WAAqB,CAAC;CAC5B,MAAM,cAAc,qBAAqB,YAAY,eAAe,cAAc,YAAY,SAAS,KAAK,OAAO,CAAC;CACpH,MAAM,SAAS,yBAAyB;EAAE,QAAQ;EAAY;EAAa;CAAY,CAAC;CACxF,MAAM,MACJ,OAAO,WAAW,YACd,CAAC,oBAAoB,OAAO,IAAI,YAAY,IAC5C,OAAO,WAAW,WAChB,CAAC,wCAAwC,OAAO,QAAQ,IACxD,CAAC;CACT,MAAM,eAAe,4BAA4B;EAAE,QAAQ;EAAY;CAAY,CAAC;CAOpF,OAAO;EAAE;EAAU;EAAK,QALtB,aAAa,WAAW,YACpB,CAAC,uBAAuB,aAAa,IAAI,YAAY,IACrD,aAAa,WAAW,WACtB,CAAC,2CAA2C,aAAa,QAAQ,IACjE,CAAC;EACuB;CAAS;AAC3C;;;;;;;;AASA,eAAsB,YACpB,MACA,cAAiC,QAAQ,KACzC,mBAAmB,QAAQ,IAAI,GAC/B,SAAqB,QAAQ,QAC7B,iBAAqC,CAAC,GACrB;CACjB,MAAM,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,aAAa,CAAC,aAAa,IAAI,QAAQ,CAAC;CAC9E,IAAI,QAAQ,SAAS,GAAG,MAAM,IAAI,MAAM,8BAA8B,QAAQ,KAAK,GAAG,GAAG;CACzF,MAAM,QAAQ,KAAK,SAAS,YAAY;CACxC,MAAM,OAAO,KAAK,SAAS,WAAW;CACtC,MAAM,gBAAgB,eAAe,iBAAiB,YAAY,QAAQ,GAAG,QAAQ;CACrF,MAAM,EAAE,YAAY,YAAY,YAAY,eAAe,iBACzD,MACA,aACA,kBACA,aACF;CACA,MAAM,oBAAoB,wBAAwB,aAAa,UAAU;CACzE,IAAI,cAAc,CAAC,OAAO,GAAG,UAAU,YAAY;EAAE,WAAW;EAAM,MAAM;CAAuB,CAAC;CAGpG,MAAM,QAAQ,4BAA4B,YAAY,eAAe,iBAAiB;CACtF,MAAM,cAAc,CAAC,GAAGA,wBAAsB,YAAY,aAAa,CAAC,CAAC,aAAa,GAAG,MAAM,WAAW;CAC1G,IAAI,QAAQ,YAAY,SAAS,GAAG,SAAS,QAAQ;EAAE,MAAM;EAAU;CAAY,CAAC;MAC/E,IAAI,CAAC,MAAM,uBAAuB,aAAa,MAAM;CAE1D,IAAI,OAAO;EACT,MAAM,YAAY,cAAc,YAAY,eAAe,iBAAiB;EAC5E,KAAK,MAAM,WAAW,UAAU,UAAU,OAAO,MAAM,aAAa,QAAQ,GAAG;EAC/E,MAAM,WAAW;GAAC,GAAG,UAAU;GAAU,GAAG,UAAU;GAAK,GAAG,UAAU;EAAM;EAC9E,IAAI,SAAS,WAAW,GAAG;GACzB,OAAO,MAAM,yBAAyB;GACtC,OAAO;EACT;EACA,OAAO,MAAM,4BAA4B,SAAS,KAAK,UAAU,KAAK,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,GAAG;EAC7F,OAAO;CACT;CAEA,MAAM,SAAS,MAAMC,QACnB;EACE;EACA,aAAa;EACb;EAEA,GAAI,aAAa,CAAC,IAAI,EAAE,UAAU,WAAW;EAE7C,QAAQ,cAAc,WAAW,MAAM,KAAA,IAAY,QAAQ;EAC3D,SAAS,QAAQ,UAAU,SAAS,QAAQ,KAAK,IAAI,aAAa,MAAM;CAC1E,GACA,eAAe,IACjB;CACA,IAAI,MAAM,SAAS,QAAQ;EAAE,MAAM;EAAU;CAAO,CAAC;MAChD,KAAK,MAAM,SAAS,OAAO,QAAQ,OAAO,MAAM,aAAa,MAAM,GAAG;CAC3E,OAAO,aAAa,OAAO,MAAM;AACnC;;AAGA,IAAa,cAAb,MAAyB;CACvB,OAAgB;CAChB;CAEA,YAAY,UAA8B,CAAC,GAAG;EAC5C,KAAK,gBAAgB,QAAQ;CAC/B;CAEA,QAAQ,MAAyB;EAC/B,OAAO,KAAK,OAAO,KAAK;CAC1B;CAEA,MAAM,QACJ,MACA,cAAiC,QAAQ,KACzC,mBAAmB,QAAQ,IAAI,GAC/B,SAAqB,QAAQ,QACZ;EACjB,OAAO,YAAY,MAAM,aAAa,kBAAkB,QAAQ,EAAE,eAAe,KAAK,cAAc,CAAC;CACvG;AACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
//#region src/cli/commands/sync/presenter.ts
|
|
2
|
+
/**
|
|
3
|
+
* Step-by-step progress for `po sync`.
|
|
4
|
+
*
|
|
5
|
+
* Sync spends almost all of its wall clock in three places a user cannot see:
|
|
6
|
+
* the registry check, the mode build, and the runtime precompile. A terminal
|
|
7
|
+
* gets a live line that the finished step overwrites, so the transcript stays
|
|
8
|
+
* as short as the existing summary. Anything else (a pipe, CI, the embedded
|
|
9
|
+
* dpi runner) gets one line per completed step and no escape sequences.
|
|
10
|
+
*/
|
|
11
|
+
const LABEL_WIDTH = 10;
|
|
12
|
+
const CLEAR_LINE = `${String.fromCharCode(27)}[2K\r`;
|
|
13
|
+
const MILLISECONDS_PER_SECOND = 1e3;
|
|
14
|
+
function formatProgressLine(label, message) {
|
|
15
|
+
return `${`${label}:`.padEnd(LABEL_WIDTH)}${message}`;
|
|
16
|
+
}
|
|
17
|
+
function formatElapsed(milliseconds) {
|
|
18
|
+
return `${(milliseconds / MILLISECONDS_PER_SECOND).toFixed(1)}s`;
|
|
19
|
+
}
|
|
20
|
+
/** Reports sync phases as they run rather than only after everything is done. */
|
|
21
|
+
var SyncProgress = class {
|
|
22
|
+
output;
|
|
23
|
+
now;
|
|
24
|
+
live = false;
|
|
25
|
+
constructor(output, now = Date.now) {
|
|
26
|
+
this.output = output;
|
|
27
|
+
this.now = now;
|
|
28
|
+
}
|
|
29
|
+
/** Opens a timed step and returns the call that closes it. */
|
|
30
|
+
start(label, message) {
|
|
31
|
+
const startedAt = this.now();
|
|
32
|
+
this.drawLive(formatProgressLine(label, `${message}...`));
|
|
33
|
+
return (summary) => {
|
|
34
|
+
this.clearLive();
|
|
35
|
+
this.output.write(`${formatProgressLine(label, `${summary} (${formatElapsed(this.now() - startedAt)})`)}\n`);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Writes a standalone line, such as one package moving to a new version. */
|
|
39
|
+
line(label, message) {
|
|
40
|
+
this.clearLive();
|
|
41
|
+
this.output.write(`${formatProgressLine(label, message)}\n`);
|
|
42
|
+
}
|
|
43
|
+
drawLive(text) {
|
|
44
|
+
if (!this.output.isTTY) return;
|
|
45
|
+
this.output.write(`${CLEAR_LINE}${text}`);
|
|
46
|
+
this.live = true;
|
|
47
|
+
}
|
|
48
|
+
clearLive() {
|
|
49
|
+
if (!this.live) return;
|
|
50
|
+
this.output.write(CLEAR_LINE);
|
|
51
|
+
this.live = false;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
//#endregion
|
|
55
|
+
exports.SyncProgress = SyncProgress;
|
|
56
|
+
exports.formatProgressLine = formatProgressLine;
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=presenter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenter.cjs","names":[],"sources":["../../../../../src/cli/commands/sync/presenter.ts"],"sourcesContent":["/**\n * Step-by-step progress for `po sync`.\n *\n * Sync spends almost all of its wall clock in three places a user cannot see:\n * the registry check, the mode build, and the runtime precompile. A terminal\n * gets a live line that the finished step overwrites, so the transcript stays\n * as short as the existing summary. Anything else (a pipe, CI, the embedded\n * dpi runner) gets one line per completed step and no escape sequences.\n */\n\nconst LABEL_WIDTH = 10;\nconst ANSI_ESCAPE = String.fromCharCode(0x1b);\nconst CLEAR_LINE = `${ANSI_ESCAPE}[2K\\r`;\nconst MILLISECONDS_PER_SECOND = 1000;\n\nexport interface SyncProgressOutput {\n write: NodeJS.WritableStream['write'];\n isTTY?: boolean;\n}\n\n/** Closes the step a `start` call opened, recording how long it took. */\nexport type SyncStepDone = (summary: string) => void;\n\nexport function formatProgressLine(label: string, message: string): string {\n return `${`${label}:`.padEnd(LABEL_WIDTH)}${message}`;\n}\n\nfunction formatElapsed(milliseconds: number): string {\n return `${(milliseconds / MILLISECONDS_PER_SECOND).toFixed(1)}s`;\n}\n\n/** Reports sync phases as they run rather than only after everything is done. */\nexport class SyncProgress {\n private readonly output: SyncProgressOutput;\n private readonly now: () => number;\n private live = false;\n\n constructor(output: SyncProgressOutput, now: () => number = Date.now) {\n this.output = output;\n this.now = now;\n }\n\n /** Opens a timed step and returns the call that closes it. */\n start(label: string, message: string): SyncStepDone {\n const startedAt = this.now();\n this.drawLive(formatProgressLine(label, `${message}...`));\n return (summary) => {\n this.clearLive();\n this.output.write(`${formatProgressLine(label, `${summary} (${formatElapsed(this.now() - startedAt)})`)}\\n`);\n };\n }\n\n /** Writes a standalone line, such as one package moving to a new version. */\n line(label: string, message: string): void {\n this.clearLive();\n this.output.write(`${formatProgressLine(label, message)}\\n`);\n }\n\n private drawLive(text: string): void {\n if (!this.output.isTTY) return;\n this.output.write(`${CLEAR_LINE}${text}`);\n this.live = true;\n }\n\n private clearLive(): void {\n if (!this.live) return;\n this.output.write(CLEAR_LINE);\n this.live = false;\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,cAAc;AAEpB,MAAM,aAAa,GADC,OAAO,aAAa,EACR,EAAE;AAClC,MAAM,0BAA0B;AAUhC,SAAgB,mBAAmB,OAAe,SAAyB;CACzE,OAAO,GAAG,GAAG,MAAM,GAAG,OAAO,WAAW,IAAI;AAC9C;AAEA,SAAS,cAAc,cAA8B;CACnD,OAAO,IAAI,eAAe,wBAAA,CAAyB,QAAQ,CAAC,EAAE;AAChE;;AAGA,IAAa,eAAb,MAA0B;CACxB;CACA;CACA,OAAe;CAEf,YAAY,QAA4B,MAAoB,KAAK,KAAK;EACpE,KAAK,SAAS;EACd,KAAK,MAAM;CACb;;CAGA,MAAM,OAAe,SAA+B;EAClD,MAAM,YAAY,KAAK,IAAI;EAC3B,KAAK,SAAS,mBAAmB,OAAO,GAAG,QAAQ,IAAI,CAAC;EACxD,QAAQ,YAAY;GAClB,KAAK,UAAU;GACf,KAAK,OAAO,MAAM,GAAG,mBAAmB,OAAO,GAAG,QAAQ,IAAI,cAAc,KAAK,IAAI,IAAI,SAAS,EAAE,EAAE,EAAE,GAAG;EAC7G;CACF;;CAGA,KAAK,OAAe,SAAuB;EACzC,KAAK,UAAU;EACf,KAAK,OAAO,MAAM,GAAG,mBAAmB,OAAO,OAAO,EAAE,GAAG;CAC7D;CAEA,SAAiB,MAAoB;EACnC,IAAI,CAAC,KAAK,OAAO,OAAO;EACxB,KAAK,OAAO,MAAM,GAAG,aAAa,MAAM;EACxC,KAAK,OAAO;CACd;CAEA,YAA0B;EACxB,IAAI,CAAC,KAAK,MAAM;EAChB,KAAK,OAAO,MAAM,UAAU;EAC5B,KAAK,OAAO;CACd;AACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/cli/commands/sync/presenter.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Step-by-step progress for `po sync`.
|
|
4
|
+
*
|
|
5
|
+
* Sync spends almost all of its wall clock in three places a user cannot see:
|
|
6
|
+
* the registry check, the mode build, and the runtime precompile. A terminal
|
|
7
|
+
* gets a live line that the finished step overwrites, so the transcript stays
|
|
8
|
+
* as short as the existing summary. Anything else (a pipe, CI, the embedded
|
|
9
|
+
* dpi runner) gets one line per completed step and no escape sequences.
|
|
10
|
+
*/
|
|
11
|
+
export interface SyncProgressOutput {
|
|
12
|
+
write: NodeJS.WritableStream['write'];
|
|
13
|
+
isTTY?: boolean;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
//# sourceMappingURL=presenter.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenter.d.mts","names":[],"sources":["../../../../../src/cli/commands/sync/presenter.ts"],"mappings":";;;;;;;;;;iBAeiB;EACf,OAAO,OAAO;EACd"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//#region src/cli/commands/sync/presenter.ts
|
|
2
|
+
/**
|
|
3
|
+
* Step-by-step progress for `po sync`.
|
|
4
|
+
*
|
|
5
|
+
* Sync spends almost all of its wall clock in three places a user cannot see:
|
|
6
|
+
* the registry check, the mode build, and the runtime precompile. A terminal
|
|
7
|
+
* gets a live line that the finished step overwrites, so the transcript stays
|
|
8
|
+
* as short as the existing summary. Anything else (a pipe, CI, the embedded
|
|
9
|
+
* dpi runner) gets one line per completed step and no escape sequences.
|
|
10
|
+
*/
|
|
11
|
+
const LABEL_WIDTH = 10;
|
|
12
|
+
const CLEAR_LINE = `${String.fromCharCode(27)}[2K\r`;
|
|
13
|
+
const MILLISECONDS_PER_SECOND = 1e3;
|
|
14
|
+
function formatProgressLine(label, message) {
|
|
15
|
+
return `${`${label}:`.padEnd(LABEL_WIDTH)}${message}`;
|
|
16
|
+
}
|
|
17
|
+
function formatElapsed(milliseconds) {
|
|
18
|
+
return `${(milliseconds / MILLISECONDS_PER_SECOND).toFixed(1)}s`;
|
|
19
|
+
}
|
|
20
|
+
/** Reports sync phases as they run rather than only after everything is done. */
|
|
21
|
+
var SyncProgress = class {
|
|
22
|
+
output;
|
|
23
|
+
now;
|
|
24
|
+
live = false;
|
|
25
|
+
constructor(output, now = Date.now) {
|
|
26
|
+
this.output = output;
|
|
27
|
+
this.now = now;
|
|
28
|
+
}
|
|
29
|
+
/** Opens a timed step and returns the call that closes it. */
|
|
30
|
+
start(label, message) {
|
|
31
|
+
const startedAt = this.now();
|
|
32
|
+
this.drawLive(formatProgressLine(label, `${message}...`));
|
|
33
|
+
return (summary) => {
|
|
34
|
+
this.clearLive();
|
|
35
|
+
this.output.write(`${formatProgressLine(label, `${summary} (${formatElapsed(this.now() - startedAt)})`)}\n`);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Writes a standalone line, such as one package moving to a new version. */
|
|
39
|
+
line(label, message) {
|
|
40
|
+
this.clearLive();
|
|
41
|
+
this.output.write(`${formatProgressLine(label, message)}\n`);
|
|
42
|
+
}
|
|
43
|
+
drawLive(text) {
|
|
44
|
+
if (!this.output.isTTY) return;
|
|
45
|
+
this.output.write(`${CLEAR_LINE}${text}`);
|
|
46
|
+
this.live = true;
|
|
47
|
+
}
|
|
48
|
+
clearLive() {
|
|
49
|
+
if (!this.live) return;
|
|
50
|
+
this.output.write(CLEAR_LINE);
|
|
51
|
+
this.live = false;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
//#endregion
|
|
55
|
+
export { SyncProgress, formatProgressLine };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=presenter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenter.mjs","names":[],"sources":["../../../../../src/cli/commands/sync/presenter.ts"],"sourcesContent":["/**\n * Step-by-step progress for `po sync`.\n *\n * Sync spends almost all of its wall clock in three places a user cannot see:\n * the registry check, the mode build, and the runtime precompile. A terminal\n * gets a live line that the finished step overwrites, so the transcript stays\n * as short as the existing summary. Anything else (a pipe, CI, the embedded\n * dpi runner) gets one line per completed step and no escape sequences.\n */\n\nconst LABEL_WIDTH = 10;\nconst ANSI_ESCAPE = String.fromCharCode(0x1b);\nconst CLEAR_LINE = `${ANSI_ESCAPE}[2K\\r`;\nconst MILLISECONDS_PER_SECOND = 1000;\n\nexport interface SyncProgressOutput {\n write: NodeJS.WritableStream['write'];\n isTTY?: boolean;\n}\n\n/** Closes the step a `start` call opened, recording how long it took. */\nexport type SyncStepDone = (summary: string) => void;\n\nexport function formatProgressLine(label: string, message: string): string {\n return `${`${label}:`.padEnd(LABEL_WIDTH)}${message}`;\n}\n\nfunction formatElapsed(milliseconds: number): string {\n return `${(milliseconds / MILLISECONDS_PER_SECOND).toFixed(1)}s`;\n}\n\n/** Reports sync phases as they run rather than only after everything is done. */\nexport class SyncProgress {\n private readonly output: SyncProgressOutput;\n private readonly now: () => number;\n private live = false;\n\n constructor(output: SyncProgressOutput, now: () => number = Date.now) {\n this.output = output;\n this.now = now;\n }\n\n /** Opens a timed step and returns the call that closes it. */\n start(label: string, message: string): SyncStepDone {\n const startedAt = this.now();\n this.drawLive(formatProgressLine(label, `${message}...`));\n return (summary) => {\n this.clearLive();\n this.output.write(`${formatProgressLine(label, `${summary} (${formatElapsed(this.now() - startedAt)})`)}\\n`);\n };\n }\n\n /** Writes a standalone line, such as one package moving to a new version. */\n line(label: string, message: string): void {\n this.clearLive();\n this.output.write(`${formatProgressLine(label, message)}\\n`);\n }\n\n private drawLive(text: string): void {\n if (!this.output.isTTY) return;\n this.output.write(`${CLEAR_LINE}${text}`);\n this.live = true;\n }\n\n private clearLive(): void {\n if (!this.live) return;\n this.output.write(CLEAR_LINE);\n this.live = false;\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,cAAc;AAEpB,MAAM,aAAa,GADC,OAAO,aAAa,EACR,EAAE;AAClC,MAAM,0BAA0B;AAUhC,SAAgB,mBAAmB,OAAe,SAAyB;CACzE,OAAO,GAAG,GAAG,MAAM,GAAG,OAAO,WAAW,IAAI;AAC9C;AAEA,SAAS,cAAc,cAA8B;CACnD,OAAO,IAAI,eAAe,wBAAA,CAAyB,QAAQ,CAAC,EAAE;AAChE;;AAGA,IAAa,eAAb,MAA0B;CACxB;CACA;CACA,OAAe;CAEf,YAAY,QAA4B,MAAoB,KAAK,KAAK;EACpE,KAAK,SAAS;EACd,KAAK,MAAM;CACb;;CAGA,MAAM,OAAe,SAA+B;EAClD,MAAM,YAAY,KAAK,IAAI;EAC3B,KAAK,SAAS,mBAAmB,OAAO,GAAG,QAAQ,IAAI,CAAC;EACxD,QAAQ,YAAY;GAClB,KAAK,UAAU;GACf,KAAK,OAAO,MAAM,GAAG,mBAAmB,OAAO,GAAG,QAAQ,IAAI,cAAc,KAAK,IAAI,IAAI,SAAS,EAAE,EAAE,EAAE,GAAG;EAC7G;CACF;;CAGA,KAAK,OAAe,SAAuB;EACzC,KAAK,UAAU;EACf,KAAK,OAAO,MAAM,GAAG,mBAAmB,OAAO,OAAO,EAAE,GAAG;CAC7D;CAEA,SAAiB,MAAoB;EACnC,IAAI,CAAC,KAAK,OAAO,OAAO;EACxB,KAAK,OAAO,MAAM,GAAG,aAAa,MAAM;EACxC,KAAK,OAAO;CACd;CAEA,YAA0B;EACxB,IAAI,CAAC,KAAK,MAAM;EAChB,KAAK,OAAO,MAAM,UAAU;EAC5B,KAAK,OAAO;CACd;AACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const require_help = require("./help.cjs");
|
|
2
|
+
const require_router = require("../../router.cjs");
|
|
3
|
+
const require_index = require("./index.cjs");
|
|
4
|
+
//#region src/cli/commands/sync/workflow.ts
|
|
5
|
+
/** The `po sync` entry: help, or installs plus the global builds. */
|
|
6
|
+
async function runSync(args, environment = process.env, currentDirectory = process.cwd(), output = process.stdout) {
|
|
7
|
+
if (require_router.wantsHelp(args)) {
|
|
8
|
+
output.write(require_help.syncHelp());
|
|
9
|
+
return 0;
|
|
10
|
+
}
|
|
11
|
+
return require_index.synchronize(args, environment, currentDirectory, output);
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
exports.runSync = runSync;
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=workflow.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.cjs","names":["wantsHelp","syncHelp","synchronize"],"sources":["../../../../../src/cli/commands/sync/workflow.ts"],"sourcesContent":["import { wantsHelp } from '../../router';\nimport { syncHelp } from './help';\nimport { synchronize } from './index';\nimport type { SyncProgressOutput } from './presenter';\n\n/** The `po sync` entry: help, or installs plus the global builds. */\nexport async function runSync(\n args: string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n output: SyncProgressOutput = process.stdout,\n): Promise<number> {\n // Before anything else, so both `sync --help` and `sync --check --help` print\n // instead of running a sync nobody asked for.\n if (wantsHelp(args)) {\n output.write(syncHelp());\n return 0;\n }\n return synchronize(args, environment, currentDirectory, output);\n}\n"],"mappings":";;;;;AAMA,eAAsB,QACpB,MACA,cAAiC,QAAQ,KACzC,mBAAmB,QAAQ,IAAI,GAC/B,SAA6B,QAAQ,QACpB;CAGjB,IAAIA,eAAAA,UAAU,IAAI,GAAG;EACnB,OAAO,MAAMC,aAAAA,SAAS,CAAC;EACvB,OAAO;CACT;CACA,OAAOC,cAAAA,YAAY,MAAM,aAAa,kBAAkB,MAAM;AAChE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { syncHelp } from "./help.mjs";
|
|
2
|
+
import { wantsHelp } from "../../router.mjs";
|
|
3
|
+
import { synchronize } from "./index.mjs";
|
|
4
|
+
//#region src/cli/commands/sync/workflow.ts
|
|
5
|
+
/** The `po sync` entry: help, or installs plus the global builds. */
|
|
6
|
+
async function runSync(args, environment = process.env, currentDirectory = process.cwd(), output = process.stdout) {
|
|
7
|
+
if (wantsHelp(args)) {
|
|
8
|
+
output.write(syncHelp());
|
|
9
|
+
return 0;
|
|
10
|
+
}
|
|
11
|
+
return synchronize(args, environment, currentDirectory, output);
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { runSync };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=workflow.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.mjs","names":[],"sources":["../../../../../src/cli/commands/sync/workflow.ts"],"sourcesContent":["import { wantsHelp } from '../../router';\nimport { syncHelp } from './help';\nimport { synchronize } from './index';\nimport type { SyncProgressOutput } from './presenter';\n\n/** The `po sync` entry: help, or installs plus the global builds. */\nexport async function runSync(\n args: string[],\n environment: NodeJS.ProcessEnv = process.env,\n currentDirectory = process.cwd(),\n output: SyncProgressOutput = process.stdout,\n): Promise<number> {\n // Before anything else, so both `sync --help` and `sync --check --help` print\n // instead of running a sync nobody asked for.\n if (wantsHelp(args)) {\n output.write(syncHelp());\n return 0;\n }\n return synchronize(args, environment, currentDirectory, output);\n}\n"],"mappings":";;;;;AAMA,eAAsB,QACpB,MACA,cAAiC,QAAQ,KACzC,mBAAmB,QAAQ,IAAI,GAC/B,SAA6B,QAAQ,QACpB;CAGjB,IAAI,UAAU,IAAI,GAAG;EACnB,OAAO,MAAM,SAAS,CAAC;EACvB,OAAO;CACT;CACA,OAAO,YAAY,MAAM,aAAa,kBAAkB,MAAM;AAChE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
const require_runtime = require("../../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let node_path = require("node:path");
|
|
3
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
4
|
+
let node_child_process = require("node:child_process");
|
|
5
|
+
let node_module = require("node:module");
|
|
6
|
+
//#region src/cli/commands/web/index.ts
|
|
7
|
+
const PO_WEB_PACKAGE = "@agimon-ai/po-web";
|
|
8
|
+
const PO_WEB_MANIFEST = `${PO_WEB_PACKAGE}/package.json`;
|
|
9
|
+
const PO_WEB_BIN = "po-web";
|
|
10
|
+
const FORWARDED_SIGNALS = ["SIGINT", "SIGTERM"];
|
|
11
|
+
const SIGNAL_EXIT_BASE = 128;
|
|
12
|
+
const SIGNAL_NUMBERS = {
|
|
13
|
+
SIGINT: 2,
|
|
14
|
+
SIGTERM: 15
|
|
15
|
+
};
|
|
16
|
+
function defaultDependencies() {
|
|
17
|
+
const require$1 = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
|
|
18
|
+
return {
|
|
19
|
+
resolve: (specifier) => require$1.resolve(specifier),
|
|
20
|
+
readManifest: (manifestPath) => require$1(manifestPath),
|
|
21
|
+
spawn: (command, args) => (0, node_child_process.spawn)(command, args, { stdio: "inherit" }),
|
|
22
|
+
signals: process,
|
|
23
|
+
error: process.stderr
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function binEntry(manifest) {
|
|
27
|
+
if (typeof manifest !== "object" || manifest === null) return void 0;
|
|
28
|
+
const bin = manifest.bin;
|
|
29
|
+
if (typeof bin === "string") return bin;
|
|
30
|
+
if (typeof bin !== "object" || bin === null) return void 0;
|
|
31
|
+
const entry = bin[PO_WEB_BIN];
|
|
32
|
+
return typeof entry === "string" ? entry : void 0;
|
|
33
|
+
}
|
|
34
|
+
/** Absolute path of the installed po-web bin, or undefined when po-web is not installed. */
|
|
35
|
+
function resolvePoWebBin(dependencies) {
|
|
36
|
+
let manifestPath;
|
|
37
|
+
try {
|
|
38
|
+
manifestPath = dependencies.resolve(PO_WEB_MANIFEST);
|
|
39
|
+
} catch {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const entry = binEntry(dependencies.readManifest(manifestPath));
|
|
43
|
+
return entry ? node_path.default.resolve(node_path.default.dirname(manifestPath), entry) : void 0;
|
|
44
|
+
}
|
|
45
|
+
function installGuidance() {
|
|
46
|
+
return `po could not find ${PO_WEB_PACKAGE}, which serves the Po web console.
|
|
47
|
+
Install it next to po, for example:
|
|
48
|
+
npm install -g ${PO_WEB_PACKAGE}
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Bare `po`: runs the po-web console with the caller's arguments.
|
|
53
|
+
*
|
|
54
|
+
* po-web depends on po, so po locates it at runtime instead of declaring it.
|
|
55
|
+
* The child inherits stdio, receives SIGINT and SIGTERM, and its exit code
|
|
56
|
+
* becomes po's.
|
|
57
|
+
*/
|
|
58
|
+
async function runPoWeb(args, dependencies = defaultDependencies()) {
|
|
59
|
+
const bin = resolvePoWebBin(dependencies);
|
|
60
|
+
if (!bin) {
|
|
61
|
+
dependencies.error.write(installGuidance());
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
const child = dependencies.spawn(process.execPath, [bin, ...args]);
|
|
65
|
+
const forwarders = FORWARDED_SIGNALS.map((signal) => {
|
|
66
|
+
const forward = () => {
|
|
67
|
+
child.kill(signal);
|
|
68
|
+
};
|
|
69
|
+
dependencies.signals.on(signal, forward);
|
|
70
|
+
return [signal, forward];
|
|
71
|
+
});
|
|
72
|
+
try {
|
|
73
|
+
return await new Promise((resolve, reject) => {
|
|
74
|
+
child.once("error", reject);
|
|
75
|
+
child.once("exit", (code, signal) => {
|
|
76
|
+
if (code !== null) resolve(code);
|
|
77
|
+
else resolve(SIGNAL_EXIT_BASE + (signal ? SIGNAL_NUMBERS[signal] ?? 0 : 0));
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
} finally {
|
|
81
|
+
for (const [signal, forward] of forwarders) dependencies.signals.off(signal, forward);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
exports.resolvePoWebBin = resolvePoWebBin;
|
|
86
|
+
exports.runPoWeb = runPoWeb;
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["require","createRequire","spawn","path"],"sources":["../../../../../src/cli/commands/web/index.ts"],"sourcesContent":["import { type ChildProcess, spawn } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nconst PO_WEB_PACKAGE = '@agimon-ai/po-web';\nconst PO_WEB_MANIFEST = `${PO_WEB_PACKAGE}/package.json`;\nconst PO_WEB_BIN = 'po-web';\nconst FORWARDED_SIGNALS = ['SIGINT', 'SIGTERM'] as const;\nconst SIGNAL_EXIT_BASE = 128;\nconst SIGNAL_NUMBERS: Record<string, number> = { SIGINT: 2, SIGTERM: 15 };\n\nexport interface PoWebOutput {\n write(chunk: string): void;\n}\n\nexport interface PoWebDependencies {\n /** Resolves a module specifier to an absolute path, throwing when it is not installed. */\n resolve: (specifier: string) => string;\n /** Reads a resolved package manifest. */\n readManifest: (manifestPath: string) => unknown;\n spawn: (command: string, args: string[]) => ChildProcess;\n signals: Pick<NodeJS.Process, 'on' | 'off'>;\n error: PoWebOutput;\n}\n\nfunction defaultDependencies(): PoWebDependencies {\n const require = createRequire(import.meta.url);\n return {\n resolve: (specifier) => require.resolve(specifier),\n readManifest: (manifestPath) => require(manifestPath) as unknown,\n spawn: (command, args) => spawn(command, args, { stdio: 'inherit' }),\n signals: process,\n error: process.stderr,\n };\n}\n\nfunction binEntry(manifest: unknown): string | undefined {\n if (typeof manifest !== 'object' || manifest === null) return undefined;\n const bin = (manifest as { bin?: unknown }).bin;\n if (typeof bin === 'string') return bin;\n if (typeof bin !== 'object' || bin === null) return undefined;\n const entry = (bin as Record<string, unknown>)[PO_WEB_BIN];\n return typeof entry === 'string' ? entry : undefined;\n}\n\n/** Absolute path of the installed po-web bin, or undefined when po-web is not installed. */\nexport function resolvePoWebBin(dependencies: Pick<PoWebDependencies, 'resolve' | 'readManifest'>): string | undefined {\n let manifestPath: string;\n try {\n manifestPath = dependencies.resolve(PO_WEB_MANIFEST);\n } catch {\n return undefined;\n }\n const entry = binEntry(dependencies.readManifest(manifestPath));\n return entry ? path.resolve(path.dirname(manifestPath), entry) : undefined;\n}\n\nfunction installGuidance(): string {\n return `po could not find ${PO_WEB_PACKAGE}, which serves the Po web console.\nInstall it next to po, for example:\n npm install -g ${PO_WEB_PACKAGE}\n`;\n}\n\n/**\n * Bare `po`: runs the po-web console with the caller's arguments.\n *\n * po-web depends on po, so po locates it at runtime instead of declaring it.\n * The child inherits stdio, receives SIGINT and SIGTERM, and its exit code\n * becomes po's.\n */\nexport async function runPoWeb(\n args: string[],\n dependencies: PoWebDependencies = defaultDependencies(),\n): Promise<number> {\n const bin = resolvePoWebBin(dependencies);\n if (!bin) {\n dependencies.error.write(installGuidance());\n return 1;\n }\n const child = dependencies.spawn(process.execPath, [bin, ...args]);\n const forwarders = FORWARDED_SIGNALS.map((signal) => {\n const forward = (): void => {\n child.kill(signal);\n };\n dependencies.signals.on(signal, forward);\n return [signal, forward] as const;\n });\n try {\n return await new Promise<number>((resolve, reject) => {\n child.once('error', reject);\n child.once('exit', (code, signal) => {\n if (code !== null) resolve(code);\n else resolve(SIGNAL_EXIT_BASE + (signal ? (SIGNAL_NUMBERS[signal] ?? 0) : 0));\n });\n });\n } finally {\n for (const [signal, forward] of forwarders) dependencies.signals.off(signal, forward);\n }\n}\n"],"mappings":";;;;;;AAIA,MAAM,iBAAiB;AACvB,MAAM,kBAAkB,GAAG,eAAe;AAC1C,MAAM,aAAa;AACnB,MAAM,oBAAoB,CAAC,UAAU,SAAS;AAC9C,MAAM,mBAAmB;AACzB,MAAM,iBAAyC;CAAE,QAAQ;CAAG,SAAS;AAAG;AAgBxE,SAAS,sBAAyC;CAChD,MAAMA,aAAAA,GAAUC,YAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAA6B;CAC7C,OAAO;EACL,UAAU,cAAcD,UAAQ,QAAQ,SAAS;EACjD,eAAe,iBAAiBA,UAAQ,YAAY;EACpD,QAAQ,SAAS,UAAA,GAASE,mBAAAA,MAAAA,CAAM,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;EACnE,SAAS;EACT,OAAO,QAAQ;CACjB;AACF;AAEA,SAAS,SAAS,UAAuC;CACvD,IAAI,OAAO,aAAa,YAAY,aAAa,MAAM,OAAO,KAAA;CAC9D,MAAM,MAAO,SAA+B;CAC5C,IAAI,OAAO,QAAQ,UAAU,OAAO;CACpC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM,OAAO,KAAA;CACpD,MAAM,QAAS,IAAgC;CAC/C,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;;AAGA,SAAgB,gBAAgB,cAAuF;CACrH,IAAI;CACJ,IAAI;EACF,eAAe,aAAa,QAAQ,eAAe;CACrD,QAAQ;EACN;CACF;CACA,MAAM,QAAQ,SAAS,aAAa,aAAa,YAAY,CAAC;CAC9D,OAAO,QAAQC,UAAAA,QAAK,QAAQA,UAAAA,QAAK,QAAQ,YAAY,GAAG,KAAK,IAAI,KAAA;AACnE;AAEA,SAAS,kBAA0B;CACjC,OAAO,qBAAqB,eAAe;;mBAE1B,eAAe;;AAElC;;;;;;;;AASA,eAAsB,SACpB,MACA,eAAkC,oBAAoB,GACrC;CACjB,MAAM,MAAM,gBAAgB,YAAY;CACxC,IAAI,CAAC,KAAK;EACR,aAAa,MAAM,MAAM,gBAAgB,CAAC;EAC1C,OAAO;CACT;CACA,MAAM,QAAQ,aAAa,MAAM,QAAQ,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC;CACjE,MAAM,aAAa,kBAAkB,KAAK,WAAW;EACnD,MAAM,gBAAsB;GAC1B,MAAM,KAAK,MAAM;EACnB;EACA,aAAa,QAAQ,GAAG,QAAQ,OAAO;EACvC,OAAO,CAAC,QAAQ,OAAO;CACzB,CAAC;CACD,IAAI;EACF,OAAO,MAAM,IAAI,SAAiB,SAAS,WAAW;GACpD,MAAM,KAAK,SAAS,MAAM;GAC1B,MAAM,KAAK,SAAS,MAAM,WAAW;IACnC,IAAI,SAAS,MAAM,QAAQ,IAAI;SAC1B,QAAQ,oBAAoB,SAAU,eAAe,WAAW,IAAK,EAAE;GAC9E,CAAC;EACH,CAAC;CACH,UAAU;EACR,KAAK,MAAM,CAAC,QAAQ,YAAY,YAAY,aAAa,QAAQ,IAAI,QAAQ,OAAO;CACtF;AACF"}
|