opensip-cli 0.1.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 +202 -0
- package/NOTICE +8 -0
- package/README.md +51 -0
- package/dist/api.d.ts +17 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +16 -0
- package/dist/api.js.map +1 -0
- package/dist/bootstrap/admit-tool-package.d.ts +117 -0
- package/dist/bootstrap/admit-tool-package.d.ts.map +1 -0
- package/dist/bootstrap/admit-tool-package.js +170 -0
- package/dist/bootstrap/admit-tool-package.js.map +1 -0
- package/dist/bootstrap/baseline-seams.d.ts +30 -0
- package/dist/bootstrap/baseline-seams.d.ts.map +1 -0
- package/dist/bootstrap/baseline-seams.js +156 -0
- package/dist/bootstrap/baseline-seams.js.map +1 -0
- package/dist/bootstrap/bootstrap-error.d.ts +41 -0
- package/dist/bootstrap/bootstrap-error.d.ts.map +1 -0
- package/dist/bootstrap/bootstrap-error.js +33 -0
- package/dist/bootstrap/bootstrap-error.js.map +1 -0
- package/dist/bootstrap/build-command-registration-input.d.ts +34 -0
- package/dist/bootstrap/build-command-registration-input.d.ts.map +1 -0
- package/dist/bootstrap/build-command-registration-input.js +73 -0
- package/dist/bootstrap/build-command-registration-input.js.map +1 -0
- package/dist/bootstrap/build-per-run-scope.d.ts +62 -0
- package/dist/bootstrap/build-per-run-scope.d.ts.map +1 -0
- package/dist/bootstrap/build-per-run-scope.js +152 -0
- package/dist/bootstrap/build-per-run-scope.js.map +1 -0
- package/dist/bootstrap/build-targets.d.ts +42 -0
- package/dist/bootstrap/build-targets.d.ts.map +1 -0
- package/dist/bootstrap/build-targets.js +117 -0
- package/dist/bootstrap/build-targets.js.map +1 -0
- package/dist/bootstrap/cli-defaults.d.ts +35 -0
- package/dist/bootstrap/cli-defaults.d.ts.map +1 -0
- package/dist/bootstrap/cli-defaults.js +65 -0
- package/dist/bootstrap/cli-defaults.js.map +1 -0
- package/dist/bootstrap/config-and-capabilities.d.ts +74 -0
- package/dist/bootstrap/config-and-capabilities.d.ts.map +1 -0
- package/dist/bootstrap/config-and-capabilities.js +224 -0
- package/dist/bootstrap/config-and-capabilities.js.map +1 -0
- package/dist/bootstrap/deliver-envelope.d.ts +80 -0
- package/dist/bootstrap/deliver-envelope.d.ts.map +1 -0
- package/dist/bootstrap/deliver-envelope.js +195 -0
- package/dist/bootstrap/deliver-envelope.js.map +1 -0
- package/dist/bootstrap/egress-plane.d.ts +22 -0
- package/dist/bootstrap/egress-plane.d.ts.map +1 -0
- package/dist/bootstrap/egress-plane.js +37 -0
- package/dist/bootstrap/egress-plane.js.map +1 -0
- package/dist/bootstrap/host-planes.d.ts +28 -0
- package/dist/bootstrap/host-planes.d.ts.map +1 -0
- package/dist/bootstrap/host-planes.js +152 -0
- package/dist/bootstrap/host-planes.js.map +1 -0
- package/dist/bootstrap/index.d.ts +76 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +109 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/bootstrap/live-plane.d.ts +51 -0
- package/dist/bootstrap/live-plane.d.ts.map +1 -0
- package/dist/bootstrap/live-plane.js +72 -0
- package/dist/bootstrap/live-plane.js.map +1 -0
- package/dist/bootstrap/load-tool-capabilities.d.ts +42 -0
- package/dist/bootstrap/load-tool-capabilities.d.ts.map +1 -0
- package/dist/bootstrap/load-tool-capabilities.js +76 -0
- package/dist/bootstrap/load-tool-capabilities.js.map +1 -0
- package/dist/bootstrap/output-plane.d.ts +37 -0
- package/dist/bootstrap/output-plane.d.ts.map +1 -0
- package/dist/bootstrap/output-plane.js +114 -0
- package/dist/bootstrap/output-plane.js.map +1 -0
- package/dist/bootstrap/owning-tool-init.d.ts +32 -0
- package/dist/bootstrap/owning-tool-init.d.ts.map +1 -0
- package/dist/bootstrap/owning-tool-init.js +69 -0
- package/dist/bootstrap/owning-tool-init.js.map +1 -0
- package/dist/bootstrap/pre-action-guards.d.ts +44 -0
- package/dist/bootstrap/pre-action-guards.d.ts.map +1 -0
- package/dist/bootstrap/pre-action-guards.js +136 -0
- package/dist/bootstrap/pre-action-guards.js.map +1 -0
- package/dist/bootstrap/pre-action-hook.d.ts +68 -0
- package/dist/bootstrap/pre-action-hook.d.ts.map +1 -0
- package/dist/bootstrap/pre-action-hook.js +289 -0
- package/dist/bootstrap/pre-action-hook.js.map +1 -0
- package/dist/bootstrap/pre-action-messages.d.ts +32 -0
- package/dist/bootstrap/pre-action-messages.d.ts.map +1 -0
- package/dist/bootstrap/pre-action-messages.js +49 -0
- package/dist/bootstrap/pre-action-messages.js.map +1 -0
- package/dist/bootstrap/process-idempotency.d.ts +17 -0
- package/dist/bootstrap/process-idempotency.d.ts.map +1 -0
- package/dist/bootstrap/process-idempotency.js +20 -0
- package/dist/bootstrap/process-idempotency.js.map +1 -0
- package/dist/bootstrap/register-language-adapters.d.ts +23 -0
- package/dist/bootstrap/register-language-adapters.d.ts.map +1 -0
- package/dist/bootstrap/register-language-adapters.js +35 -0
- package/dist/bootstrap/register-language-adapters.js.map +1 -0
- package/dist/bootstrap/register-tools.d.ts +228 -0
- package/dist/bootstrap/register-tools.d.ts.map +1 -0
- package/dist/bootstrap/register-tools.js +696 -0
- package/dist/bootstrap/register-tools.js.map +1 -0
- package/dist/bootstrap/render.d.ts +27 -0
- package/dist/bootstrap/render.d.ts.map +1 -0
- package/dist/bootstrap/render.js +53 -0
- package/dist/bootstrap/render.js.map +1 -0
- package/dist/bootstrap/report.d.ts +34 -0
- package/dist/bootstrap/report.d.ts.map +1 -0
- package/dist/bootstrap/report.js +47 -0
- package/dist/bootstrap/report.js.map +1 -0
- package/dist/bootstrap/run-plane.d.ts +105 -0
- package/dist/bootstrap/run-plane.d.ts.map +1 -0
- package/dist/bootstrap/run-plane.js +190 -0
- package/dist/bootstrap/run-plane.js.map +1 -0
- package/dist/bootstrap/scope-access.d.ts +68 -0
- package/dist/bootstrap/scope-access.d.ts.map +1 -0
- package/dist/bootstrap/scope-access.js +115 -0
- package/dist/bootstrap/scope-access.js.map +1 -0
- package/dist/bootstrap/state-seams.d.ts +14 -0
- package/dist/bootstrap/state-seams.d.ts.map +1 -0
- package/dist/bootstrap/state-seams.js +26 -0
- package/dist/bootstrap/state-seams.js.map +1 -0
- package/dist/bootstrap/tool-lifecycle.d.ts +102 -0
- package/dist/bootstrap/tool-lifecycle.d.ts.map +1 -0
- package/dist/bootstrap/tool-lifecycle.js +103 -0
- package/dist/bootstrap/tool-lifecycle.js.map +1 -0
- package/dist/bootstrap/tool-trust.d.ts +49 -0
- package/dist/bootstrap/tool-trust.d.ts.map +1 -0
- package/dist/bootstrap/tool-trust.js +65 -0
- package/dist/bootstrap/tool-trust.js.map +1 -0
- package/dist/bootstrap/validate-tool.d.ts +22 -0
- package/dist/bootstrap/validate-tool.d.ts.map +1 -0
- package/dist/bootstrap/validate-tool.js +38 -0
- package/dist/bootstrap/validate-tool.js.map +1 -0
- package/dist/cli-context.d.ts +38 -0
- package/dist/cli-context.d.ts.map +1 -0
- package/dist/cli-context.js +134 -0
- package/dist/cli-context.js.map +1 -0
- package/dist/commands/agent-catalog.d.ts +45 -0
- package/dist/commands/agent-catalog.d.ts.map +1 -0
- package/dist/commands/agent-catalog.js +115 -0
- package/dist/commands/agent-catalog.js.map +1 -0
- package/dist/commands/assemble-outcome.d.ts +69 -0
- package/dist/commands/assemble-outcome.d.ts.map +1 -0
- package/dist/commands/assemble-outcome.js +121 -0
- package/dist/commands/assemble-outcome.js.map +1 -0
- package/dist/commands/clear.d.ts +32 -0
- package/dist/commands/clear.d.ts.map +1 -0
- package/dist/commands/clear.js +73 -0
- package/dist/commands/clear.js.map +1 -0
- package/dist/commands/completion.d.ts +90 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +233 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/configure.d.ts +32 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/configure.js +94 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/commands/history.d.ts +18 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +48 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/host-command-specs.d.ts +49 -0
- package/dist/commands/host-command-specs.d.ts.map +1 -0
- package/dist/commands/host-command-specs.js +331 -0
- package/dist/commands/host-command-specs.js.map +1 -0
- package/dist/commands/host-subcommand-groups.d.ts +69 -0
- package/dist/commands/host-subcommand-groups.d.ts.map +1 -0
- package/dist/commands/host-subcommand-groups.js +374 -0
- package/dist/commands/host-subcommand-groups.js.map +1 -0
- package/dist/commands/index.d.ts +36 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +36 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init/config-templates.d.ts +16 -0
- package/dist/commands/init/config-templates.d.ts.map +1 -0
- package/dist/commands/init/config-templates.js +108 -0
- package/dist/commands/init/config-templates.js.map +1 -0
- package/dist/commands/init/file-classifier.d.ts +40 -0
- package/dist/commands/init/file-classifier.d.ts.map +1 -0
- package/dist/commands/init/file-classifier.js +155 -0
- package/dist/commands/init/file-classifier.js.map +1 -0
- package/dist/commands/init/language-detection.d.ts +44 -0
- package/dist/commands/init/language-detection.d.ts.map +1 -0
- package/dist/commands/init/language-detection.js +124 -0
- package/dist/commands/init/language-detection.js.map +1 -0
- package/dist/commands/init/scaffold-writer.d.ts +26 -0
- package/dist/commands/init/scaffold-writer.d.ts.map +1 -0
- package/dist/commands/init/scaffold-writer.js +102 -0
- package/dist/commands/init/scaffold-writer.js.map +1 -0
- package/dist/commands/init/state-machine.d.ts +32 -0
- package/dist/commands/init/state-machine.d.ts.map +1 -0
- package/dist/commands/init/state-machine.js +105 -0
- package/dist/commands/init/state-machine.js.map +1 -0
- package/dist/commands/init.d.ts +95 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +209 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mount-command-spec.d.ts +106 -0
- package/dist/commands/mount-command-spec.d.ts.map +1 -0
- package/dist/commands/mount-command-spec.js +313 -0
- package/dist/commands/mount-command-spec.js.map +1 -0
- package/dist/commands/mount-result-command.d.ts +71 -0
- package/dist/commands/mount-result-command.d.ts.map +1 -0
- package/dist/commands/mount-result-command.js +76 -0
- package/dist/commands/mount-result-command.js.map +1 -0
- package/dist/commands/plugin/config-edit.d.ts +20 -0
- package/dist/commands/plugin/config-edit.d.ts.map +1 -0
- package/dist/commands/plugin/config-edit.js +102 -0
- package/dist/commands/plugin/config-edit.js.map +1 -0
- package/dist/commands/plugin/domain-resolution.d.ts +38 -0
- package/dist/commands/plugin/domain-resolution.d.ts.map +1 -0
- package/dist/commands/plugin/domain-resolution.js +98 -0
- package/dist/commands/plugin/domain-resolution.js.map +1 -0
- package/dist/commands/plugin/host-dir.d.ts +42 -0
- package/dist/commands/plugin/host-dir.d.ts.map +1 -0
- package/dist/commands/plugin/host-dir.js +168 -0
- package/dist/commands/plugin/host-dir.js.map +1 -0
- package/dist/commands/plugin-host-ops.d.ts +41 -0
- package/dist/commands/plugin-host-ops.d.ts.map +1 -0
- package/dist/commands/plugin-host-ops.js +114 -0
- package/dist/commands/plugin-host-ops.js.map +1 -0
- package/dist/commands/plugin.d.ts +81 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +287 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/render-outcome.d.ts +52 -0
- package/dist/commands/render-outcome.d.ts.map +1 -0
- package/dist/commands/render-outcome.js +55 -0
- package/dist/commands/render-outcome.js.map +1 -0
- package/dist/commands/session-show.d.ts +27 -0
- package/dist/commands/session-show.d.ts.map +1 -0
- package/dist/commands/session-show.js +166 -0
- package/dist/commands/session-show.js.map +1 -0
- package/dist/commands/shared.d.ts +107 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +13 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/tools/data-purge.d.ts +20 -0
- package/dist/commands/tools/data-purge.d.ts.map +1 -0
- package/dist/commands/tools/data-purge.js +59 -0
- package/dist/commands/tools/data-purge.js.map +1 -0
- package/dist/commands/tools/index.d.ts +16 -0
- package/dist/commands/tools/index.d.ts.map +1 -0
- package/dist/commands/tools/index.js +213 -0
- package/dist/commands/tools/index.js.map +1 -0
- package/dist/commands/tools/install.d.ts +24 -0
- package/dist/commands/tools/install.d.ts.map +1 -0
- package/dist/commands/tools/install.js +83 -0
- package/dist/commands/tools/install.js.map +1 -0
- package/dist/commands/tools/list.d.ts +41 -0
- package/dist/commands/tools/list.d.ts.map +1 -0
- package/dist/commands/tools/list.js +103 -0
- package/dist/commands/tools/list.js.map +1 -0
- package/dist/commands/tools/runtime-probe-entry.d.ts +14 -0
- package/dist/commands/tools/runtime-probe-entry.d.ts.map +1 -0
- package/dist/commands/tools/runtime-probe-entry.js +36 -0
- package/dist/commands/tools/runtime-probe-entry.js.map +1 -0
- package/dist/commands/tools/runtime-probe.d.ts +29 -0
- package/dist/commands/tools/runtime-probe.d.ts.map +1 -0
- package/dist/commands/tools/runtime-probe.js +66 -0
- package/dist/commands/tools/runtime-probe.js.map +1 -0
- package/dist/commands/tools/storage-contract-checks.d.ts +37 -0
- package/dist/commands/tools/storage-contract-checks.d.ts.map +1 -0
- package/dist/commands/tools/storage-contract-checks.js +91 -0
- package/dist/commands/tools/storage-contract-checks.js.map +1 -0
- package/dist/commands/tools/uninstall.d.ts +29 -0
- package/dist/commands/tools/uninstall.d.ts.map +1 -0
- package/dist/commands/tools/uninstall.js +77 -0
- package/dist/commands/tools/uninstall.js.map +1 -0
- package/dist/commands/tools/validate.d.ts +44 -0
- package/dist/commands/tools/validate.d.ts.map +1 -0
- package/dist/commands/tools/validate.js +202 -0
- package/dist/commands/tools/validate.js.map +1 -0
- package/dist/commands/uninstall/targets.d.ts +53 -0
- package/dist/commands/uninstall/targets.d.ts.map +1 -0
- package/dist/commands/uninstall/targets.js +205 -0
- package/dist/commands/uninstall/targets.js.map +1 -0
- package/dist/commands/uninstall.d.ts +88 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +184 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/env/host-env-specs.d.ts +52 -0
- package/dist/env/host-env-specs.d.ts.map +1 -0
- package/dist/env/host-env-specs.js +129 -0
- package/dist/env/host-env-specs.js.map +1 -0
- package/dist/error-handler.d.ts +64 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +180 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/open-report.d.ts +40 -0
- package/dist/open-report.d.ts.map +1 -0
- package/dist/open-report.js +54 -0
- package/dist/open-report.js.map +1 -0
- package/dist/report-compose.d.ts +35 -0
- package/dist/report-compose.d.ts.map +1 -0
- package/dist/report-compose.js +103 -0
- package/dist/report-compose.js.map +1 -0
- package/dist/session-replay-registry.d.ts +20 -0
- package/dist/session-replay-registry.d.ts.map +1 -0
- package/dist/session-replay-registry.js +38 -0
- package/dist/session-replay-registry.js.map +1 -0
- package/dist/telemetry/profiling.d.ts +42 -0
- package/dist/telemetry/profiling.d.ts.map +1 -0
- package/dist/telemetry/profiling.js +160 -0
- package/dist/telemetry/profiling.js.map +1 -0
- package/dist/telemetry/sdk-init.d.ts +87 -0
- package/dist/telemetry/sdk-init.d.ts.map +1 -0
- package/dist/telemetry/sdk-init.js +235 -0
- package/dist/telemetry/sdk-init.js.map +1 -0
- package/dist/ui/App.d.ts +32 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +35 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/render.d.ts +15 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +21 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/result-to-view.d.ts +40 -0
- package/dist/ui/result-to-view.d.ts.map +1 -0
- package/dist/ui/result-to-view.js +389 -0
- package/dist/ui/result-to-view.js.map +1 -0
- package/dist/ui/views/init-view.d.ts +9 -0
- package/dist/ui/views/init-view.d.ts.map +1 -0
- package/dist/ui/views/init-view.js +119 -0
- package/dist/ui/views/init-view.js.map +1 -0
- package/dist/ui/views/misc-views.d.ts +18 -0
- package/dist/ui/views/misc-views.d.ts.map +1 -0
- package/dist/ui/views/misc-views.js +244 -0
- package/dist/ui/views/misc-views.js.map +1 -0
- package/dist/ui/views/plugin-view.d.ts +8 -0
- package/dist/ui/views/plugin-view.d.ts.map +1 -0
- package/dist/ui/views/plugin-view.js +135 -0
- package/dist/ui/views/plugin-view.js.map +1 -0
- package/dist/ui/views/tools-views.d.ts +12 -0
- package/dist/ui/views/tools-views.d.ts.map +1 -0
- package/dist/ui/views/tools-views.js +152 -0
- package/dist/ui/views/tools-views.js.map +1 -0
- package/dist/update-notifier.d.ts +108 -0
- package/dist/update-notifier.d.ts.map +1 -0
- package/dist/update-notifier.js +188 -0
- package/dist/update-notifier.js.map +1 -0
- package/dist/update-state.d.ts +40 -0
- package/dist/update-state.d.ts.map +1 -0
- package/dist/update-state.js +81 -0
- package/dist/update-state.js.map +1 -0
- package/dist/welcome.d.ts +53 -0
- package/dist/welcome.d.ts.map +1 -0
- package/dist/welcome.js +89 -0
- package/dist/welcome.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* shared — the registrar context type used by every CLI-owned (host) command.
|
|
3
|
+
*
|
|
4
|
+
* Launch Phase 6 moved the host commands onto the declarative
|
|
5
|
+
* `CommandSpec` plane (`host-command-specs.ts` / `host-subcommand-groups.ts`),
|
|
6
|
+
* which sources `--cwd` / `--json` from the ADR-0021 common-flag registry
|
|
7
|
+
* directly (via `commonFlags: ['cwd', 'json']`). The former
|
|
8
|
+
* `CWD_OPTION_SPEC` / `JSON_DESC` re-export constants — used only by the
|
|
9
|
+
* deleted `register-*.ts` registrars — are gone; this module now carries just
|
|
10
|
+
* the shared context type.
|
|
11
|
+
*/
|
|
12
|
+
import type { SpecLike } from './completion.js';
|
|
13
|
+
import type { SessionReplayRegistry } from '../session-replay-registry.js';
|
|
14
|
+
import type { CommandResult } from '@opensip-cli/contracts';
|
|
15
|
+
import type { PluginLayout, ScaffoldContext, ScaffoldFile } from '@opensip-cli/core';
|
|
16
|
+
/**
|
|
17
|
+
* One registered tool's `init`-scaffold contribution (ADR-0038): its structural
|
|
18
|
+
* `pluginLayout` (domain + userSubdirs the host `mkdir`s) plus the optional
|
|
19
|
+
* tool-owned example/config hooks. Derived from the tool registry by the host; the
|
|
20
|
+
* init command iterates these instead of hardcoding fit/sim.
|
|
21
|
+
*/
|
|
22
|
+
export interface ToolScaffold {
|
|
23
|
+
readonly layout: PluginLayout;
|
|
24
|
+
readonly scaffoldExamples?: (ctx: ScaffoldContext) => readonly ScaffoldFile[];
|
|
25
|
+
readonly stableExampleIds?: () => readonly string[];
|
|
26
|
+
readonly scaffoldConfigBlock?: () => string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Context the orchestrator (`registerCliCommands`) hands to every
|
|
30
|
+
* sub-registrar. The `setExitCode` write path mirrors `ToolCliContext`'s
|
|
31
|
+
* — exit-code mutations route through here, never through direct
|
|
32
|
+
* `process.exitCode` writes.
|
|
33
|
+
*/
|
|
34
|
+
export interface CliCommandsContext {
|
|
35
|
+
readonly setExitCode: (code: number) => void;
|
|
36
|
+
readonly render: (result: CommandResult) => Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Success machine-output seam — wraps the value in a `CommandOutcome` via the
|
|
39
|
+
* single `renderOutcome` seam (launch, §5.5). Always supplied by the host
|
|
40
|
+
* (sourced from {@link ToolCliContext.emitJson}); required so raw-stream host
|
|
41
|
+
* commands (`sessions show`) never fall back to a direct `process.stdout.write`.
|
|
42
|
+
*/
|
|
43
|
+
readonly emitJson: (value: unknown) => void;
|
|
44
|
+
/**
|
|
45
|
+
* RAW_STREAM machine-output seam — the host-command mirror of
|
|
46
|
+
* {@link ToolCliContext.emitRaw}. Emits the bare, unwrapped payload for a host
|
|
47
|
+
* command that declares `output:'raw-stream'` (`sessions show --raw`), so it
|
|
48
|
+
* never falls back to a direct `process.stdout.write`; the actual write lives
|
|
49
|
+
* in the single `renderRaw` seam.
|
|
50
|
+
*/
|
|
51
|
+
readonly emitRaw: (value: unknown) => void;
|
|
52
|
+
/**
|
|
53
|
+
* Structured-error machine-output seam (launch, §5.5) — the host-command
|
|
54
|
+
* mirror of {@link ToolCliContext.emitError}. A failed `--json` host command
|
|
55
|
+
* (e.g. `sessions show`) emits its diagnosed failure through here so it rides
|
|
56
|
+
* the single `renderOutcome` seam as a `status:'error'` `CommandOutcome`,
|
|
57
|
+
* never a bare `emitJson({ error })`. Sourced from the same context closure as
|
|
58
|
+
* the tool seam, so exit code and reported outcome stay in agreement.
|
|
59
|
+
*/
|
|
60
|
+
readonly emitError: (detail: {
|
|
61
|
+
readonly message: string;
|
|
62
|
+
readonly exitCode: number;
|
|
63
|
+
readonly suggestion?: string;
|
|
64
|
+
readonly code?: string;
|
|
65
|
+
}) => void;
|
|
66
|
+
/**
|
|
67
|
+
* Project-local plugin layouts contributed by the registered tools
|
|
68
|
+
* (each tool's `Tool.pluginLayout`). The `plugin` command reads these
|
|
69
|
+
* to know which domains support project-local plugins instead of
|
|
70
|
+
* hardcoding `['fit', 'sim']` — the kernel stays tool-agnostic and the
|
|
71
|
+
* tools remain the single source of truth (ADR-0009 corollary 1).
|
|
72
|
+
*/
|
|
73
|
+
readonly pluginLayouts: readonly PluginLayout[];
|
|
74
|
+
/**
|
|
75
|
+
* Per-tool `init`-scaffold contributions (ADR-0038), derived from the tool
|
|
76
|
+
* registry. The `init` command iterates these — each tool's `pluginLayout` +
|
|
77
|
+
* `scaffoldExamples` — instead of hardcoding the fit/sim directories + example
|
|
78
|
+
* content. A tool with no `pluginLayout` contributes nothing (e.g. `graph`).
|
|
79
|
+
*/
|
|
80
|
+
readonly toolScaffolds: readonly ToolScaffold[];
|
|
81
|
+
readonly sessionReplayRegistry?: SessionReplayRegistry;
|
|
82
|
+
/**
|
|
83
|
+
* The live tool command specs (each registered tool's `commandSpecs`),
|
|
84
|
+
* supplied by the composition root. The `completion` command derives its
|
|
85
|
+
* shell-completion subcommands + flags from these — the same source of truth
|
|
86
|
+
* the runtime mounts — so the emitted script can never drift from the real
|
|
87
|
+
* tool command surface. Typed structurally ({@link SpecLike}) to keep this
|
|
88
|
+
* module free of the full `CommandSpec` generic. Optional so test harnesses
|
|
89
|
+
* that don't exercise completion can omit it (completion then offers the host
|
|
90
|
+
* surface only).
|
|
91
|
+
*/
|
|
92
|
+
readonly toolCommandSpecs?: readonly SpecLike[];
|
|
93
|
+
/**
|
|
94
|
+
* Persistence accessor (thunk). Calling this returns the project-local
|
|
95
|
+
* DataStore, opening it lazily on first access. Commands that don't read
|
|
96
|
+
* the datastore (dry-runs, list-style commands, completion) never trigger
|
|
97
|
+
* the SQLite open and therefore don't materialise `.runtime/`. Loosely
|
|
98
|
+
* typed `unknown` to keep this module free of `@opensip-cli/datastore`
|
|
99
|
+
* at the type level; consumers cast to `DataStore` at use time.
|
|
100
|
+
*
|
|
101
|
+
* Throws when called in a non-project context — CLI commands that need
|
|
102
|
+
* the datastore should already have errored on `project.scope === 'none'`
|
|
103
|
+
* before reaching this call.
|
|
104
|
+
*/
|
|
105
|
+
readonly datastore: () => unknown;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErF;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,SAAS,YAAY,EAAE,CAAC;IAC9E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;IACpD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE;QAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;KACxB,KAAK,IAAI,CAAC;IACX;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IACvD;;;;;;;;;OASG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;CACnC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* shared — the registrar context type used by every CLI-owned (host) command.
|
|
3
|
+
*
|
|
4
|
+
* Launch Phase 6 moved the host commands onto the declarative
|
|
5
|
+
* `CommandSpec` plane (`host-command-specs.ts` / `host-subcommand-groups.ts`),
|
|
6
|
+
* which sources `--cwd` / `--json` from the ADR-0021 common-flag registry
|
|
7
|
+
* directly (via `commonFlags: ['cwd', 'json']`). The former
|
|
8
|
+
* `CWD_OPTION_SPEC` / `JSON_DESC` re-export constants — used only by the
|
|
9
|
+
* deleted `register-*.ts` registrars — are gone; this module now carries just
|
|
10
|
+
* the shared context type.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `tools data-purge <tool-id>` — per-tool project-data removal (ADR-0042).
|
|
3
|
+
*
|
|
4
|
+
* Rows, never tables: one tool's sessions (payload rows cascade via the
|
|
5
|
+
* schema FK), baseline entries + meta, and tool_state rows, all through
|
|
6
|
+
* repository APIs — no SQL in command code (`restrict-raw-db-access`).
|
|
7
|
+
* Project-scoped by nature (the datastore is per-project). Works for ANY
|
|
8
|
+
* tool id including bundled ones (purging fit history is legitimate).
|
|
9
|
+
*
|
|
10
|
+
* Surface note: the spec drafted `tools data purge` (a nested group); the
|
|
11
|
+
* host group machinery is deliberately one level deep (a nested action-less
|
|
12
|
+
* `data` shell would need its own parity-allowlist entry, completion
|
|
13
|
+
* inventory, and mounter recursion for one leaf), so this ships flattened as
|
|
14
|
+
* `data-purge`. Recorded as a plan deviation.
|
|
15
|
+
*/
|
|
16
|
+
import { type DataStore } from '@opensip-cli/datastore';
|
|
17
|
+
import type { ToolsDataPurgeResult } from '@opensip-cli/contracts';
|
|
18
|
+
/** Purge one tool's rows from the project datastore; reports counts. */
|
|
19
|
+
export declare function toolsDataPurge(toolId: string, datastore: DataStore): ToolsDataPurgeResult;
|
|
20
|
+
//# sourceMappingURL=data-purge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-purge.d.ts","sourceRoot":"","sources":["../../../src/commands/tools/data-purge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAgBnE,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,oBAAoB,CAwBzF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `tools data-purge <tool-id>` — per-tool project-data removal (ADR-0042).
|
|
3
|
+
*
|
|
4
|
+
* Rows, never tables: one tool's sessions (payload rows cascade via the
|
|
5
|
+
* schema FK), baseline entries + meta, and tool_state rows, all through
|
|
6
|
+
* repository APIs — no SQL in command code (`restrict-raw-db-access`).
|
|
7
|
+
* Project-scoped by nature (the datastore is per-project). Works for ANY
|
|
8
|
+
* tool id including bundled ones (purging fit history is legitimate).
|
|
9
|
+
*
|
|
10
|
+
* Surface note: the spec drafted `tools data purge` (a nested group); the
|
|
11
|
+
* host group machinery is deliberately one level deep (a nested action-less
|
|
12
|
+
* `data` shell would need its own parity-allowlist entry, completion
|
|
13
|
+
* inventory, and mounter recursion for one leaf), so this ships flattened as
|
|
14
|
+
* `data-purge`. Recorded as a plan deviation.
|
|
15
|
+
*/
|
|
16
|
+
import { isToolLongId, isToolShortId, TOOL_LONG_TO_SHORT, TOOL_SHORT_TO_LONG, } from '@opensip-cli/core';
|
|
17
|
+
import { BaselineRepo, ToolStateRepo } from '@opensip-cli/datastore';
|
|
18
|
+
import { SessionRepo } from '@opensip-cli/session-store';
|
|
19
|
+
/**
|
|
20
|
+
* Every id form one user-supplied tool id may appear under across the stores.
|
|
21
|
+
* The stores key inconsistently for historical reasons (`core/tools/ids.ts`):
|
|
22
|
+
* sessions key the SHORT form (`fit`); the baseline plane keys the LONG form
|
|
23
|
+
* (`fitness`); tool-state keys whatever the tool passed. Purging clears every
|
|
24
|
+
* form — a per-store key namespace makes clearing an absent form a 0-count
|
|
25
|
+
* no-op, so this is robust rather than wasteful.
|
|
26
|
+
*/
|
|
27
|
+
function idFormsFor(toolId) {
|
|
28
|
+
if (isToolLongId(toolId))
|
|
29
|
+
return [...new Set([toolId, TOOL_LONG_TO_SHORT[toolId]])];
|
|
30
|
+
if (isToolShortId(toolId))
|
|
31
|
+
return [...new Set([toolId, TOOL_SHORT_TO_LONG[toolId]])];
|
|
32
|
+
return [toolId];
|
|
33
|
+
}
|
|
34
|
+
/** Purge one tool's rows from the project datastore; reports counts. */
|
|
35
|
+
export function toolsDataPurge(toolId, datastore) {
|
|
36
|
+
const sessionRepo = new SessionRepo(datastore);
|
|
37
|
+
const baselineRepo = new BaselineRepo(datastore);
|
|
38
|
+
const stateRepo = new ToolStateRepo(datastore);
|
|
39
|
+
let sessions = 0;
|
|
40
|
+
let baselineEntries = 0;
|
|
41
|
+
let baselineMeta = false;
|
|
42
|
+
let stateRows = 0;
|
|
43
|
+
for (const form of idFormsFor(toolId)) {
|
|
44
|
+
sessions += sessionRepo.clearForTool(form);
|
|
45
|
+
const baseline = baselineRepo.clear(form);
|
|
46
|
+
baselineEntries += baseline.entries;
|
|
47
|
+
baselineMeta = baselineMeta || baseline.meta;
|
|
48
|
+
stateRows += stateRepo.clear(form);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
type: 'tools-data-purge',
|
|
52
|
+
toolId,
|
|
53
|
+
sessions,
|
|
54
|
+
baselineEntries,
|
|
55
|
+
baselineMeta,
|
|
56
|
+
stateRows,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data-purge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-purge.js","sourceRoot":"","sources":["../../../src/commands/tools/data-purge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAkB,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIzD;;;;;;;GAOG;AACH,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,SAAoB;IACjE,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,QAAQ,IAAI,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,eAAe,IAAI,QAAQ,CAAC,OAAO,CAAC;QACpC,YAAY,GAAG,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC;QAC7C,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM;QACN,QAAQ;QACR,eAAe;QACf,YAAY;QACZ,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tools — the customer-facing whole-tool management group (ADR-0041).
|
|
3
|
+
*
|
|
4
|
+
* Leaf {@link CommandSpec} builders for the `tools` subcommand group, mounted
|
|
5
|
+
* by `host-subcommand-groups.ts` exactly as the `sessions`/`plugin` groups
|
|
6
|
+
* are. Subcommands ONLY — no flag aliases, no `tool` singular (the parity
|
|
7
|
+
* snapshot pins this). Later phases append leaves here
|
|
8
|
+
* (validate/install/uninstall/data purge).
|
|
9
|
+
*/
|
|
10
|
+
import { type CommandSpec } from '@opensip-cli/core';
|
|
11
|
+
import type { CliCommandsContext } from '../shared.js';
|
|
12
|
+
type HostSpec = CommandSpec<unknown, CliCommandsContext>;
|
|
13
|
+
/** Build the `tools` group's leaf specs (consumed by the group mounter). */
|
|
14
|
+
export declare function buildToolsGroupLeaves(ctx: CliCommandsContext): readonly HostSpec[];
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,KAAK,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AA8MzD,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG,SAAS,QAAQ,EAAE,CAQlF"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tools — the customer-facing whole-tool management group (ADR-0041).
|
|
3
|
+
*
|
|
4
|
+
* Leaf {@link CommandSpec} builders for the `tools` subcommand group, mounted
|
|
5
|
+
* by `host-subcommand-groups.ts` exactly as the `sessions`/`plugin` groups
|
|
6
|
+
* are. Subcommands ONLY — no flag aliases, no `tool` singular (the parity
|
|
7
|
+
* snapshot pins this). Later phases append leaves here
|
|
8
|
+
* (validate/install/uninstall/data purge).
|
|
9
|
+
*/
|
|
10
|
+
import { EXIT_CODES } from '@opensip-cli/contracts';
|
|
11
|
+
import { currentScope, defineCommand, } from '@opensip-cli/core';
|
|
12
|
+
import { toolsDataPurge } from './data-purge.js';
|
|
13
|
+
import { toolsInstall } from './install.js';
|
|
14
|
+
import { toolsList } from './list.js';
|
|
15
|
+
import { toolsUninstall } from './uninstall.js';
|
|
16
|
+
import { runToolValidation } from './validate.js';
|
|
17
|
+
const COMMAND_RESULT_OUTPUT = 'command-result';
|
|
18
|
+
/**
|
|
19
|
+
* Prefer the discovered project root; fall back to literal cwd; finally
|
|
20
|
+
* process.cwd(). (Local copy of the group module's `effectiveCwd` — importing
|
|
21
|
+
* it from `host-subcommand-groups.ts` would close a module cycle, since that
|
|
22
|
+
* module imports this group's leaves.)
|
|
23
|
+
*/
|
|
24
|
+
function effectiveCwd(opts) {
|
|
25
|
+
return opts.projectContext?.projectRoot ?? opts.cwd ?? process.cwd();
|
|
26
|
+
}
|
|
27
|
+
function buildToolsListSpec() {
|
|
28
|
+
return defineCommand({
|
|
29
|
+
name: 'list',
|
|
30
|
+
description: 'List the effective tool set (bundled, global, and project-local)',
|
|
31
|
+
commonFlags: ['json'],
|
|
32
|
+
options: [
|
|
33
|
+
{ flag: '--global', description: 'Only user-global installed tools', default: false },
|
|
34
|
+
{ flag: '--project', description: 'Only project-local installed tools', default: false },
|
|
35
|
+
],
|
|
36
|
+
// Listing must work outside a project too (global tools are still
|
|
37
|
+
// visible); the project host dir simply scans empty there.
|
|
38
|
+
scope: 'none',
|
|
39
|
+
output: COMMAND_RESULT_OUTPUT,
|
|
40
|
+
handler: (rawOpts) => {
|
|
41
|
+
const opts = rawOpts;
|
|
42
|
+
// The admitted-tool set is per-run state on the entered RunScope (stamped
|
|
43
|
+
// by the bootstrap), read here and passed into the pure `toolsList`.
|
|
44
|
+
const scope = currentScope();
|
|
45
|
+
return Promise.resolve(toolsList({
|
|
46
|
+
cwd: effectiveCwd(opts),
|
|
47
|
+
global: opts.global,
|
|
48
|
+
project: opts.project,
|
|
49
|
+
provenance: scope?.toolProvenance ?? [],
|
|
50
|
+
manifests: scope?.toolManifests ?? [],
|
|
51
|
+
}));
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function buildToolsValidateSpec(ctx) {
|
|
56
|
+
return defineCommand({
|
|
57
|
+
name: 'validate',
|
|
58
|
+
description: 'Validate a tool package against the Tool contract (runs the package module — see docs)',
|
|
59
|
+
commonFlags: ['json'],
|
|
60
|
+
args: [{ name: 'spec', description: 'npm spec, tarball, or local directory path' }],
|
|
61
|
+
options: [
|
|
62
|
+
{
|
|
63
|
+
flag: '--install-deps',
|
|
64
|
+
description: 'For a local path: stage via npm install so the runtime sections can load',
|
|
65
|
+
default: false,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
scope: 'none',
|
|
69
|
+
output: COMMAND_RESULT_OUTPUT,
|
|
70
|
+
handler: async (rawOpts) => {
|
|
71
|
+
const opts = rawOpts;
|
|
72
|
+
const spec = opts._args[0] ?? '';
|
|
73
|
+
const { result } = await runToolValidation({
|
|
74
|
+
spec,
|
|
75
|
+
cwd: effectiveCwd(opts),
|
|
76
|
+
installDeps: opts.installDeps,
|
|
77
|
+
});
|
|
78
|
+
if (result.verdict !== 'passed')
|
|
79
|
+
ctx.setExitCode(EXIT_CODES.CONFIGURATION_ERROR);
|
|
80
|
+
return result;
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function buildToolsInstallSpec(ctx) {
|
|
85
|
+
return defineCommand({
|
|
86
|
+
name: 'install',
|
|
87
|
+
description: 'Validate, then install a tool package (global by default; see tools validate)',
|
|
88
|
+
commonFlags: ['json'],
|
|
89
|
+
args: [{ name: 'spec', description: 'npm spec, tarball, or local directory path' }],
|
|
90
|
+
options: [
|
|
91
|
+
{ flag: '--global', description: 'Install user-global (the default)', default: false },
|
|
92
|
+
{
|
|
93
|
+
flag: '--project',
|
|
94
|
+
description: 'Install into this project’s runtime tool host instead',
|
|
95
|
+
default: false,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
scope: 'none',
|
|
99
|
+
output: COMMAND_RESULT_OUTPUT,
|
|
100
|
+
handler: async (rawOpts) => {
|
|
101
|
+
const opts = rawOpts;
|
|
102
|
+
if (opts.global === true && opts.project === true) {
|
|
103
|
+
ctx.setExitCode(EXIT_CODES.CONFIGURATION_ERROR);
|
|
104
|
+
return {
|
|
105
|
+
type: 'tools-uninstall',
|
|
106
|
+
target: opts._args[0] ?? '',
|
|
107
|
+
success: false,
|
|
108
|
+
error: '--global and --project are mutually exclusive',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const result = await toolsInstall({
|
|
112
|
+
spec: opts._args[0] ?? '',
|
|
113
|
+
cwd: effectiveCwd(opts),
|
|
114
|
+
project: opts.project,
|
|
115
|
+
});
|
|
116
|
+
if (!result.success)
|
|
117
|
+
ctx.setExitCode(EXIT_CODES.CONFIGURATION_ERROR);
|
|
118
|
+
return result;
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
function buildToolsUninstallSpec(ctx) {
|
|
123
|
+
return defineCommand({
|
|
124
|
+
name: 'uninstall',
|
|
125
|
+
description: 'Uninstall a tool by id or package name (never deletes project SQLite data)',
|
|
126
|
+
commonFlags: ['json'],
|
|
127
|
+
args: [{ name: 'name-or-id', description: 'Tool id or npm package name' }],
|
|
128
|
+
options: [
|
|
129
|
+
{ flag: '--global', description: 'Target the user-global install', default: false },
|
|
130
|
+
{ flag: '--project', description: 'Target the project-local install', default: false },
|
|
131
|
+
{
|
|
132
|
+
flag: '--purge-data',
|
|
133
|
+
description: 'Also purge the tool’s project SQLite rows (project scope only)',
|
|
134
|
+
default: false,
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
scope: 'none',
|
|
138
|
+
output: COMMAND_RESULT_OUTPUT,
|
|
139
|
+
// eslint-disable-next-line @typescript-eslint/require-await -- async keeps the CommandSpec handler signature; the bodies are synchronous SQLite + fs
|
|
140
|
+
handler: async (rawOpts) => {
|
|
141
|
+
const opts = rawOpts;
|
|
142
|
+
// --purge-data is project-local only: runtime data lives per project
|
|
143
|
+
// (the spec's explicit rejection for --global).
|
|
144
|
+
if (opts.purgeData === true && opts.global === true) {
|
|
145
|
+
ctx.setExitCode(EXIT_CODES.CONFIGURATION_ERROR);
|
|
146
|
+
return {
|
|
147
|
+
type: 'tools-uninstall',
|
|
148
|
+
target: opts._args[0] ?? '',
|
|
149
|
+
success: false,
|
|
150
|
+
error: '--purge-data is project-local only (runtime data lives per project); it cannot combine with --global',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const result = toolsUninstall({
|
|
154
|
+
target: opts._args[0] ?? '',
|
|
155
|
+
cwd: effectiveCwd(opts),
|
|
156
|
+
global: opts.global,
|
|
157
|
+
project: opts.project,
|
|
158
|
+
// Per-run admitted-tool provenance (bundled-id guard) from the scope.
|
|
159
|
+
provenance: currentScope()?.toolProvenance ?? [],
|
|
160
|
+
});
|
|
161
|
+
if (!result.success) {
|
|
162
|
+
ctx.setExitCode(EXIT_CODES.CONFIGURATION_ERROR);
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
if (opts.purgeData === true && result.removed?.scope === 'project') {
|
|
166
|
+
const datastore = ctx.datastore();
|
|
167
|
+
if (datastore !== undefined) {
|
|
168
|
+
// Purge AFTER a successful project uninstall; counts ride stderr so
|
|
169
|
+
// the uninstall result stays the command's one payload.
|
|
170
|
+
const purge = toolsDataPurge(result.removed.id, datastore);
|
|
171
|
+
process.stderr.write(`opensip: purged ${purge.sessions} session(s), ${purge.baselineEntries} baseline entr(ies), ` +
|
|
172
|
+
`${purge.stateRows} state row(s) for '${purge.toolId}'\n`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function buildToolsDataPurgeSpec(ctx) {
|
|
180
|
+
return defineCommand({
|
|
181
|
+
name: 'data-purge',
|
|
182
|
+
description: 'Delete one tool’s project SQLite rows (sessions, baselines, state) — never tables',
|
|
183
|
+
commonFlags: ['json'],
|
|
184
|
+
args: [{ name: 'tool-id', description: 'The tool id whose rows to delete' }],
|
|
185
|
+
scope: 'project',
|
|
186
|
+
output: COMMAND_RESULT_OUTPUT,
|
|
187
|
+
handler: (rawOpts) => {
|
|
188
|
+
const opts = rawOpts;
|
|
189
|
+
const datastore = ctx.datastore();
|
|
190
|
+
if (datastore === undefined) {
|
|
191
|
+
ctx.setExitCode(EXIT_CODES.CONFIGURATION_ERROR);
|
|
192
|
+
return Promise.resolve({
|
|
193
|
+
type: 'tools-uninstall',
|
|
194
|
+
target: opts._args[0] ?? '',
|
|
195
|
+
success: false,
|
|
196
|
+
error: 'tools data-purge requires the project datastore (run inside a project)',
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return Promise.resolve(toolsDataPurge(opts._args[0] ?? '', datastore));
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/** Build the `tools` group's leaf specs (consumed by the group mounter). */
|
|
204
|
+
export function buildToolsGroupLeaves(ctx) {
|
|
205
|
+
return [
|
|
206
|
+
buildToolsListSpec(),
|
|
207
|
+
buildToolsValidateSpec(ctx),
|
|
208
|
+
buildToolsInstallSpec(ctx),
|
|
209
|
+
buildToolsUninstallSpec(ctx),
|
|
210
|
+
buildToolsDataPurgeSpec(ctx),
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `tools install` — atomic stage → validate → activate (ADR-0041).
|
|
3
|
+
*
|
|
4
|
+
* The candidate stages into a temp host (npm `--ignore-scripts`) and the FULL
|
|
5
|
+
* validation (`runToolValidation`, keepStaged) runs against the staged bytes.
|
|
6
|
+
* Only a `passed` verdict activates — and activation installs a tarball
|
|
7
|
+
* `npm pack`ed FROM THE STAGED DIR, never a re-resolve of the original spec
|
|
8
|
+
* (a registry re-resolve between validate and activate could deliver
|
|
9
|
+
* different bytes than the ones validated; and `npm install <dir>` would
|
|
10
|
+
* symlink the about-to-be-deleted temp host). A failed install leaves no
|
|
11
|
+
* discoverable tool behind: the temp host is removed in `finally` and the
|
|
12
|
+
* scope host is never touched.
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolsInstallResult } from '@opensip-cli/contracts';
|
|
15
|
+
/** Options for {@link toolsInstall}. */
|
|
16
|
+
export interface ToolsInstallOptions {
|
|
17
|
+
readonly spec: string;
|
|
18
|
+
readonly cwd: string;
|
|
19
|
+
/** Install into the project `.runtime` tool host instead of user-global. */
|
|
20
|
+
readonly project?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** Stage, validate, and (on a `passed` verdict only) activate one tool package. */
|
|
23
|
+
export declare function toolsInstall(opts: ToolsInstallOptions): Promise<ToolsInstallResult>;
|
|
24
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/tools/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAaD,mFAAmF;AACnF,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0DzF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `tools install` — atomic stage → validate → activate (ADR-0041).
|
|
3
|
+
*
|
|
4
|
+
* The candidate stages into a temp host (npm `--ignore-scripts`) and the FULL
|
|
5
|
+
* validation (`runToolValidation`, keepStaged) runs against the staged bytes.
|
|
6
|
+
* Only a `passed` verdict activates — and activation installs a tarball
|
|
7
|
+
* `npm pack`ed FROM THE STAGED DIR, never a re-resolve of the original spec
|
|
8
|
+
* (a registry re-resolve between validate and activate could deliver
|
|
9
|
+
* different bytes than the ones validated; and `npm install <dir>` would
|
|
10
|
+
* symlink the about-to-be-deleted temp host). A failed install leaves no
|
|
11
|
+
* discoverable tool behind: the temp host is removed in `finally` and the
|
|
12
|
+
* scope host is never touched.
|
|
13
|
+
*/
|
|
14
|
+
import { execFileSync } from 'node:child_process';
|
|
15
|
+
import { admitToolPackage } from '../../bootstrap/admit-tool-package.js';
|
|
16
|
+
import { addToolPlugin } from '../plugin-host-ops.js';
|
|
17
|
+
import { runToolValidation } from './validate.js';
|
|
18
|
+
/** Pack the staged package dir into a tarball beside it; returns the tarball path. */
|
|
19
|
+
function packStagedDir(stagedPkgDir) {
|
|
20
|
+
const out = execFileSync('npm', ['pack', '--pack-destination', stagedPkgDir, '.'], {
|
|
21
|
+
cwd: stagedPkgDir,
|
|
22
|
+
encoding: 'utf8',
|
|
23
|
+
stdio: ['ignore', 'pipe', process.stderr],
|
|
24
|
+
});
|
|
25
|
+
const name = out.trim().split('\n').at(-1)?.trim() ?? '';
|
|
26
|
+
return `${stagedPkgDir}/${name}`;
|
|
27
|
+
}
|
|
28
|
+
/** Stage, validate, and (on a `passed` verdict only) activate one tool package. */
|
|
29
|
+
export async function toolsInstall(opts) {
|
|
30
|
+
const scope = opts.project === true ? 'project' : 'global';
|
|
31
|
+
const { result, stagedPkgDir, cleanup } = await runToolValidation({ spec: opts.spec, cwd: opts.cwd, installDeps: true }, { keepStaged: true });
|
|
32
|
+
try {
|
|
33
|
+
if (result.verdict !== 'passed') {
|
|
34
|
+
return { type: 'tools-install', spec: opts.spec, success: false, scope, validation: result };
|
|
35
|
+
}
|
|
36
|
+
/* v8 ignore next 9 -- defensive: a passed verdict from a keepStaged run always carries the staged dir */
|
|
37
|
+
if (stagedPkgDir === undefined) {
|
|
38
|
+
return {
|
|
39
|
+
type: 'tools-install',
|
|
40
|
+
spec: opts.spec,
|
|
41
|
+
success: false,
|
|
42
|
+
scope,
|
|
43
|
+
validation: result,
|
|
44
|
+
error: 'validation passed but no staged package dir was retained',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Activate the VALIDATED bytes: pack the staged dir, install the tarball.
|
|
48
|
+
const tarball = packStagedDir(stagedPkgDir);
|
|
49
|
+
const activation = addToolPlugin(tarball, opts.cwd, opts.project === true);
|
|
50
|
+
if (activation.type !== 'plugin-add' || activation.success !== true) {
|
|
51
|
+
const error = 'error' in activation ? (activation.error ?? 'activation failed') : 'activation failed';
|
|
52
|
+
return {
|
|
53
|
+
type: 'tools-install',
|
|
54
|
+
spec: opts.spec,
|
|
55
|
+
success: false,
|
|
56
|
+
scope,
|
|
57
|
+
validation: result,
|
|
58
|
+
error,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Inventory row from the ACTIVATED install (manifest file read — no import).
|
|
62
|
+
const report = await admitToolPackage({
|
|
63
|
+
dir: stagedPkgDir,
|
|
64
|
+
source: 'installed',
|
|
65
|
+
explicitlyRequested: true,
|
|
66
|
+
staticOnly: true,
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
type: 'tools-install',
|
|
70
|
+
spec: opts.spec,
|
|
71
|
+
success: true,
|
|
72
|
+
scope,
|
|
73
|
+
validation: result,
|
|
74
|
+
...(report.manifest === undefined
|
|
75
|
+
? {}
|
|
76
|
+
: { toolId: report.manifest.id, version: report.manifest.version }),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
cleanup();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/tools/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `tools list` — the read-only effective-tool inventory (ADR-0041).
|
|
3
|
+
*
|
|
4
|
+
* HARD RULE: this command performs ZERO dynamic imports of tool runtimes. A
|
|
5
|
+
* listing command that executes plugin code is both slow and a consent
|
|
6
|
+
* violation (the trust posture reserves code execution for validate/install).
|
|
7
|
+
* Every row derives from
|
|
8
|
+
*
|
|
9
|
+
* - the CURRENT RUN's admitted set — the provenance + manifest pairs the
|
|
10
|
+
* bootstrap recorded, passed in by the command handler from the entered
|
|
11
|
+
* RunScope (`currentScope().toolProvenance` / `?.toolManifests`),
|
|
12
|
+
* status `loaded`; and
|
|
13
|
+
* - marker scans of the two install hosts (user-global + project
|
|
14
|
+
* `.runtime`), `loadToolManifest` only (a file read), status
|
|
15
|
+
* `manifest-only` — covering installed-but-not-loaded packages (and, by
|
|
16
|
+
* construction, a package whose module top-level would throw).
|
|
17
|
+
*
|
|
18
|
+
* Shadow-marking: discovery is first-occurrence-wins (project before global in
|
|
19
|
+
* `buildToolDiscoverySources`), so when a project row and a global row share a
|
|
20
|
+
* tool id the GLOBAL row is marked shadowed.
|
|
21
|
+
*/
|
|
22
|
+
import { type ToolPluginManifest, type ToolProvenance } from '@opensip-cli/core';
|
|
23
|
+
import type { ToolsListResult } from '@opensip-cli/contracts';
|
|
24
|
+
/** Options for {@link toolsList}. */
|
|
25
|
+
export interface ToolsListOptions {
|
|
26
|
+
readonly cwd: string;
|
|
27
|
+
/** Restrict to one install scope (mutually exclusive; neither = effective set). */
|
|
28
|
+
readonly global?: boolean;
|
|
29
|
+
readonly project?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* The admitted-tool provenance + manifests for this run (paired index-wise),
|
|
32
|
+
* read by the command handler from the entered RunScope and passed in so this
|
|
33
|
+
* function stays a pure function of its inputs. Default `[]` (no admitted set
|
|
34
|
+
* — e.g. an isolated unit test).
|
|
35
|
+
*/
|
|
36
|
+
readonly provenance?: readonly ToolProvenance[];
|
|
37
|
+
readonly manifests?: readonly ToolPluginManifest[];
|
|
38
|
+
}
|
|
39
|
+
/** Build the effective tool inventory. Read-only; never imports a runtime. */
|
|
40
|
+
export declare function toolsList(opts: ToolsListOptions): ToolsListResult;
|
|
41
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/tools/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,wBAAwB,CAAC;AAK5E,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACpD;AAwBD,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CA2DjE"}
|