@untangle-code/cli 0.0.0-stage → 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 +661 -0
- package/NOTICE +90 -0
- package/README.md +424 -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,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bereitstellung eines Container-Dienstes aus dem Manifest (extensions.md §6.2).
|
|
3
|
+
*
|
|
4
|
+
* Der Ablauf ist bewusst kurz und ohne Werkzeugwissen:
|
|
5
|
+
*
|
|
6
|
+
* Manifest → Compose-Datei rendern → up → Healthcheck des Manifests
|
|
7
|
+
*
|
|
8
|
+
* Die Compose-Datei entsteht bei jedem Lauf neu aus dem validierten Manifest.
|
|
9
|
+
* Damit gilt der gepinnte Digest wirklich, die Ports binden wirklich an
|
|
10
|
+
* Loopback und die Labels sind wirklich gesetzt — statt in einer mitgebrachten
|
|
11
|
+
* YAML behauptet zu werden, die Untangle nicht geprueft hat.
|
|
12
|
+
*
|
|
13
|
+
* Auf die Gesundheit wartet Untangle SELBST, ueber den Healthcheck aus dem
|
|
14
|
+
* Manifest, statt einen in den Container zu rendern. Ein Healthcheck im
|
|
15
|
+
* Container muesste voraussetzen, welches Programm darin liegt, um eine URL
|
|
16
|
+
* abzufragen — genau das Werkzeugwissen, das X9 aus dem Quelltext heraushaelt.
|
|
17
|
+
*/
|
|
18
|
+
import { dirname, join } from "node:path";
|
|
19
|
+
import { renderComposeFile, } from "@untangle-code/extension-runtime";
|
|
20
|
+
/** Ort der gerenderten Datei: im Nutzer-Datenverzeichnis, nie im Projekt. */
|
|
21
|
+
export function composeFilePath(userDataDirectory, extensionId) {
|
|
22
|
+
return join(userDataDirectory, "extensions", extensionId, "compose.yaml");
|
|
23
|
+
}
|
|
24
|
+
/** Der erste Hostport des Manifests, mit optionaler Ueberschreibung. */
|
|
25
|
+
export function primaryHostPort(manifest, overrides = {}) {
|
|
26
|
+
const port = manifest.container?.ports[0];
|
|
27
|
+
if (port === undefined) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return overrides[port.name] ?? port.hostPortDefault;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Startet den Dienst, falls noetig, und wartet auf seine Gesundheit.
|
|
34
|
+
*
|
|
35
|
+
* Ein bereits laufender, Untangle gehoerender Container wird NICHT neu
|
|
36
|
+
* gestartet: der Lauf soll den Dienst benutzen, nicht bewirtschaften.
|
|
37
|
+
*/
|
|
38
|
+
export async function provisionContainer(deps, input) {
|
|
39
|
+
const steps = [];
|
|
40
|
+
const manifest = input.manifest;
|
|
41
|
+
const container = manifest.container;
|
|
42
|
+
if (container === undefined) {
|
|
43
|
+
const state = {
|
|
44
|
+
exists: false,
|
|
45
|
+
running: false,
|
|
46
|
+
ownedByUntangle: false,
|
|
47
|
+
detail: "the manifest declares no container block",
|
|
48
|
+
};
|
|
49
|
+
return { healthy: false, steps, state, detail: state.detail };
|
|
50
|
+
}
|
|
51
|
+
const runtime = await deps.container.available(input.signal === undefined ? {} : { signal: input.signal });
|
|
52
|
+
steps.push(runtime.detail);
|
|
53
|
+
if (!runtime.available) {
|
|
54
|
+
return {
|
|
55
|
+
healthy: false,
|
|
56
|
+
steps,
|
|
57
|
+
state: {
|
|
58
|
+
exists: false,
|
|
59
|
+
running: false,
|
|
60
|
+
ownedByUntangle: false,
|
|
61
|
+
detail: runtime.detail,
|
|
62
|
+
},
|
|
63
|
+
detail: runtime.detail,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const path = composeFilePath(input.userDataDirectory, manifest.id);
|
|
67
|
+
const yaml = renderComposeFile({
|
|
68
|
+
manifest,
|
|
69
|
+
...(input.hostPorts === undefined ? {} : { hostPorts: input.hostPorts }),
|
|
70
|
+
...(input.workspacePath === undefined ? {} : { workspacePath: input.workspacePath }),
|
|
71
|
+
});
|
|
72
|
+
await deps.fs.mkdir(dirname(path), { recursive: true });
|
|
73
|
+
await deps.fs.writeFile(path, new TextEncoder().encode(yaml));
|
|
74
|
+
steps.push(`rendered ${path} from the manifest (image pinned to ${container.digest})`);
|
|
75
|
+
let state = await deps.container.inspect(manifest, input.signal === undefined ? {} : { signal: input.signal });
|
|
76
|
+
if (state.exists && !state.ownedByUntangle) {
|
|
77
|
+
steps.push(state.detail);
|
|
78
|
+
return { healthy: false, steps, state, detail: state.detail };
|
|
79
|
+
}
|
|
80
|
+
if (state.running) {
|
|
81
|
+
steps.push("the container was already running; Untangle did not restart it");
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const up = await deps.container.up({ manifest, composeFilePath: path }, input.signal === undefined ? {} : { signal: input.signal });
|
|
85
|
+
steps.push(up.detail);
|
|
86
|
+
if (!up.ok) {
|
|
87
|
+
return { healthy: false, steps, state, detail: up.detail };
|
|
88
|
+
}
|
|
89
|
+
state = await deps.container.inspect(manifest, input.signal === undefined ? {} : { signal: input.signal });
|
|
90
|
+
}
|
|
91
|
+
const health = await waitForHealth(deps, {
|
|
92
|
+
manifest,
|
|
93
|
+
...(input.hostPorts === undefined ? {} : { hostPorts: input.hostPorts }),
|
|
94
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
95
|
+
});
|
|
96
|
+
steps.push(health.detail);
|
|
97
|
+
return { healthy: health.healthy, steps, state, detail: health.detail };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Fragt den Healthcheck des Manifests ab, bis er antwortet oder die erklaerten
|
|
101
|
+
* Versuche erschoepft sind. Ein Dienst, der lange startet, ist kein Fehler —
|
|
102
|
+
* ein Dienst, der nie antwortet, schon, und dann steht der Grund da.
|
|
103
|
+
*/
|
|
104
|
+
async function waitForHealth(deps, input) {
|
|
105
|
+
const check = input.manifest.container?.healthcheck;
|
|
106
|
+
if (check === undefined || check.kind !== "http" || check.httpPath === undefined) {
|
|
107
|
+
return {
|
|
108
|
+
healthy: true,
|
|
109
|
+
detail: "the manifest declares no http healthcheck; Untangle treats the container as ready " +
|
|
110
|
+
"without probing and says so rather than implying it checked",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const port = primaryHostPort(input.manifest, input.hostPorts ?? {});
|
|
114
|
+
if (port === undefined) {
|
|
115
|
+
return { healthy: false, detail: "the manifest declares a healthcheck but no port" };
|
|
116
|
+
}
|
|
117
|
+
const url = `http://127.0.0.1:${String(port)}${check.httpPath}`;
|
|
118
|
+
let lastDetail = "no probe was made";
|
|
119
|
+
for (let attempt = 1; attempt <= check.retries; attempt += 1) {
|
|
120
|
+
const response = await deps.httpRunner.request({ url, method: "GET" }, { ...deps.limits, timeoutMs: check.timeoutMs }, input.signal === undefined ? {} : { signal: input.signal });
|
|
121
|
+
if (response.outcome === "completed" && (response.status ?? 500) < 400) {
|
|
122
|
+
return {
|
|
123
|
+
healthy: true,
|
|
124
|
+
detail: `healthcheck ${url} answered ${String(response.status)} after ${String(attempt)} attempt(s)`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
lastDetail = `attempt ${String(attempt)}: ${response.outcome}${response.status === undefined ? "" : ` (status ${String(response.status)})`}`;
|
|
128
|
+
if (attempt < check.retries) {
|
|
129
|
+
await deps.wait(check.intervalMs, input.signal);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
healthy: false,
|
|
134
|
+
detail: `healthcheck ${url} did not answer within ${String(check.retries)} attempts — ${lastDetail}`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=provision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../../src/commands/extensions/provision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
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 runRemove(environment: ExtensionEnvironmentV1, args: ParsedArgs, io: Io, format: "text" | "json"): Promise<number>;
|
|
5
|
+
//# sourceMappingURL=remove.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/remove.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAc,KAAK,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAIhF,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,CA6EjB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `untangle extensions remove <id>`
|
|
3
|
+
*
|
|
4
|
+
* Deletes one installed extension directory from the user's extension root.
|
|
5
|
+
*
|
|
6
|
+
* Two guards. The directory must lie inside a resolved extension root — the
|
|
7
|
+
* command deletes recursively, and a recursive delete driven by an id from
|
|
8
|
+
* the command line has to prove where it is pointing. And it must not lie
|
|
9
|
+
* inside a project directory, which would mean the boundary was crossed
|
|
10
|
+
* earlier and deleting is not the right repair.
|
|
11
|
+
*
|
|
12
|
+
* The license acknowledgment is kept by default. It is a personal declaration
|
|
13
|
+
* about a tool's terms, not a property of the installed file, and
|
|
14
|
+
* re-installing the same tool should not quietly need a fresh one. Dropping
|
|
15
|
+
* it is `--revoke-license`, what extensions.md §9.3 calls revocation.
|
|
16
|
+
*/
|
|
17
|
+
import { dirname } from "node:path";
|
|
18
|
+
import { boolFlag } from "../../cli/args.js";
|
|
19
|
+
import { EXIT, OperationalError, UsageError } from "../../cli/exit.js";
|
|
20
|
+
import { line, note } from "../../cli/io.js";
|
|
21
|
+
import { explainMissing, findExtension, loadExtensionContext } from "./context.js";
|
|
22
|
+
import { isInsideAnyRoot } from "./environment.js";
|
|
23
|
+
import { emitJson } from "./render.js";
|
|
24
|
+
import { removeAcknowledgments, saveAcknowledgments, saveCliState } from "./state.js";
|
|
25
|
+
export async function runRemove(environment, args, io, format) {
|
|
26
|
+
const extensionId = args.positionals[1];
|
|
27
|
+
if (extensionId === undefined) {
|
|
28
|
+
throw new UsageError("`untangle extensions remove` needs an extension id.", "Run `untangle extensions list` to see the installed ids.");
|
|
29
|
+
}
|
|
30
|
+
const context = await loadExtensionContext(environment);
|
|
31
|
+
const extension = findExtension(context, extensionId);
|
|
32
|
+
if (extension === null) {
|
|
33
|
+
throw new OperationalError(explainMissing(context, extensionId), "Run `untangle extensions list` to see what is installed and why something was rejected.");
|
|
34
|
+
}
|
|
35
|
+
const directory = dirname(extension.manifestPath);
|
|
36
|
+
if (!isInsideAnyRoot(directory, environment.roots)) {
|
|
37
|
+
throw new OperationalError(`Refusing to delete "${directory}": it is not inside a resolved extension root ` +
|
|
38
|
+
`(${environment.roots.join(", ")}).`, "Delete the directory yourself if that is really what you want.");
|
|
39
|
+
}
|
|
40
|
+
if (isInsideAnyRoot(directory, environment.projectRoots)) {
|
|
41
|
+
throw new OperationalError(`Refusing to delete "${directory}": it lies inside a project directory.`, "Extensions are user-profile artifacts; remove this one with your own tools.");
|
|
42
|
+
}
|
|
43
|
+
await environment.fs.remove(directory, { recursive: true });
|
|
44
|
+
const statePath = await saveCliState(environment.fs, environment.userDataDir, {
|
|
45
|
+
...context.state,
|
|
46
|
+
enabled: context.state.enabled.filter((id) => id !== extensionId),
|
|
47
|
+
lastRuns: Object.fromEntries(Object.entries(context.state.lastRuns).filter(([id]) => id !== extensionId)),
|
|
48
|
+
});
|
|
49
|
+
let acknowledgmentFile;
|
|
50
|
+
const revoked = boolFlag(args, "revoke-license");
|
|
51
|
+
if (revoked) {
|
|
52
|
+
acknowledgmentFile = await saveAcknowledgments(environment.fs, environment.userDataDir, removeAcknowledgments(context.acknowledgments, extensionId));
|
|
53
|
+
}
|
|
54
|
+
if (format === "json") {
|
|
55
|
+
emitJson(io, {
|
|
56
|
+
command: "extensions remove",
|
|
57
|
+
extensionId,
|
|
58
|
+
removedDirectory: directory,
|
|
59
|
+
stateFile: statePath,
|
|
60
|
+
licenseAcknowledgment: revoked ? "revoked" : "kept",
|
|
61
|
+
acknowledgmentFile,
|
|
62
|
+
warnings: context.warnings,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
line(io, `removed "${extensionId}"`);
|
|
67
|
+
line(io, ` directory ${directory}`);
|
|
68
|
+
line(io, revoked
|
|
69
|
+
? ` license acknowledgment revoked in ${String(acknowledgmentFile)}`
|
|
70
|
+
: " license acknowledgment kept (use --revoke-license to drop it)");
|
|
71
|
+
}
|
|
72
|
+
for (const warning of context.warnings) {
|
|
73
|
+
note(io, `warning: ${warning}`);
|
|
74
|
+
}
|
|
75
|
+
return EXIT.ok;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/extensions/remove.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two output shapes the extension commands share.
|
|
3
|
+
*
|
|
4
|
+
* Payload goes to stdout, everything else to stderr (see `cli/io.ts`), so
|
|
5
|
+
* `--format=json | jq` stays usable while warnings remain visible.
|
|
6
|
+
*/
|
|
7
|
+
import { type Io } from "../../cli/io.js";
|
|
8
|
+
/** Writes one JSON document to stdout. */
|
|
9
|
+
export declare function emitJson(io: Io, value: unknown): void;
|
|
10
|
+
/**
|
|
11
|
+
* Renders a table padded to the widest cell per column. Padding counts code
|
|
12
|
+
* units, which is what a fixed-width terminal measures for the ASCII
|
|
13
|
+
* identifiers, SPDX ids and paths shown here.
|
|
14
|
+
*/
|
|
15
|
+
export declare function renderTable(header: readonly string[], rows: readonly (readonly string[])[]): string[];
|
|
16
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAQ,KAAK,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAEhD,0CAA0C;AAC1C,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAErD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,GACnC,MAAM,EAAE,CAUV"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two output shapes the extension commands share.
|
|
3
|
+
*
|
|
4
|
+
* Payload goes to stdout, everything else to stderr (see `cli/io.ts`), so
|
|
5
|
+
* `--format=json | jq` stays usable while warnings remain visible.
|
|
6
|
+
*/
|
|
7
|
+
import { line } from "../../cli/io.js";
|
|
8
|
+
/** Writes one JSON document to stdout. */
|
|
9
|
+
export function emitJson(io, value) {
|
|
10
|
+
line(io, JSON.stringify(value, null, 2));
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Renders a table padded to the widest cell per column. Padding counts code
|
|
14
|
+
* units, which is what a fixed-width terminal measures for the ASCII
|
|
15
|
+
* identifiers, SPDX ids and paths shown here.
|
|
16
|
+
*/
|
|
17
|
+
export function renderTable(header, rows) {
|
|
18
|
+
const widths = header.map((cell, column) => rows.reduce((widest, row) => Math.max(widest, (row[column] ?? "").length), cell.length));
|
|
19
|
+
const render = (cells) => cells
|
|
20
|
+
.map((cell, column) => cell.padEnd(widths[column] ?? 0))
|
|
21
|
+
.join(" ")
|
|
22
|
+
.trimEnd();
|
|
23
|
+
return [render(header), render(widths.map((width) => "-".repeat(width))), ...rows.map(render)];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/commands/extensions/render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAW,MAAM,iBAAiB,CAAC;AAEhD,0CAA0C;AAC1C,MAAM,UAAU,QAAQ,CAAC,EAAM,EAAE,KAAc;IAC7C,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,MAAyB,EACzB,IAAoC;IAEpC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CACzC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CACxF,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAU,EAAE,CAClD,KAAK;SACF,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;SACvD,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,EAAE,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACjG,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type FileResolutionV1 } from "@untangle-code/extension-runtime";
|
|
2
|
+
import { type ParsedArgs } from "../../cli/args.js";
|
|
3
|
+
import { type Io } from "../../cli/io.js";
|
|
4
|
+
import { type ExtensionEnvironmentV1 } from "./environment.js";
|
|
5
|
+
export interface RunDeps {
|
|
6
|
+
/** Injected in tests so no unit test opens a socket. */
|
|
7
|
+
fetchImpl?: typeof fetch;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
export declare function runRun(environment: ExtensionEnvironmentV1, args: ParsedArgs, io: Io, format: "text" | "json", deps?: RunDeps): Promise<number>;
|
|
11
|
+
/**
|
|
12
|
+
* Maps a tool-reported path onto workspace-relative form.
|
|
13
|
+
*
|
|
14
|
+
* `fileId` is deliberately absent with a stated reason: this command runs
|
|
15
|
+
* against the working tree, not an index generation, so there is no file
|
|
16
|
+
* identity to attach. Inventing one would make a finding look joined to an
|
|
17
|
+
* index that never saw it.
|
|
18
|
+
*/
|
|
19
|
+
export declare function workspaceFileResolver(workspacePath: string): (toolPath: string) => FileResolutionV1;
|
|
20
|
+
/**
|
|
21
|
+
* A `ReadonlyMap` view over the working tree that reads a file the first time
|
|
22
|
+
* a position inside it must be resolved.
|
|
23
|
+
*
|
|
24
|
+
* Reading the whole workspace eagerly to translate a handful of line numbers
|
|
25
|
+
* would be the wrong trade. A failed read is cached as "absent", which makes
|
|
26
|
+
* the position unresolvable — and therefore a ledger entry rather than a
|
|
27
|
+
* guess (E4).
|
|
28
|
+
*/
|
|
29
|
+
export declare function lazyWorkspaceContents(workspacePath: string): ReadonlyMap<string, string>;
|
|
30
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/run.ts"],"names":[],"mappings":"AAwBA,OAAO,EAML,KAAK,gBAAgB,EAEtB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,EAAc,KAAK,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAKhF,MAAM,WAAW,OAAO;IACtB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAsB,MAAM,CAC1B,WAAW,EAAE,sBAAsB,EACnC,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,IAAI,GAAE,OAAY,GACjB,OAAO,CAAC,MAAM,CAAC,CA+GjB;AAqBD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,GACpB,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,CAuBxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAuBxF"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `untangle extensions run <id>`
|
|
3
|
+
*
|
|
4
|
+
* Runs one installed extension and normalizes whatever it prints into
|
|
5
|
+
* `ExternalFindingV1` (X3). The order of the checks is the load-bearing part:
|
|
6
|
+
*
|
|
7
|
+
* license gate → availability probe → run → parse → normalize
|
|
8
|
+
*
|
|
9
|
+
* The gate comes first because a version probe is already a process start,
|
|
10
|
+
* and X5 forbids starting or pulling anything for a tool whose terms have not
|
|
11
|
+
* been acknowledged. Checking availability first and the license second would
|
|
12
|
+
* produce the same refusal — after having run the tool once.
|
|
13
|
+
*
|
|
14
|
+
* What comes out is evidence, never an Untangle metric: findings do not
|
|
15
|
+
* change the exit code, and no number here is ever folded into a complexity
|
|
16
|
+
* or risk value (X3). Everything the run could not resolve — a file outside
|
|
17
|
+
* the workspace, a position that does not exist, a severity that hit the
|
|
18
|
+
* mapping fallback — is reported with its reason rather than dropped (E4).
|
|
19
|
+
*/
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import { relative, resolve } from "node:path";
|
|
22
|
+
import { compareCodepoints } from "@untangle-code/domain";
|
|
23
|
+
import { createLineOffsetResolver, defaultProcessLimits, normalizeToolPath, } from "@untangle-code/extension-runtime";
|
|
24
|
+
import { boolFlag, integerFlag, stringFlag } from "../../cli/args.js";
|
|
25
|
+
import { EXIT, EnvironmentError, OperationalError, UsageError } from "../../cli/exit.js";
|
|
26
|
+
import { line, note } from "../../cli/io.js";
|
|
27
|
+
import { explainMissing, findExtension, gateFor, loadExtensionContext } from "./context.js";
|
|
28
|
+
import { resolveUserPath } from "./environment.js";
|
|
29
|
+
import { invokeExtension } from "./invoke.js";
|
|
30
|
+
import { emitJson, renderTable } from "./render.js";
|
|
31
|
+
import { saveCliState, summarizeRun } from "./state.js";
|
|
32
|
+
export async function runRun(environment, args, io, format, deps = {}) {
|
|
33
|
+
const command = args.positionals[0] === "setup" ? "extensions setup" : "extensions run";
|
|
34
|
+
const extensionId = args.positionals[1];
|
|
35
|
+
if (extensionId === undefined) {
|
|
36
|
+
throw new UsageError(`\`untangle ${command}\` needs an extension id.`, "Run `untangle extensions list` to see the installed ids.");
|
|
37
|
+
}
|
|
38
|
+
const context = await loadExtensionContext(environment);
|
|
39
|
+
const extension = findExtension(context, extensionId);
|
|
40
|
+
if (extension === null) {
|
|
41
|
+
throw new OperationalError(explainMissing(context, extensionId), "Install it first: untangle extensions add --from=<path-or-url>");
|
|
42
|
+
}
|
|
43
|
+
const manifest = extension.manifest;
|
|
44
|
+
const workspacePath = resolveUserPath(environment.cwd, stringFlag(args, "workspace") ?? ".");
|
|
45
|
+
const target = resolveUserPath(environment.cwd, stringFlag(args, "target") ?? workspacePath);
|
|
46
|
+
const ruleset = stringFlag(args, "ruleset") ?? manifest.defaultRuleset;
|
|
47
|
+
// --- license gate BEFORE any process start (X5) -------------------------
|
|
48
|
+
const gate = gateFor(context, extension, ruleset);
|
|
49
|
+
if (!gate.allowed) {
|
|
50
|
+
note(io, `EXTENSION_LICENSE_UNACKNOWLEDGED: ${extensionId} did not start.`);
|
|
51
|
+
note(io, ` ${gate.tool.reason}`);
|
|
52
|
+
for (const entry of gate.rulesets) {
|
|
53
|
+
if (entry.status !== "acknowledged" && entry.status !== "not_required") {
|
|
54
|
+
note(io, ` ruleset ${entry.ruleset}: ${entry.reason}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
throw new EnvironmentError(`The license gate for "${extensionId}" is not satisfied; nothing was started and nothing was pulled.`, gate.acknowledgeCommands.join(" && "));
|
|
58
|
+
}
|
|
59
|
+
// Der eigentliche Lauf liegt in `invoke.ts` — als Daten hinein, als Ergebnis
|
|
60
|
+
// heraus. `runRun` ist die MENSCHLICHE Fassung davon: es uebersetzt einen
|
|
61
|
+
// nicht stattgefundenen Lauf in die Ausnahme, die ein einzelner Aufruf
|
|
62
|
+
// erwartet, und berichtet danach. Ein Sammelbericht ruft dieselbe Funktion
|
|
63
|
+
// auf und uebersetzt eben NICHT in eine Ausnahme.
|
|
64
|
+
const limits = readLimits(args);
|
|
65
|
+
const httpUrl = stringFlag(args, "url") ?? manifest.http?.defaultUrl;
|
|
66
|
+
const outcome = await invokeExtension({
|
|
67
|
+
environment,
|
|
68
|
+
context,
|
|
69
|
+
extension,
|
|
70
|
+
workspacePath,
|
|
71
|
+
target,
|
|
72
|
+
limits,
|
|
73
|
+
provisionConsent: boolFlag(args, "yes"),
|
|
74
|
+
...(ruleset === undefined ? {} : { ruleset }),
|
|
75
|
+
...(httpUrl === undefined ? {} : { httpUrl }),
|
|
76
|
+
...(deps.fetchImpl === undefined ? {} : { fetchImpl: deps.fetchImpl }),
|
|
77
|
+
...(deps.signal === undefined ? {} : { signal: deps.signal }),
|
|
78
|
+
onProvisionStep: (step) => {
|
|
79
|
+
note(io, ` ${step}`);
|
|
80
|
+
},
|
|
81
|
+
onProvisionPlanned: (detail) => {
|
|
82
|
+
note(io, ` ${detail}`);
|
|
83
|
+
},
|
|
84
|
+
resolveFile: workspaceFileResolver(workspacePath),
|
|
85
|
+
resolvePosition: createLineOffsetResolver(lazyWorkspaceContents(workspacePath)),
|
|
86
|
+
});
|
|
87
|
+
if (outcome.status === "not_run") {
|
|
88
|
+
note(io, `${extensionId} did not run: ${outcome.detail}`);
|
|
89
|
+
if (outcome.reason === "license_gate_open") {
|
|
90
|
+
throw new EnvironmentError(`The license gate for "${extensionId}" is not satisfied; nothing was started and nothing was pulled.`, outcome.nextStep ?? "acknowledge the licence first");
|
|
91
|
+
}
|
|
92
|
+
throw new EnvironmentError(`"${extensionId}" did not run (${outcome.reason}).`, outcome.nextStep ?? "see the reason above");
|
|
93
|
+
}
|
|
94
|
+
const { health, result } = outcome;
|
|
95
|
+
await saveCliState(environment.fs, environment.userDataDir, {
|
|
96
|
+
...context.state,
|
|
97
|
+
lastRuns: {
|
|
98
|
+
...context.state.lastRuns,
|
|
99
|
+
[extensionId]: summarizeRun(result.run),
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
report(io, format, {
|
|
103
|
+
command,
|
|
104
|
+
extensionId,
|
|
105
|
+
workspacePath,
|
|
106
|
+
target,
|
|
107
|
+
health,
|
|
108
|
+
result,
|
|
109
|
+
warnings: context.warnings,
|
|
110
|
+
});
|
|
111
|
+
if (result.run.exitStatus === "completed") {
|
|
112
|
+
return EXIT.ok;
|
|
113
|
+
}
|
|
114
|
+
throw new OperationalError(`"${extensionId}" ended with status ${result.run.exitStatus}` +
|
|
115
|
+
`${result.run.errorCode === undefined ? "" : ` (${result.run.errorCode})`}.`, describeNextStep(health, result));
|
|
116
|
+
}
|
|
117
|
+
function readLimits(args) {
|
|
118
|
+
const limits = defaultProcessLimits();
|
|
119
|
+
const timeout = integerFlag(args, "timeout", limits.timeoutMs);
|
|
120
|
+
const maxOutput = integerFlag(args, "max-output-bytes", limits.maxOutputBytes);
|
|
121
|
+
if (timeout <= 0) {
|
|
122
|
+
throw new UsageError("--timeout expects a positive number of milliseconds.", "Example: --timeout=60000");
|
|
123
|
+
}
|
|
124
|
+
if (maxOutput <= 0) {
|
|
125
|
+
throw new UsageError("--max-output-bytes expects a positive byte count.", "Example: --max-output-bytes=1048576");
|
|
126
|
+
}
|
|
127
|
+
return { ...limits, timeoutMs: timeout, maxOutputBytes: maxOutput };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Maps a tool-reported path onto workspace-relative form.
|
|
131
|
+
*
|
|
132
|
+
* `fileId` is deliberately absent with a stated reason: this command runs
|
|
133
|
+
* against the working tree, not an index generation, so there is no file
|
|
134
|
+
* identity to attach. Inventing one would make a finding look joined to an
|
|
135
|
+
* index that never saw it.
|
|
136
|
+
*/
|
|
137
|
+
export function workspaceFileResolver(workspacePath) {
|
|
138
|
+
return (toolPath) => {
|
|
139
|
+
const normalized = normalizeToolPath(toolPath);
|
|
140
|
+
if (normalized === "") {
|
|
141
|
+
return { fileIdMissingReason: "the tool reported an empty path" };
|
|
142
|
+
}
|
|
143
|
+
const absolute = /^([a-zA-Z]:\/|\/)/.test(normalized)
|
|
144
|
+
? normalized
|
|
145
|
+
: resolve(workspacePath, normalized);
|
|
146
|
+
const relativePath = relative(workspacePath, absolute).split("\\").join("/");
|
|
147
|
+
if (relativePath === "" || relativePath.startsWith("../")) {
|
|
148
|
+
return {
|
|
149
|
+
fileIdMissingReason: `the tool reported "${toolPath}", which is outside the analyzed workspace ` +
|
|
150
|
+
`"${workspacePath}"`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
relativePath,
|
|
155
|
+
fileIdMissingReason: "no index generation is loaded; this run resolves paths against the working tree only",
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* A `ReadonlyMap` view over the working tree that reads a file the first time
|
|
161
|
+
* a position inside it must be resolved.
|
|
162
|
+
*
|
|
163
|
+
* Reading the whole workspace eagerly to translate a handful of line numbers
|
|
164
|
+
* would be the wrong trade. A failed read is cached as "absent", which makes
|
|
165
|
+
* the position unresolvable — and therefore a ledger entry rather than a
|
|
166
|
+
* guess (E4).
|
|
167
|
+
*/
|
|
168
|
+
export function lazyWorkspaceContents(workspacePath) {
|
|
169
|
+
const cache = new Map();
|
|
170
|
+
const load = (relativePath) => {
|
|
171
|
+
if (cache.has(relativePath)) {
|
|
172
|
+
return cache.get(relativePath) ?? null;
|
|
173
|
+
}
|
|
174
|
+
let content;
|
|
175
|
+
try {
|
|
176
|
+
content = readFileSync(resolve(workspacePath, relativePath), "utf8");
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
content = null;
|
|
180
|
+
}
|
|
181
|
+
cache.set(relativePath, content);
|
|
182
|
+
return content;
|
|
183
|
+
};
|
|
184
|
+
return Object.assign(new Map(), {
|
|
185
|
+
get(key) {
|
|
186
|
+
return load(key) ?? undefined;
|
|
187
|
+
},
|
|
188
|
+
has(key) {
|
|
189
|
+
return load(key) !== null;
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function report(io, format, input) {
|
|
194
|
+
const { result } = input;
|
|
195
|
+
if (format === "json") {
|
|
196
|
+
emitJson(io, {
|
|
197
|
+
command: input.command,
|
|
198
|
+
extensionId: input.extensionId,
|
|
199
|
+
workspace: input.workspacePath,
|
|
200
|
+
target: input.target,
|
|
201
|
+
evidenceOnly: true,
|
|
202
|
+
health: input.health,
|
|
203
|
+
run: result.run,
|
|
204
|
+
findings: result.findings,
|
|
205
|
+
measurements: result.measurements,
|
|
206
|
+
skipped: result.skipped,
|
|
207
|
+
error: result.error === undefined ? undefined : { message: result.error.message },
|
|
208
|
+
warnings: input.warnings,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
line(io, `run ${result.run.runId} — ${input.extensionId} (${result.run.exitStatus})`);
|
|
213
|
+
line(io, ` invocation ${result.run.invocation ?? "(none)"}`);
|
|
214
|
+
line(io, ` tool ${result.run.toolVersion}`);
|
|
215
|
+
line(io, ` format ${result.run.outputFormat} via ${result.run.formatParserVersion}`);
|
|
216
|
+
line(io, ` target ${input.target}`);
|
|
217
|
+
line(io, ` wall time ${String(result.run.resources.wallTimeMs)} ms`);
|
|
218
|
+
line(io, ` findings ${String(result.run.findingsTotal)} (${describeCounts(result.run.findingCounts)})`);
|
|
219
|
+
if (result.findings.length > 0) {
|
|
220
|
+
line(io, "");
|
|
221
|
+
const rows = [...result.findings]
|
|
222
|
+
.sort((left, right) => compareCodepoints(left.filePath, right.filePath) ||
|
|
223
|
+
left.sourceRange.startByte - right.sourceRange.startByte ||
|
|
224
|
+
compareCodepoints(left.ruleId, right.ruleId))
|
|
225
|
+
.map((finding) => [
|
|
226
|
+
finding.severity.normalized,
|
|
227
|
+
`${finding.filePath}:${String(finding.sourceRange.startLine ?? 0)}`,
|
|
228
|
+
finding.ruleId,
|
|
229
|
+
firstLine(finding.message),
|
|
230
|
+
]);
|
|
231
|
+
for (const rendered of renderTable(["SEVERITY", "LOCATION", "RULE", "MESSAGE"], rows)) {
|
|
232
|
+
line(io, rendered);
|
|
233
|
+
}
|
|
234
|
+
line(io, "");
|
|
235
|
+
line(io, "These are external findings — evidence from a third-party tool. They are never folded " +
|
|
236
|
+
"into Untangle complexity or risk numbers (X3).");
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
reportUnmappedSeverities(io, result.findings);
|
|
240
|
+
for (const entry of result.skipped) {
|
|
241
|
+
note(io, `skipped ${describeSkip(entry)}`);
|
|
242
|
+
}
|
|
243
|
+
for (const warning of result.run.warnings) {
|
|
244
|
+
note(io, `warning: ${warning}`);
|
|
245
|
+
}
|
|
246
|
+
for (const warning of input.warnings) {
|
|
247
|
+
note(io, `warning: ${warning}`);
|
|
248
|
+
}
|
|
249
|
+
for (const error of result.run.errors) {
|
|
250
|
+
note(io, `${error.code}: ${error.message}`);
|
|
251
|
+
}
|
|
252
|
+
if (result.run.exitStatus !== "completed") {
|
|
253
|
+
for (const reason of input.health.unavailableReasons) {
|
|
254
|
+
note(io, ` ${reason.invocation}: ${reason.detail}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function describeNextStep(health, result) {
|
|
259
|
+
if (!health.available) {
|
|
260
|
+
const first = health.unavailableReasons[0];
|
|
261
|
+
return first === undefined
|
|
262
|
+
? "Check the manifest's invocation section against what is installed on this machine."
|
|
263
|
+
: `Make the ${first.invocation} invocation work: ${first.detail}`;
|
|
264
|
+
}
|
|
265
|
+
return result.error === undefined
|
|
266
|
+
? "Re-run with --format=json to see the full run record."
|
|
267
|
+
: result.error.message;
|
|
268
|
+
}
|
|
269
|
+
function reportUnmappedSeverities(io, findings) {
|
|
270
|
+
const unmapped = findings.filter((finding) => !finding.severity.mappingMatched);
|
|
271
|
+
if (unmapped.length === 0) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const originals = [...new Set(unmapped.map((finding) => finding.severity.original))].sort(compareCodepoints);
|
|
275
|
+
note(io, `warning: ${String(unmapped.length)} finding(s) hit the severity fallback; the manifest maps ` +
|
|
276
|
+
`no rule for: ${originals.join(", ")}`);
|
|
277
|
+
}
|
|
278
|
+
function describeCounts(counts) {
|
|
279
|
+
const parts = Object.entries(counts)
|
|
280
|
+
.filter(([, value]) => value > 0)
|
|
281
|
+
.map(([key, value]) => `${key} ${String(value)}`);
|
|
282
|
+
return parts.length === 0 ? "none" : parts.join(", ");
|
|
283
|
+
}
|
|
284
|
+
function describeSkip(entry) {
|
|
285
|
+
const where = entry.path === undefined ? entry.subjectKind : `${entry.subjectKind} ${entry.path}`;
|
|
286
|
+
return `${where}: ${entry.reason} — ${entry.detail}`;
|
|
287
|
+
}
|
|
288
|
+
function firstLine(message) {
|
|
289
|
+
const text = message.split("\n")[0] ?? "";
|
|
290
|
+
return text.length > 96 ? `${text.slice(0, 93)}...` : text;
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/extensions/run.ts"],"names":[],"mappings":"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"}
|