@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,141 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFileSync, realpathSync, statSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { analyzeFrontendBoundaries } from "@untangle-code/core";
|
|
5
|
+
import { enumFlag, integerFlag, stringFlag } from "../../cli/args.js";
|
|
6
|
+
import { EXIT, OperationalError, UsageError } from "../../cli/exit.js";
|
|
7
|
+
import { line } from "../../cli/io.js";
|
|
8
|
+
import { loadWorkspace } from "../../cli/workspace.js";
|
|
9
|
+
import { httpServicesFileSchema } from "./boundaries-input.js";
|
|
10
|
+
function inside(root, candidate) {
|
|
11
|
+
const relative = path.relative(root, candidate);
|
|
12
|
+
return relative !== ".." && !relative.startsWith(".." + path.sep) && !path.isAbsolute(relative);
|
|
13
|
+
}
|
|
14
|
+
function readServices(root, requested) {
|
|
15
|
+
const selected = requested ?? ".untangle/services.json";
|
|
16
|
+
const candidate = path.resolve(root, selected);
|
|
17
|
+
if (!inside(root, candidate))
|
|
18
|
+
throw new UsageError("Service configuration must be inside the project root.");
|
|
19
|
+
const controlPath = path.relative(root, candidate).split(path.sep).join("/");
|
|
20
|
+
let physical;
|
|
21
|
+
try {
|
|
22
|
+
physical = realpathSync(candidate);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (requested === undefined && error.code === "ENOENT") {
|
|
26
|
+
return {
|
|
27
|
+
services: [],
|
|
28
|
+
control: { path: controlPath, status: "missing" },
|
|
29
|
+
verify: () => {
|
|
30
|
+
try {
|
|
31
|
+
realpathSync(candidate);
|
|
32
|
+
}
|
|
33
|
+
catch (failure) {
|
|
34
|
+
if (failure.code === "ENOENT")
|
|
35
|
+
return;
|
|
36
|
+
throw failure;
|
|
37
|
+
}
|
|
38
|
+
throw new OperationalError("Service configuration appeared during the analysis; repeat it.");
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
throw new OperationalError("Service configuration could not be read.");
|
|
43
|
+
}
|
|
44
|
+
if (!inside(root, physical))
|
|
45
|
+
throw new UsageError("Service configuration resolves outside the project root.");
|
|
46
|
+
const stat = statSync(physical);
|
|
47
|
+
if (!stat.isFile() || stat.size > 1024 * 1024)
|
|
48
|
+
throw new UsageError("Service configuration must be a regular JSON file no larger than 1 MiB.");
|
|
49
|
+
const bytes = readFileSync(physical);
|
|
50
|
+
let raw;
|
|
51
|
+
try {
|
|
52
|
+
raw = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new UsageError("Service configuration is not valid UTF-8 JSON.");
|
|
56
|
+
}
|
|
57
|
+
const parsed = httpServicesFileSchema.safeParse(raw);
|
|
58
|
+
if (!parsed.success)
|
|
59
|
+
throw new UsageError("Invalid service configuration: " +
|
|
60
|
+
parsed.error.issues.map((issue) => issue.path.join(".") + ": " + issue.message).join("; "));
|
|
61
|
+
const digest = (value) => createHash("sha256").update(value).digest("hex");
|
|
62
|
+
const contentHash = digest(bytes);
|
|
63
|
+
return {
|
|
64
|
+
services: parsed.data.services.map((service) => ({
|
|
65
|
+
id: service.id,
|
|
66
|
+
frontendRoots: service.frontendRoots,
|
|
67
|
+
backendRoots: service.backendRoots,
|
|
68
|
+
...(service.sameOrigin === undefined ? {} : { sameOrigin: service.sameOrigin }),
|
|
69
|
+
...(service.origins === undefined ? {} : { origins: service.origins }),
|
|
70
|
+
})),
|
|
71
|
+
control: { path: controlPath, status: "loaded", contentHash },
|
|
72
|
+
verify: () => {
|
|
73
|
+
if (realpathSync(candidate) !== physical || digest(readFileSync(physical)) !== contentHash)
|
|
74
|
+
throw new OperationalError("Service configuration changed during the analysis; repeat it.");
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export async function runBoundaries(ctx, args) {
|
|
79
|
+
const allowed = new Set(["root", "services", "path", "max-relations", "format"]);
|
|
80
|
+
for (const flag of Object.keys(args.flags))
|
|
81
|
+
if (!allowed.has(flag))
|
|
82
|
+
throw new UsageError(`Option --${flag} is not supported by graph boundaries.`);
|
|
83
|
+
const format = enumFlag(args, "format", ["text", "json"], "text");
|
|
84
|
+
const maxRelations = integerFlag(args, "max-relations", 200);
|
|
85
|
+
if (maxRelations < 1 || maxRelations > 1000)
|
|
86
|
+
throw new UsageError("--max-relations must be between 1 and 1000.");
|
|
87
|
+
const rootFlag = stringFlag(args, "root");
|
|
88
|
+
const workspace = loadWorkspace({
|
|
89
|
+
cwd: path.resolve(ctx.cwd, rootFlag ?? "."),
|
|
90
|
+
env: ctx.env,
|
|
91
|
+
strict: true,
|
|
92
|
+
});
|
|
93
|
+
const root = realpathSync(rootFlag === undefined ? workspace.root : path.resolve(ctx.cwd, rootFlag));
|
|
94
|
+
const services = readServices(root, stringFlag(args, "services"));
|
|
95
|
+
const selectedPath = stringFlag(args, "path");
|
|
96
|
+
if (selectedPath !== undefined &&
|
|
97
|
+
(!selectedPath ||
|
|
98
|
+
selectedPath.length > 4096 ||
|
|
99
|
+
selectedPath.startsWith("/") ||
|
|
100
|
+
/[:\\*?[\]{}]/u.test(selectedPath) ||
|
|
101
|
+
selectedPath.split("/").some((part) => !part || part === "." || part === "..")))
|
|
102
|
+
throw new UsageError("--path must be one literal repository-relative file path.");
|
|
103
|
+
const repository = (workspace.config.repositories ?? []).find((entry) => path.resolve(workspace.load.sources.configBaseDir, entry.path) === root);
|
|
104
|
+
const report = await analyzeFrontendBoundaries({
|
|
105
|
+
root,
|
|
106
|
+
services: services.services,
|
|
107
|
+
maxRelations,
|
|
108
|
+
...(selectedPath === undefined ? {} : { path: selectedPath }),
|
|
109
|
+
...(repository?.exclude === undefined
|
|
110
|
+
? {}
|
|
111
|
+
: { inventoryScope: { additionalDefaultExcludes: repository.exclude } }),
|
|
112
|
+
signal: ctx.signal,
|
|
113
|
+
});
|
|
114
|
+
ctx.signal.throwIfAborted();
|
|
115
|
+
services.verify();
|
|
116
|
+
const data = { ...report, servicesManifest: services.control };
|
|
117
|
+
if (format === "json")
|
|
118
|
+
line(ctx.io, JSON.stringify(data, null, 2));
|
|
119
|
+
else {
|
|
120
|
+
line(ctx.io, `Frontend/backend HTTP dependencies: ${report.status}; sources ${report.freshness.status}`);
|
|
121
|
+
line(ctx.io, `${report.http.summary.endpoints} endpoints; ${report.http.summary.requests} requests: ${report.http.summary.resolved} resolved, ${report.http.summary.ambiguous} ambiguous, ${report.http.summary.unresolved} unresolved.`);
|
|
122
|
+
for (const request of report.http.requests) {
|
|
123
|
+
line(ctx.io, `${request.source.path}:${request.source.range.startLine} ${request.method ?? "?"} ${request.path ?? "?"} [${request.status}]`);
|
|
124
|
+
for (const target of request.targets) {
|
|
125
|
+
const route = target.provenance.find((item) => item.kind === "route");
|
|
126
|
+
line(ctx.io, ` -> ${target.serviceId ?? "unbound"} ${target.handler}${route ? " " + route.path + ":" + route.range.startLine : ""}`);
|
|
127
|
+
}
|
|
128
|
+
if (request.reason)
|
|
129
|
+
line(ctx.io, " " + request.reason);
|
|
130
|
+
}
|
|
131
|
+
for (const importer of report.importContext.requestImporters)
|
|
132
|
+
line(ctx.io, `Import context: ${importer.path} -> ${importer.requestPath} (${importer.distance} import edges; no function-call proof)`);
|
|
133
|
+
line(ctx.io, `Feature associations: ${report.features.associationCount}; declared dependsOn remains unchanged.`);
|
|
134
|
+
if (report.truncation.truncated)
|
|
135
|
+
line(ctx.io, "Output was truncated; inspect the JSON counts and limits.");
|
|
136
|
+
for (const limitation of report.limitations)
|
|
137
|
+
line(ctx.io, "Limit: " + limitation);
|
|
138
|
+
}
|
|
139
|
+
return report.freshness.status === "stale" ? EXIT.environment : EXIT.ok;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=boundaries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../../src/commands/graph/boundaries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory-bounded projection of one file's direct edges.
|
|
3
|
+
*
|
|
4
|
+
* Persisted snapshots already keep their edges in canonical order. Iterating
|
|
5
|
+
* that snapshot directly avoids materialising the complete high-degree result
|
|
6
|
+
* returned by `RestoredFileGraph.edgesFrom` immediately before JSON encoding.
|
|
7
|
+
* We still count every matching edge so the visible omission count is exact.
|
|
8
|
+
*/
|
|
9
|
+
export declare function boundDirectEdges<T extends {
|
|
10
|
+
readonly fromFileId: string;
|
|
11
|
+
}>(candidates: Iterable<T>, fromFileId: string, maxEdges: number): {
|
|
12
|
+
edges: T[];
|
|
13
|
+
truncated: boolean;
|
|
14
|
+
omittedCount: number;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=bounds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounds.d.ts","sourceRoot":"","sources":["../../../src/commands/graph/bounds.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EACxE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAY1D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory-bounded projection of one file's direct edges.
|
|
3
|
+
*
|
|
4
|
+
* Persisted snapshots already keep their edges in canonical order. Iterating
|
|
5
|
+
* that snapshot directly avoids materialising the complete high-degree result
|
|
6
|
+
* returned by `RestoredFileGraph.edgesFrom` immediately before JSON encoding.
|
|
7
|
+
* We still count every matching edge so the visible omission count is exact.
|
|
8
|
+
*/
|
|
9
|
+
export function boundDirectEdges(candidates, fromFileId, maxEdges) {
|
|
10
|
+
const edges = [];
|
|
11
|
+
let matchingCount = 0;
|
|
12
|
+
for (const edge of candidates) {
|
|
13
|
+
if (edge.fromFileId !== fromFileId)
|
|
14
|
+
continue;
|
|
15
|
+
matchingCount += 1;
|
|
16
|
+
if (edges.length < maxEdges)
|
|
17
|
+
edges.push(edge);
|
|
18
|
+
}
|
|
19
|
+
const omittedCount = matchingCount - edges.length;
|
|
20
|
+
return { edges, truncated: omittedCount > 0, omittedCount };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=bounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../../src/commands/graph/bounds.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAuB,EACvB,UAAkB,EAClB,QAAgB;IAEhB,MAAM,KAAK,GAAQ,EAAE,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU;YAAE,SAAS;QAC7C,aAAa,IAAI,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;IAClD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FeaturePoint3D } from "./feature-3d.js";
|
|
2
|
+
import type { FeatureMapEdgeV1, FeatureMapNodeV1 } from "./feature-model.js";
|
|
3
|
+
export type CategoryClusterDimension = "code" | "test" | "owner" | "intent" | "unmapped";
|
|
4
|
+
export type CategoryClusterNode = Pick<FeatureMapNodeV1, "id" | "kind"> & Partial<Pick<FeatureMapNodeV1, "label" | "path" | "details" | "status">>;
|
|
5
|
+
export interface CategoryClusterGroup {
|
|
6
|
+
id: string;
|
|
7
|
+
kind: "category" | "shared" | "unassigned";
|
|
8
|
+
label: string;
|
|
9
|
+
center: FeaturePoint3D;
|
|
10
|
+
memberIds: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface CategoryClusterLayout {
|
|
13
|
+
positions: Record<string, FeaturePoint3D>;
|
|
14
|
+
groups: CategoryClusterGroup[];
|
|
15
|
+
memberships: Record<string, string[]>;
|
|
16
|
+
description: string;
|
|
17
|
+
}
|
|
18
|
+
/** Self-contained browser geometry; context paths are declarations, never inferred ownership. */
|
|
19
|
+
export declare function createCategoryClusterLayout(nodes: readonly CategoryClusterNode[], edges: readonly Pick<FeatureMapEdgeV1, "from" | "to" | "kind">[], dimension: CategoryClusterDimension): CategoryClusterLayout;
|
|
20
|
+
//# sourceMappingURL=category-clusters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-clusters.d.ts","sourceRoot":"","sources":["../../../src/commands/graph/category-clusters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AACzF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,CAAC,GACrE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;AAE3E,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,iGAAiG;AACjG,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,KAAK,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,EAAE,EAChE,SAAS,EAAE,wBAAwB,GAClC,qBAAqB,CAsKvB"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/** Self-contained browser geometry; context paths are declarations, never inferred ownership. */
|
|
2
|
+
export function createCategoryClusterLayout(nodes, edges, dimension) {
|
|
3
|
+
const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
4
|
+
const descriptions = {
|
|
5
|
+
code: "Code areas use repository-relative directories. Other nodes show declared feature context.",
|
|
6
|
+
test: "Test areas use repository-relative directories. Other nodes show declared feature context.",
|
|
7
|
+
owner: "Ownership groups use declared roles and feature scopes. They do not establish file ownership.",
|
|
8
|
+
intent: "Vision / Spec groups use source paths and declared feature scopes, not semantic similarity.",
|
|
9
|
+
unmapped: "Unassigned files use repository-relative directories. Declared context stays separate.",
|
|
10
|
+
};
|
|
11
|
+
if (!Object.hasOwn(descriptions, dimension))
|
|
12
|
+
throw new RangeError("Unknown grouping category.");
|
|
13
|
+
const ordered = [...nodes].sort((a, b) => compare(a.id, b.id));
|
|
14
|
+
const byId = new Map(ordered.map((node) => [node.id, node]));
|
|
15
|
+
const features = new Set(ordered.filter((node) => node.kind === "feature").map((node) => node.id));
|
|
16
|
+
const memberships = Object.create(null);
|
|
17
|
+
const positions = Object.create(null);
|
|
18
|
+
const buckets = new Map();
|
|
19
|
+
const anchorBuckets = new Map();
|
|
20
|
+
const featureBuckets = new Map([...features].map((id) => [id, new Set()]));
|
|
21
|
+
const linkedFeatures = new Map(ordered.map((node) => [node.id, new Set()]));
|
|
22
|
+
const compatible = {
|
|
23
|
+
feature: [],
|
|
24
|
+
code: ["code", "test"],
|
|
25
|
+
test: ["code", "test"],
|
|
26
|
+
owner: ["ownership"],
|
|
27
|
+
intent: ["intent"],
|
|
28
|
+
unmapped: [],
|
|
29
|
+
};
|
|
30
|
+
const targetRelations = {
|
|
31
|
+
code: "code",
|
|
32
|
+
test: "test",
|
|
33
|
+
owner: "ownership",
|
|
34
|
+
intent: "intent",
|
|
35
|
+
unmapped: null,
|
|
36
|
+
};
|
|
37
|
+
for (const node of ordered) {
|
|
38
|
+
const roles = node.details?.["roles"];
|
|
39
|
+
const hasRole = (role) => (node.kind === "code" || node.kind === "test") &&
|
|
40
|
+
Array.isArray(roles) &&
|
|
41
|
+
roles.includes(role);
|
|
42
|
+
const anchor = dimension === "code"
|
|
43
|
+
? node.kind === "code" || node.kind === "unmapped" || hasRole("code")
|
|
44
|
+
: dimension === "test"
|
|
45
|
+
? node.kind === "test" || hasRole("test")
|
|
46
|
+
: node.kind === dimension;
|
|
47
|
+
if (!anchor)
|
|
48
|
+
continue;
|
|
49
|
+
let key;
|
|
50
|
+
let label;
|
|
51
|
+
if (dimension === "owner") {
|
|
52
|
+
key = node.id;
|
|
53
|
+
label = node.label || node.id;
|
|
54
|
+
if (node.status === "missing")
|
|
55
|
+
label += " (missing ownership)";
|
|
56
|
+
}
|
|
57
|
+
else if (dimension === "intent") {
|
|
58
|
+
key = node.path || "(no source path)";
|
|
59
|
+
label = node.path || "Intent without a source path";
|
|
60
|
+
}
|
|
61
|
+
else if (!node.path) {
|
|
62
|
+
key = "(no source path)";
|
|
63
|
+
label = "Files without a source path";
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const directories = node.path.replaceAll("\\", "/").split("/").slice(0, -1);
|
|
67
|
+
key = directories.slice(0, 2).join("/") || ".";
|
|
68
|
+
label = key === "." ? "Repository root" : key;
|
|
69
|
+
}
|
|
70
|
+
const id = dimension !== "owner" && !node.path ? `missing:${dimension}` : `${dimension}:${key}`;
|
|
71
|
+
if (!buckets.has(id))
|
|
72
|
+
buckets.set(id, { label, sortKey: key, memberIds: [] });
|
|
73
|
+
anchorBuckets.set(node.id, id);
|
|
74
|
+
}
|
|
75
|
+
if (dimension !== "unmapped") {
|
|
76
|
+
for (const edge of edges) {
|
|
77
|
+
const fromFeature = features.has(edge.from);
|
|
78
|
+
const toFeature = features.has(edge.to);
|
|
79
|
+
if (fromFeature === toFeature)
|
|
80
|
+
continue;
|
|
81
|
+
const feature = fromFeature ? edge.from : edge.to;
|
|
82
|
+
const member = byId.get(fromFeature ? edge.to : edge.from);
|
|
83
|
+
if (!member || !compatible[member.kind].includes(edge.kind))
|
|
84
|
+
continue;
|
|
85
|
+
linkedFeatures.get(member.id).add(feature);
|
|
86
|
+
const bucket = anchorBuckets.get(member.id);
|
|
87
|
+
if (bucket !== undefined && edge.kind === targetRelations[dimension])
|
|
88
|
+
featureBuckets.get(feature).add(bucket);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const shared = [];
|
|
92
|
+
const outside = [];
|
|
93
|
+
for (const node of ordered) {
|
|
94
|
+
const anchor = anchorBuckets.get(node.id);
|
|
95
|
+
const categories = anchor !== undefined
|
|
96
|
+
? [anchor]
|
|
97
|
+
: [
|
|
98
|
+
...new Set((node.kind === "feature" ? [node.id] : [...linkedFeatures.get(node.id)]).flatMap((id) => [...featureBuckets.get(id)])),
|
|
99
|
+
].sort(compare);
|
|
100
|
+
memberships[node.id] = categories;
|
|
101
|
+
if (categories.length === 1)
|
|
102
|
+
buckets.get(categories[0]).memberIds.push(node.id);
|
|
103
|
+
else if (categories.length > 1)
|
|
104
|
+
shared.push(node.id);
|
|
105
|
+
else
|
|
106
|
+
outside.push(node.id);
|
|
107
|
+
}
|
|
108
|
+
const primary = [...buckets].sort(([a, first], [b, second]) => compare(first.sortKey, second.sortKey) || compare(a, b));
|
|
109
|
+
const columns = Math.max(1, Math.ceil(Math.sqrt(primary.length * 1.3)));
|
|
110
|
+
const rows = Math.ceil(primary.length / columns);
|
|
111
|
+
const stepX = Math.min(140, 700 / Math.max(1, columns - 1));
|
|
112
|
+
const stepY = Math.min(110, 400 / Math.max(1, rows - 1));
|
|
113
|
+
const radius = primary.length === 1 ? 140 : Math.min(50, Math.min(stepX, stepY) * 0.4);
|
|
114
|
+
const goldenAngle = Math.PI * (3 - Math.sqrt(5));
|
|
115
|
+
const groups = [];
|
|
116
|
+
function placeMembers(ids, center, extent) {
|
|
117
|
+
ids.forEach((id, index) => {
|
|
118
|
+
const orbit = extent * (0.12 + 0.88 * Math.sqrt((index + 0.5) / ids.length));
|
|
119
|
+
const kind = byId.get(id).kind;
|
|
120
|
+
const depth = kind === "test" ? 1 : kind === "owner" ? 0.5 : kind === "intent" ? -0.5 : -1;
|
|
121
|
+
positions[id] = {
|
|
122
|
+
x: center.x + Math.cos(index * goldenAngle) * orbit,
|
|
123
|
+
y: center.y + Math.sin(index * goldenAngle) * orbit,
|
|
124
|
+
z: center.z + extent * (depth * 0.2 + ((index % 7) - 3) * 0.035),
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
primary.forEach(([id, bucket], index) => {
|
|
129
|
+
const row = Math.floor(index / columns);
|
|
130
|
+
const rowSize = Math.min(columns, primary.length - row * columns);
|
|
131
|
+
const center = {
|
|
132
|
+
x: ((index % columns) - (rowSize - 1) / 2) * stepX,
|
|
133
|
+
y: -65 + (row - (rows - 1) / 2) * stepY,
|
|
134
|
+
z: ((index % 3) - 1) * 12,
|
|
135
|
+
};
|
|
136
|
+
placeMembers(bucket.memberIds, center, radius);
|
|
137
|
+
groups.push({ id, kind: "category", label: bucket.label, center, memberIds: bucket.memberIds });
|
|
138
|
+
});
|
|
139
|
+
function addContext(kind, label, ids, x) {
|
|
140
|
+
if (ids.length === 0)
|
|
141
|
+
return;
|
|
142
|
+
const center = primary.length === 0 ? { x: 0, y: 0, z: 0 } : { x, y: 270, z: 0 };
|
|
143
|
+
const extent = primary.length === 0 ? 190 : Math.min(85, 65 + Math.sqrt(ids.length) * 0.75);
|
|
144
|
+
placeMembers(ids, center, extent);
|
|
145
|
+
groups.push({ id: `context:${dimension}:${kind}`, kind, label, center, memberIds: ids });
|
|
146
|
+
}
|
|
147
|
+
const outsideLabels = {
|
|
148
|
+
code: "Outside declared code context",
|
|
149
|
+
test: "Outside declared test context",
|
|
150
|
+
owner: "No declared ownership context",
|
|
151
|
+
intent: "No declared vision / spec context",
|
|
152
|
+
unmapped: "Declared context",
|
|
153
|
+
};
|
|
154
|
+
addContext("shared", "Shared context", shared, -175);
|
|
155
|
+
addContext("unassigned", outsideLabels[dimension], outside, 175);
|
|
156
|
+
return { positions, groups, memberships, description: descriptions[dimension] };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=category-clusters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-clusters.js","sourceRoot":"","sources":["../../../src/commands/graph/category-clusters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FeatureMapEdgeV1, FeatureMapNodeV1 } from "./feature-model.js";
|
|
2
|
+
export interface FeaturePoint3D {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
z: number;
|
|
6
|
+
}
|
|
7
|
+
export interface FeatureCamera3D {
|
|
8
|
+
yaw: number;
|
|
9
|
+
pitch: number;
|
|
10
|
+
}
|
|
11
|
+
/** Stable spatial grouping follows declared edges. Distance is a layout choice, not evidence. */
|
|
12
|
+
export declare function createFeatureWoolLayout(nodes: readonly Pick<FeatureMapNodeV1, "id" | "kind">[], edges: readonly Pick<FeatureMapEdgeV1, "from" | "to">[]): Record<string, FeaturePoint3D>;
|
|
13
|
+
/** Rotate in world space, then project with a camera outside every bounded layout point. */
|
|
14
|
+
export declare function projectFeaturePoint(point: FeaturePoint3D, camera: FeatureCamera3D): {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
depth: number;
|
|
18
|
+
scale: number;
|
|
19
|
+
};
|
|
20
|
+
/** Sample a cubic thread in 3D before projection; rotation changes the whole thread. */
|
|
21
|
+
export declare function createFeatureThread(from: FeaturePoint3D, to: FeaturePoint3D, camera: FeatureCamera3D, winding: number, grouping?: number): string;
|
|
22
|
+
//# sourceMappingURL=feature-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-3d.d.ts","sourceRoot":"","sources":["../../../src/commands/graph/feature-3d.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,CAAC,EAAE,EACvD,KAAK,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,GACtD,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAwDhC;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,eAAe,GACtB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAWxD;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,QAAQ,SAAI,GACX,MAAM,CAyCR"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/** Stable spatial grouping follows declared edges. Distance is a layout choice, not evidence. */
|
|
2
|
+
export function createFeatureWoolLayout(nodes, edges) {
|
|
3
|
+
const positions = Object.create(null);
|
|
4
|
+
const ordered = [...nodes].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
5
|
+
const features = ordered.filter((node) => node.kind === "feature");
|
|
6
|
+
const featureIds = new Set(features.map((node) => node.id));
|
|
7
|
+
const adjacency = new Map();
|
|
8
|
+
for (const edge of edges) {
|
|
9
|
+
if (featureIds.has(edge.from)) {
|
|
10
|
+
if (!adjacency.has(edge.to))
|
|
11
|
+
adjacency.set(edge.to, new Set());
|
|
12
|
+
adjacency.get(edge.to).add(edge.from);
|
|
13
|
+
}
|
|
14
|
+
if (featureIds.has(edge.to)) {
|
|
15
|
+
if (!adjacency.has(edge.from))
|
|
16
|
+
adjacency.set(edge.from, new Set());
|
|
17
|
+
adjacency.get(edge.from).add(edge.to);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const goldenAngle = Math.PI * (3 - Math.sqrt(5));
|
|
21
|
+
function sphere(index, count, radius) {
|
|
22
|
+
const y = 1 - (2 * (index + 0.5)) / Math.max(1, count);
|
|
23
|
+
const ring = Math.sqrt(Math.max(0, 1 - y * y));
|
|
24
|
+
return {
|
|
25
|
+
x: Math.cos(index * goldenAngle) * ring * radius,
|
|
26
|
+
y: y * radius,
|
|
27
|
+
z: Math.sin(index * goldenAngle) * ring * radius,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
features.forEach((node, index) => {
|
|
31
|
+
positions[node.id] =
|
|
32
|
+
features.length === 1 ? { x: 0, y: 0, z: 0 } : sphere(index, features.length, 200);
|
|
33
|
+
});
|
|
34
|
+
const other = ordered.filter((node) => node.kind !== "feature");
|
|
35
|
+
other.forEach((node, index) => {
|
|
36
|
+
const linked = [...(adjacency.get(node.id) ?? [])].sort();
|
|
37
|
+
if (linked.length === 0) {
|
|
38
|
+
positions[node.id] = sphere(index, other.length, 335 + (index % 7) * 5);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const center = { x: 0, y: 0, z: 0 };
|
|
42
|
+
for (const id of linked) {
|
|
43
|
+
const point = positions[id];
|
|
44
|
+
center.x += point.x / linked.length;
|
|
45
|
+
center.y += point.y / linked.length;
|
|
46
|
+
center.z += point.z / linked.length;
|
|
47
|
+
}
|
|
48
|
+
const radius = node.kind === "code" ? 88 : node.kind === "test" ? 118 : 150;
|
|
49
|
+
const offset = sphere(index, other.length, radius + (index % 11) * 2);
|
|
50
|
+
positions[node.id] = {
|
|
51
|
+
x: center.x + offset.x,
|
|
52
|
+
y: center.y + offset.y,
|
|
53
|
+
z: center.z + offset.z,
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
return positions;
|
|
57
|
+
}
|
|
58
|
+
/** Rotate in world space, then project with a camera outside every bounded layout point. */
|
|
59
|
+
export function projectFeaturePoint(point, camera) {
|
|
60
|
+
const cosYaw = Math.cos(camera.yaw);
|
|
61
|
+
const sinYaw = Math.sin(camera.yaw);
|
|
62
|
+
const x = point.x * cosYaw + point.z * sinYaw;
|
|
63
|
+
const z = point.z * cosYaw - point.x * sinYaw;
|
|
64
|
+
const cosPitch = Math.cos(camera.pitch);
|
|
65
|
+
const sinPitch = Math.sin(camera.pitch);
|
|
66
|
+
const y = point.y * cosPitch - z * sinPitch;
|
|
67
|
+
const depth = point.y * sinPitch + z * cosPitch;
|
|
68
|
+
const scale = 1000 / (1000 - depth);
|
|
69
|
+
return { x: 650 + x * scale, y: 410 + y * scale, depth, scale };
|
|
70
|
+
}
|
|
71
|
+
/** Sample a cubic thread in 3D before projection; rotation changes the whole thread. */
|
|
72
|
+
export function createFeatureThread(from, to, camera, winding, grouping = 0) {
|
|
73
|
+
const twist = Math.max(-1, Math.min(1, winding)) * 90;
|
|
74
|
+
const a = { x: from.x * 0.35 + twist, y: from.y * 0.35 - twist, z: from.z * 0.35 + twist };
|
|
75
|
+
const b = { x: to.x * 0.35 - twist, y: to.y * 0.35 + twist, z: to.z * 0.35 - twist };
|
|
76
|
+
const amount = Number.isFinite(grouping) ? Math.max(0, Math.min(1, grouping)) : 0;
|
|
77
|
+
if (amount > 0) {
|
|
78
|
+
const dx = to.x - from.x;
|
|
79
|
+
const dy = to.y - from.y;
|
|
80
|
+
const dz = to.z - from.z;
|
|
81
|
+
const length = Math.hypot(dx, dy, dz);
|
|
82
|
+
const bend = Math.max(-1, Math.min(1, winding)) * Math.min(24, length * 0.12);
|
|
83
|
+
const normal = Math.hypot(dx, dy) || 1;
|
|
84
|
+
const offset = { x: (-dy / normal) * bend, y: (dx / normal) * bend, z: bend * 0.35 };
|
|
85
|
+
const localA = {
|
|
86
|
+
x: from.x + dx / 3 + offset.x,
|
|
87
|
+
y: from.y + dy / 3 + offset.y,
|
|
88
|
+
z: from.z + dz / 3 + offset.z,
|
|
89
|
+
};
|
|
90
|
+
const localB = {
|
|
91
|
+
x: from.x + (dx * 2) / 3 + offset.x,
|
|
92
|
+
y: from.y + (dy * 2) / 3 + offset.y,
|
|
93
|
+
z: from.z + (dz * 2) / 3 + offset.z,
|
|
94
|
+
};
|
|
95
|
+
for (const coordinate of ["x", "y", "z"]) {
|
|
96
|
+
a[coordinate] += (localA[coordinate] - a[coordinate]) * amount;
|
|
97
|
+
b[coordinate] += (localB[coordinate] - b[coordinate]) * amount;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const parts = [];
|
|
101
|
+
for (let i = 0; i <= 18; i += 1) {
|
|
102
|
+
const t = i / 18;
|
|
103
|
+
const s = 1 - t;
|
|
104
|
+
const point = {
|
|
105
|
+
x: s ** 3 * from.x + 3 * s ** 2 * t * a.x + 3 * s * t ** 2 * b.x + t ** 3 * to.x,
|
|
106
|
+
y: s ** 3 * from.y + 3 * s ** 2 * t * a.y + 3 * s * t ** 2 * b.y + t ** 3 * to.y,
|
|
107
|
+
z: s ** 3 * from.z + 3 * s ** 2 * t * a.z + 3 * s * t ** 2 * b.z + t ** 3 * to.z,
|
|
108
|
+
};
|
|
109
|
+
const projected = projectFeaturePoint(point, camera);
|
|
110
|
+
parts.push(`${i === 0 ? "M" : "L"}${projected.x.toFixed(2)},${projected.y.toFixed(2)}`);
|
|
111
|
+
}
|
|
112
|
+
return parts.join(" ");
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=feature-3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-3d.js","sourceRoot":"","sources":["../../../src/commands/graph/feature-3d.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { FeaturePoint3D } from "./feature-3d.js";
|
|
2
|
+
import type { FeatureMapEdgeV1, FeatureMapNodeV1 } from "./feature-model.js";
|
|
3
|
+
export interface FeatureClusterGroup {
|
|
4
|
+
id: string;
|
|
5
|
+
kind: "feature" | "shared" | "unassigned";
|
|
6
|
+
featureId?: string;
|
|
7
|
+
center: FeaturePoint3D;
|
|
8
|
+
memberIds: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface FeatureClusterLayout {
|
|
11
|
+
positions: Record<string, FeaturePoint3D>;
|
|
12
|
+
groups: FeatureClusterGroup[];
|
|
13
|
+
memberships: Record<string, string[]>;
|
|
14
|
+
}
|
|
15
|
+
/** Declared membership determines each island; spatial distance proves nothing beyond layout. */
|
|
16
|
+
export declare function createFeatureClusterLayout(nodes: readonly Pick<FeatureMapNodeV1, "id" | "kind">[], edges: readonly Pick<FeatureMapEdgeV1, "from" | "to" | "kind">[]): FeatureClusterLayout;
|
|
17
|
+
//# sourceMappingURL=feature-clusters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-clusters.d.ts","sourceRoot":"","sources":["../../../src/commands/graph/feature-clusters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED,iGAAiG;AACjG,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,CAAC,EAAE,EACvD,KAAK,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,EAAE,GAC/D,oBAAoB,CAuGtB"}
|