@cjhyy/code-shell-core 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +7 -3
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +17 -1
- package/dist/context/manager.js +36 -1
- package/dist/credentials/access.d.ts +3 -1
- package/dist/credentials/access.js +24 -3
- package/dist/credentials/index.d.ts +1 -1
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/oauth.d.ts +4 -1
- package/dist/credentials/oauth.js +14 -0
- package/dist/credentials/store.d.ts +15 -1
- package/dist/credentials/store.js +17 -4
- package/dist/credentials/types.d.ts +24 -0
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +254 -195
- package/dist/engine/engine.js +1812 -2041
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +49 -10
- package/dist/engine/turn-loop.js +370 -104
- package/dist/engine/types.d.ts +30 -3
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +24 -10
- package/dist/hooks/goal-stop-hook.d.ts +17 -28
- package/dist/hooks/goal-stop-hook.js +110 -465
- package/dist/hooks/registry.js +1 -1
- package/dist/index.d.ts +48 -108
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +34 -123
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +60 -0
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +6 -0
- package/dist/plugins/pluginCommandHook.js +25 -8
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +64 -1
- package/dist/protocol/chat-session-manager.js +104 -0
- package/dist/protocol/chat-session.d.ts +61 -10
- package/dist/protocol/chat-session.js +135 -25
- package/dist/protocol/client.d.ts +33 -3
- package/dist/protocol/client.js +96 -5
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +127 -3
- package/dist/protocol/server.js +1309 -182
- package/dist/protocol/types.d.ts +152 -34
- package/dist/protocol/types.js +16 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.js +10 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.js +4 -1
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +182 -28
- package/dist/session/session-manager.js +910 -130
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +46 -5
- package/dist/session/transcript.js +159 -3
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +274 -33
- package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
- package/dist/tool-system/builtin/background-jobs.js +96 -4
- package/dist/tool-system/builtin/background-work.d.ts +6 -0
- package/dist/tool-system/builtin/background-work.js +8 -1
- package/dist/tool-system/builtin/bash.js +5 -2
- package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.js +2 -6
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.js +26 -7
- package/dist/tool-system/builtin/grep.js +2 -2
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +32 -7
- package/dist/tool-system/builtin/index.js +237 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/web-fetch.js +17 -13
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +77 -19
- package/dist/tool-system/executor.js +75 -50
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +11 -1
- package/dist/tool-system/mcp-manager.js +19 -4
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/path-policy.js +99 -2
- package/dist/tool-system/permission.d.ts +26 -0
- package/dist/tool-system/permission.js +46 -0
- package/dist/tool-system/registry.d.ts +12 -1
- package/dist/tool-system/registry.js +31 -7
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +186 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -45
- package/dist/arena/arena.js +0 -362
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -25
- package/dist/arena/phases/adjudication.js +0 -142
- package/dist/arena/phases/build-consensus.d.ts +0 -30
- package/dist/arena/phases/build-consensus.js +0 -85
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -47
- package/dist/arena/phases/cross-review.js +0 -224
- package/dist/arena/phases/debate-rounds.d.ts +0 -28
- package/dist/arena/phases/debate-rounds.js +0 -161
- package/dist/arena/phases/participant-research.d.ts +0 -39
- package/dist/arena/phases/participant-research.js +0 -316
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
- package/dist/arena/phases/planning-detail-expansion.js +0 -120
- package/dist/arena/planner.d.ts +0 -28
- package/dist/arena/planner.js +0 -312
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -518
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -72
- package/dist/git/worktree/crud.js +0 -235
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -87
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -43
- package/dist/git/worktree/query.js +0 -128
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -416
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -363
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import {
|
|
3
|
-
import { join } from "node:path";
|
|
2
|
+
import { copyFile, mkdir, readdir, realpath, stat } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { PluginInstallError } from "../types.js";
|
|
4
5
|
/**
|
|
5
6
|
* Map a Codex plugin's slash commands into CC's `commands/` layout.
|
|
6
7
|
*
|
|
@@ -10,37 +11,59 @@ import { join } from "node:path";
|
|
|
10
11
|
* already scans `commands/*.md`. So the conversion is a flat copy of every
|
|
11
12
|
* `.md` from `prompts/` (and any explicit `commands/`) into `dest/commands/`.
|
|
12
13
|
*
|
|
13
|
-
* Placeholder syntax differs (Codex `$1`/`$FILE` vs CC `$ARGUMENTS`)
|
|
14
|
-
* body is copied verbatim
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* Placeholder syntax differs (Codex `$1`/`$FILE` vs CC `$ARGUMENTS`), so the
|
|
15
|
+
* body is copied verbatim and expanded at invocation time by
|
|
16
|
+
* `expandPluginCommandBody`. Non-`.md` files are ignored, matching Codex's
|
|
17
|
+
* own behaviour. On a filename collision an explicit `commands/` entry wins
|
|
18
|
+
* over `prompts/` (the more specific source).
|
|
18
19
|
*
|
|
19
20
|
* Async fs throughout: this runs in the Electron main process during install;
|
|
20
21
|
* sync copies block the event loop and freeze the UI (see convertSkills.ts).
|
|
21
22
|
*/
|
|
22
23
|
export async function copyCodexCommands(sourceDir, destDir) {
|
|
24
|
+
const sourceRoot = await realpath(sourceDir);
|
|
23
25
|
// prompts/ first, then commands/ — later writes overwrite earlier, so an
|
|
24
26
|
// explicit commands/ entry wins the collision.
|
|
25
|
-
const written = await copyMdFiles(join(sourceDir, "prompts"), join(destDir, "commands"));
|
|
26
|
-
await copyMdFiles(join(sourceDir, "commands"), join(destDir, "commands"), written);
|
|
27
|
+
const written = await copyMdFiles(sourceRoot, join(sourceDir, "prompts"), join(destDir, "commands"));
|
|
28
|
+
await copyMdFiles(sourceRoot, join(sourceDir, "commands"), join(destDir, "commands"), written);
|
|
27
29
|
}
|
|
28
30
|
/** Flat-copy *.md from srcDir into destDir; returns the set of basenames written. */
|
|
29
|
-
async function copyMdFiles(srcDir, destDir, written = new Set()) {
|
|
31
|
+
async function copyMdFiles(sourceRoot, srcDir, destDir, written = new Set()) {
|
|
30
32
|
if (!existsSync(srcDir))
|
|
31
33
|
return written;
|
|
34
|
+
const resolvedDir = await resolveContainedSource(sourceRoot, srcDir, srcDir);
|
|
32
35
|
let ensuredDest = false;
|
|
33
|
-
for (const dirent of await readdir(
|
|
36
|
+
for (const dirent of await readdir(resolvedDir, { withFileTypes: true })) {
|
|
34
37
|
if (!dirent.isFile() && !dirent.isSymbolicLink())
|
|
35
38
|
continue;
|
|
36
39
|
if (!dirent.name.endsWith(".md"))
|
|
37
40
|
continue;
|
|
41
|
+
const source = await resolveContainedSource(sourceRoot, join(resolvedDir, dirent.name), `${srcDir}/${dirent.name}`);
|
|
42
|
+
if (!(await stat(source)).isFile())
|
|
43
|
+
continue;
|
|
38
44
|
if (!ensuredDest) {
|
|
39
45
|
await mkdir(destDir, { recursive: true });
|
|
40
46
|
ensuredDest = true;
|
|
41
47
|
}
|
|
42
|
-
|
|
48
|
+
const destination = join(destDir, dirent.name);
|
|
49
|
+
if (resolve(source) !== resolve(destination)) {
|
|
50
|
+
await copyFile(source, destination);
|
|
51
|
+
}
|
|
43
52
|
written.add(dirent.name);
|
|
44
53
|
}
|
|
45
54
|
return written;
|
|
46
55
|
}
|
|
56
|
+
async function resolveContainedSource(sourceRoot, candidate, label) {
|
|
57
|
+
let target;
|
|
58
|
+
try {
|
|
59
|
+
target = await realpath(candidate);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new PluginInstallError(`plugin command source not found: ${label}`);
|
|
63
|
+
}
|
|
64
|
+
const rel = relative(sourceRoot, target);
|
|
65
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
66
|
+
throw new PluginInstallError(`plugin command source escapes plugin dir: ${label}`);
|
|
67
|
+
}
|
|
68
|
+
return target;
|
|
69
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Codex plugin hook declarations into CodeShell's canonical
|
|
3
|
+
* `hooks/hooks.json` location.
|
|
4
|
+
*
|
|
5
|
+
* Codex accepts a path, an inline object, or an array mixing both. CodeShell's
|
|
6
|
+
* runtime intentionally has one loader path, so installation resolves and
|
|
7
|
+
* merges those declarations once. When the manifest omits `hooks`, the normal
|
|
8
|
+
* `hooks/hooks.json` copied from the source tree is already canonical.
|
|
9
|
+
*/
|
|
10
|
+
export declare function copyCodexHooks(sourceDir: string, destDir: string, declaration: string | Record<string, unknown> | Array<string | Record<string, unknown>> | undefined): Promise<void>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, realpath, writeFile } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { PluginInstallError } from "../types.js";
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function normalizeHookDocument(value, label) {
|
|
9
|
+
if (!isRecord(value)) {
|
|
10
|
+
throw new PluginInstallError(`${label}: hooks declaration must be an object`);
|
|
11
|
+
}
|
|
12
|
+
const candidate = isRecord(value.hooks) ? value.hooks : value;
|
|
13
|
+
const hooks = {};
|
|
14
|
+
for (const [event, groups] of Object.entries(candidate)) {
|
|
15
|
+
if (!Array.isArray(groups)) {
|
|
16
|
+
throw new PluginInstallError(`${label}: hook event '${event}' must be an array`);
|
|
17
|
+
}
|
|
18
|
+
hooks[event] = groups;
|
|
19
|
+
}
|
|
20
|
+
return hooks;
|
|
21
|
+
}
|
|
22
|
+
async function readHookDocument(sourceDir, declaration) {
|
|
23
|
+
const base = await realpath(sourceDir);
|
|
24
|
+
const candidate = resolve(base, declaration);
|
|
25
|
+
const rel = relative(base, candidate);
|
|
26
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
27
|
+
throw new PluginInstallError(`hooks ref escapes plugin dir: ${declaration}`);
|
|
28
|
+
}
|
|
29
|
+
if (!existsSync(candidate)) {
|
|
30
|
+
throw new PluginInstallError(`hooks ref not found: ${declaration}`);
|
|
31
|
+
}
|
|
32
|
+
let target;
|
|
33
|
+
try {
|
|
34
|
+
target = await realpath(candidate);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
throw new PluginInstallError(`hooks ref not found: ${declaration}`);
|
|
38
|
+
}
|
|
39
|
+
const targetRel = relative(base, target);
|
|
40
|
+
if (targetRel === ".." || targetRel.startsWith(`..${sep}`) || isAbsolute(targetRel)) {
|
|
41
|
+
throw new PluginInstallError(`hooks ref escapes plugin dir: ${declaration}`);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
return normalizeHookDocument(JSON.parse(await readFile(target, "utf-8")), `hooks ref ${declaration}`);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (error instanceof PluginInstallError)
|
|
48
|
+
throw error;
|
|
49
|
+
throw new PluginInstallError(`invalid hooks json ${declaration}: ${error instanceof Error ? error.message : String(error)}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function mergeHooks(target, source) {
|
|
53
|
+
for (const [event, groups] of Object.entries(source)) {
|
|
54
|
+
target[event] = [...(target[event] ?? []), ...groups];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Convert Codex plugin hook declarations into CodeShell's canonical
|
|
59
|
+
* `hooks/hooks.json` location.
|
|
60
|
+
*
|
|
61
|
+
* Codex accepts a path, an inline object, or an array mixing both. CodeShell's
|
|
62
|
+
* runtime intentionally has one loader path, so installation resolves and
|
|
63
|
+
* merges those declarations once. When the manifest omits `hooks`, the normal
|
|
64
|
+
* `hooks/hooks.json` copied from the source tree is already canonical.
|
|
65
|
+
*/
|
|
66
|
+
export async function copyCodexHooks(sourceDir, destDir, declaration) {
|
|
67
|
+
if (declaration === undefined)
|
|
68
|
+
return;
|
|
69
|
+
const declarations = Array.isArray(declaration) ? declaration : [declaration];
|
|
70
|
+
const merged = {};
|
|
71
|
+
for (const item of declarations) {
|
|
72
|
+
if (typeof item === "string") {
|
|
73
|
+
mergeHooks(merged, await readHookDocument(sourceDir, item));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
mergeHooks(merged, normalizeHookDocument(item, "inline hooks"));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const hooksDir = join(destDir, "hooks");
|
|
80
|
+
await mkdir(hooksDir, { recursive: true });
|
|
81
|
+
await writeFile(join(hooksDir, "hooks.json"), `${JSON.stringify({ hooks: merged }, null, 2)}\n`, "utf-8");
|
|
82
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { readdir, readFile,
|
|
3
|
-
import { join } from "node:path";
|
|
2
|
+
import { cp, lstat, readdir, readFile, realpath, stat } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, join, relative, sep } from "node:path";
|
|
4
4
|
import { PluginInstallError } from "../types.js";
|
|
5
5
|
const FRONTMATTER = /^---\s*\n[\s\S]*?\n---/;
|
|
6
6
|
/**
|
|
@@ -18,16 +18,51 @@ export async function copyCodexSkills(sourceDir, destDir) {
|
|
|
18
18
|
const skillsSrc = join(sourceDir, "skills");
|
|
19
19
|
if (!existsSync(skillsSrc))
|
|
20
20
|
return;
|
|
21
|
-
|
|
21
|
+
if ((await lstat(skillsSrc)).isSymbolicLink()) {
|
|
22
|
+
throw new PluginInstallError("skills directory must not be a symbolic link");
|
|
23
|
+
}
|
|
24
|
+
const sourceRoot = await realpath(sourceDir);
|
|
25
|
+
const resolvedSkillsRoot = await resolveContainedSkillSource(sourceRoot, skillsSrc, "skills");
|
|
26
|
+
await assertNoSkillSymlinks(resolvedSkillsRoot, resolvedSkillsRoot);
|
|
27
|
+
for (const dirent of await readdir(resolvedSkillsRoot, { withFileTypes: true })) {
|
|
22
28
|
if (!dirent.isDirectory())
|
|
23
29
|
continue;
|
|
24
|
-
const
|
|
30
|
+
const skillDir = await resolveContainedSkillSource(resolvedSkillsRoot, join(resolvedSkillsRoot, dirent.name), `skills/${dirent.name}`);
|
|
31
|
+
const skillFile = join(skillDir, "SKILL.md");
|
|
25
32
|
if (!existsSync(skillFile))
|
|
26
33
|
continue;
|
|
27
|
-
const
|
|
34
|
+
const resolvedSkillFile = await resolveContainedSkillSource(skillDir, skillFile, `skills/${dirent.name}/SKILL.md`);
|
|
35
|
+
if (!(await stat(resolvedSkillFile)).isFile())
|
|
36
|
+
continue;
|
|
37
|
+
const raw = (await readFile(resolvedSkillFile, "utf-8")).trim();
|
|
28
38
|
if (!FRONTMATTER.test(raw)) {
|
|
29
39
|
throw new PluginInstallError(`skills/${dirent.name}/SKILL.md: missing frontmatter`);
|
|
30
40
|
}
|
|
31
41
|
}
|
|
32
|
-
await cp(
|
|
42
|
+
await cp(resolvedSkillsRoot, join(destDir, "skills"), { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
async function resolveContainedSkillSource(root, candidate, label) {
|
|
45
|
+
let target;
|
|
46
|
+
try {
|
|
47
|
+
target = await realpath(candidate);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
throw new PluginInstallError(`skill source not found: ${label}`);
|
|
51
|
+
}
|
|
52
|
+
const rel = relative(root, target);
|
|
53
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
54
|
+
throw new PluginInstallError(`skill source escapes plugin dir: ${label}`);
|
|
55
|
+
}
|
|
56
|
+
return target;
|
|
57
|
+
}
|
|
58
|
+
async function assertNoSkillSymlinks(root, dir) {
|
|
59
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
60
|
+
const path = join(dir, entry.name);
|
|
61
|
+
const rel = relative(root, path);
|
|
62
|
+
if (entry.isSymbolicLink()) {
|
|
63
|
+
throw new PluginInstallError(`skill source must not contain symbolic links: skills/${rel}`);
|
|
64
|
+
}
|
|
65
|
+
if (entry.isDirectory())
|
|
66
|
+
await assertNoSkillSymlinks(root, path);
|
|
67
|
+
}
|
|
33
68
|
}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
export interface InstallPluginFromPathOptions {
|
|
2
|
+
/** Trusted source identity to persist instead of the temporary projection input path. */
|
|
3
|
+
source?: string;
|
|
4
|
+
/** Trusted distribution version to persist instead of the plugin manifest version. */
|
|
5
|
+
version?: string;
|
|
6
|
+
}
|
|
1
7
|
/**
|
|
2
8
|
* Install a local plugin directory into ~/.code-shell/plugins/<name>/.
|
|
3
9
|
* Builds into a temp sibling dir, then renames into place — a conversion
|
|
4
10
|
* failure leaves nothing behind. `installedAt` is passed in (caller stamps the
|
|
5
11
|
* timestamp) to keep this function pure of the unavailable Date.now().
|
|
6
12
|
*/
|
|
7
|
-
export declare function installPluginFromPath(sourceDir: string, name: string, installedAt: string): Promise<string>;
|
|
13
|
+
export declare function installPluginFromPath(sourceDir: string, name: string, installedAt: string, options?: InstallPluginFromPathOptions): Promise<string>;
|
|
@@ -1,22 +1,21 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
1
2
|
import { existsSync, statSync } from "node:fs";
|
|
2
|
-
import { mkdir, writeFile,
|
|
3
|
-
import { join
|
|
4
|
-
import { detectPluginFormat } from "./detectFormat.js";
|
|
3
|
+
import { mkdir, writeFile, rm, rename } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
5
|
import { pluginInstallDir, pluginsRoot, assertSafePluginName } from "./paths.js";
|
|
6
|
-
import {
|
|
7
|
-
import { convertCodexAgentToml } from "./codex/convertAgents.js";
|
|
8
|
-
import { resolveCodexMcpServers } from "./codex/convertMcp.js";
|
|
9
|
-
import { copyCodexSkills } from "./codex/convertSkills.js";
|
|
10
|
-
import { copyCodexCommands } from "./codex/convertCommands.js";
|
|
6
|
+
import { PluginInstallError } from "./types.js";
|
|
11
7
|
import { appendInstallEntry, pluginInstallKey } from "../installedPlugins.js";
|
|
12
|
-
import {
|
|
8
|
+
import { pluginHookInstallRecord } from "../pluginHookIntegrity.js";
|
|
9
|
+
import { pluginMcpInstallRecord } from "../pluginMcpIntegrity.js";
|
|
10
|
+
import { readPluginMcp } from "./loadPluginMcp.js";
|
|
11
|
+
import { projectPluginSource } from "./projectPluginSource.js";
|
|
13
12
|
/**
|
|
14
13
|
* Install a local plugin directory into ~/.code-shell/plugins/<name>/.
|
|
15
14
|
* Builds into a temp sibling dir, then renames into place — a conversion
|
|
16
15
|
* failure leaves nothing behind. `installedAt` is passed in (caller stamps the
|
|
17
16
|
* timestamp) to keep this function pure of the unavailable Date.now().
|
|
18
17
|
*/
|
|
19
|
-
export async function installPluginFromPath(sourceDir, name, installedAt) {
|
|
18
|
+
export async function installPluginFromPath(sourceDir, name, installedAt, options = {}) {
|
|
20
19
|
assertSafePluginName(name);
|
|
21
20
|
if (!existsSync(sourceDir) || !statSync(sourceDir).isDirectory()) {
|
|
22
21
|
throw new PluginInstallError(`source is not a directory: ${sourceDir}`);
|
|
@@ -26,45 +25,17 @@ export async function installPluginFromPath(sourceDir, name, installedAt) {
|
|
|
26
25
|
throw new PluginInstallError(`plugin '${name}' already installed; uninstall first or rename the source`);
|
|
27
26
|
}
|
|
28
27
|
await mkdir(pluginsRoot(), { recursive: true });
|
|
29
|
-
const tmpDir = join(pluginsRoot(), `.tmp-${name}-${process.pid}`);
|
|
30
|
-
await
|
|
31
|
-
await mkdir(tmpDir, { recursive: true });
|
|
28
|
+
const tmpDir = join(pluginsRoot(), `.tmp-${name}-${process.pid}-${randomUUID()}`);
|
|
29
|
+
await mkdir(tmpDir);
|
|
32
30
|
try {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
// install record (and the UI's "installed version" chip) shows e.g.
|
|
42
|
-
// "v0.1.0" instead of falling back to the literal "local". Best-effort:
|
|
43
|
-
// CC plugins commonly omit version, and the file may be absent/malformed.
|
|
44
|
-
const version = await readCcPluginVersion(sourceDir);
|
|
45
|
-
meta = { name, format: "cc", version, source: sourceDir, installedAt };
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
const manifest = CodexPluginManifest.parse(JSON.parse(await readFile(join(sourceDir, ".codex-plugin", "plugin.json"), "utf-8")));
|
|
49
|
-
// skills (verbatim copy)
|
|
50
|
-
await copyCodexSkills(sourceDir, tmpDir);
|
|
51
|
-
// agents (TOML → MD)
|
|
52
|
-
await convertAgentsInto(sourceDir, tmpDir, name);
|
|
53
|
-
// prompts/ (+ commands/) → commands/ (Codex slash commands == CC commands)
|
|
54
|
-
await copyCodexCommands(sourceDir, tmpDir);
|
|
55
|
-
// mcp → mcp-servers.json keyed <plugin>:<server>
|
|
56
|
-
const servers = resolveCodexMcpServers(sourceDir, manifest.mcpServers);
|
|
57
|
-
const keyed = {};
|
|
58
|
-
for (const [serverName, cfg] of Object.entries(servers)) {
|
|
59
|
-
const key = `${name}:${serverName}`;
|
|
60
|
-
keyed[key] = { ...cfg, name: key };
|
|
61
|
-
}
|
|
62
|
-
if (Object.keys(keyed).length > 0) {
|
|
63
|
-
await writeFile(join(tmpDir, "mcp-servers.json"), JSON.stringify(keyed, null, 2));
|
|
64
|
-
}
|
|
65
|
-
meta = { name, format: "codex", version: manifest.version, source: sourceDir, installedAt };
|
|
66
|
-
}
|
|
67
|
-
rewritePluginVars(tmpDir);
|
|
31
|
+
const projected = await projectPluginSource(sourceDir, tmpDir, name);
|
|
32
|
+
const meta = {
|
|
33
|
+
name,
|
|
34
|
+
format: projected.format,
|
|
35
|
+
version: options.version ?? projected.version,
|
|
36
|
+
source: options.source ?? sourceDir,
|
|
37
|
+
installedAt,
|
|
38
|
+
};
|
|
68
39
|
await writeFile(join(tmpDir, ".cs-meta.json"), JSON.stringify(meta, null, 2));
|
|
69
40
|
await rename(tmpDir, finalDir);
|
|
70
41
|
// Register so existing loaders (scanInstalledPlugins / loadPluginHooks)
|
|
@@ -76,6 +47,8 @@ export async function installPluginFromPath(sourceDir, name, installedAt) {
|
|
|
76
47
|
version: meta.version ?? "local",
|
|
77
48
|
installedAt,
|
|
78
49
|
lastUpdated: installedAt,
|
|
50
|
+
...pluginHookInstallRecord(finalDir),
|
|
51
|
+
...pluginMcpInstallRecord(finalDir, Object.keys(readPluginMcp(finalDir, name)).length > 0),
|
|
79
52
|
});
|
|
80
53
|
return finalDir;
|
|
81
54
|
}
|
|
@@ -84,42 +57,3 @@ export async function installPluginFromPath(sourceDir, name, installedAt) {
|
|
|
84
57
|
throw err;
|
|
85
58
|
}
|
|
86
59
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Best-effort read of a CC plugin's declared version from
|
|
89
|
-
* <sourceDir>/.claude-plugin/plugin.json. Returns undefined when the file is
|
|
90
|
-
* absent, unparseable, or has no string `version` — the caller then records the
|
|
91
|
-
* install without a version (UI shows the source tag instead of a number).
|
|
92
|
-
*/
|
|
93
|
-
async function readCcPluginVersion(sourceDir) {
|
|
94
|
-
try {
|
|
95
|
-
const raw = await readFile(join(sourceDir, ".claude-plugin", "plugin.json"), "utf-8");
|
|
96
|
-
const v = JSON.parse(raw).version;
|
|
97
|
-
return typeof v === "string" && v.length > 0 ? v : undefined;
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/** Walk <sourceDir>/agents/**.toml → <destDir>/agents/**.md (structure preserved). */
|
|
104
|
-
async function convertAgentsInto(sourceDir, destDir, pluginName) {
|
|
105
|
-
const agentsSrc = join(sourceDir, "agents");
|
|
106
|
-
if (!existsSync(agentsSrc))
|
|
107
|
-
return;
|
|
108
|
-
const walk = async (dir) => {
|
|
109
|
-
for (const dirent of await readdir(dir, { withFileTypes: true })) {
|
|
110
|
-
const abs = join(dir, dirent.name);
|
|
111
|
-
if (dirent.isDirectory()) {
|
|
112
|
-
await walk(abs);
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
if (!dirent.name.endsWith(".toml"))
|
|
116
|
-
continue;
|
|
117
|
-
const rel = relative(agentsSrc, abs).replace(/\.toml$/, ".md");
|
|
118
|
-
const outPath = join(destDir, "agents", rel);
|
|
119
|
-
await mkdir(join(outPath, ".."), { recursive: true });
|
|
120
|
-
const md = convertCodexAgentToml(await readFile(abs, "utf-8"), rel, pluginName);
|
|
121
|
-
await writeFile(outPath, md);
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
await walk(agentsSrc);
|
|
125
|
-
}
|
|
@@ -9,6 +9,15 @@ export interface InstallLocalOptions {
|
|
|
9
9
|
*/
|
|
10
10
|
overwrite?: boolean;
|
|
11
11
|
}
|
|
12
|
+
export interface LocalPluginSourceInput {
|
|
13
|
+
kind: "dir" | "zip";
|
|
14
|
+
path: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a directory/zip input to its actual plugin root. Zip extraction is
|
|
18
|
+
* private and always cleaned after the callback settles.
|
|
19
|
+
*/
|
|
20
|
+
export declare function withLocalPluginSourceRoot<T>(input: LocalPluginSourceInput, operation: (root: string) => Promise<T>): Promise<T>;
|
|
12
21
|
/**
|
|
13
22
|
* Install a local plugin from a .zip archive.
|
|
14
23
|
*
|
|
@@ -34,10 +43,23 @@ export declare function installPluginFromArchive(zipPath: string, installedAt: s
|
|
|
34
43
|
* a repo checkout whose plugin sits one level down, and so the name comes from
|
|
35
44
|
* the manifest rather than forcing the caller to guess it.
|
|
36
45
|
*/
|
|
37
|
-
export declare function installLocalPlugin(input: {
|
|
38
|
-
kind: "dir" | "zip";
|
|
39
|
-
path: string;
|
|
40
|
-
}, installedAt: string, name?: string, options?: InstallLocalOptions): Promise<{
|
|
46
|
+
export declare function installLocalPlugin(input: LocalPluginSourceInput, installedAt: string, name?: string, options?: InstallLocalOptions): Promise<{
|
|
41
47
|
dir: string;
|
|
42
48
|
name: string;
|
|
43
49
|
}>;
|
|
50
|
+
/**
|
|
51
|
+
* A plugin root is a dir that holds a recognizable manifest or component dir.
|
|
52
|
+
* Zip archives commonly wrap everything in a single top-level folder, so if
|
|
53
|
+
* `dir` itself isn't a plugin root but contains exactly one subdirectory, dive
|
|
54
|
+
* one level. Only one level — deeper nesting is treated as malformed.
|
|
55
|
+
*/
|
|
56
|
+
export declare function findPluginRoot(dir: string): Promise<string>;
|
|
57
|
+
/** Read the `name` field from a CC or Codex manifest; fall back to the dir name. */
|
|
58
|
+
export declare function deriveName(root: string): Promise<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Coerce an arbitrary derived name into a safe single path segment:
|
|
61
|
+
* lowercase, only [a-z0-9._-], collapse the rest to '-'. assertSafePluginName
|
|
62
|
+
* (called by installPluginFromPath) rejects separators outright; this makes a
|
|
63
|
+
* manifest name like "My Plugin" usable instead of erroring.
|
|
64
|
+
*/
|
|
65
|
+
export declare function normalizePluginName(raw: string): string;
|
|
@@ -7,6 +7,38 @@ import { installPluginFromPath } from "./install.js";
|
|
|
7
7
|
import { reinstallAtomic } from "./update.js";
|
|
8
8
|
import { pluginInstallDir } from "./paths.js";
|
|
9
9
|
import { PluginInstallError } from "./types.js";
|
|
10
|
+
const MAX_LOCAL_PLUGIN_SOURCE_PATH = 4096;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a directory/zip input to its actual plugin root. Zip extraction is
|
|
13
|
+
* private and always cleaned after the callback settles.
|
|
14
|
+
*/
|
|
15
|
+
export async function withLocalPluginSourceRoot(input, operation) {
|
|
16
|
+
if (!input ||
|
|
17
|
+
(input.kind !== "dir" && input.kind !== "zip") ||
|
|
18
|
+
typeof input.path !== "string" ||
|
|
19
|
+
input.path.length === 0 ||
|
|
20
|
+
input.path.length > MAX_LOCAL_PLUGIN_SOURCE_PATH ||
|
|
21
|
+
input.path.includes("\0")) {
|
|
22
|
+
throw new PluginInstallError("local plugin source is invalid");
|
|
23
|
+
}
|
|
24
|
+
if (input.kind === "dir") {
|
|
25
|
+
if (!existsSync(input.path) || !statSync(input.path).isDirectory()) {
|
|
26
|
+
throw new PluginInstallError(`source is not a directory: ${input.path}`);
|
|
27
|
+
}
|
|
28
|
+
return operation(await findPluginRoot(input.path));
|
|
29
|
+
}
|
|
30
|
+
if (!existsSync(input.path) || !statSync(input.path).isFile()) {
|
|
31
|
+
throw new PluginInstallError(`archive is not a file: ${input.path}`);
|
|
32
|
+
}
|
|
33
|
+
const tmp = await mkdtemp(join(tmpdir(), "cs-tmp-zip-"));
|
|
34
|
+
try {
|
|
35
|
+
await extractZip(input.path, tmp);
|
|
36
|
+
return await operation(await findPluginRoot(tmp));
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await rm(tmp, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
10
42
|
/**
|
|
11
43
|
* Install `root` as plugin `name`, atomically replacing an already-installed
|
|
12
44
|
* plugin of the same name when `overwrite` is set. When no same-name plugin
|
|
@@ -35,22 +67,11 @@ async function installRootMaybeOverwrite(root, resolvedName, installedAt, overwr
|
|
|
35
67
|
* caller stamps `installedAt` to keep this pure of the unavailable Date.now().
|
|
36
68
|
*/
|
|
37
69
|
export async function installPluginFromArchive(zipPath, installedAt, name, options) {
|
|
38
|
-
|
|
39
|
-
throw new PluginInstallError(`archive is not a file: ${zipPath}`);
|
|
40
|
-
}
|
|
41
|
-
const tmp = await mkdtemp(join(tmpdir(), "cs-tmp-zip-"));
|
|
42
|
-
try {
|
|
43
|
-
await extractZip(zipPath, tmp);
|
|
44
|
-
const root = await findPluginRoot(tmp);
|
|
70
|
+
return withLocalPluginSourceRoot({ kind: "zip", path: zipPath }, async (root) => {
|
|
45
71
|
const resolvedName = normalizePluginName(name ?? (await deriveName(root)));
|
|
46
|
-
// Overwrite (when set) runs inside this try so the extracted `root` is still
|
|
47
|
-
// present while reinstallAtomic installs from it; the finally removes tmp.
|
|
48
72
|
const dir = await installRootMaybeOverwrite(root, resolvedName, installedAt, options?.overwrite ?? false);
|
|
49
73
|
return { dir, name: resolvedName };
|
|
50
|
-
}
|
|
51
|
-
finally {
|
|
52
|
-
await rm(tmp, { recursive: true, force: true });
|
|
53
|
-
}
|
|
74
|
+
});
|
|
54
75
|
}
|
|
55
76
|
/**
|
|
56
77
|
* Unified local-install entry for the desktop/UI: takes either a directory or
|
|
@@ -62,16 +83,11 @@ export async function installPluginFromArchive(zipPath, installedAt, name, optio
|
|
|
62
83
|
* the manifest rather than forcing the caller to guess it.
|
|
63
84
|
*/
|
|
64
85
|
export async function installLocalPlugin(input, installedAt, name, options) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
const root = await findPluginRoot(input.path);
|
|
72
|
-
const resolvedName = normalizePluginName(name ?? (await deriveName(root)));
|
|
73
|
-
const dir = await installRootMaybeOverwrite(root, resolvedName, installedAt, options?.overwrite ?? false);
|
|
74
|
-
return { dir, name: resolvedName };
|
|
86
|
+
return withLocalPluginSourceRoot(input, async (root) => {
|
|
87
|
+
const resolvedName = normalizePluginName(name ?? (await deriveName(root)));
|
|
88
|
+
const dir = await installRootMaybeOverwrite(root, resolvedName, installedAt, options?.overwrite ?? false);
|
|
89
|
+
return { dir, name: resolvedName };
|
|
90
|
+
});
|
|
75
91
|
}
|
|
76
92
|
/**
|
|
77
93
|
* A plugin root is a dir that holds a recognizable manifest or component dir.
|
|
@@ -79,7 +95,7 @@ export async function installLocalPlugin(input, installedAt, name, options) {
|
|
|
79
95
|
* `dir` itself isn't a plugin root but contains exactly one subdirectory, dive
|
|
80
96
|
* one level. Only one level — deeper nesting is treated as malformed.
|
|
81
97
|
*/
|
|
82
|
-
async function findPluginRoot(dir) {
|
|
98
|
+
export async function findPluginRoot(dir) {
|
|
83
99
|
if (looksLikePluginRoot(dir))
|
|
84
100
|
return dir;
|
|
85
101
|
const entries = await readdir(dir, { withFileTypes: true });
|
|
@@ -97,7 +113,7 @@ function looksLikePluginRoot(dir) {
|
|
|
97
113
|
["skills", "commands", "agents", "hooks"].some((d) => existsSync(join(dir, d))));
|
|
98
114
|
}
|
|
99
115
|
/** Read the `name` field from a CC or Codex manifest; fall back to the dir name. */
|
|
100
|
-
async function deriveName(root) {
|
|
116
|
+
export async function deriveName(root) {
|
|
101
117
|
for (const rel of [
|
|
102
118
|
[".claude-plugin", "plugin.json"],
|
|
103
119
|
[".codex-plugin", "plugin.json"],
|
|
@@ -122,13 +138,14 @@ async function deriveName(root) {
|
|
|
122
138
|
* (called by installPluginFromPath) rejects separators outright; this makes a
|
|
123
139
|
* manifest name like "My Plugin" usable instead of erroring.
|
|
124
140
|
*/
|
|
125
|
-
function normalizePluginName(raw) {
|
|
141
|
+
export function normalizePluginName(raw) {
|
|
126
142
|
const cleaned = raw
|
|
127
143
|
.trim()
|
|
128
144
|
.toLowerCase()
|
|
129
145
|
.replace(/[^a-z0-9._-]+/g, "-")
|
|
130
146
|
.replace(/^[-.]+|[-.]+$/g, "");
|
|
131
|
-
if (!cleaned)
|
|
147
|
+
if (!cleaned) {
|
|
132
148
|
throw new PluginInstallError(`cannot derive a valid plugin name from: ${JSON.stringify(raw)}`);
|
|
149
|
+
}
|
|
133
150
|
return cleaned;
|
|
134
151
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ParsedSource } from "./parseSource.js";
|
|
2
|
+
export declare const NPM_PUBLIC_REGISTRY = "https://registry.npmjs.org";
|
|
3
|
+
export declare const MAX_NPM_METADATA_BYTES: number;
|
|
4
|
+
export interface ResolvedNpmPlugin {
|
|
5
|
+
packageName: string;
|
|
6
|
+
requestedSelector: string;
|
|
7
|
+
resolvedVersion: string;
|
|
8
|
+
tarballUrl: string;
|
|
9
|
+
integrity: string;
|
|
10
|
+
}
|
|
11
|
+
export type NpmPluginFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
12
|
+
export interface NpmPluginInstallOptions {
|
|
13
|
+
/** Test seam; production always uses the platform fetch implementation. */
|
|
14
|
+
fetch?: NpmPluginFetch;
|
|
15
|
+
}
|
|
16
|
+
/** Resolve an exact version or dist-tag to an immutable public-registry snapshot. */
|
|
17
|
+
export declare function resolveNpmPlugin(parsed: Extract<ParsedSource, {
|
|
18
|
+
kind: "npm";
|
|
19
|
+
}>, options?: NpmPluginInstallOptions): Promise<ResolvedNpmPlugin>;
|
|
20
|
+
/** Download a tarball with a compressed-byte cap and verify SHA-512 before use. */
|
|
21
|
+
export declare function downloadVerifiedNpmTarball(resolution: ResolvedNpmPlugin, targetPath: string, options?: NpmPluginInstallOptions): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Install a self-contained plugin from the public npm registry. The resolved
|
|
24
|
+
* exact version is recorded as the source; Phase A deliberately has no npm
|
|
25
|
+
* dependency install, lifecycle execution, private registry, or auto-update.
|
|
26
|
+
*/
|
|
27
|
+
export declare function installPluginFromNpm(parsed: ParsedSource, name: string | undefined, installedAt: string, options?: NpmPluginInstallOptions): Promise<{
|
|
28
|
+
dir: string;
|
|
29
|
+
name: string;
|
|
30
|
+
resolution: ResolvedNpmPlugin;
|
|
31
|
+
}>;
|