@untangle-code/cli 0.0.0-stage → 0.1.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/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +451 -2
- package/THIRD_PARTY_LICENSES.md +152 -0
- package/dist/cli/args.d.ts +48 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +167 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/command.d.ts +69 -0
- package/dist/cli/command.d.ts.map +1 -0
- package/dist/cli/command.js +82 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/deadline.d.ts +33 -0
- package/dist/cli/deadline.d.ts.map +1 -0
- package/dist/cli/deadline.js +49 -0
- package/dist/cli/deadline.js.map +1 -0
- package/dist/cli/embedder-deadline.d.ts +72 -0
- package/dist/cli/embedder-deadline.d.ts.map +1 -0
- package/dist/cli/embedder-deadline.js +117 -0
- package/dist/cli/embedder-deadline.js.map +1 -0
- package/dist/cli/exit.d.ts +71 -0
- package/dist/cli/exit.d.ts.map +1 -0
- package/dist/cli/exit.js +81 -0
- package/dist/cli/exit.js.map +1 -0
- package/dist/cli/graphs.d.ts +65 -0
- package/dist/cli/graphs.d.ts.map +1 -0
- package/dist/cli/graphs.js +108 -0
- package/dist/cli/graphs.js.map +1 -0
- package/dist/cli/index-freshness.d.ts +13 -0
- package/dist/cli/index-freshness.d.ts.map +1 -0
- package/dist/cli/index-freshness.js +226 -0
- package/dist/cli/index-freshness.js.map +1 -0
- package/dist/cli/index-refresh.d.ts +10 -0
- package/dist/cli/index-refresh.d.ts.map +1 -0
- package/dist/cli/index-refresh.js +76 -0
- package/dist/cli/index-refresh.js.map +1 -0
- package/dist/cli/index-state.d.ts +184 -0
- package/dist/cli/index-state.d.ts.map +1 -0
- package/dist/cli/index-state.js +852 -0
- package/dist/cli/index-state.js.map +1 -0
- package/dist/cli/io.d.ts +29 -0
- package/dist/cli/io.d.ts.map +1 -0
- package/dist/cli/io.js +42 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/language-support.d.ts +77 -0
- package/dist/cli/language-support.d.ts.map +1 -0
- package/dist/cli/language-support.js +152 -0
- package/dist/cli/language-support.js.map +1 -0
- package/dist/cli/renewing-lease.d.ts +26 -0
- package/dist/cli/renewing-lease.d.ts.map +1 -0
- package/dist/cli/renewing-lease.js +102 -0
- package/dist/cli/renewing-lease.js.map +1 -0
- package/dist/cli/search-graph-enrichment.d.ts +16 -0
- package/dist/cli/search-graph-enrichment.d.ts.map +1 -0
- package/dist/cli/search-graph-enrichment.js +428 -0
- package/dist/cli/search-graph-enrichment.js.map +1 -0
- package/dist/cli/system.d.ts +34 -0
- package/dist/cli/system.d.ts.map +1 -0
- package/dist/cli/system.js +89 -0
- package/dist/cli/system.js.map +1 -0
- package/dist/cli/vector-store-policy.d.ts +116 -0
- package/dist/cli/vector-store-policy.d.ts.map +1 -0
- package/dist/cli/vector-store-policy.js +160 -0
- package/dist/cli/vector-store-policy.js.map +1 -0
- package/dist/cli/version.d.ts +3 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +3 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli/workspace.d.ts +105 -0
- package/dist/cli/workspace.d.ts.map +1 -0
- package/dist/cli/workspace.js +215 -0
- package/dist/cli/workspace.js.map +1 -0
- package/dist/commands/complexity.d.ts +72 -0
- package/dist/commands/complexity.d.ts.map +1 -0
- package/dist/commands/complexity.js +580 -0
- package/dist/commands/complexity.js.map +1 -0
- package/dist/commands/doctor.d.ts +66 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +764 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.languages.d.ts +37 -0
- package/dist/commands/doctor.languages.d.ts.map +1 -0
- package/dist/commands/doctor.languages.js +143 -0
- package/dist/commands/doctor.languages.js.map +1 -0
- package/dist/commands/doctor.storage.d.ts +17 -0
- package/dist/commands/doctor.storage.d.ts.map +1 -0
- package/dist/commands/doctor.storage.js +91 -0
- package/dist/commands/doctor.storage.js.map +1 -0
- package/dist/commands/extensions/add.d.ts +10 -0
- package/dist/commands/extensions/add.d.ts.map +1 -0
- package/dist/commands/extensions/add.js +213 -0
- package/dist/commands/extensions/add.js.map +1 -0
- package/dist/commands/extensions/configure.d.ts +5 -0
- package/dist/commands/extensions/configure.d.ts.map +1 -0
- package/dist/commands/extensions/configure.js +58 -0
- package/dist/commands/extensions/configure.js.map +1 -0
- package/dist/commands/extensions/container.d.ts +15 -0
- package/dist/commands/extensions/container.d.ts.map +1 -0
- package/dist/commands/extensions/container.js +135 -0
- package/dist/commands/extensions/container.js.map +1 -0
- package/dist/commands/extensions/context.d.ts +37 -0
- package/dist/commands/extensions/context.d.ts.map +1 -0
- package/dist/commands/extensions/context.js +72 -0
- package/dist/commands/extensions/context.js.map +1 -0
- package/dist/commands/extensions/enable.d.ts +6 -0
- package/dist/commands/extensions/enable.d.ts.map +1 -0
- package/dist/commands/extensions/enable.js +180 -0
- package/dist/commands/extensions/enable.js.map +1 -0
- package/dist/commands/extensions/environment.d.ts +74 -0
- package/dist/commands/extensions/environment.d.ts.map +1 -0
- package/dist/commands/extensions/environment.js +168 -0
- package/dist/commands/extensions/environment.js.map +1 -0
- package/dist/commands/extensions/feature-scan.d.ts +48 -0
- package/dist/commands/extensions/feature-scan.d.ts.map +1 -0
- package/dist/commands/extensions/feature-scan.js +156 -0
- package/dist/commands/extensions/feature-scan.js.map +1 -0
- package/dist/commands/extensions/invoke.d.ts +60 -0
- package/dist/commands/extensions/invoke.d.ts.map +1 -0
- package/dist/commands/extensions/invoke.js +275 -0
- package/dist/commands/extensions/invoke.js.map +1 -0
- package/dist/commands/extensions/list.d.ts +5 -0
- package/dist/commands/extensions/list.d.ts.map +1 -0
- package/dist/commands/extensions/list.js +125 -0
- package/dist/commands/extensions/list.js.map +1 -0
- package/dist/commands/extensions/logs.d.ts +5 -0
- package/dist/commands/extensions/logs.d.ts.map +1 -0
- package/dist/commands/extensions/logs.js +74 -0
- package/dist/commands/extensions/logs.js.map +1 -0
- package/dist/commands/extensions/provision.d.ts +36 -0
- package/dist/commands/extensions/provision.d.ts.map +1 -0
- package/dist/commands/extensions/provision.js +137 -0
- package/dist/commands/extensions/provision.js.map +1 -0
- package/dist/commands/extensions/remove.d.ts +5 -0
- package/dist/commands/extensions/remove.d.ts.map +1 -0
- package/dist/commands/extensions/remove.js +77 -0
- package/dist/commands/extensions/remove.js.map +1 -0
- package/dist/commands/extensions/render.d.ts +16 -0
- package/dist/commands/extensions/render.d.ts.map +1 -0
- package/dist/commands/extensions/render.js +25 -0
- package/dist/commands/extensions/render.js.map +1 -0
- package/dist/commands/extensions/run.d.ts +30 -0
- package/dist/commands/extensions/run.d.ts.map +1 -0
- package/dist/commands/extensions/run.js +292 -0
- package/dist/commands/extensions/run.js.map +1 -0
- package/dist/commands/extensions/secret-store.d.ts +15 -0
- package/dist/commands/extensions/secret-store.d.ts.map +1 -0
- package/dist/commands/extensions/secret-store.js +164 -0
- package/dist/commands/extensions/secret-store.js.map +1 -0
- package/dist/commands/extensions/setup.d.ts +17 -0
- package/dist/commands/extensions/setup.d.ts.map +1 -0
- package/dist/commands/extensions/setup.js +94 -0
- package/dist/commands/extensions/setup.js.map +1 -0
- package/dist/commands/extensions/source.d.ts +47 -0
- package/dist/commands/extensions/source.d.ts.map +1 -0
- package/dist/commands/extensions/source.js +142 -0
- package/dist/commands/extensions/source.js.map +1 -0
- package/dist/commands/extensions/state.d.ts +62 -0
- package/dist/commands/extensions/state.d.ts.map +1 -0
- package/dist/commands/extensions/state.js +177 -0
- package/dist/commands/extensions/state.js.map +1 -0
- package/dist/commands/extensions/status.d.ts +9 -0
- package/dist/commands/extensions/status.d.ts.map +1 -0
- package/dist/commands/extensions/status.js +239 -0
- package/dist/commands/extensions/status.js.map +1 -0
- package/dist/commands/extensions.d.ts +3 -0
- package/dist/commands/extensions.d.ts.map +1 -0
- package/dist/commands/extensions.js +223 -0
- package/dist/commands/extensions.js.map +1 -0
- package/dist/commands/flow/index.d.ts +3 -0
- package/dist/commands/flow/index.d.ts.map +1 -0
- package/dist/commands/flow/index.js +295 -0
- package/dist/commands/flow/index.js.map +1 -0
- package/dist/commands/flow/limits.d.ts +12 -0
- package/dist/commands/flow/limits.d.ts.map +1 -0
- package/dist/commands/flow/limits.js +13 -0
- package/dist/commands/flow/limits.js.map +1 -0
- package/dist/commands/flow/output.d.ts +8 -0
- package/dist/commands/flow/output.d.ts.map +1 -0
- package/dist/commands/flow/output.js +11 -0
- package/dist/commands/flow/output.js.map +1 -0
- package/dist/commands/flow/render.d.ts +51 -0
- package/dist/commands/flow/render.d.ts.map +1 -0
- package/dist/commands/flow/render.js +220 -0
- package/dist/commands/flow/render.js.map +1 -0
- package/dist/commands/flow/select.d.ts +31 -0
- package/dist/commands/flow/select.d.ts.map +1 -0
- package/dist/commands/flow/select.js +62 -0
- package/dist/commands/flow/select.js.map +1 -0
- package/dist/commands/graph/boundaries-input.d.ts +26 -0
- package/dist/commands/graph/boundaries-input.d.ts.map +1 -0
- package/dist/commands/graph/boundaries-input.js +54 -0
- package/dist/commands/graph/boundaries-input.js.map +1 -0
- package/dist/commands/graph/boundaries.d.ts +4 -0
- package/dist/commands/graph/boundaries.d.ts.map +1 -0
- package/dist/commands/graph/boundaries.js +141 -0
- package/dist/commands/graph/boundaries.js.map +1 -0
- package/dist/commands/graph/bounds.d.ts +16 -0
- package/dist/commands/graph/bounds.d.ts.map +1 -0
- package/dist/commands/graph/bounds.js +22 -0
- package/dist/commands/graph/bounds.js.map +1 -0
- package/dist/commands/graph/category-clusters.d.ts +20 -0
- package/dist/commands/graph/category-clusters.d.ts.map +1 -0
- package/dist/commands/graph/category-clusters.js +158 -0
- package/dist/commands/graph/category-clusters.js.map +1 -0
- package/dist/commands/graph/feature-3d.d.ts +22 -0
- package/dist/commands/graph/feature-3d.d.ts.map +1 -0
- package/dist/commands/graph/feature-3d.js +114 -0
- package/dist/commands/graph/feature-3d.js.map +1 -0
- package/dist/commands/graph/feature-clusters.d.ts +17 -0
- package/dist/commands/graph/feature-clusters.d.ts.map +1 -0
- package/dist/commands/graph/feature-clusters.js +94 -0
- package/dist/commands/graph/feature-clusters.js.map +1 -0
- package/dist/commands/graph/feature-html.d.ts +26 -0
- package/dist/commands/graph/feature-html.d.ts.map +1 -0
- package/dist/commands/graph/feature-html.js +314 -0
- package/dist/commands/graph/feature-html.js.map +1 -0
- package/dist/commands/graph/feature-map.d.ts +31 -0
- package/dist/commands/graph/feature-map.d.ts.map +1 -0
- package/dist/commands/graph/feature-map.js +217 -0
- package/dist/commands/graph/feature-map.js.map +1 -0
- package/dist/commands/graph/feature-model.d.ts +55 -0
- package/dist/commands/graph/feature-model.d.ts.map +1 -0
- package/dist/commands/graph/feature-model.js +167 -0
- package/dist/commands/graph/feature-model.js.map +1 -0
- package/dist/commands/graph/feature-untangle-motion.d.ts +33 -0
- package/dist/commands/graph/feature-untangle-motion.d.ts.map +1 -0
- package/dist/commands/graph/feature-untangle-motion.js +155 -0
- package/dist/commands/graph/feature-untangle-motion.js.map +1 -0
- package/dist/commands/graph/index.d.ts +3 -0
- package/dist/commands/graph/index.d.ts.map +1 -0
- package/dist/commands/graph/index.js +414 -0
- package/dist/commands/graph/index.js.map +1 -0
- package/dist/commands/graph/render.d.ts +63 -0
- package/dist/commands/graph/render.d.ts.map +1 -0
- package/dist/commands/graph/render.js +352 -0
- package/dist/commands/graph/render.js.map +1 -0
- package/dist/commands/graph/select.d.ts +34 -0
- package/dist/commands/graph/select.d.ts.map +1 -0
- package/dist/commands/graph/select.js +55 -0
- package/dist/commands/graph/select.js.map +1 -0
- package/dist/commands/index/index.d.ts +6 -0
- package/dist/commands/index/index.d.ts.map +1 -0
- package/dist/commands/index/index.js +461 -0
- package/dist/commands/index/index.js.map +1 -0
- package/dist/commands/index/render.d.ts +53 -0
- package/dist/commands/index/render.d.ts.map +1 -0
- package/dist/commands/index/render.js +205 -0
- package/dist/commands/index/render.js.map +1 -0
- package/dist/commands/index/target.d.ts +34 -0
- package/dist/commands/index/target.d.ts.map +1 -0
- package/dist/commands/index/target.js +97 -0
- package/dist/commands/index/target.js.map +1 -0
- package/dist/commands/index-watch.d.ts +30 -0
- package/dist/commands/index-watch.d.ts.map +1 -0
- package/dist/commands/index-watch.js +138 -0
- package/dist/commands/index-watch.js.map +1 -0
- package/dist/commands/init/command.d.ts +25 -0
- package/dist/commands/init/command.d.ts.map +1 -0
- package/dist/commands/init/command.js +198 -0
- package/dist/commands/init/command.js.map +1 -0
- package/dist/commands/init/config-draft.d.ts +48 -0
- package/dist/commands/init/config-draft.d.ts.map +1 -0
- package/dist/commands/init/config-draft.js +201 -0
- package/dist/commands/init/config-draft.js.map +1 -0
- package/dist/commands/init/diff.d.ts +33 -0
- package/dist/commands/init/diff.d.ts.map +1 -0
- package/dist/commands/init/diff.js +109 -0
- package/dist/commands/init/diff.js.map +1 -0
- package/dist/commands/init/http-probe.d.ts +26 -0
- package/dist/commands/init/http-probe.d.ts.map +1 -0
- package/dist/commands/init/http-probe.js +144 -0
- package/dist/commands/init/http-probe.js.map +1 -0
- package/dist/commands/init/ignore-rules.d.ts +70 -0
- package/dist/commands/init/ignore-rules.d.ts.map +1 -0
- package/dist/commands/init/ignore-rules.js +146 -0
- package/dist/commands/init/ignore-rules.js.map +1 -0
- package/dist/commands/init/index.d.ts +33 -0
- package/dist/commands/init/index.d.ts.map +1 -0
- package/dist/commands/init/index.js +32 -0
- package/dist/commands/init/index.js.map +1 -0
- package/dist/commands/init/integrations-apply.d.ts +50 -0
- package/dist/commands/init/integrations-apply.d.ts.map +1 -0
- package/dist/commands/init/integrations-apply.js +452 -0
- package/dist/commands/init/integrations-apply.js.map +1 -0
- package/dist/commands/init/integrations-plan.d.ts +68 -0
- package/dist/commands/init/integrations-plan.d.ts.map +1 -0
- package/dist/commands/init/integrations-plan.js +515 -0
- package/dist/commands/init/integrations-plan.js.map +1 -0
- package/dist/commands/init/integrations.d.ts +5 -0
- package/dist/commands/init/integrations.d.ts.map +1 -0
- package/dist/commands/init/integrations.js +4 -0
- package/dist/commands/init/integrations.js.map +1 -0
- package/dist/commands/init/languages.d.ts +55 -0
- package/dist/commands/init/languages.d.ts.map +1 -0
- package/dist/commands/init/languages.js +245 -0
- package/dist/commands/init/languages.js.map +1 -0
- package/dist/commands/init/product-context.d.ts +63 -0
- package/dist/commands/init/product-context.d.ts.map +1 -0
- package/dist/commands/init/product-context.js +390 -0
- package/dist/commands/init/product-context.js.map +1 -0
- package/dist/commands/init/render.d.ts +38 -0
- package/dist/commands/init/render.d.ts.map +1 -0
- package/dist/commands/init/render.js +501 -0
- package/dist/commands/init/render.js.map +1 -0
- package/dist/commands/init/report.d.ts +24 -0
- package/dist/commands/init/report.d.ts.map +1 -0
- package/dist/commands/init/report.js +163 -0
- package/dist/commands/init/report.js.map +1 -0
- package/dist/commands/init/run.d.ts +71 -0
- package/dist/commands/init/run.d.ts.map +1 -0
- package/dist/commands/init/run.js +253 -0
- package/dist/commands/init/run.js.map +1 -0
- package/dist/commands/init/services.d.ts +82 -0
- package/dist/commands/init/services.d.ts.map +1 -0
- package/dist/commands/init/services.js +209 -0
- package/dist/commands/init/services.js.map +1 -0
- package/dist/commands/init/storage.d.ts +8 -0
- package/dist/commands/init/storage.d.ts.map +1 -0
- package/dist/commands/init/storage.js +102 -0
- package/dist/commands/init/storage.js.map +1 -0
- package/dist/commands/init/toml.d.ts +65 -0
- package/dist/commands/init/toml.d.ts.map +1 -0
- package/dist/commands/init/toml.js +159 -0
- package/dist/commands/init/toml.js.map +1 -0
- package/dist/commands/init/topology.d.ts +54 -0
- package/dist/commands/init/topology.d.ts.map +1 -0
- package/dist/commands/init/topology.js +146 -0
- package/dist/commands/init/topology.js.map +1 -0
- package/dist/commands/init/types.d.ts +334 -0
- package/dist/commands/init/types.d.ts.map +1 -0
- package/dist/commands/init/types.js +31 -0
- package/dist/commands/init/types.js.map +1 -0
- package/dist/commands/init/wizard-terminal.d.ts +36 -0
- package/dist/commands/init/wizard-terminal.d.ts.map +1 -0
- package/dist/commands/init/wizard-terminal.js +163 -0
- package/dist/commands/init/wizard-terminal.js.map +1 -0
- package/dist/commands/init/wizard.d.ts +25 -0
- package/dist/commands/init/wizard.d.ts.map +1 -0
- package/dist/commands/init/wizard.js +358 -0
- package/dist/commands/init/wizard.js.map +1 -0
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +111 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/product-test-runner.d.ts +4 -0
- package/dist/commands/product-test-runner.d.ts.map +1 -0
- package/dist/commands/product-test-runner.js +85 -0
- package/dist/commands/product-test-runner.js.map +1 -0
- package/dist/commands/product.d.ts +16 -0
- package/dist/commands/product.d.ts.map +1 -0
- package/dist/commands/product.js +262 -0
- package/dist/commands/product.js.map +1 -0
- package/dist/commands/query.d.ts +114 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +783 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/scan.d.ts +10 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +302 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/sdd.d.ts +24 -0
- package/dist/commands/sdd.d.ts.map +1 -0
- package/dist/commands/sdd.js +195 -0
- package/dist/commands/sdd.js.map +1 -0
- package/dist/commands/unavailable.d.ts +40 -0
- package/dist/commands/unavailable.d.ts.map +1 -0
- package/dist/commands/unavailable.js +73 -0
- package/dist/commands/unavailable.js.map +1 -0
- package/dist/commands/watch/analyze.d.ts +69 -0
- package/dist/commands/watch/analyze.d.ts.map +1 -0
- package/dist/commands/watch/analyze.js +402 -0
- package/dist/commands/watch/analyze.js.map +1 -0
- package/dist/commands/watch/cli.d.ts +8 -0
- package/dist/commands/watch/cli.d.ts.map +1 -0
- package/dist/commands/watch/cli.js +97 -0
- package/dist/commands/watch/cli.js.map +1 -0
- package/dist/commands/watch/delta.d.ts +46 -0
- package/dist/commands/watch/delta.d.ts.map +1 -0
- package/dist/commands/watch/delta.js +170 -0
- package/dist/commands/watch/delta.js.map +1 -0
- package/dist/commands/watch/events.d.ts +214 -0
- package/dist/commands/watch/events.d.ts.map +1 -0
- package/dist/commands/watch/events.js +13 -0
- package/dist/commands/watch/events.js.map +1 -0
- package/dist/commands/watch/index.d.ts +19 -0
- package/dist/commands/watch/index.d.ts.map +1 -0
- package/dist/commands/watch/index.js +15 -0
- package/dist/commands/watch/index.js.map +1 -0
- package/dist/commands/watch/options.d.ts +43 -0
- package/dist/commands/watch/options.d.ts.map +1 -0
- package/dist/commands/watch/options.js +193 -0
- package/dist/commands/watch/options.js.map +1 -0
- package/dist/commands/watch/render.d.ts +26 -0
- package/dist/commands/watch/render.d.ts.map +1 -0
- package/dist/commands/watch/render.js +175 -0
- package/dist/commands/watch/render.js.map +1 -0
- package/dist/commands/watch/run.d.ts +14 -0
- package/dist/commands/watch/run.d.ts.map +1 -0
- package/dist/commands/watch/run.js +460 -0
- package/dist/commands/watch/run.js.map +1 -0
- package/dist/commands/watch/runtime.d.ts +67 -0
- package/dist/commands/watch/runtime.d.ts.map +1 -0
- package/dist/commands/watch/runtime.js +149 -0
- package/dist/commands/watch/runtime.js.map +1 -0
- package/dist/commands/watch-command.d.ts +3 -0
- package/dist/commands/watch-command.d.ts.map +1 -0
- package/dist/commands/watch-command.js +273 -0
- package/dist/commands/watch-command.js.map +1 -0
- package/dist/entry-point.d.ts +11 -0
- package/dist/entry-point.d.ts.map +1 -0
- package/dist/entry-point.js +65 -0
- package/dist/entry-point.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +245 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/boundaries-schema.d.ts +262 -0
- package/dist/mcp/boundaries-schema.d.ts.map +1 -0
- package/dist/mcp/boundaries-schema.js +183 -0
- package/dist/mcp/boundaries-schema.js.map +1 -0
- package/dist/mcp/default-runtime.d.ts +16 -0
- package/dist/mcp/default-runtime.d.ts.map +1 -0
- package/dist/mcp/default-runtime.js +718 -0
- package/dist/mcp/default-runtime.js.map +1 -0
- package/dist/mcp/envelope.d.ts +13 -0
- package/dist/mcp/envelope.d.ts.map +1 -0
- package/dist/mcp/envelope.js +29 -0
- package/dist/mcp/envelope.js.map +1 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/output-schemas.d.ts +5928 -0
- package/dist/mcp/output-schemas.d.ts.map +1 -0
- package/dist/mcp/output-schemas.js +2814 -0
- package/dist/mcp/output-schemas.js.map +1 -0
- package/dist/mcp/path-sandbox.d.ts +35 -0
- package/dist/mcp/path-sandbox.d.ts.map +1 -0
- package/dist/mcp/path-sandbox.js +128 -0
- package/dist/mcp/path-sandbox.js.map +1 -0
- package/dist/mcp/server.d.ts +155 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +257 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +20 -0
- package/dist/mcp/stdio.d.ts.map +1 -0
- package/dist/mcp/stdio.js +71 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/mcp/tools.d.ts +355 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +319 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +15 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +45 -0
- package/dist/mcp/types.js.map +1 -0
- package/package.json +99 -3
- package/src/cli/args.ts +231 -0
- package/src/cli/command.ts +146 -0
- package/src/cli/deadline.ts +56 -0
- package/src/cli/embedder-deadline.ts +187 -0
- package/src/cli/exit.ts +94 -0
- package/src/cli/graphs.ts +191 -0
- package/src/cli/index-freshness.ts +303 -0
- package/src/cli/index-refresh.ts +125 -0
- package/src/cli/index-state.ts +1217 -0
- package/src/cli/io.ts +56 -0
- package/src/cli/language-support.ts +203 -0
- package/src/cli/renewing-lease.ts +121 -0
- package/src/cli/search-graph-enrichment.ts +639 -0
- package/src/cli/system.ts +94 -0
- package/src/cli/vector-store-policy.ts +213 -0
- package/src/cli/version.ts +2 -0
- package/src/cli/workspace.ts +324 -0
- package/src/commands/complexity.ts +776 -0
- package/src/commands/doctor.languages.ts +187 -0
- package/src/commands/doctor.storage.ts +124 -0
- package/src/commands/doctor.ts +946 -0
- package/src/commands/extensions/add.ts +312 -0
- package/src/commands/extensions/configure.ts +82 -0
- package/src/commands/extensions/container.ts +209 -0
- package/src/commands/extensions/context.ts +109 -0
- package/src/commands/extensions/enable.ts +237 -0
- package/src/commands/extensions/environment.ts +218 -0
- package/src/commands/extensions/feature-scan.ts +232 -0
- package/src/commands/extensions/invoke.ts +368 -0
- package/src/commands/extensions/list.ts +158 -0
- package/src/commands/extensions/logs.ts +104 -0
- package/src/commands/extensions/provision.ts +206 -0
- package/src/commands/extensions/remove.ts +110 -0
- package/src/commands/extensions/render.ts +32 -0
- package/src/commands/extensions/run.ts +386 -0
- package/src/commands/extensions/secret-store.ts +223 -0
- package/src/commands/extensions/setup.ts +140 -0
- package/src/commands/extensions/source.ts +189 -0
- package/src/commands/extensions/state.ts +252 -0
- package/src/commands/extensions/status.ts +320 -0
- package/src/commands/extensions.ts +280 -0
- package/src/commands/flow/index.ts +402 -0
- package/src/commands/flow/limits.ts +14 -0
- package/src/commands/flow/output.ts +16 -0
- package/src/commands/flow/render.ts +318 -0
- package/src/commands/flow/select.ts +101 -0
- package/src/commands/graph/boundaries-input.ts +63 -0
- package/src/commands/graph/boundaries.ts +182 -0
- package/src/commands/graph/bounds.ts +25 -0
- package/src/commands/graph/category-clusters.ts +194 -0
- package/src/commands/graph/feature-3d.ts +141 -0
- package/src/commands/graph/feature-clusters.ts +125 -0
- package/src/commands/graph/feature-html.ts +336 -0
- package/src/commands/graph/feature-map.ts +270 -0
- package/src/commands/graph/feature-model.ts +234 -0
- package/src/commands/graph/feature-untangle-motion.ts +192 -0
- package/src/commands/graph/index.ts +562 -0
- package/src/commands/graph/render.ts +503 -0
- package/src/commands/graph/select.ts +77 -0
- package/src/commands/index/index.ts +595 -0
- package/src/commands/index/render.ts +325 -0
- package/src/commands/index/target.ts +136 -0
- package/src/commands/index-watch.ts +206 -0
- package/src/commands/init/command.ts +238 -0
- package/src/commands/init/config-draft.ts +235 -0
- package/src/commands/init/diff.ts +117 -0
- package/src/commands/init/http-probe.ts +150 -0
- package/src/commands/init/ignore-rules.ts +170 -0
- package/src/commands/init/index.ts +63 -0
- package/src/commands/init/integrations-apply.ts +618 -0
- package/src/commands/init/integrations-plan.ts +634 -0
- package/src/commands/init/integrations.ts +8 -0
- package/src/commands/init/languages.ts +320 -0
- package/src/commands/init/product-context.ts +576 -0
- package/src/commands/init/render.ts +598 -0
- package/src/commands/init/report.ts +204 -0
- package/src/commands/init/run.ts +349 -0
- package/src/commands/init/services.ts +271 -0
- package/src/commands/init/storage.ts +136 -0
- package/src/commands/init/toml.ts +174 -0
- package/src/commands/init/topology.ts +192 -0
- package/src/commands/init/types.ts +366 -0
- package/src/commands/init/wizard-terminal.ts +206 -0
- package/src/commands/init/wizard.ts +450 -0
- package/src/commands/mcp.ts +123 -0
- package/src/commands/product-test-runner.ts +80 -0
- package/src/commands/product.ts +331 -0
- package/src/commands/query.ts +1032 -0
- package/src/commands/scan.ts +360 -0
- package/src/commands/sdd.ts +243 -0
- package/src/commands/unavailable.ts +92 -0
- package/src/commands/watch/README.md +160 -0
- package/src/commands/watch/analyze.ts +600 -0
- package/src/commands/watch/cli.ts +108 -0
- package/src/commands/watch/delta.ts +186 -0
- package/src/commands/watch/events.ts +235 -0
- package/src/commands/watch/index.ts +53 -0
- package/src/commands/watch/options.ts +234 -0
- package/src/commands/watch/render.ts +240 -0
- package/src/commands/watch/run.ts +553 -0
- package/src/commands/watch/runtime.ts +167 -0
- package/src/commands/watch-command.ts +294 -0
- package/src/entry-point.ts +67 -0
- package/src/index.ts +291 -0
- package/src/mcp/boundaries-schema.ts +193 -0
- package/src/mcp/default-runtime.ts +1034 -0
- package/src/mcp/envelope.ts +57 -0
- package/src/mcp/index.ts +28 -0
- package/src/mcp/output-schemas.ts +3071 -0
- package/src/mcp/path-sandbox.ts +156 -0
- package/src/mcp/server.ts +358 -0
- package/src/mcp/stdio.ts +92 -0
- package/src/mcp/tools.ts +563 -0
- package/src/mcp/types.ts +66 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** User-private credential configuration; values never appear in output or argv. */
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { stringFlag } from "../../cli/args.js";
|
|
4
|
+
import { EXIT, OperationalError, UsageError } from "../../cli/exit.js";
|
|
5
|
+
import { line } from "../../cli/io.js";
|
|
6
|
+
import { explainMissing, findExtension, loadExtensionContext } from "./context.js";
|
|
7
|
+
import { resolveUserPath } from "./environment.js";
|
|
8
|
+
import { emitJson } from "./render.js";
|
|
9
|
+
import { parseSecretValues, readStoredSecrets, secretStorePath, withSecretLock, writeStoredSecrets, } from "./secret-store.js";
|
|
10
|
+
export async function runConfigure(environment, args, io, format) {
|
|
11
|
+
const id = args.positionals[1];
|
|
12
|
+
if (!id || args.positionals.length !== 2)
|
|
13
|
+
throw new UsageError("configure needs exactly one extension id.", "untangle extensions configure <id> [--from=<private-json-file>]");
|
|
14
|
+
const context = await loadExtensionContext(environment);
|
|
15
|
+
const extension = findExtension(context, id);
|
|
16
|
+
if (!extension)
|
|
17
|
+
throw new OperationalError(explainMissing(context, id), "Install the extension first.");
|
|
18
|
+
const manifest = extension.manifest;
|
|
19
|
+
const source = stringFlag(args, "from");
|
|
20
|
+
let imported = {};
|
|
21
|
+
if (source !== undefined) {
|
|
22
|
+
let content;
|
|
23
|
+
try {
|
|
24
|
+
content = JSON.parse(await readFile(resolveUserPath(environment.cwd, source), "utf8"));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new UsageError("Cannot read credential JSON; its contents were withheld.", "Use a JSON object keyed by the secret names declared in the manifest.");
|
|
28
|
+
}
|
|
29
|
+
imported = parseSecretValues(content, manifest);
|
|
30
|
+
}
|
|
31
|
+
const values = await withSecretLock(environment, id, async () => {
|
|
32
|
+
const stored = await readStoredSecrets(environment, manifest);
|
|
33
|
+
const values = {
|
|
34
|
+
...Object.fromEntries(manifest.secrets.map((secret) => [secret.name, ""])),
|
|
35
|
+
...stored,
|
|
36
|
+
...imported,
|
|
37
|
+
};
|
|
38
|
+
await writeStoredSecrets(environment, manifest, values);
|
|
39
|
+
return values;
|
|
40
|
+
});
|
|
41
|
+
const path = secretStorePath(environment, id);
|
|
42
|
+
const secrets = manifest.secrets.map((secret) => ({
|
|
43
|
+
name: secret.name,
|
|
44
|
+
envVar: secret.envVar,
|
|
45
|
+
configured: Boolean(values[secret.name]),
|
|
46
|
+
setupOnly: secret.setupOnly ?? false,
|
|
47
|
+
}));
|
|
48
|
+
if (format === "json")
|
|
49
|
+
emitJson(io, { command: "extensions configure", extensionId: id, path, secrets });
|
|
50
|
+
else {
|
|
51
|
+
line(io, `Private credential configuration (0600): ${path}`);
|
|
52
|
+
for (const secret of secrets)
|
|
53
|
+
line(io, ` ${secret.name}: ${secret.configured ? "configured" : "not set"}; environment override: ${secret.envVar}${secret.setupOnly ? " (setup only)" : ""}`);
|
|
54
|
+
line(io, `Edit the secrets object in that file, then run: untangle extensions setup ${id} --yes`);
|
|
55
|
+
}
|
|
56
|
+
return EXIT.ok;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/commands/extensions/configure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ContainerRuntimePort } from "@untangle-code/extension-runtime";
|
|
2
|
+
import type { ProcessLimitsV1, ProcessRunnerPort } from "@untangle-code/extension-runtime";
|
|
3
|
+
/** Vorgabe des Kommandos; ueberschreibbar mit `UNTANGLE_CONTAINER_CLI`. */
|
|
4
|
+
export declare const DEFAULT_CONTAINER_CLI = "docker";
|
|
5
|
+
/** Name des Containers einer Extension — bewusst vorhersagbar, nie geraten. */
|
|
6
|
+
export declare function containerNameFor(extensionId: string): string;
|
|
7
|
+
export interface ContainerCliOptions {
|
|
8
|
+
processRunner: ProcessRunnerPort;
|
|
9
|
+
limits: ProcessLimitsV1;
|
|
10
|
+
/** Kommando der Container-Runtime; kommt aus der Umgebung, nicht aus dem Quelltext. */
|
|
11
|
+
command?: string;
|
|
12
|
+
env?: Readonly<Record<string, string>>;
|
|
13
|
+
}
|
|
14
|
+
export declare function createContainerCli(options: ContainerCliOptions): ContainerRuntimePort;
|
|
15
|
+
//# sourceMappingURL=container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/container.ts"],"names":[],"mappings":"AAuBA,OAAO,EAQL,KAAK,oBAAoB,EAG1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE3F,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAE9C,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAOD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,iBAAiB,CAAC;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,oBAAoB,CAsJrF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { composeProjectName, EXTENSION_LABEL, MANAGED_LABEL, } from "@untangle-code/extension-runtime";
|
|
2
|
+
/** Vorgabe des Kommandos; ueberschreibbar mit `UNTANGLE_CONTAINER_CLI`. */
|
|
3
|
+
export const DEFAULT_CONTAINER_CLI = "docker";
|
|
4
|
+
/** Name des Containers einer Extension — bewusst vorhersagbar, nie geraten. */
|
|
5
|
+
export function containerNameFor(extensionId) {
|
|
6
|
+
return `untangle-ext-${extensionId}`;
|
|
7
|
+
}
|
|
8
|
+
const INSPECT_FORMAT = `{{index .Config.Labels "${MANAGED_LABEL}"}}\t` +
|
|
9
|
+
`{{index .Config.Labels "${EXTENSION_LABEL}"}}\t` +
|
|
10
|
+
`{{.State.Running}}\t{{.Config.Image}}`;
|
|
11
|
+
export function createContainerCli(options) {
|
|
12
|
+
const command = options.command ?? DEFAULT_CONTAINER_CLI;
|
|
13
|
+
const run = async (args, signal) => {
|
|
14
|
+
const result = await options.processRunner.run({
|
|
15
|
+
command,
|
|
16
|
+
args: [...args],
|
|
17
|
+
...(options.env === undefined ? {} : { env: options.env }),
|
|
18
|
+
}, options.limits, signal === undefined ? {} : { signal });
|
|
19
|
+
const ok = result.outcome === "completed" && (result.exitCode ?? 1) === 0;
|
|
20
|
+
return {
|
|
21
|
+
ok,
|
|
22
|
+
stdout: result.stdout,
|
|
23
|
+
stderr: result.stderr,
|
|
24
|
+
detail: ok
|
|
25
|
+
? `${command} ${args[0] ?? ""} succeeded`
|
|
26
|
+
: `${command} ${args.join(" ")} failed (${result.outcome}, exit ${String(result.exitCode)})` +
|
|
27
|
+
`${result.stderr.trim() === "" ? "" : `: ${result.stderr.trim().slice(0, 300)}`}`,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
async available(opts = {}) {
|
|
32
|
+
const result = await run(["version", "--format", "{{.Server.Version}}"], opts.signal);
|
|
33
|
+
if (!result.ok) {
|
|
34
|
+
return {
|
|
35
|
+
available: false,
|
|
36
|
+
detail: `no container runtime answered: ${result.detail}. Untangle neither ships nor starts ` +
|
|
37
|
+
`one; set UNTANGLE_CONTAINER_CLI if the command is named differently.`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const version = result.stdout.trim();
|
|
41
|
+
return {
|
|
42
|
+
available: true,
|
|
43
|
+
detail: `container runtime ${version} answered on "${command}"`,
|
|
44
|
+
...(version === "" ? {} : { version }),
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
async inspect(manifest, opts = {}) {
|
|
48
|
+
const name = containerNameFor(manifest.id);
|
|
49
|
+
const result = await run(["inspect", name, "--format", INSPECT_FORMAT], opts.signal);
|
|
50
|
+
if (!result.ok) {
|
|
51
|
+
return {
|
|
52
|
+
exists: false,
|
|
53
|
+
running: false,
|
|
54
|
+
ownedByUntangle: false,
|
|
55
|
+
detail: `no container named "${name}" exists`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const [managed, extensionId, running, image] = result.stdout.trim().split("\t");
|
|
59
|
+
const owned = managed === "true" && extensionId === manifest.id;
|
|
60
|
+
if (!owned) {
|
|
61
|
+
// Der Name allein beweist nichts. Ohne beide Labels ist der Container
|
|
62
|
+
// fremd, und fremde Container fasst Untangle nicht an (spec.md §3.2).
|
|
63
|
+
return {
|
|
64
|
+
exists: true,
|
|
65
|
+
running: running === "true",
|
|
66
|
+
ownedByUntangle: false,
|
|
67
|
+
detail: `a container named "${name}" exists but does not carry ${MANAGED_LABEL}=true and ` +
|
|
68
|
+
`${EXTENSION_LABEL}=${manifest.id}; Untangle does not touch containers it did not create`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const digest = /@(sha256:[0-9a-f]{64})$/.exec(image ?? "")?.[1];
|
|
72
|
+
return {
|
|
73
|
+
exists: true,
|
|
74
|
+
running: running === "true",
|
|
75
|
+
ownedByUntangle: true,
|
|
76
|
+
...(digest === undefined ? {} : { imageDigest: digest }),
|
|
77
|
+
detail: `container "${name}" is ${running === "true" ? "running" : "stopped"}`,
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
async up(input, opts = {}) {
|
|
81
|
+
const state = await this.inspect(input.manifest, opts);
|
|
82
|
+
if (state.exists && !state.ownedByUntangle) {
|
|
83
|
+
return { ok: false, detail: state.detail };
|
|
84
|
+
}
|
|
85
|
+
const result = await run([
|
|
86
|
+
"compose",
|
|
87
|
+
"--project-name",
|
|
88
|
+
composeProjectName(input.manifest.id),
|
|
89
|
+
"--file",
|
|
90
|
+
input.composeFilePath,
|
|
91
|
+
"up",
|
|
92
|
+
"--detach",
|
|
93
|
+
], opts.signal);
|
|
94
|
+
return { ok: result.ok, detail: result.detail };
|
|
95
|
+
},
|
|
96
|
+
async down(input, opts = {}) {
|
|
97
|
+
const state = await this.inspect(input.manifest, opts);
|
|
98
|
+
if (state.exists && !state.ownedByUntangle) {
|
|
99
|
+
return { ok: false, detail: state.detail };
|
|
100
|
+
}
|
|
101
|
+
const result = await run([
|
|
102
|
+
"compose",
|
|
103
|
+
"--project-name",
|
|
104
|
+
composeProjectName(input.manifest.id),
|
|
105
|
+
"--file",
|
|
106
|
+
input.composeFilePath,
|
|
107
|
+
"down",
|
|
108
|
+
...(input.removeVolumes ? ["--volumes"] : []),
|
|
109
|
+
], opts.signal);
|
|
110
|
+
return { ok: result.ok, detail: result.detail };
|
|
111
|
+
},
|
|
112
|
+
async logs(input, opts = {}) {
|
|
113
|
+
const state = await this.inspect(input.manifest, opts);
|
|
114
|
+
if (state.exists && !state.ownedByUntangle) {
|
|
115
|
+
return { ok: false, text: "", detail: state.detail };
|
|
116
|
+
}
|
|
117
|
+
if (!state.exists) {
|
|
118
|
+
return { ok: false, text: "", detail: state.detail };
|
|
119
|
+
}
|
|
120
|
+
const result = await run([
|
|
121
|
+
"compose",
|
|
122
|
+
"--project-name",
|
|
123
|
+
composeProjectName(input.manifest.id),
|
|
124
|
+
"--file",
|
|
125
|
+
input.composeFilePath,
|
|
126
|
+
"logs",
|
|
127
|
+
"--no-color",
|
|
128
|
+
"--tail",
|
|
129
|
+
String(input.tail),
|
|
130
|
+
], opts.signal);
|
|
131
|
+
return { ok: result.ok, text: result.stdout, detail: result.detail };
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/commands/extensions/container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared read path of the extension commands.
|
|
3
|
+
*
|
|
4
|
+
* Every command starts from the same picture: which manifests were found in
|
|
5
|
+
* the user roots, which were rejected and why, which were deliberately
|
|
6
|
+
* ignored and why, which acknowledgments exist, and what the CLI recorded
|
|
7
|
+
* about earlier runs. Building that once keeps `list`, `run` and `enable`
|
|
8
|
+
* from drifting apart in what they consider "installed".
|
|
9
|
+
*/
|
|
10
|
+
import { type ExtensionDiscoveryResultV1, type LicenseAcknowledgmentV1, type LicenseGateDecisionV1, type LoadedExtensionV1 } from "@untangle-code/extension-runtime";
|
|
11
|
+
import type { ExtensionEnvironmentV1 } from "./environment.js";
|
|
12
|
+
import { type CliStateV1 } from "./state.js";
|
|
13
|
+
export interface ExtensionContextV1 {
|
|
14
|
+
discovery: ExtensionDiscoveryResultV1;
|
|
15
|
+
acknowledgments: LicenseAcknowledgmentV1[];
|
|
16
|
+
state: CliStateV1;
|
|
17
|
+
/** Everything that was skipped, unreadable or ignored, with its reason (E4). */
|
|
18
|
+
warnings: string[];
|
|
19
|
+
}
|
|
20
|
+
/** Reads discovery, acknowledgments and CLI state in one go. */
|
|
21
|
+
export declare function loadExtensionContext(environment: ExtensionEnvironmentV1): Promise<ExtensionContextV1>;
|
|
22
|
+
/** Finds a loaded extension by id, or null. */
|
|
23
|
+
export declare function findExtension(context: ExtensionContextV1, extensionId: string): LoadedExtensionV1 | null;
|
|
24
|
+
/**
|
|
25
|
+
* Evaluates both gates for one extension against the stored acknowledgments.
|
|
26
|
+
*
|
|
27
|
+
* `ruleset` is the effective ruleset of the intended run; without one the
|
|
28
|
+
* manifest's `defaultRuleset` applies, which is what the runtime would use.
|
|
29
|
+
*/
|
|
30
|
+
export declare function gateFor(context: ExtensionContextV1, extension: LoadedExtensionV1, ruleset?: string): LicenseGateDecisionV1;
|
|
31
|
+
/**
|
|
32
|
+
* Explains why an id is not installed, naming the manifests that were
|
|
33
|
+
* rejected or ignored for it. "Not found" without a reason is exactly the
|
|
34
|
+
* silent skip E4 forbids.
|
|
35
|
+
*/
|
|
36
|
+
export declare function explainMissing(context: ExtensionContextV1, extensionId: string): string;
|
|
37
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAIL,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,0BAA0B,CAAC;IACtC,eAAe,EAAE,uBAAuB,EAAE,CAAC;IAC3C,KAAK,EAAE,UAAU,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,gEAAgE;AAChE,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,sBAAsB,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAgB7B;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAC3B,OAAO,EAAE,kBAAkB,EAC3B,WAAW,EAAE,MAAM,GAClB,iBAAiB,GAAG,IAAI,CAE1B;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,iBAAiB,EAC5B,OAAO,CAAC,EAAE,MAAM,GACf,qBAAqB,CAOvB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAyBvF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared read path of the extension commands.
|
|
3
|
+
*
|
|
4
|
+
* Every command starts from the same picture: which manifests were found in
|
|
5
|
+
* the user roots, which were rejected and why, which were deliberately
|
|
6
|
+
* ignored and why, which acknowledgments exist, and what the CLI recorded
|
|
7
|
+
* about earlier runs. Building that once keeps `list`, `run` and `enable`
|
|
8
|
+
* from drifting apart in what they consider "installed".
|
|
9
|
+
*/
|
|
10
|
+
import { discoverExtensions, evaluateLicenseGate, loadLicenseAcknowledgments, } from "@untangle-code/extension-runtime";
|
|
11
|
+
import { loadCliState } from "./state.js";
|
|
12
|
+
/** Reads discovery, acknowledgments and CLI state in one go. */
|
|
13
|
+
export async function loadExtensionContext(environment) {
|
|
14
|
+
const discovery = await discoverExtensions(environment.fs, {
|
|
15
|
+
roots: environment.roots,
|
|
16
|
+
projectRoots: environment.projectRoots,
|
|
17
|
+
});
|
|
18
|
+
const acknowledgments = await loadLicenseAcknowledgments(environment.fs, {
|
|
19
|
+
userDataDirectory: environment.userDataDir,
|
|
20
|
+
projectRoots: environment.projectRoots,
|
|
21
|
+
});
|
|
22
|
+
const state = await loadCliState(environment.fs, environment.userDataDir);
|
|
23
|
+
return {
|
|
24
|
+
discovery,
|
|
25
|
+
acknowledgments: acknowledgments.acknowledgments,
|
|
26
|
+
state: state.state,
|
|
27
|
+
warnings: [...acknowledgments.warnings, ...state.warnings],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Finds a loaded extension by id, or null. */
|
|
31
|
+
export function findExtension(context, extensionId) {
|
|
32
|
+
return context.discovery.extensions.find((entry) => entry.manifest.id === extensionId) ?? null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Evaluates both gates for one extension against the stored acknowledgments.
|
|
36
|
+
*
|
|
37
|
+
* `ruleset` is the effective ruleset of the intended run; without one the
|
|
38
|
+
* manifest's `defaultRuleset` applies, which is what the runtime would use.
|
|
39
|
+
*/
|
|
40
|
+
export function gateFor(context, extension, ruleset) {
|
|
41
|
+
const effective = ruleset ?? extension.manifest.defaultRuleset;
|
|
42
|
+
return evaluateLicenseGate({
|
|
43
|
+
extension,
|
|
44
|
+
acknowledgments: context.acknowledgments,
|
|
45
|
+
...(effective === undefined ? {} : { ruleset: effective }),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Explains why an id is not installed, naming the manifests that were
|
|
50
|
+
* rejected or ignored for it. "Not found" without a reason is exactly the
|
|
51
|
+
* silent skip E4 forbids.
|
|
52
|
+
*/
|
|
53
|
+
export function explainMissing(context, extensionId) {
|
|
54
|
+
const rejected = context.discovery.rejected.filter((entry) => entry.directoryName === extensionId || entry.manifestPath.includes(`/${extensionId}/`));
|
|
55
|
+
if (rejected.length > 0) {
|
|
56
|
+
const reasons = rejected
|
|
57
|
+
.flatMap((entry) => entry.issues.map((issue) => `${issue.field}: ${issue.message}`))
|
|
58
|
+
.join("; ");
|
|
59
|
+
return `extension "${extensionId}" has a manifest but it was rejected — ${reasons}`;
|
|
60
|
+
}
|
|
61
|
+
const ignored = context.discovery.ignored.filter((entry) => entry.manifestPath.includes(`/${extensionId}/`));
|
|
62
|
+
if (ignored.length > 0) {
|
|
63
|
+
const reasons = ignored.map((entry) => `${entry.reason}: ${entry.detail}`).join("; ");
|
|
64
|
+
return `extension "${extensionId}" was found but not loaded — ${reasons}`;
|
|
65
|
+
}
|
|
66
|
+
const roots = context.discovery.rootsScanned
|
|
67
|
+
.map((entry) => `${entry.root}${entry.exists ? "" : " (does not exist)"}`)
|
|
68
|
+
.join(", ");
|
|
69
|
+
return (`no extension "${extensionId}" is installed; searched: ${roots}. ` +
|
|
70
|
+
`Install one with: untangle extensions add --from <path-or-url>`);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/commands/extensions/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ParsedArgs } from "../../cli/args.js";
|
|
2
|
+
import { type Io } from "../../cli/io.js";
|
|
3
|
+
import type { ExtensionEnvironmentV1 } from "./environment.js";
|
|
4
|
+
export declare function runEnable(environment: ExtensionEnvironmentV1, args: ParsedArgs, io: Io, format: "text" | "json"): Promise<number>;
|
|
5
|
+
export declare function runDisable(environment: ExtensionEnvironmentV1, args: ParsedArgs, io: Io, format: "text" | "json"): Promise<number>;
|
|
6
|
+
//# sourceMappingURL=enable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/enable.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAc,KAAK,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAItD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAU/D,wBAAsB,SAAS,CAC7B,WAAW,EAAE,sBAAsB,EACnC,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,GAAG,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAkGjB;AAED,wBAAsB,UAAU,CAC9B,WAAW,EAAE,sBAAsB,EACnC,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,GAAG,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAuFjB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `untangle extensions enable <id>` / `disable <id>`
|
|
3
|
+
*
|
|
4
|
+
* These exist because the runtime's license gate prints them. When a gate is
|
|
5
|
+
* unacknowledged the runtime hands back the exact command that would grant
|
|
6
|
+
* the acknowledgment (extensions.md §9.5), and a printed command that does
|
|
7
|
+
* not exist is worse than no hint at all.
|
|
8
|
+
*
|
|
9
|
+
* `enable` records the opt-in and, with the acknowledgment flags, the
|
|
10
|
+
* personal license declaration. It starts nothing: no process, no pull, no
|
|
11
|
+
* container (X1). `disable` reverses the opt-in and, with `--revoke-license`,
|
|
12
|
+
* the declaration (§9.3).
|
|
13
|
+
*
|
|
14
|
+
* The tool gate and the ruleset gate are separate. `--acknowledge-license`
|
|
15
|
+
* covers the tool ONLY; a restricted ruleset still needs its own
|
|
16
|
+
* `--acknowledge-ruleset=<id>`, which is repeatable.
|
|
17
|
+
*/
|
|
18
|
+
import { buildAcknowledgment, createNodeProcessRunner, defaultProcessLimits, } from "@untangle-code/extension-runtime";
|
|
19
|
+
import { boolFlag, listFlag } from "../../cli/args.js";
|
|
20
|
+
import { EXIT, OperationalError, UsageError } from "../../cli/exit.js";
|
|
21
|
+
import { line, note } from "../../cli/io.js";
|
|
22
|
+
import { createContainerCli } from "./container.js";
|
|
23
|
+
import { explainMissing, findExtension, gateFor, loadExtensionContext } from "./context.js";
|
|
24
|
+
import { composeFilePath } from "./provision.js";
|
|
25
|
+
import { emitJson } from "./render.js";
|
|
26
|
+
import { revokeAcknowledgments, saveAcknowledgments, saveCliState, upsertAcknowledgment, } from "./state.js";
|
|
27
|
+
export async function runEnable(environment, args, io, format) {
|
|
28
|
+
const extensionId = args.positionals[1];
|
|
29
|
+
if (extensionId === undefined) {
|
|
30
|
+
throw new UsageError("`untangle extensions enable` needs an extension id.", "Run `untangle extensions list` to see the installed ids.");
|
|
31
|
+
}
|
|
32
|
+
const context = await loadExtensionContext(environment);
|
|
33
|
+
const extension = findExtension(context, extensionId);
|
|
34
|
+
if (extension === null) {
|
|
35
|
+
throw new OperationalError(explainMissing(context, extensionId), "Install it first: untangle extensions add --from=<path-or-url>");
|
|
36
|
+
}
|
|
37
|
+
let acknowledgments = context.acknowledgments;
|
|
38
|
+
const acknowledgedNow = [];
|
|
39
|
+
if (boolFlag(args, "acknowledge-license")) {
|
|
40
|
+
acknowledgments = upsertAcknowledgment(acknowledgments, buildAcknowledgment({
|
|
41
|
+
manifest: extension.manifest,
|
|
42
|
+
acknowledgedAt: environment.clock.nowIso(),
|
|
43
|
+
acknowledgedBy: environment.userName,
|
|
44
|
+
}));
|
|
45
|
+
acknowledgedNow.push(`tool:${extensionId}`);
|
|
46
|
+
}
|
|
47
|
+
for (const ruleset of listFlag(args, "acknowledge-ruleset")) {
|
|
48
|
+
acknowledgments = upsertAcknowledgment(acknowledgments, buildAcknowledgment({
|
|
49
|
+
manifest: extension.manifest,
|
|
50
|
+
ruleset,
|
|
51
|
+
acknowledgedAt: environment.clock.nowIso(),
|
|
52
|
+
acknowledgedBy: environment.userName,
|
|
53
|
+
}));
|
|
54
|
+
acknowledgedNow.push(`ruleset:${ruleset}`);
|
|
55
|
+
}
|
|
56
|
+
let acknowledgmentFile;
|
|
57
|
+
if (acknowledgedNow.length > 0) {
|
|
58
|
+
acknowledgmentFile = await saveAcknowledgments(environment.fs, environment.userDataDir, acknowledgments);
|
|
59
|
+
}
|
|
60
|
+
const enabled = context.state.enabled.includes(extensionId)
|
|
61
|
+
? context.state.enabled
|
|
62
|
+
: [...context.state.enabled, extensionId];
|
|
63
|
+
const statePath = await saveCliState(environment.fs, environment.userDataDir, {
|
|
64
|
+
...context.state,
|
|
65
|
+
enabled,
|
|
66
|
+
});
|
|
67
|
+
const gate = gateFor({ ...context, acknowledgments }, extension);
|
|
68
|
+
if (format === "json") {
|
|
69
|
+
emitJson(io, {
|
|
70
|
+
command: "extensions enable",
|
|
71
|
+
extensionId,
|
|
72
|
+
enabled: true,
|
|
73
|
+
started: false,
|
|
74
|
+
stateFile: statePath,
|
|
75
|
+
acknowledgedNow,
|
|
76
|
+
acknowledgmentFile,
|
|
77
|
+
licenseGate: {
|
|
78
|
+
allowed: gate.allowed,
|
|
79
|
+
tool: { status: gate.tool.status, reason: gate.tool.reason },
|
|
80
|
+
rulesets: gate.rulesets.map((entry) => ({
|
|
81
|
+
ruleset: entry.ruleset,
|
|
82
|
+
status: entry.status,
|
|
83
|
+
reason: entry.reason,
|
|
84
|
+
})),
|
|
85
|
+
acknowledgeCommands: gate.acknowledgeCommands,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
line(io, `enabled "${extensionId}" — nothing was started (X1).`);
|
|
91
|
+
line(io, ` state ${statePath}`);
|
|
92
|
+
line(io, ` license ${gate.tool.status} — ${gate.tool.reason}`);
|
|
93
|
+
for (const entry of gate.rulesets) {
|
|
94
|
+
line(io, ` ruleset ${entry.ruleset}: ${entry.status} — ${entry.reason}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (!gate.allowed) {
|
|
98
|
+
note(io, "The license gate is still open; run:");
|
|
99
|
+
for (const command of gate.acknowledgeCommands) {
|
|
100
|
+
note(io, ` ${command}`);
|
|
101
|
+
}
|
|
102
|
+
return EXIT.environment;
|
|
103
|
+
}
|
|
104
|
+
return EXIT.ok;
|
|
105
|
+
}
|
|
106
|
+
export async function runDisable(environment, args, io, format) {
|
|
107
|
+
const extensionId = args.positionals[1];
|
|
108
|
+
if (extensionId === undefined) {
|
|
109
|
+
throw new UsageError("`untangle extensions disable` needs an extension id.", "Run `untangle extensions list` to see the installed ids.");
|
|
110
|
+
}
|
|
111
|
+
// Die Flag-Pruefung steht VOR jeder Zustandsaenderung. Zuvor lag sie danach:
|
|
112
|
+
// ein Aufruf, den die CLI im selben Atemzug als Aufruffehler zurueckwies,
|
|
113
|
+
// hatte die Extension bereits deaktiviert. Ein abgelehnter Befehl darf nichts
|
|
114
|
+
// getan haben.
|
|
115
|
+
const removeContainer = boolFlag(args, "remove-container");
|
|
116
|
+
const removeVolumes = boolFlag(args, "remove-volumes");
|
|
117
|
+
if (removeVolumes && !removeContainer) {
|
|
118
|
+
throw new UsageError("--remove-volumes only applies together with --remove-container.", `Run untangle extensions disable ${extensionId} --remove-container --remove-volumes`);
|
|
119
|
+
}
|
|
120
|
+
const context = await loadExtensionContext(environment);
|
|
121
|
+
const statePath = await saveCliState(environment.fs, environment.userDataDir, {
|
|
122
|
+
...context.state,
|
|
123
|
+
enabled: context.state.enabled.filter((id) => id !== extensionId),
|
|
124
|
+
});
|
|
125
|
+
// `--remove-container` fasst NUR den eigenen Container an; die Besitzprobe
|
|
126
|
+
// liegt im Adapter und laesst einen fremden gleichen Namens unberuehrt.
|
|
127
|
+
// Volumes bleiben ohne die zweite, ausdrueckliche Anweisung erhalten: ein
|
|
128
|
+
// geloeschtes Volume ist die einzige hier moegliche Handlung, die Arbeit
|
|
129
|
+
// vernichtet, die niemand wiederherstellen kann.
|
|
130
|
+
let containerDetail;
|
|
131
|
+
if (removeContainer) {
|
|
132
|
+
const installed = findExtension(context, extensionId);
|
|
133
|
+
const manifest = installed?.manifest;
|
|
134
|
+
if (manifest?.container === undefined) {
|
|
135
|
+
containerDetail = `"${extensionId}" declares no container; nothing to remove`;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const containerCli = createContainerCli({
|
|
139
|
+
processRunner: createNodeProcessRunner(environment.clock),
|
|
140
|
+
limits: { ...defaultProcessLimits(), timeoutMs: 120_000 },
|
|
141
|
+
...(environment.env["UNTANGLE_CONTAINER_CLI"] === undefined
|
|
142
|
+
? {}
|
|
143
|
+
: { command: environment.env["UNTANGLE_CONTAINER_CLI"] }),
|
|
144
|
+
});
|
|
145
|
+
const down = await containerCli.down({
|
|
146
|
+
manifest,
|
|
147
|
+
composeFilePath: composeFilePath(environment.userDataDir, manifest.id),
|
|
148
|
+
removeVolumes,
|
|
149
|
+
});
|
|
150
|
+
containerDetail = down.detail;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
let acknowledgmentFile;
|
|
154
|
+
const revoked = boolFlag(args, "revoke-license");
|
|
155
|
+
if (revoked) {
|
|
156
|
+
acknowledgmentFile = await saveAcknowledgments(environment.fs, environment.userDataDir, revokeAcknowledgments(context.acknowledgments, extensionId, environment.clock.nowIso()));
|
|
157
|
+
}
|
|
158
|
+
if (format === "json") {
|
|
159
|
+
emitJson(io, {
|
|
160
|
+
command: "extensions disable",
|
|
161
|
+
extensionId,
|
|
162
|
+
enabled: false,
|
|
163
|
+
stateFile: statePath,
|
|
164
|
+
licenseAcknowledgment: revoked ? "revoked" : "kept",
|
|
165
|
+
acknowledgmentFile,
|
|
166
|
+
...(containerDetail === undefined ? {} : { container: containerDetail }),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
line(io, `disabled "${extensionId}".`);
|
|
171
|
+
line(io, revoked
|
|
172
|
+
? ` license acknowledgment revoked in ${String(acknowledgmentFile)}`
|
|
173
|
+
: " license acknowledgment kept (use --revoke-license to drop it)");
|
|
174
|
+
if (containerDetail !== undefined) {
|
|
175
|
+
line(io, ` container ${containerDetail}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return EXIT.ok;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=enable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/commands/extensions/enable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Clock, FileSystemPort, Random } from "@untangle-code/domain";
|
|
2
|
+
export interface ExtensionEnvironmentV1 {
|
|
3
|
+
fs: FileSystemPort;
|
|
4
|
+
clock: Clock;
|
|
5
|
+
random: Random;
|
|
6
|
+
/** Directory the user invoked the CLI from, canonicalized where possible. */
|
|
7
|
+
cwd: string;
|
|
8
|
+
/** Search roots for user-installed extensions; `roots[0]` is the install target. */
|
|
9
|
+
roots: string[];
|
|
10
|
+
/** OS-specific user data directory (holds the acknowledgment file). */
|
|
11
|
+
userDataDir: string;
|
|
12
|
+
/** Directories that MUST NOT be scanned for manifests. */
|
|
13
|
+
projectRoots: string[];
|
|
14
|
+
/** OS user name — an acknowledgment is a personal declaration. */
|
|
15
|
+
userName: string;
|
|
16
|
+
env: Readonly<Record<string, string | undefined>>;
|
|
17
|
+
}
|
|
18
|
+
export interface CreateExtensionEnvironmentOptions {
|
|
19
|
+
cwd: string;
|
|
20
|
+
env: Readonly<Record<string, string | undefined>>;
|
|
21
|
+
fs?: FileSystemPort;
|
|
22
|
+
clock?: Clock;
|
|
23
|
+
random?: Random;
|
|
24
|
+
homeDir?: string;
|
|
25
|
+
platform?: string;
|
|
26
|
+
userName?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function createExtensionEnvironment(options: CreateExtensionEnvironmentOptions): Promise<ExtensionEnvironmentV1>;
|
|
29
|
+
/**
|
|
30
|
+
* Determines which directories must be treated as project directories.
|
|
31
|
+
*
|
|
32
|
+
* Walks from `start` up to the filesystem root and collects every directory
|
|
33
|
+
* carrying a project marker; if at least one is found, `start` itself joins
|
|
34
|
+
* the list, because the working directory inside a project is part of that
|
|
35
|
+
* project.
|
|
36
|
+
*
|
|
37
|
+
* Two deliberate exclusions:
|
|
38
|
+
*
|
|
39
|
+
* - **The home directory is never a project root.** A dotfiles repository in
|
|
40
|
+
* `$HOME` is ordinary, and treating `$HOME` as a project would put
|
|
41
|
+
* `~/.untangle/extensions` inside a project directory — which would make the
|
|
42
|
+
* user's own extension root unscannable the moment they ran the CLI from
|
|
43
|
+
* their home directory. The boundary is meant to keep a stranger's
|
|
44
|
+
* repository out, not to lock people out of their own profile.
|
|
45
|
+
* - **A directory with no marker anywhere above it yields no project roots at
|
|
46
|
+
* all.** Without a marker there is no project to protect, and a bare
|
|
47
|
+
* directory the user made themselves is theirs. The consequence is stated
|
|
48
|
+
* openly: `add --from ./manifest.toml` in such a directory is NOT refused.
|
|
49
|
+
* A cloned repository always carries `.git`, so the case the boundary exists
|
|
50
|
+
* for is still covered.
|
|
51
|
+
*/
|
|
52
|
+
export declare function discoverProjectRoots(fs: FileSystemPort, start: string, homeDir?: string): Promise<string[]>;
|
|
53
|
+
/** True when `candidate` lies inside any of `roots`. */
|
|
54
|
+
export declare function isInsideAnyRoot(candidate: string, roots: readonly string[]): boolean;
|
|
55
|
+
/** Resolves a user-supplied path against the working directory. */
|
|
56
|
+
export declare function resolveUserPath(cwd: string, path: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Canonical form of a path, with symlinks resolved.
|
|
59
|
+
*
|
|
60
|
+
* This is not cosmetic. `isProjectLocalManifest` and `isInsideDirectory`
|
|
61
|
+
* compare LEXICALLY and say so: they never resolve symlinks, and the caller is
|
|
62
|
+
* expected to hand them canonical paths. Skipping this step would leave the
|
|
63
|
+
* project boundary trivially escapable — a symlink, or on macOS merely the
|
|
64
|
+
* `/var` → `/private/var` alias, is enough to make a path inside a project
|
|
65
|
+
* compare as if it were outside one.
|
|
66
|
+
*
|
|
67
|
+
* A path that does not exist yet still gets canonicalized as far as it does
|
|
68
|
+
* exist: the deepest existing ancestor is resolved and the remaining segments
|
|
69
|
+
* are re-appended. Failing the whole command over a not-yet-created file would
|
|
70
|
+
* be worse than a partially canonical answer, and the ancestor is the part
|
|
71
|
+
* that decides containment.
|
|
72
|
+
*/
|
|
73
|
+
export declare function canonicalize(fs: FileSystemPort, path: string): Promise<string>;
|
|
74
|
+
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/environment.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAW3E,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,cAAc,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,oFAAoF;IACpF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,iCAAiC;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAClD,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,sBAAsB,CAAC,CAsBjC;AAUD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAWD,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAEpF;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBpF"}
|