@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
package/NOTICE
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# NOTICE
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 Luke Bölling and contributors.
|
|
4
|
+
|
|
5
|
+
This attribution covers original Untangle work. Contributors retain copyright in
|
|
6
|
+
their contributions. Third-party packages, grammars and other materials retain
|
|
7
|
+
their own copyright holders, licenses and notices; this line does not replace them.
|
|
8
|
+
|
|
9
|
+
## License — binding decision
|
|
10
|
+
|
|
11
|
+
Untangle is licensed under the **GNU Affero General Public License, Version 3
|
|
12
|
+
(AGPL-3.0-only)**. See [`LICENSE`](./LICENSE).
|
|
13
|
+
|
|
14
|
+
This decision is **final, not provisional**, and was explicitly instructed by
|
|
15
|
+
the project owner. No contributor, agent or tool may change it without a new
|
|
16
|
+
explicit instruction.
|
|
17
|
+
|
|
18
|
+
The repository-wide license covers Untangle's first-party source code, scripts,
|
|
19
|
+
tests, fixtures, configuration, documentation, website and brand artwork, including
|
|
20
|
+
the logo and 3D yarn illustrations. Every workspace `package.json` declares
|
|
21
|
+
`"license": "AGPL-3.0-only"`. There is no separately licensed enterprise component
|
|
22
|
+
or separate permissive license for documentation or brand assets.
|
|
23
|
+
|
|
24
|
+
Third-party code, embedded grammars, dependency assets and their notices retain
|
|
25
|
+
their original licenses. Their inclusion does not relicense those works. The
|
|
26
|
+
repository license does not grant trademark rights or change the license of a
|
|
27
|
+
repository analyzed with Untangle. See the repository's `docs/LICENSING.md` for
|
|
28
|
+
scope and verification details.
|
|
29
|
+
|
|
30
|
+
This resolves the license question left open in `vision.md` §14 and completes
|
|
31
|
+
`product.md` §16, item 2.
|
|
32
|
+
|
|
33
|
+
## Rationale
|
|
34
|
+
|
|
35
|
+
- **Network copyleft fits the intended product model.** AGPL §13 sets source
|
|
36
|
+
availability requirements for modified versions used through a computer network.
|
|
37
|
+
The current local CLI/stdio-MCP entry and future shared-server modes share the
|
|
38
|
+
same license.
|
|
39
|
+
- **Local-first analysis has a clear boundary.** Running Untangle against a codebase
|
|
40
|
+
does not replace that codebase's own license with Untangle's license.
|
|
41
|
+
- **First-party components share one license.** Implemented components and future
|
|
42
|
+
official plugins use this repository's licensing policy. Planned integrations do
|
|
43
|
+
not establish implemented or published products.
|
|
44
|
+
|
|
45
|
+
## Deliberately accepted consequence
|
|
46
|
+
|
|
47
|
+
The project deliberately chooses AGPL rather than a permissive embedding license.
|
|
48
|
+
Redistribution, modifications and combined works must be assessed against the
|
|
49
|
+
actual terms in `LICENSE`, including applicable Corresponding Source requirements.
|
|
50
|
+
No permissive exception, commercial dual license or special contract-only package
|
|
51
|
+
license is granted or promised by this notice.
|
|
52
|
+
|
|
53
|
+
## Dependencies
|
|
54
|
+
|
|
55
|
+
Third-party runtime dependencies are checked against the allowlist in
|
|
56
|
+
`scripts/check-licenses.mjs`. Their licenses and copyright notices remain unchanged
|
|
57
|
+
and traceable through package `THIRD_PARTY_LICENSES.md` files, grammar provenance,
|
|
58
|
+
the lockfile and release SBOM. The allowlist includes MIT / Apache-2.0 / BSD / ISC
|
|
59
|
+
and other explicitly listed licenses; it is not a license grant for dependencies.
|
|
60
|
+
|
|
61
|
+
The allowlist in `scripts/check-licenses.mjs` applies to **dependencies**, not
|
|
62
|
+
workspace packages. Untangle's own packages carry AGPL-3.0-only and are excluded
|
|
63
|
+
from that check.
|
|
64
|
+
|
|
65
|
+
## Clean room
|
|
66
|
+
|
|
67
|
+
Untangle is an independent implementation with its own data models, APIs, tool
|
|
68
|
+
names, tests and sources. Feature ideas may be derived from publicly observable
|
|
69
|
+
behavior and generally known techniques. Third-party source code is not copied,
|
|
70
|
+
including from AGPL projects even where the license would permit it.
|
|
71
|
+
|
|
72
|
+
## Contribution terms
|
|
73
|
+
|
|
74
|
+
Pull requests are welcome under the repository's existing AGPL-3.0-only license.
|
|
75
|
+
No separate CLA, copyright assignment or DCO sign-off is required. Contributors
|
|
76
|
+
must have the right to submit their work under those terms. See CONTRIBUTING.md.
|
|
77
|
+
|
|
78
|
+
## Release decisions
|
|
79
|
+
|
|
80
|
+
- [x] Copyright attribution: Luke Bölling, with contributors retaining their rights.
|
|
81
|
+
- [x] Contributions use AGPL-3.0-only without an additional CLA or DCO gate.
|
|
82
|
+
|
|
83
|
+
## Open legal items before public beta
|
|
84
|
+
|
|
85
|
+
- [ ] Trademark search for the product name `Untangle`.
|
|
86
|
+
- [ ] Registration and legal review of the npm scope `@untangle-code`.
|
|
87
|
+
- [ ] Verify source availability and notices for each released network daemon/server
|
|
88
|
+
mode (WP-59). The current stdio MCP `untangle_about` already reports the license,
|
|
89
|
+
source repository and build commit when supplied; metadata alone does not prove
|
|
90
|
+
that a concrete deployed version's source is available.
|
package/README.md
CHANGED
|
@@ -1,3 +1,452 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @untangle-code/cli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Untangle's CLI and MCP entry point: the **`untangle`** binary. It connects local search,
|
|
4
|
+
code complexity and declared feature responsibility. Requires Node.js **`^22.13.0 || >=24.0.0`**.
|
|
5
|
+
|
|
6
|
+
The [agent workflow](https://github.com/lboel/untangle/blob/main/docs/AGENT_WORKFLOW.md)
|
|
7
|
+
connects MCP, search, complete feature scopes and real tests, with a copyable task brief for
|
|
8
|
+
spec-driven development and agentic engineering.
|
|
9
|
+
|
|
10
|
+
## Install in an npm project
|
|
11
|
+
|
|
12
|
+
From the directory containing your project's `package.json`, add Untangle as a pinned
|
|
13
|
+
development dependency and run a first analysis.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install --save-dev --save-exact @untangle-code/cli@0.1.1
|
|
17
|
+
npm exec -- untangle --version
|
|
18
|
+
npm exec -- untangle complexity --top=10
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Direct complexity analysis runs on the current project without an index or search services.
|
|
22
|
+
Commit the manifest and lockfile changes to share the version with your team.
|
|
23
|
+
|
|
24
|
+
Preview the project setup, then create `untangle.toml` when you're ready.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm exec -- untangle init --offline --dry-run
|
|
28
|
+
npm exec -- untangle init --offline
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Offline init inspects local files and skips network probes. Dry-run previews the
|
|
32
|
+
configuration. The second command creates it in a new project and reports any differences
|
|
33
|
+
with an existing configuration.
|
|
34
|
+
|
|
35
|
+
## Try it in any repository
|
|
36
|
+
|
|
37
|
+
Run a one-off analysis from a project directory, including repositories without a `package.json`.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm exec --yes --package=@untangle-code/cli@0.1.1 -- untangle complexity --top=10
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`npm exec` fetches the package into the npm cache if needed. To preview setup the same way,
|
|
44
|
+
replace `complexity --top=10` with `init --offline --dry-run`.
|
|
45
|
+
|
|
46
|
+
## Install once for multiple projects
|
|
47
|
+
|
|
48
|
+
Install the npm preview globally if you prefer to run `untangle` directly from each project.
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npm install --global @untangle-code/cli@next
|
|
52
|
+
untangle --version
|
|
53
|
+
cd /path/to/your/project
|
|
54
|
+
untangle complexity --top=10
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
For a project installation, prefix the `untangle` examples below with `npm exec --`.
|
|
58
|
+
|
|
59
|
+
## Build from a source checkout
|
|
60
|
+
|
|
61
|
+
From the checkout root with **pnpm 10.34.5**:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pnpm setup:local --project=/absolute/path/to/your/project
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
This explicit helper checks pnpm, installs frozen dependencies, builds the checkout and
|
|
68
|
+
measures the target directly. The first report needs no index, Qdrant, Ollama, LLM or feature
|
|
69
|
+
map. Without `--project` it analyzes Untangle. Unanalyzed sources/reasons remain visible.
|
|
70
|
+
It writes no target configuration, feature declarations or ignore rules; registers no host,
|
|
71
|
+
changes no shell profile and starts no tests, global install or services. It prints follow-up
|
|
72
|
+
commands and an MCP template using actual absolute Node/CLI/project paths.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pnpm setup:local --project=/absolute/path/to/project --dry-run
|
|
76
|
+
pnpm setup:local --project=/absolute/path/to/project --skip-build --format=json
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Dry-run executes nothing. Skip-build uses existing Dist files without proving they match
|
|
80
|
+
edited sources. JSON includes plan, executed steps, analysis, next commands and MCP template.
|
|
81
|
+
The helper targets Linux/macOS and belongs to the checkout, not the installed CLI package.
|
|
82
|
+
For later calls in the same shell:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
UNTANGLE_CLI="$PWD/apps/cli/dist/index.js"
|
|
86
|
+
untangle() { node "$UNTANGLE_CLI" "$@"; }
|
|
87
|
+
cd /path/to/your/project
|
|
88
|
+
untangle --help
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
An agent host uses the MCP template rather than this shell function. Standalone `changes`
|
|
92
|
+
and `gate` commands are not implemented; `complexity --max-*` thresholds are available.
|
|
93
|
+
|
|
94
|
+
## Workflow
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
untangle complexity # Direct AST analysis, no services/index
|
|
98
|
+
untangle init --offline --dry-run # Inspect local context without writing
|
|
99
|
+
untangle product # Declared features, ownership and code/test metrics
|
|
100
|
+
untangle scan # Own metrics and explicitly enabled extensions
|
|
101
|
+
untangle init --interactive # Guided configuration and optional tool setup
|
|
102
|
+
untangle product connect auto --dry-run --format=json
|
|
103
|
+
untangle graph features # Local interactive 3D feature/code map
|
|
104
|
+
untangle doctor # Inspect config, parsers, services and index
|
|
105
|
+
untangle index # Index/graphs; selected storage and embedder
|
|
106
|
+
untangle query "..." # Hybrid, lexical, symbol, semantic or grep-like
|
|
107
|
+
untangle graph visualize --out=graph.html
|
|
108
|
+
untangle mcp --stdio # Local server for agent hosts
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
New projects store their index in LanceDB under `.untangle/index/lancedb`, without a database
|
|
112
|
+
service. `init --storage=qdrant` selects Qdrant; existing Qdrant configurations keep that backend.
|
|
113
|
+
Lexical/symbol retrieval needs a compatible index but no query embedding.
|
|
114
|
+
`index --embedder=offline` builds one without Ollama; its deterministic vectors have no
|
|
115
|
+
language-model semantics. Semantic retrieval needs its configured embedding provider.
|
|
116
|
+
Noninteractive init starts no services/models. Explicit scan can run enabled analyzers;
|
|
117
|
+
container provisioning requires separate consent.
|
|
118
|
+
|
|
119
|
+
Guided init previews its file/command plan and separates preparation from execution. Offers
|
|
120
|
+
include embedded LanceDB (default), local Qdrant/Ollama, local/existing SonarQube, a hash-verified Sentrux binary/MCP
|
|
121
|
+
template and custom SARIF/JUnit/JSON extensions. Tokens use environment-variable names, not
|
|
122
|
+
project-stored values. Existing files and foreign containers are preserved. Tool installation
|
|
123
|
+
is not scan evidence.
|
|
124
|
+
|
|
125
|
+
The map stores HTML/JSON under `<project>/.untangle/feature-map/`. Its 3D positions, perspective,
|
|
126
|
+
rotation, zoom, filters, neighbor selection and accessible list inspect declared relationships.
|
|
127
|
+
Complete feature metrics and gaps stay visible independently of rendering caps. Missing
|
|
128
|
+
features are not invented. Spatial distance is not semantic proof. Controls are English;
|
|
129
|
+
inspected names/source content are preserved. JSON, pipes and dry-run never open a TUI;
|
|
130
|
+
`init --no-interactive --offline --format=json` remains scriptable.
|
|
131
|
+
|
|
132
|
+
## Product context in init
|
|
133
|
+
|
|
134
|
+
Init inspects candidates for vision, specification and product descriptions from the accepted
|
|
135
|
+
scan. Filename roles are provisional; ambiguity remains open. Select other paths explicitly:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
untangle init /path/to/project --vision=docs/vision.md --spec=docs/requirements.md --offline --dry-run --format=json
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Paths are project-relative. Offline suppresses network probes; document inspection needs no
|
|
142
|
+
provider/LLM/embeddings. `findings.productContext` contains paths, content hashes, sections,
|
|
143
|
+
selection reasons and local references, with `needs_context`, `needs_selection`,
|
|
144
|
+
`ready_for_review` or `incomplete`. Vision/specification are required; product description is
|
|
145
|
+
optional. Ignore/security/read limits still apply and missing/unassessed sources are explicit.
|
|
146
|
+
|
|
147
|
+
After 256 references, `referencesTruncated: true` marks incomplete inspection. Parse limits
|
|
148
|
+
are 16,384 UTF-16 units per line, 4,096 `[` openings and 2,048 heading candidates per document.
|
|
149
|
+
Exceeded budgets retain the hash but mark `not_assessed`/`incomplete`.
|
|
150
|
+
|
|
151
|
+
Even `ready_for_review` leaves `alignment.status: unverified` and empty feature/ownership
|
|
152
|
+
review drafts. A `present` reference proves only its accepted path/hash, not anchors, behavior
|
|
153
|
+
or ownership. Selected readable documents become markdown `[[contextArtifacts]]` in the TOML
|
|
154
|
+
proposal. Ordinary Markdown search works after indexing; independent artifact search remains
|
|
155
|
+
unimplemented in CLI/MCP.
|
|
156
|
+
|
|
157
|
+
Configuration-only init writes no documents/Journey data; dry-run writes nothing. Differing
|
|
158
|
+
configuration needs `--force` or explicit guided replacement. `--feature-map=docs/features.json`
|
|
159
|
+
selects an existing declared map; otherwise init looks for `untangle.features.json`. That
|
|
160
|
+
inspection neither writes nor confirms declarations and leaves document-context assessment
|
|
161
|
+
independent. It adds no MCP init tool.
|
|
162
|
+
|
|
163
|
+
## Concrete SDD connectors
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
untangle product connect auto --dry-run --format=json
|
|
167
|
+
untangle product connect spec-kit --format=json
|
|
168
|
+
untangle product connect openspec --format=json
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Spec Kit/OpenSpec adapters read supported local specs, plans, tasks and change artifacts.
|
|
172
|
+
They record actual requirement/task identities, checked state and explicit file-reference
|
|
173
|
+
provenance/hashes without running framework scripts. An explicit connection saves versioned
|
|
174
|
+
`.untangle/sdd/` report/manifest files after source revalidation; dry-run writes nothing.
|
|
175
|
+
Drafts stay `planned`/`proposed`, without invented owners, dependencies or passing-test claims.
|
|
176
|
+
Inspect and complete the returned manifest, then pass its real path to `product --manifest`
|
|
177
|
+
and `graph features --feature-map`. Existing declarations are never silently merged/replaced.
|
|
178
|
+
The spec-driven TUI offers detected workspaces when no explicit feature manifest is selected,
|
|
179
|
+
and writes only after final confirmation.
|
|
180
|
+
[Supported artifact layouts and limits](https://github.com/lboel/untangle/blob/main/docs/SDD_CONNECTORS.md).
|
|
181
|
+
|
|
182
|
+
## Declared feature alignment
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
untangle product --root=/path/to/project --format=json
|
|
186
|
+
untangle product --path=src/accounts/lookup.ts
|
|
187
|
+
untangle product --draft --feature=accounts.lookup --path=src/accounts/lookup.ts --format=json
|
|
188
|
+
untangle product --path=src/accounts/lookup.ts --run-tests -- pnpm exec vitest run src/accounts/lookup.test.ts
|
|
189
|
+
untangle product --test-evidence=.untangle/product-tests.json --max-cognitive=15 --require-complete --format=json
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
The default map is `untangle.features.json`; `--manifest` selects another in-root path.
|
|
193
|
+
The index-free report connects declared IDs to exact vision/spec headings, owners and full
|
|
194
|
+
code/test scopes. Code/tests stay separate, shared sources count once in the overall union,
|
|
195
|
+
and missing/partial sources remain gaps.
|
|
196
|
+
|
|
197
|
+
`--path` accepts a literal search hit. `selection.matches` reports every feature association
|
|
198
|
+
as code/test/intent/ownership while retaining complete measurements, including helpers.
|
|
199
|
+
MCP exposes `untangle_product({path: "src/accounts/lookup.ts"})`.
|
|
200
|
+
|
|
201
|
+
With a missing map, `--draft --feature=ID --path=PATH` supplies an unreviewed **`report.draft`**,
|
|
202
|
+
not an entire-report manifest. Review/extend all code, tests, intent and owners before saving;
|
|
203
|
+
the command writes nothing and invents no owner.
|
|
204
|
+
|
|
205
|
+
Default analysis executes no tests. `--test-evidence` reads a real report bound to the entire
|
|
206
|
+
accepted inventory before/after execution; `testNames` can identify exact criteria cases.
|
|
207
|
+
Only explicit `--run-tests -- <argv>` executes a Vitest-compatible command without a shell
|
|
208
|
+
inside the target. The runner must exist; Untangle installs none. Reporter/output arguments
|
|
209
|
+
are supplied by Untangle and caller overrides rejected; other test frameworks are unsupported.
|
|
210
|
+
|
|
211
|
+
`testRun.receiptPath` records inventories, actual argv/exit, original reports and hashes in an
|
|
212
|
+
exclusive OS-temporary directory; archive it for durable evidence. Timeout defaults to 120s,
|
|
213
|
+
with `--test-timeout` at most one hour. stdout/stderr share 16 MiB; JSON has another 16 MiB.
|
|
214
|
+
Timeout/abort stop the child tree. Changed sources are `stale`, failures `bound_failed`, skips
|
|
215
|
+
satisfy no criterion. Failing tests exit 5; runner errors exit 1. Binding authenticates neither
|
|
216
|
+
external toolchain nor runner. `--run-tests` and `--test-evidence` are mutually exclusive;
|
|
217
|
+
MCP remains read-only.
|
|
218
|
+
|
|
219
|
+
Default `--max-cognitive=15` is per execution unit. Normal report exit 0 can include open
|
|
220
|
+
review; `--require-complete` exits 5 except for `evidence_consistent`. Missing maps yield
|
|
221
|
+
`needs_manifest`. Consistent declarations prove neither semantic behavior nor owner identity.
|
|
222
|
+
The [feature contract](https://github.com/lboel/untangle/blob/main/docs/FEATURE_ALIGNMENT.md)
|
|
223
|
+
details source binding, scopes and budgets. Untangle's own map has proposed reviews/declared
|
|
224
|
+
roles, not human approval or an objective feature-richness score.
|
|
225
|
+
|
|
226
|
+
## Command status
|
|
227
|
+
|
|
228
|
+
| Command | Status and scope |
|
|
229
|
+
|---|---|
|
|
230
|
+
| `init` | Implemented: commented configuration, context inventory, optional guided setup. |
|
|
231
|
+
| `query` | Implemented: hybrid/lexical/symbol/semantic/pattern retrieval; scoped profile auto-selection. |
|
|
232
|
+
| `complexity` | Implemented: direct measurements without services/index, threshold exit 5. |
|
|
233
|
+
| `product` | Implemented: declared alignment, separate metrics, source-bound evidence and optional gate. |
|
|
234
|
+
| `product connect` | Implemented: native local Spec Kit/OpenSpec imports into proposed manifests. |
|
|
235
|
+
| `scan` | Implemented: own analysis, enabled extensions and explained failures; explicit container consent. |
|
|
236
|
+
| `doctor` | Implemented: read-only checks, exactly one next step per failed check. |
|
|
237
|
+
| `watch` | Implemented: complexity deltas; optional serialized index refresh. |
|
|
238
|
+
| `extensions` | Implemented: analyzer manifest/import/activation/execution. |
|
|
239
|
+
| `index` | Implemented: complete core pipeline, incremental/dry-run/offline modes. |
|
|
240
|
+
| `graph` | Implemented: file/symbol context, frontend/FastAPI boundaries, offline explorers/3D feature map. |
|
|
241
|
+
| `flow` | Implemented: symbol paths, impact, entry points and confidence. |
|
|
242
|
+
| `mcp` | Implemented: stdio runtime; specified unbuilt capabilities explicitly unavailable. |
|
|
243
|
+
|
|
244
|
+
Command specifications/`--help` are executable truth. Registered but unbuilt MCP tools return
|
|
245
|
+
`FEATURE_UNAVAILABLE`. For a project installation, configure the MCP host with the absolute
|
|
246
|
+
paths to your Node executable, installed CLI and project root.
|
|
247
|
+
|
|
248
|
+
```json
|
|
249
|
+
{
|
|
250
|
+
"mcpServers": {
|
|
251
|
+
"untangle": {
|
|
252
|
+
"command": "/absolute/path/to/node",
|
|
253
|
+
"args": [
|
|
254
|
+
"/path/to/your/project/node_modules/@untangle-code/cli/dist/index.js",
|
|
255
|
+
"mcp",
|
|
256
|
+
"--stdio",
|
|
257
|
+
"--root=/path/to/your/project"
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## Exit codes and streams
|
|
265
|
+
|
|
266
|
+
| Code | Meaning |
|
|
267
|
+
|---|---|
|
|
268
|
+
| 0 | Success/report produced; inspect report status. |
|
|
269
|
+
| 1 | Operational error: unreadable file, invalid configuration, adapter/runner failure. |
|
|
270
|
+
| 2 | Invalid arguments, command or option. |
|
|
271
|
+
| 3 | Capability unimplemented, not a user error. |
|
|
272
|
+
| 4 | Environment/index unavailable, unconfirmed required freshness or incomplete retrieval. |
|
|
273
|
+
| 5 | Analysis/evidence threshold or explicit tests failed. |
|
|
274
|
+
| 130 | Cancelled by SIGINT/SIGTERM. |
|
|
275
|
+
|
|
276
|
+
Unavailable capability, environment and quality-gate failures stay distinct without parsing
|
|
277
|
+
stderr. MCP tool errors remain structured on a live connection rather than terminating its
|
|
278
|
+
server. Scan can exit 0 with individual extension failures in its report.
|
|
279
|
+
|
|
280
|
+
**Payload to stdout, human diagnostics to stderr.** JSON also contains structured warnings,
|
|
281
|
+
freshness and skipped data. JSONL begins with a header; hits are under `hit`:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
untangle query "retry" --format=jsonl | jq -r 'select(.kind == "hit") | .hit.filePath'
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
Inspect the search exit code too; `set -o pipefail` prevents jq from hiding it.
|
|
288
|
+
|
|
289
|
+
## Query
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
untangle query "where is a payment triggered" # hybrid
|
|
293
|
+
untangle query "charge" --mode=symbol --explain
|
|
294
|
+
untangle query "user id" --mode=lexical --require-fresh
|
|
295
|
+
untangle query "renew a token" --mode=semantic
|
|
296
|
+
untangle query "charge" --context --linked
|
|
297
|
+
untangle query --regex "await\s+fetch\(" -C 2 --path='src/**' --exclude='**/*.test.ts'
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
`--explain` exposes raw score values, weights and contributions, helping investigate both
|
|
301
|
+
high and missing rankings. Auto embedding selection reads bounded `.untangle/index-states-v1/`
|
|
302
|
+
records scoped to workspace/repository/ref/profile and generation-bound current pointers.
|
|
303
|
+
Multiple refs/profiles/logical repositories on one physical root remain separate. Incompatible
|
|
304
|
+
selected spaces require explicit `service`/`offline` rather than silently searching a subset.
|
|
305
|
+
The old `.untangle/index-state.json` is read-only migration fallback.
|
|
306
|
+
|
|
307
|
+
Every query checks content hashes and reports freshness/time/reasons per repository.
|
|
308
|
+
`--require-fresh` requires confirmed currency; `--refresh` updates stale checked-out refs first,
|
|
309
|
+
with stderr progress. `watch --index` repeats serially at its reconciliation interval.
|
|
310
|
+
Historical unchecked-out refs remain `unknown`; refresh cannot assign them the current tree.
|
|
311
|
+
MCP exposes the same freshness and read-only `requireFresh`.
|
|
312
|
+
|
|
313
|
+
Lexical uses sparse/BM25, symbol uses symbols, semantic uses dense retrieval. The first two
|
|
314
|
+
need no query embedding but do need a compatible index. Offline indexing needs no Ollama and
|
|
315
|
+
claims no model semantics. Hybrid fuses independent paths, with a ten-second per-branch budget
|
|
316
|
+
preventing a hung service from hiding ready hits. Partial failures preserve hits/warnings on
|
|
317
|
+
stdout and exit 4. Versioned identifier tokenization requires legacy migration/reindex;
|
|
318
|
+
refresh handles this. Stale/incomplete contexts are not complete Journey measurements.
|
|
319
|
+
|
|
320
|
+
Strict abstention is default: insufficient evidence clears hits. `--abstention=evidence`
|
|
321
|
+
retains candidates/verdict for inspection without overriding warnings/freshness/exit status.
|
|
322
|
+
MCP partial errors retain data under `error.details.data`.
|
|
323
|
+
|
|
324
|
+
## Observe search effort through MCP
|
|
325
|
+
|
|
326
|
+
An explicitly started Search Journey connects a caller-declared feature ID to actual
|
|
327
|
+
attempts and a confirmed target. Effort remains separate from complexity; it proves neither
|
|
328
|
+
semantic correctness nor causes of findability and produces no combined score.
|
|
329
|
+
|
|
330
|
+
```jsonc
|
|
331
|
+
// Send to untangle_search_session; retain session.sessionId.
|
|
332
|
+
{
|
|
333
|
+
"action": "start",
|
|
334
|
+
"goal": "Find profile card rendering and its tests",
|
|
335
|
+
"featureId": "profile.cards.presentation",
|
|
336
|
+
"executionContext": {
|
|
337
|
+
"agentModel": "model-with-exact-version",
|
|
338
|
+
"harness": "my-harness-v2",
|
|
339
|
+
"searchStrategy": "hybrid-then-symbol-and-graph-v1",
|
|
340
|
+
"taskClass": "find-feature-code-and-tests",
|
|
341
|
+
"taskMix": "fixed-eight-task-suite-v1",
|
|
342
|
+
"priorContext": "fresh-session-no-open-files"
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Send to untangle_search.
|
|
346
|
+
{ "query": "profile card component", "session": { "id": "<session-id>", "step": 1 } }
|
|
347
|
+
// Confirm the actual target through untangle_search_session.
|
|
348
|
+
{ "action": "complete", "sessionId": "<session-id>", "target": { "filePath": "src/profile/ProfileCard.tsx" } }
|
|
349
|
+
{ "action": "report" }
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Optional `executionContext` is entirely caller-declared. When present it requires model,
|
|
353
|
+
harness, strategy and task class; task mix/prior context are optional. Values are trimmed
|
|
354
|
+
identifiers of at most 256 UTF-16 units. No hidden environment inference occurs. Different
|
|
355
|
+
contexts create separate cohorts; absent conditions remain `not-recorded`/`uncontrolledDimensions`.
|
|
356
|
+
Even complete declarations do not independently prove controlled conditions.
|
|
357
|
+
|
|
358
|
+
Actions are `start`, `get`, `observe`, `complete`, `abandon`, `report`. Observe records explicit
|
|
359
|
+
`open-file`, `open-symbol`, `graph-query`, `other-tool` steps. Completion needs at least one
|
|
360
|
+
search attempt and an explicit file/chunk/symbol target. `acceptedAttemptId` can bind a specific
|
|
361
|
+
attempt. Steps are positive integers ≤128; numbered/unnumbered attempts cannot mix. Identical
|
|
362
|
+
repeated steps are idempotent; differing data conflicts. Limits: 128 attempts and 512 navigation
|
|
363
|
+
events per Journey.
|
|
364
|
+
|
|
365
|
+
Successful recording returns `searchObservation.status: recorded` and `attemptId`. Optional
|
|
366
|
+
recording failure preserves search with `not_recorded`/`SEARCH_SESSION_RECORDING_FAILED`.
|
|
367
|
+
Stale/failed/incomplete retrieval is not full evidence. Cohorts separate ranker, ranking
|
|
368
|
+
context, hit/candidate limits, profile, generation and immutable corpus revision. Legacy
|
|
369
|
+
incomplete revisions remain readable/insufficient; fewer than three compatible completions
|
|
370
|
+
set `sufficientEvidence: false`, without independently confirming caller conditions.
|
|
371
|
+
|
|
372
|
+
`cohorts`/feature search mappings retain completed-task views. `outcomeCohorts` adds active,
|
|
373
|
+
completed and abandoned sessions with effort/reasons. `terminalCompletionRate` uses completed
|
|
374
|
+
plus abandoned as denominator and is null without terminals. Active sessions stay separate;
|
|
375
|
+
easy successes do not hide abandoned effort. Feature mappings require explicit IDs/unambiguous
|
|
376
|
+
target evidence and do not average incompatible metric versions.
|
|
377
|
+
|
|
378
|
+
Recording is local/opt-in. Default `retainText: false` uses separate workspace HMAC domains
|
|
379
|
+
for goals, feature IDs, queries and context. Candidate paths, ranks/scores and declared tool
|
|
380
|
+
metadata/reason codes remain; source/chunk content and free error/abort text are not retained.
|
|
381
|
+
`retainText: true` additionally retains those texts. The separate key is
|
|
382
|
+
`.untangle/product-complexity/fingerprint.key`. This is neither encryption nor anonymity;
|
|
383
|
+
access to full local state permits testing guessed values.
|
|
384
|
+
[Context, denominators and privacy](https://github.com/lboel/untangle/blob/main/docs/SEARCH-JOURNEY-CONTEXT.md)
|
|
385
|
+
do not imply automatic time trends, ROI or productivity measurement.
|
|
386
|
+
|
|
387
|
+
## Decisions
|
|
388
|
+
|
|
389
|
+
- The custom closed argument parser rejects unknown options instead of silently treating
|
|
390
|
+
typos as positional inputs. Help is generated from the option specification.
|
|
391
|
+
- Doctor has a per-check deadline (`--timeout`, default 15s). Adapter retry/backoff suited
|
|
392
|
+
to indexing must not leave diagnosis hanging. Deadline is a failed check; outer abort is
|
|
393
|
+
whole-command exit 130/MCP `CANCELLED`.
|
|
394
|
+
- A failed retrieval target is a failure, not empty success. Provider-unavailable data stays
|
|
395
|
+
visible in warnings/ledger and query exits 4.
|
|
396
|
+
- Query has its own default 60s deadline, allowing model warm-up without indefinite hanging.
|
|
397
|
+
- Main explicitly exits after flushing streams; it does not wait for lingering adapter work
|
|
398
|
+
once the final outcome is known.
|
|
399
|
+
- MCP is another interface to the same analysis, not a second implementation. The public
|
|
400
|
+
CLI export owns runtime; private MCP app only re-exports it. Canonical roots, JSON-RPC-only
|
|
401
|
+
stdout, validated inputs/envelopes/data, disjoint success/failure, explicit availability,
|
|
402
|
+
hard graph/flow/impact/visualization budgets and in-flight cancellation have contract tests.
|
|
403
|
+
|
|
404
|
+
## Known limits
|
|
405
|
+
|
|
406
|
+
- Each search requires compatible embedding spaces; explicit profiles search their own
|
|
407
|
+
collection. Profile changes need a matching index.
|
|
408
|
+
- Query searches the index, not disk; absent indexes exit 4 rather than claim no hits.
|
|
409
|
+
- Complexity measures only available deep adapters; other sources remain explained skips.
|
|
410
|
+
- Graph context is generation-bound. Context/linked data uses direct/exact resolved edges
|
|
411
|
+
from the same generation without changing rank/count. New payloads include `generation_id`
|
|
412
|
+
and `metrics_version`; missing legacy values remain `unknown`, requiring one deliberate
|
|
413
|
+
`index --no-incremental --no-resume`, without attaching an unrelated current graph.
|
|
414
|
+
- Damaged syntax trees contribute no complexity numbers because unreliable scopes/hotspots
|
|
415
|
+
are worse than explicitly incomplete coverage.
|
|
416
|
+
- Retrieval depends on parsers, chunks, model and ranking. Missing hits do not prove absent
|
|
417
|
+
implementation. Real acceptance covers targeted identifier/language/freshness/migration/
|
|
418
|
+
outage cases, not complete recall.
|
|
419
|
+
- Ownership and feature richness are not automatically proven. Declared IDs and confirmed
|
|
420
|
+
target observations remain caller evidence. The general capability/reduce-complexity loop
|
|
421
|
+
is unimplemented; embedding similarity is not behavior equivalence.
|
|
422
|
+
|
|
423
|
+
## Combined analysis report
|
|
424
|
+
|
|
425
|
+
```bash
|
|
426
|
+
untangle scan --root=/path/to/project --format=json
|
|
427
|
+
untangle scan --feature=accounts.lookup --format=json
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
Scan runs own analysis and enabled extensions, separating own metrics, external evidence and
|
|
431
|
+
explained omissions. Without `--yes`, no container provisioning occurs; with it, resources are
|
|
432
|
+
shown on stderr first and license gates remain. Exit 0 means report produced, even if some
|
|
433
|
+
extensions failed. JSON retains run status, provenance, findings and diagnostics.
|
|
434
|
+
|
|
435
|
+
`--feature` adds `featureAlignment`, not a smaller repository/analyzer scan. Explicit
|
|
436
|
+
`--manifest`/`--test-evidence` require a feature and execute no tests. Sentrux/Sonar/other tools
|
|
437
|
+
use reviewed definitions in the user profile. Repository metrics stay `repository_context`;
|
|
438
|
+
file/symbol findings attach only through real paths. Values are neither summed with own metrics
|
|
439
|
+
nor apportioned into features. Sonar retrieval proves no analysis of the current commit.
|
|
440
|
+
[Provider boundaries](https://github.com/lboel/untangle/blob/main/docs/ANALYZER-FEATURE-WORKFLOW.md).
|
|
441
|
+
|
|
442
|
+
Complexity/scan totals use `totalsReading: execution_unit`: inclusive outer functions plus
|
|
443
|
+
self contributions outside them, without re-adding nested functions. `executionUnits` counts
|
|
444
|
+
all functions; `executionUnitRoots` counts outer ones. Legacy double-counted totals require a
|
|
445
|
+
new measured baseline.
|
|
446
|
+
|
|
447
|
+
## License
|
|
448
|
+
|
|
449
|
+
**AGPL-3.0-only.** The tarball includes [`LICENSE`](./LICENSE), [`NOTICE`](./NOTICE),
|
|
450
|
+
[`THIRD_PARTY_LICENSES.md`](./THIRD_PARTY_LICENSES.md) and corresponding TypeScript under `src/`.
|
|
451
|
+
A README is not a substitute for the full license copy. Repository:
|
|
452
|
+
<https://github.com/lboel/untangle>.
|