@backthread/extractor 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 +21 -0
- package/README.md +83 -0
- package/dist/cluster/domain-grouping.d.ts +113 -0
- package/dist/cluster/domain-grouping.d.ts.map +1 -0
- package/dist/cluster/domain-grouping.js +277 -0
- package/dist/cluster/domain-grouping.js.map +1 -0
- package/dist/cluster/grouping-gate.d.ts +54 -0
- package/dist/cluster/grouping-gate.d.ts.map +1 -0
- package/dist/cluster/grouping-gate.js +0 -0
- package/dist/cluster/grouping-gate.js.map +1 -0
- package/dist/cluster/louvain.d.ts +88 -0
- package/dist/cluster/louvain.d.ts.map +1 -0
- package/dist/cluster/louvain.js +674 -0
- package/dist/cluster/louvain.js.map +1 -0
- package/dist/cluster/overrides.d.ts +19 -0
- package/dist/cluster/overrides.d.ts.map +1 -0
- package/dist/cluster/overrides.js +32 -0
- package/dist/cluster/overrides.js.map +1 -0
- package/dist/cluster/subsystem.d.ts +45 -0
- package/dist/cluster/subsystem.d.ts.map +1 -0
- package/dist/cluster/subsystem.js +299 -0
- package/dist/cluster/subsystem.js.map +1 -0
- package/dist/cluster/workspaces.d.ts +64 -0
- package/dist/cluster/workspaces.d.ts.map +1 -0
- package/dist/cluster/workspaces.js +739 -0
- package/dist/cluster/workspaces.js.map +1 -0
- package/dist/extract.d.ts +52 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +48 -0
- package/dist/extract.js.map +1 -0
- package/dist/framework/celery/celery.d.ts +17 -0
- package/dist/framework/celery/celery.d.ts.map +1 -0
- package/dist/framework/celery/celery.js +524 -0
- package/dist/framework/celery/celery.js.map +1 -0
- package/dist/framework/contribute-step.d.ts +38 -0
- package/dist/framework/contribute-step.d.ts.map +1 -0
- package/dist/framework/contribute-step.js +403 -0
- package/dist/framework/contribute-step.js.map +1 -0
- package/dist/framework/detect-step.d.ts +8 -0
- package/dist/framework/detect-step.d.ts.map +1 -0
- package/dist/framework/detect-step.js +54 -0
- package/dist/framework/detect-step.js.map +1 -0
- package/dist/framework/detect-util.d.ts +24 -0
- package/dist/framework/detect-util.d.ts.map +1 -0
- package/dist/framework/detect-util.js +59 -0
- package/dist/framework/detect-util.js.map +1 -0
- package/dist/framework/django/django.d.ts +22 -0
- package/dist/framework/django/django.d.ts.map +1 -0
- package/dist/framework/django/django.js +940 -0
- package/dist/framework/django/django.js.map +1 -0
- package/dist/framework/fastapi/fastapi.d.ts +27 -0
- package/dist/framework/fastapi/fastapi.d.ts.map +1 -0
- package/dist/framework/fastapi/fastapi.js +477 -0
- package/dist/framework/fastapi/fastapi.js.map +1 -0
- package/dist/framework/faststream/faststream.d.ts +19 -0
- package/dist/framework/faststream/faststream.d.ts.map +1 -0
- package/dist/framework/faststream/faststream.js +765 -0
- package/dist/framework/faststream/faststream.js.map +1 -0
- package/dist/framework/flask/flask.d.ts +17 -0
- package/dist/framework/flask/flask.d.ts.map +1 -0
- package/dist/framework/flask/flask.js +507 -0
- package/dist/framework/flask/flask.js.map +1 -0
- package/dist/framework/graphql/graphql.d.ts +17 -0
- package/dist/framework/graphql/graphql.d.ts.map +1 -0
- package/dist/framework/graphql/graphql.js +708 -0
- package/dist/framework/graphql/graphql.js.map +1 -0
- package/dist/framework/grpc/grpc.d.ts +22 -0
- package/dist/framework/grpc/grpc.d.ts.map +1 -0
- package/dist/framework/grpc/grpc.js +618 -0
- package/dist/framework/grpc/grpc.js.map +1 -0
- package/dist/framework/litestar/litestar.d.ts +17 -0
- package/dist/framework/litestar/litestar.d.ts.map +1 -0
- package/dist/framework/litestar/litestar.js +536 -0
- package/dist/framework/litestar/litestar.js.map +1 -0
- package/dist/framework/nest/nest.d.ts +19 -0
- package/dist/framework/nest/nest.d.ts.map +1 -0
- package/dist/framework/nest/nest.js +613 -0
- package/dist/framework/nest/nest.js.map +1 -0
- package/dist/framework/next/next.d.ts +22 -0
- package/dist/framework/next/next.d.ts.map +1 -0
- package/dist/framework/next/next.js +449 -0
- package/dist/framework/next/next.js.map +1 -0
- package/dist/framework/node/node.d.ts +24 -0
- package/dist/framework/node/node.d.ts.map +1 -0
- package/dist/framework/node/node.js +1009 -0
- package/dist/framework/node/node.js.map +1 -0
- package/dist/framework/orchestrator/orchestrator.d.ts +34 -0
- package/dist/framework/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/framework/orchestrator/orchestrator.js +691 -0
- package/dist/framework/orchestrator/orchestrator.js.map +1 -0
- package/dist/framework/orm/orm.d.ts +61 -0
- package/dist/framework/orm/orm.d.ts.map +1 -0
- package/dist/framework/orm/orm.js +620 -0
- package/dist/framework/orm/orm.js.map +1 -0
- package/dist/framework/python/analyze.d.ts +38 -0
- package/dist/framework/python/analyze.d.ts.map +1 -0
- package/dist/framework/python/analyze.js +98 -0
- package/dist/framework/python/analyze.js.map +1 -0
- package/dist/framework/python/py-ast.d.ts +130 -0
- package/dist/framework/python/py-ast.d.ts.map +1 -0
- package/dist/framework/python/py-ast.js +344 -0
- package/dist/framework/python/py-ast.js.map +1 -0
- package/dist/framework/python-orm/python-orm.d.ts +19 -0
- package/dist/framework/python-orm/python-orm.d.ts.map +1 -0
- package/dist/framework/python-orm/python-orm.js +516 -0
- package/dist/framework/python-orm/python-orm.js.map +1 -0
- package/dist/framework/react-native/react-native.d.ts +35 -0
- package/dist/framework/react-native/react-native.d.ts.map +1 -0
- package/dist/framework/react-native/react-native.js +1181 -0
- package/dist/framework/react-native/react-native.js.map +1 -0
- package/dist/framework/register.d.ts +2 -0
- package/dist/framework/register.d.ts.map +1 -0
- package/dist/framework/register.js +59 -0
- package/dist/framework/register.js.map +1 -0
- package/dist/framework/registry.d.ts +31 -0
- package/dist/framework/registry.d.ts.map +1 -0
- package/dist/framework/registry.js +70 -0
- package/dist/framework/registry.js.map +1 -0
- package/dist/framework/routing/expo-router.d.ts +31 -0
- package/dist/framework/routing/expo-router.d.ts.map +1 -0
- package/dist/framework/routing/expo-router.js +356 -0
- package/dist/framework/routing/expo-router.js.map +1 -0
- package/dist/framework/routing/index.d.ts +4 -0
- package/dist/framework/routing/index.d.ts.map +1 -0
- package/dist/framework/routing/index.js +16 -0
- package/dist/framework/routing/index.js.map +1 -0
- package/dist/framework/routing/next-router.d.ts +45 -0
- package/dist/framework/routing/next-router.d.ts.map +1 -0
- package/dist/framework/routing/next-router.js +378 -0
- package/dist/framework/routing/next-router.js.map +1 -0
- package/dist/framework/routing/route-tree.d.ts +73 -0
- package/dist/framework/routing/route-tree.d.ts.map +1 -0
- package/dist/framework/routing/route-tree.js +120 -0
- package/dist/framework/routing/route-tree.js.map +1 -0
- package/dist/framework/types.d.ts +230 -0
- package/dist/framework/types.d.ts.map +1 -0
- package/dist/framework/types.js +25 -0
- package/dist/framework/types.js.map +1 -0
- package/dist/graph/cross-language.d.ts +11 -0
- package/dist/graph/cross-language.d.ts.map +1 -0
- package/dist/graph/cross-language.js +123 -0
- package/dist/graph/cross-language.js.map +1 -0
- package/dist/graph/extract.d.ts +13 -0
- package/dist/graph/extract.d.ts.map +1 -0
- package/dist/graph/extract.js +79 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/file-graph.d.ts +186 -0
- package/dist/graph/file-graph.d.ts.map +1 -0
- package/dist/graph/file-graph.js +427 -0
- package/dist/graph/file-graph.js.map +1 -0
- package/dist/graph/http-callsites.d.ts +14 -0
- package/dist/graph/http-callsites.d.ts.map +1 -0
- package/dist/graph/http-callsites.js +107 -0
- package/dist/graph/http-callsites.js.map +1 -0
- package/dist/graph/incremental.d.ts +122 -0
- package/dist/graph/incremental.d.ts.map +1 -0
- package/dist/graph/incremental.js +448 -0
- package/dist/graph/incremental.js.map +1 -0
- package/dist/graph/language.d.ts +31 -0
- package/dist/graph/language.d.ts.map +1 -0
- package/dist/graph/language.js +146 -0
- package/dist/graph/language.js.map +1 -0
- package/dist/graph/noise-filter.d.ts +46 -0
- package/dist/graph/noise-filter.d.ts.map +1 -0
- package/dist/graph/noise-filter.js +199 -0
- package/dist/graph/noise-filter.js.map +1 -0
- package/dist/graph/python-adapter.d.ts +36 -0
- package/dist/graph/python-adapter.d.ts.map +1 -0
- package/dist/graph/python-adapter.js +402 -0
- package/dist/graph/python-adapter.js.map +1 -0
- package/dist/graph/python-manifest.d.ts +22 -0
- package/dist/graph/python-manifest.d.ts.map +1 -0
- package/dist/graph/python-manifest.js +137 -0
- package/dist/graph/python-manifest.js.map +1 -0
- package/dist/graph/python-stdlib.d.ts +2 -0
- package/dist/graph/python-stdlib.d.ts.map +1 -0
- package/dist/graph/python-stdlib.js +53 -0
- package/dist/graph/python-stdlib.js.map +1 -0
- package/dist/graph/ts-morph-adapter.d.ts +65 -0
- package/dist/graph/ts-morph-adapter.d.ts.map +1 -0
- package/dist/graph/ts-morph-adapter.js +265 -0
- package/dist/graph/ts-morph-adapter.js.map +1 -0
- package/dist/graph/types.d.ts +37 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +50 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/aws/aws-parse.d.ts +39 -0
- package/dist/infra/aws/aws-parse.d.ts.map +1 -0
- package/dist/infra/aws/aws-parse.js +149 -0
- package/dist/infra/aws/aws-parse.js.map +1 -0
- package/dist/infra/aws/aws.d.ts +6 -0
- package/dist/infra/aws/aws.d.ts.map +1 -0
- package/dist/infra/aws/aws.js +425 -0
- package/dist/infra/aws/aws.js.map +1 -0
- package/dist/infra/azure/azure-parse.d.ts +73 -0
- package/dist/infra/azure/azure-parse.d.ts.map +1 -0
- package/dist/infra/azure/azure-parse.js +178 -0
- package/dist/infra/azure/azure-parse.js.map +1 -0
- package/dist/infra/azure/azure.d.ts +12 -0
- package/dist/infra/azure/azure.d.ts.map +1 -0
- package/dist/infra/azure/azure.js +673 -0
- package/dist/infra/azure/azure.js.map +1 -0
- package/dist/infra/cloudflare/cloudflare.d.ts +50 -0
- package/dist/infra/cloudflare/cloudflare.d.ts.map +1 -0
- package/dist/infra/cloudflare/cloudflare.js +382 -0
- package/dist/infra/cloudflare/cloudflare.js.map +1 -0
- package/dist/infra/cloudflare/wrangler-parse.d.ts +6 -0
- package/dist/infra/cloudflare/wrangler-parse.d.ts.map +1 -0
- package/dist/infra/cloudflare/wrangler-parse.js +278 -0
- package/dist/infra/cloudflare/wrangler-parse.js.map +1 -0
- package/dist/infra/compose/compose-parse.d.ts +24 -0
- package/dist/infra/compose/compose-parse.d.ts.map +1 -0
- package/dist/infra/compose/compose-parse.js +77 -0
- package/dist/infra/compose/compose-parse.js.map +1 -0
- package/dist/infra/compose/compose.d.ts +12 -0
- package/dist/infra/compose/compose.d.ts.map +1 -0
- package/dist/infra/compose/compose.js +201 -0
- package/dist/infra/compose/compose.js.map +1 -0
- package/dist/infra/convex/convex-parse.d.ts +28 -0
- package/dist/infra/convex/convex-parse.d.ts.map +1 -0
- package/dist/infra/convex/convex-parse.js +74 -0
- package/dist/infra/convex/convex-parse.js.map +1 -0
- package/dist/infra/convex/convex.d.ts +18 -0
- package/dist/infra/convex/convex.d.ts.map +1 -0
- package/dist/infra/convex/convex.js +199 -0
- package/dist/infra/convex/convex.js.map +1 -0
- package/dist/infra/digitalocean/digitalocean.d.ts +33 -0
- package/dist/infra/digitalocean/digitalocean.d.ts.map +1 -0
- package/dist/infra/digitalocean/digitalocean.js +204 -0
- package/dist/infra/digitalocean/digitalocean.js.map +1 -0
- package/dist/infra/firebase/firebase.d.ts +43 -0
- package/dist/infra/firebase/firebase.d.ts.map +1 -0
- package/dist/infra/firebase/firebase.js +271 -0
- package/dist/infra/firebase/firebase.js.map +1 -0
- package/dist/infra/fly/fly-parse.d.ts +52 -0
- package/dist/infra/fly/fly-parse.d.ts.map +1 -0
- package/dist/infra/fly/fly-parse.js +114 -0
- package/dist/infra/fly/fly-parse.js.map +1 -0
- package/dist/infra/fly/fly.d.ts +15 -0
- package/dist/infra/fly/fly.d.ts.map +1 -0
- package/dist/infra/fly/fly.js +265 -0
- package/dist/infra/fly/fly.js.map +1 -0
- package/dist/infra/gcp/gcp-parse.d.ts +24 -0
- package/dist/infra/gcp/gcp-parse.d.ts.map +1 -0
- package/dist/infra/gcp/gcp-parse.js +123 -0
- package/dist/infra/gcp/gcp-parse.js.map +1 -0
- package/dist/infra/gcp/gcp.d.ts +10 -0
- package/dist/infra/gcp/gcp.d.ts.map +1 -0
- package/dist/infra/gcp/gcp.js +502 -0
- package/dist/infra/gcp/gcp.js.map +1 -0
- package/dist/infra/heroku/heroku-parse.d.ts +33 -0
- package/dist/infra/heroku/heroku-parse.d.ts.map +1 -0
- package/dist/infra/heroku/heroku-parse.js +63 -0
- package/dist/infra/heroku/heroku-parse.js.map +1 -0
- package/dist/infra/heroku/heroku.d.ts +24 -0
- package/dist/infra/heroku/heroku.d.ts.map +1 -0
- package/dist/infra/heroku/heroku.js +253 -0
- package/dist/infra/heroku/heroku.js.map +1 -0
- package/dist/infra/image-resolve.d.ts +56 -0
- package/dist/infra/image-resolve.d.ts.map +1 -0
- package/dist/infra/image-resolve.js +229 -0
- package/dist/infra/image-resolve.js.map +1 -0
- package/dist/infra/infra-step.d.ts +39 -0
- package/dist/infra/infra-step.d.ts.map +1 -0
- package/dist/infra/infra-step.js +57 -0
- package/dist/infra/infra-step.js.map +1 -0
- package/dist/infra/k8s/index.d.ts +78 -0
- package/dist/infra/k8s/index.d.ts.map +1 -0
- package/dist/infra/k8s/index.js +251 -0
- package/dist/infra/k8s/index.js.map +1 -0
- package/dist/infra/kamal/kamal-parse.d.ts +23 -0
- package/dist/infra/kamal/kamal-parse.d.ts.map +1 -0
- package/dist/infra/kamal/kamal-parse.js +66 -0
- package/dist/infra/kamal/kamal-parse.js.map +1 -0
- package/dist/infra/kamal/kamal.d.ts +17 -0
- package/dist/infra/kamal/kamal.d.ts.map +1 -0
- package/dist/infra/kamal/kamal.js +162 -0
- package/dist/infra/kamal/kamal.js.map +1 -0
- package/dist/infra/netlify/netlify.d.ts +33 -0
- package/dist/infra/netlify/netlify.d.ts.map +1 -0
- package/dist/infra/netlify/netlify.js +247 -0
- package/dist/infra/netlify/netlify.js.map +1 -0
- package/dist/infra/opentofu/opentofu.d.ts +3 -0
- package/dist/infra/opentofu/opentofu.d.ts.map +1 -0
- package/dist/infra/opentofu/opentofu.js +157 -0
- package/dist/infra/opentofu/opentofu.js.map +1 -0
- package/dist/infra/pulumi/pulumi-parse.d.ts +60 -0
- package/dist/infra/pulumi/pulumi-parse.d.ts.map +1 -0
- package/dist/infra/pulumi/pulumi-parse.js +155 -0
- package/dist/infra/pulumi/pulumi-parse.js.map +1 -0
- package/dist/infra/pulumi/pulumi.d.ts +23 -0
- package/dist/infra/pulumi/pulumi.d.ts.map +1 -0
- package/dist/infra/pulumi/pulumi.js +260 -0
- package/dist/infra/pulumi/pulumi.js.map +1 -0
- package/dist/infra/railway/railway-parse.d.ts +54 -0
- package/dist/infra/railway/railway-parse.d.ts.map +1 -0
- package/dist/infra/railway/railway-parse.js +200 -0
- package/dist/infra/railway/railway-parse.js.map +1 -0
- package/dist/infra/railway/railway.d.ts +19 -0
- package/dist/infra/railway/railway.d.ts.map +1 -0
- package/dist/infra/railway/railway.js +397 -0
- package/dist/infra/railway/railway.js.map +1 -0
- package/dist/infra/register.d.ts +2 -0
- package/dist/infra/register.d.ts.map +1 -0
- package/dist/infra/register.js +81 -0
- package/dist/infra/register.js.map +1 -0
- package/dist/infra/registry.d.ts +64 -0
- package/dist/infra/registry.d.ts.map +1 -0
- package/dist/infra/registry.js +205 -0
- package/dist/infra/registry.js.map +1 -0
- package/dist/infra/relevance.d.ts +16 -0
- package/dist/infra/relevance.d.ts.map +1 -0
- package/dist/infra/relevance.js +132 -0
- package/dist/infra/relevance.js.map +1 -0
- package/dist/infra/render/render-parse.d.ts +76 -0
- package/dist/infra/render/render-parse.d.ts.map +1 -0
- package/dist/infra/render/render-parse.js +155 -0
- package/dist/infra/render/render-parse.js.map +1 -0
- package/dist/infra/render/render.d.ts +11 -0
- package/dist/infra/render/render.d.ts.map +1 -0
- package/dist/infra/render/render.js +303 -0
- package/dist/infra/render/render.js.map +1 -0
- package/dist/infra/sst/sst-parse.d.ts +25 -0
- package/dist/infra/sst/sst-parse.d.ts.map +1 -0
- package/dist/infra/sst/sst-parse.js +45 -0
- package/dist/infra/sst/sst-parse.js.map +1 -0
- package/dist/infra/sst/sst.d.ts +19 -0
- package/dist/infra/sst/sst.d.ts.map +1 -0
- package/dist/infra/sst/sst.js +236 -0
- package/dist/infra/sst/sst.js.map +1 -0
- package/dist/infra/supabase/supabase-parse.d.ts +34 -0
- package/dist/infra/supabase/supabase-parse.d.ts.map +1 -0
- package/dist/infra/supabase/supabase-parse.js +113 -0
- package/dist/infra/supabase/supabase-parse.js.map +1 -0
- package/dist/infra/supabase/supabase.d.ts +15 -0
- package/dist/infra/supabase/supabase.d.ts.map +1 -0
- package/dist/infra/supabase/supabase.js +198 -0
- package/dist/infra/supabase/supabase.js.map +1 -0
- package/dist/infra/terraform/hcl-parse.d.ts +34 -0
- package/dist/infra/terraform/hcl-parse.d.ts.map +1 -0
- package/dist/infra/terraform/hcl-parse.js +203 -0
- package/dist/infra/terraform/hcl-parse.js.map +1 -0
- package/dist/infra/terraform/terraform.d.ts +14 -0
- package/dist/infra/terraform/terraform.d.ts.map +1 -0
- package/dist/infra/terraform/terraform.js +264 -0
- package/dist/infra/terraform/terraform.js.map +1 -0
- package/dist/infra/types.d.ts +151 -0
- package/dist/infra/types.d.ts.map +1 -0
- package/dist/infra/types.js +14 -0
- package/dist/infra/types.js.map +1 -0
- package/dist/infra/vercel/vercel-parse.d.ts +70 -0
- package/dist/infra/vercel/vercel-parse.d.ts.map +1 -0
- package/dist/infra/vercel/vercel-parse.js +194 -0
- package/dist/infra/vercel/vercel-parse.js.map +1 -0
- package/dist/infra/vercel/vercel.d.ts +30 -0
- package/dist/infra/vercel/vercel.d.ts.map +1 -0
- package/dist/infra/vercel/vercel.js +523 -0
- package/dist/infra/vercel/vercel.js.map +1 -0
- package/dist/infra/walk.d.ts +36 -0
- package/dist/infra/walk.d.ts.map +1 -0
- package/dist/infra/walk.js +85 -0
- package/dist/infra/walk.js.map +1 -0
- package/dist/safety.d.ts +13 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +67 -0
- package/dist/safety.js.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +111 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +35 -0
- package/dist/version.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
// (Slice A) — the GENERIC framework contribution-consumption step.
|
|
2
|
+
//
|
|
3
|
+
// The post-cluster sibling of scripts/ingest/infra/infra-step.ts. Where the
|
|
4
|
+
// detect-step ( Slice 1) only LOGS the detected-stack manifest, THIS step
|
|
5
|
+
// is what finally consumes it: for every detected adapter it runs the
|
|
6
|
+
// `syntheticEdges` + `roleTags` hooks and folds their contributions into the
|
|
7
|
+
// render graph. It is FRAMEWORK-AGNOSTIC — the RN adapter is the first client,
|
|
8
|
+
// and Next/Nest/Node/ORM reuse it unchanged.
|
|
9
|
+
//
|
|
10
|
+
// Founder decision (2026-06-26): render-only, POST-CLUSTER ("connect now, group
|
|
11
|
+
// later") — this runs AFTER clusterGraph + enrich, BEFORE assemble.
|
|
12
|
+
//
|
|
13
|
+
// What it does:
|
|
14
|
+
// * resolves each contribution's FILE-id endpoints → MODULE ids via the
|
|
15
|
+
// cluster's fileModuleMap (a screen file lands in its module);
|
|
16
|
+
// * DROPS self-edges (intra-module navigation collapses) + dedupes on
|
|
17
|
+
// (source, target, kind); validates every edge is one of the 8 verbs
|
|
18
|
+
// (parseEdgeKind — the same fail-loud boundary assemble + persist trust);
|
|
19
|
+
// * collapses role tags to ONE per module (highest RoleTag.priority, lexical
|
|
20
|
+
// tiebreak) — pure metadata; the module's `kind` is UNCHANGED (roles never
|
|
21
|
+
// widen the Module-kind enum);
|
|
22
|
+
// * consumes each adapter's `groupingPrior` (FrameworkGroup[]) and
|
|
23
|
+
// OVERRIDES the subsystem of every claimed module (see SUBSYSTEM OVERRIDE
|
|
24
|
+
// below). This is the only place that mutates `cluster`;
|
|
25
|
+
// * LOGS counts + everything unresolved/dropped — no silent caps.
|
|
26
|
+
//
|
|
27
|
+
// ── SUBSYSTEM OVERRIDE — the shared framework-grouping mechanism ──
|
|
28
|
+
// A framework's `groupingPrior` declares the AUTHORITATIVE grouping (a NestJS
|
|
29
|
+
// `@Module`, a Next route group): a named set of FILE ids that belong in ONE
|
|
30
|
+
// subsystem regardless of where they sit on disk. We resolve each group's files
|
|
31
|
+
// to MODULE ids and, for every claimed module, set its subsystem to the group.
|
|
32
|
+
//
|
|
33
|
+
// HOW (without touching assemble / cluster code): subsystems are computed inside
|
|
34
|
+
// assemble by computeSubsystems(cluster.modules), whose precedence is
|
|
35
|
+
// external > workspace-package (packageId) > directory.
|
|
36
|
+
// `packageId` is the EXISTING "a declared boundary beats directory
|
|
37
|
+
// clustering" lever, read ONLY by computeSubsystems. A framework group is exactly
|
|
38
|
+
// that shape, so we ride it: we MUTATE the claimed ClusteredModule in place —
|
|
39
|
+
// packageId = `<adapter>:<group.id>` (namespaced, deterministic, never an index),
|
|
40
|
+
// packageName = the group label, packageRole = cleared (a framework group is a
|
|
41
|
+
// domain boundary, not an app/lib/tooling package). assemble then renders the
|
|
42
|
+
// override naturally. This runs BEFORE assemble, so the rendered grouping — and
|
|
43
|
+
// the semantic-zoom subsystem super-nodes that aggregate by `Module.subsystem`
|
|
44
|
+
// — reflect it with no change to the zoom machinery.
|
|
45
|
+
//
|
|
46
|
+
// PRECEDENCE we implement: framework group > workspace-package > directory.
|
|
47
|
+
// (We overwrite packageId, so the group beats both an inherited workspace package
|
|
48
|
+
// AND the directory heuristic.) `external` / infra-namespaced modules are NEVER
|
|
49
|
+
// claimed (they have no source files in a group anyway, and we skip them
|
|
50
|
+
// defensively), so the `external` subsystem still wins — the partition stays total.
|
|
51
|
+
//
|
|
52
|
+
// A module claimed by more than one group goes to the group that claims the MOST
|
|
53
|
+
// of its files (lexical group-id tiebreak); the collision is LOGGED, never a
|
|
54
|
+
// silent pick. When no adapter supplies a group, this is a complete no-op — the
|
|
55
|
+
// cluster is untouched and assemble is byte-identical (the headline invariant).
|
|
56
|
+
//
|
|
57
|
+
// Detection runs INTERNALLY here (not reusing the once-per-clone detect-step log)
|
|
58
|
+
// so the manifest matches THIS tree: the hosted merge walk re-runs the step at
|
|
59
|
+
// each checkpoint's checked-out tree, and a repo may have adopted RN partway
|
|
60
|
+
// through its history. Cheap (file-exists + one package.json read per adapter).
|
|
61
|
+
//
|
|
62
|
+
// Degrade, don't abort (mirrors extractInfra's call-site discipline): a malformed
|
|
63
|
+
// adapter must never sink an otherwise-good snapshot — a throw anywhere degrades
|
|
64
|
+
// to the empty contribution + a warning, and the snapshot assembles without it.
|
|
65
|
+
import { ModuleId, parseEdgeKind } from '../types.js';
|
|
66
|
+
import { crossLanguageApiEdges } from '../graph/cross-language.js';
|
|
67
|
+
import { registerBuiltinFrameworkAdapters } from './register.js';
|
|
68
|
+
import { detectFrameworks, listFrameworkAdapters } from './registry.js';
|
|
69
|
+
const EMPTY = {
|
|
70
|
+
edges: [],
|
|
71
|
+
roles: new Map(),
|
|
72
|
+
subsystems: new Map(),
|
|
73
|
+
counts: {
|
|
74
|
+
adapters: 0,
|
|
75
|
+
rawEdges: 0,
|
|
76
|
+
edges: 0,
|
|
77
|
+
droppedSelf: 0,
|
|
78
|
+
droppedUnresolved: 0,
|
|
79
|
+
droppedBadKind: 0,
|
|
80
|
+
roles: 0,
|
|
81
|
+
groups: 0,
|
|
82
|
+
groupedModules: 0,
|
|
83
|
+
droppedGroupUnresolved: 0,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
export async function contributeFrameworkGraph(args) {
|
|
87
|
+
const { repoDir, graph, cluster } = args;
|
|
88
|
+
try {
|
|
89
|
+
registerBuiltinFrameworkAdapters();
|
|
90
|
+
const manifest = await detectFrameworks(repoDir);
|
|
91
|
+
// the cross-language full-stack seam (frontend→backend HTTP-API
|
|
92
|
+
// edges) is computed from the graph + a direct FastAPI-surface parse, NOT from
|
|
93
|
+
// the framework manifest, so it fires even when the FastAPI backend sits in a
|
|
94
|
+
// nested package the root detect didn't claim. Empty for a single-language repo
|
|
95
|
+
// (so single-language output stays byte-identical). File-id space; folded
|
|
96
|
+
// through the SAME resolve/dedup as the adapters' syntheticEdges below.
|
|
97
|
+
let xlangEdges = [];
|
|
98
|
+
try {
|
|
99
|
+
xlangEdges = crossLanguageApiEdges({ repoDir, graph });
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.warn(` ⚠ cross-language linking failed (${err.message}) — continuing without the full-stack seam`);
|
|
103
|
+
}
|
|
104
|
+
if (manifest.matches.length === 0 && xlangEdges.length === 0) {
|
|
105
|
+
// No framework detected AND no cross-language seam → generic behavior unchanged.
|
|
106
|
+
return EMPTY;
|
|
107
|
+
}
|
|
108
|
+
const adaptersByName = new Map(listFrameworkAdapters().map((a) => [a.name, a]));
|
|
109
|
+
const moduleIds = new Set(cluster.modules.map((m) => m.id));
|
|
110
|
+
const fileModuleMap = cluster.fileModuleMap;
|
|
111
|
+
// file id or module id → module id (or null when it resolves to nothing on
|
|
112
|
+
// the canvas — a dropped file, or an endpoint outside the cluster).
|
|
113
|
+
const resolve = (id) => {
|
|
114
|
+
if (moduleIds.has(id))
|
|
115
|
+
return id;
|
|
116
|
+
const viaFile = fileModuleMap[id];
|
|
117
|
+
if (viaFile && moduleIds.has(viaFile))
|
|
118
|
+
return viaFile;
|
|
119
|
+
return null;
|
|
120
|
+
};
|
|
121
|
+
const edgesByKey = new Map();
|
|
122
|
+
// moduleId → the highest-priority role seen + the distinct roles that landed
|
|
123
|
+
// on it (for the collapse log).
|
|
124
|
+
const roleByModule = new Map();
|
|
125
|
+
const distinctRolesByModule = new Map();
|
|
126
|
+
let rawEdges = 0;
|
|
127
|
+
let droppedSelf = 0;
|
|
128
|
+
let droppedUnresolved = 0;
|
|
129
|
+
let droppedBadKind = 0;
|
|
130
|
+
const unresolvedEndpoints = new Set();
|
|
131
|
+
// grouping priors collected across adapters, namespaced by adapter
|
|
132
|
+
// (`<adapter>:<group.id>`) so two adapters' groups never collide. Resolved +
|
|
133
|
+
// applied as a subsystem override AFTER the loop (see below).
|
|
134
|
+
const groupsByKey = new Map();
|
|
135
|
+
let rawGroups = 0;
|
|
136
|
+
let droppedGroupUnresolved = 0;
|
|
137
|
+
for (const match of manifest.matches) {
|
|
138
|
+
const adapter = adaptersByName.get(match.adapter);
|
|
139
|
+
if (!adapter)
|
|
140
|
+
continue;
|
|
141
|
+
const ctx = {
|
|
142
|
+
repoDir,
|
|
143
|
+
rootPath: match.rootPath,
|
|
144
|
+
match,
|
|
145
|
+
graph,
|
|
146
|
+
cluster: { fileModuleMap, moduleIds },
|
|
147
|
+
};
|
|
148
|
+
// --- syntheticEdges ---------------------------------------------------
|
|
149
|
+
if (adapter.syntheticEdges) {
|
|
150
|
+
let fwEdges = [];
|
|
151
|
+
try {
|
|
152
|
+
fwEdges = await adapter.syntheticEdges(ctx);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
console.warn(` ⚠ framework adapter '${match.adapter}' syntheticEdges failed (${err.message}) — skipping its edges`);
|
|
156
|
+
fwEdges = [];
|
|
157
|
+
}
|
|
158
|
+
for (const fe of fwEdges) {
|
|
159
|
+
rawEdges++;
|
|
160
|
+
const src = resolve(fe.source);
|
|
161
|
+
const tgt = resolve(fe.target);
|
|
162
|
+
if (!src || !tgt) {
|
|
163
|
+
droppedUnresolved++;
|
|
164
|
+
if (!src)
|
|
165
|
+
unresolvedEndpoints.add(fe.source);
|
|
166
|
+
if (!tgt)
|
|
167
|
+
unresolvedEndpoints.add(fe.target);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (src === tgt) {
|
|
171
|
+
// Intra-module contribution (e.g. navigation within one cluster)
|
|
172
|
+
// collapses to a self-edge — dropped at the producer, exactly as
|
|
173
|
+
// aggregateModuleEdges + the infra join do.
|
|
174
|
+
droppedSelf++;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
let kind;
|
|
178
|
+
try {
|
|
179
|
+
kind = parseEdgeKind(fe.kind);
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
// A non-8-verb framework edge is a producer bug; drop + log it
|
|
183
|
+
// rather than sink the snapshot (degrade-on-throw).
|
|
184
|
+
droppedBadKind++;
|
|
185
|
+
console.warn(` ⚠ framework adapter '${match.adapter}' emitted ${err.message}`);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const key = `${src}→${tgt}:${kind}`;
|
|
189
|
+
if (!edgesByKey.has(key)) {
|
|
190
|
+
edgesByKey.set(key, { source: ModuleId(src), target: ModuleId(tgt), kind });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// --- roleTags ---------------------------------------------------------
|
|
195
|
+
if (adapter.roleTags) {
|
|
196
|
+
let tags = new Map();
|
|
197
|
+
try {
|
|
198
|
+
tags = await adapter.roleTags(ctx);
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
console.warn(` ⚠ framework adapter '${match.adapter}' roleTags failed (${err.message}) — skipping its roles`);
|
|
202
|
+
tags = new Map();
|
|
203
|
+
}
|
|
204
|
+
for (const [endpoint, tag] of tags) {
|
|
205
|
+
const moduleId = resolve(endpoint);
|
|
206
|
+
if (!moduleId) {
|
|
207
|
+
unresolvedEndpoints.add(endpoint);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
let seen = distinctRolesByModule.get(moduleId);
|
|
211
|
+
if (!seen) {
|
|
212
|
+
seen = new Set();
|
|
213
|
+
distinctRolesByModule.set(moduleId, seen);
|
|
214
|
+
}
|
|
215
|
+
seen.add(tag.role);
|
|
216
|
+
const cur = roleByModule.get(moduleId);
|
|
217
|
+
if (cur === undefined || beats(tag, cur))
|
|
218
|
+
roleByModule.set(moduleId, tag);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// --- groupingPrior ------------------------------------------
|
|
222
|
+
// Collect now (in FILE-id space); resolve + apply as a subsystem override
|
|
223
|
+
// after the loop, so a group spanning several adapters'/modules' files is
|
|
224
|
+
// arbitrated globally. classificationsNeeded is deferred (not run here).
|
|
225
|
+
if (adapter.groupingPrior) {
|
|
226
|
+
let prior;
|
|
227
|
+
try {
|
|
228
|
+
prior = await adapter.groupingPrior(ctx);
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
console.warn(` ⚠ framework adapter '${match.adapter}' groupingPrior failed (${err.message}) — skipping its groups`);
|
|
232
|
+
prior = undefined;
|
|
233
|
+
}
|
|
234
|
+
for (const group of prior?.groups ?? []) {
|
|
235
|
+
rawGroups++;
|
|
236
|
+
// Namespace the id by adapter (the documented FrameworkGroup contract)
|
|
237
|
+
// so it's a unique, deterministic subsystem id across adapters.
|
|
238
|
+
const key = `${match.adapter}:${group.id}`;
|
|
239
|
+
const existing = groupsByKey.get(key);
|
|
240
|
+
if (existing)
|
|
241
|
+
existing.fileIds.push(...group.fileIds);
|
|
242
|
+
else
|
|
243
|
+
groupsByKey.set(key, { label: group.label, fileIds: [...group.fileIds] });
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// --- cross-language full-stack seam ----------------------------
|
|
248
|
+
// Fold the frontend→backend HTTP-API edges through the SAME file-id→module
|
|
249
|
+
// resolution + self-edge drop + 8-verb validation + dedup as the adapter
|
|
250
|
+
// syntheticEdges above (so a seam edge that duplicates a structural edge, or
|
|
251
|
+
// collapses to one module, is handled identically).
|
|
252
|
+
for (const fe of xlangEdges) {
|
|
253
|
+
rawEdges++;
|
|
254
|
+
const src = resolve(fe.source);
|
|
255
|
+
const tgt = resolve(fe.target);
|
|
256
|
+
if (!src || !tgt) {
|
|
257
|
+
droppedUnresolved++;
|
|
258
|
+
if (!src)
|
|
259
|
+
unresolvedEndpoints.add(fe.source);
|
|
260
|
+
if (!tgt)
|
|
261
|
+
unresolvedEndpoints.add(fe.target);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (src === tgt) {
|
|
265
|
+
droppedSelf++;
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
let kind;
|
|
269
|
+
try {
|
|
270
|
+
kind = parseEdgeKind(fe.kind);
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
droppedBadKind++;
|
|
274
|
+
console.warn(` ⚠ cross-language edge emitted ${err.message}`);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
const key = `${src}→${tgt}:${kind}`;
|
|
278
|
+
if (!edgesByKey.has(key)) {
|
|
279
|
+
edgesByKey.set(key, { source: ModuleId(src), target: ModuleId(tgt), kind });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (xlangEdges.length > 0) {
|
|
283
|
+
console.log(` [cross-language] ${xlangEdges.length} frontend→backend API edge(s) contributed`);
|
|
284
|
+
}
|
|
285
|
+
// --- apply the grouping override -------------------------------
|
|
286
|
+
// Resolve every group's FILE ids → MODULE ids, tally per-module group claims,
|
|
287
|
+
// assign each claimed module to the group claiming the MOST of its files
|
|
288
|
+
// (lexical group-key tiebreak), and MUTATE that ClusteredModule's packageId/
|
|
289
|
+
// packageName so assemble's computeSubsystems renders the framework grouping
|
|
290
|
+
// (precedence: framework group > workspace-package > directory). See the
|
|
291
|
+
// SUBSYSTEM OVERRIDE note at the top of this file.
|
|
292
|
+
const subsystems = new Map();
|
|
293
|
+
if (groupsByKey.size > 0) {
|
|
294
|
+
const moduleById = new Map(cluster.modules.map((m) => [m.id, m]));
|
|
295
|
+
// moduleId → groupKey → count of that group's files landing in the module.
|
|
296
|
+
const claims = new Map();
|
|
297
|
+
const labelByKey = new Map();
|
|
298
|
+
const unresolvedGroupFiles = new Set();
|
|
299
|
+
for (const [key, group] of groupsByKey) {
|
|
300
|
+
labelByKey.set(key, group.label);
|
|
301
|
+
for (const fileId of group.fileIds) {
|
|
302
|
+
const moduleId = resolve(fileId);
|
|
303
|
+
const mod = moduleId ? moduleById.get(moduleId) : undefined;
|
|
304
|
+
// Never claim an external / infra-namespaced module (it has no source
|
|
305
|
+
// dir → it belongs to the fixed `external` subsystem, which outranks).
|
|
306
|
+
if (!moduleId || !mod || mod.kind === 'external' || moduleId.includes(':')) {
|
|
307
|
+
droppedGroupUnresolved++;
|
|
308
|
+
unresolvedGroupFiles.add(fileId);
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
let byKey = claims.get(moduleId);
|
|
312
|
+
if (!byKey) {
|
|
313
|
+
byKey = new Map();
|
|
314
|
+
claims.set(moduleId, byKey);
|
|
315
|
+
}
|
|
316
|
+
byKey.set(key, (byKey.get(key) ?? 0) + 1);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Deterministic assignment + collision logging (no silent pick).
|
|
320
|
+
for (const moduleId of [...claims.keys()].sort()) {
|
|
321
|
+
const byKey = claims.get(moduleId);
|
|
322
|
+
let winner = '';
|
|
323
|
+
let winnerCount = -1;
|
|
324
|
+
for (const [key, count] of byKey) {
|
|
325
|
+
if (count > winnerCount || (count === winnerCount && key < winner)) {
|
|
326
|
+
winner = key;
|
|
327
|
+
winnerCount = count;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (byKey.size > 1) {
|
|
331
|
+
const all = [...byKey.entries()].map(([k, c]) => `${k}×${c}`).sort().join(', ');
|
|
332
|
+
console.log(` [framework] module '${moduleId}' claimed by ${byKey.size} groups {${all}} → kept '${winner}'`);
|
|
333
|
+
}
|
|
334
|
+
const mod = moduleById.get(moduleId);
|
|
335
|
+
const label = labelByKey.get(winner) ?? winner;
|
|
336
|
+
// The override: ride 's packageId lever (read ONLY by
|
|
337
|
+
// computeSubsystems). Clear packageRole — a framework group is a domain
|
|
338
|
+
// boundary, not an app/lib/tooling package.
|
|
339
|
+
mod.packageId = winner;
|
|
340
|
+
mod.packageName = label;
|
|
341
|
+
mod.packageRole = undefined;
|
|
342
|
+
subsystems.set(moduleId, { id: winner, label });
|
|
343
|
+
}
|
|
344
|
+
// No silent caps: log group files that didn't resolve to a claimable
|
|
345
|
+
// module (mirrors the unresolved-endpoints log on the edges path).
|
|
346
|
+
if (unresolvedGroupFiles.size > 0) {
|
|
347
|
+
const sample = [...unresolvedGroupFiles].sort().slice(0, 10);
|
|
348
|
+
console.log(` [framework] ${unresolvedGroupFiles.size} group file(s) didn't resolve to a claimable module (not regrouped): ${sample.join(', ')}` +
|
|
349
|
+
(unresolvedGroupFiles.size > sample.length ? ' …' : ''));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// No silent caps: log unresolved endpoints + per-module role collapses.
|
|
353
|
+
if (unresolvedEndpoints.size > 0) {
|
|
354
|
+
const sample = [...unresolvedEndpoints].sort().slice(0, 10);
|
|
355
|
+
console.log(` [framework] ${unresolvedEndpoints.size} endpoint(s) didn't resolve to a module (dropped): ${sample.join(', ')}` +
|
|
356
|
+
(unresolvedEndpoints.size > sample.length ? ' …' : ''));
|
|
357
|
+
}
|
|
358
|
+
for (const [moduleId, set] of distinctRolesByModule) {
|
|
359
|
+
if (set.size > 1) {
|
|
360
|
+
const winner = roleByModule.get(moduleId)?.role;
|
|
361
|
+
console.log(` [framework] module '${moduleId}' had ${set.size} roles {${[...set].sort().join(', ')}} → kept '${winner}'`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
const edges = [...edgesByKey.values()];
|
|
365
|
+
console.log(`→ framework contributions: ${edges.length} edge(s)` +
|
|
366
|
+
(droppedSelf ? ` · ${droppedSelf} self-edge(s) collapsed` : '') +
|
|
367
|
+
(droppedUnresolved ? ` · ${droppedUnresolved} unresolved` : '') +
|
|
368
|
+
(droppedBadKind ? ` · ${droppedBadKind} bad-kind` : '') +
|
|
369
|
+
` · ${roleByModule.size} role(s)` +
|
|
370
|
+
(subsystems.size ? ` · ${subsystems.size} module(s) regrouped into ${new Set([...subsystems.values()].map((s) => s.id)).size} subsystem(s)` : ''));
|
|
371
|
+
return {
|
|
372
|
+
edges,
|
|
373
|
+
roles: roleByModule,
|
|
374
|
+
subsystems,
|
|
375
|
+
counts: {
|
|
376
|
+
adapters: manifest.matches.length,
|
|
377
|
+
rawEdges,
|
|
378
|
+
edges: edges.length,
|
|
379
|
+
droppedSelf,
|
|
380
|
+
droppedUnresolved,
|
|
381
|
+
droppedBadKind,
|
|
382
|
+
roles: roleByModule.size,
|
|
383
|
+
groups: rawGroups,
|
|
384
|
+
groupedModules: subsystems.size,
|
|
385
|
+
droppedGroupUnresolved,
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
console.warn(` ⚠ framework contribution failed (${err.message}) — continuing without framework edges/roles`);
|
|
391
|
+
return EMPTY;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Higher RoleTag.priority wins; lexical role tiebreak keeps it deterministic
|
|
395
|
+
// regardless of adapter/iteration order.
|
|
396
|
+
function beats(incoming, incumbent) {
|
|
397
|
+
const a = incoming.priority ?? 0;
|
|
398
|
+
const b = incumbent.priority ?? 0;
|
|
399
|
+
if (a !== b)
|
|
400
|
+
return a > b;
|
|
401
|
+
return incoming.role < incumbent.role;
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=contribute-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contribute-step.js","sourceRoot":"","sources":["../../src/framework/contribute-step.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FrameworkManifest } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Register the builtin framework adapters, detect the repo's stack, log the
|
|
4
|
+
* manifest, and return it. Cheap + deterministic; safe to call once per ingest
|
|
5
|
+
* before extraction.
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectFrameworkStack(repoDir: string): Promise<FrameworkManifest>;
|
|
8
|
+
//# sourceMappingURL=detect-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-step.d.ts","sourceRoot":"","sources":["../../src/framework/detect-step.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkBtF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// the framework-detection pipeline step.
|
|
2
|
+
//
|
|
3
|
+
// Mirrors scripts/ingest/infra/infra-step.ts (registerBuiltins → run): a single
|
|
4
|
+
// entry point both the local CLI (cli.ts) and the hosted container (container.ts)
|
|
5
|
+
// call IDENTICALLY, so the two twins stay mirrored. It registers the builtin
|
|
6
|
+
// adapters, runs the cheap detection gate, LOGS the detected-stack manifest, and
|
|
7
|
+
// returns it.
|
|
8
|
+
//
|
|
9
|
+
// SLICE 1: nothing downstream consumes the manifest yet — this step only logs.
|
|
10
|
+
// Generic-TS behavior is byte-for-byte unchanged when the manifest is empty (the
|
|
11
|
+
// detection is read-only: package.json reads + config-file existence checks, no
|
|
12
|
+
// mutation, no effect on the assembled snapshot). Adapters consume the manifest
|
|
13
|
+
// starting in .
|
|
14
|
+
import { registerBuiltinFrameworkAdapters } from './register.js';
|
|
15
|
+
import { detectFrameworks } from './registry.js';
|
|
16
|
+
/**
|
|
17
|
+
* Register the builtin framework adapters, detect the repo's stack, log the
|
|
18
|
+
* manifest, and return it. Cheap + deterministic; safe to call once per ingest
|
|
19
|
+
* before extraction.
|
|
20
|
+
*/
|
|
21
|
+
export async function detectFrameworkStack(repoDir) {
|
|
22
|
+
// Degrade, don't abort (mirrors extractInfra's call-site discipline in cli.ts /
|
|
23
|
+
// container.ts): framework detection is purely ADDITIVE + log-only this slice,
|
|
24
|
+
// so a throwing adapter must never sink an otherwise-good ingest. RN's detect()
|
|
25
|
+
// can't throw today (all fs reads are guarded), but the contract invites more
|
|
26
|
+
// adapters — catch here, once, so BOTH call sites inherit the guarantee and stay
|
|
27
|
+
// identical, and fall through to the empty-manifest generic-TS path on failure.
|
|
28
|
+
try {
|
|
29
|
+
registerBuiltinFrameworkAdapters();
|
|
30
|
+
const manifest = await detectFrameworks(repoDir);
|
|
31
|
+
logManifest(manifest);
|
|
32
|
+
return manifest;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.warn(` ⚠ framework detection failed (${err.message}) — continuing without a framework manifest`);
|
|
36
|
+
return { root: repoDir, matches: [] };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// No silent caps ( constraint 7): log exactly what's detected (or the
|
|
40
|
+
// empty fallthrough), with each adapter's variant, root, and confidence.
|
|
41
|
+
function logManifest(manifest) {
|
|
42
|
+
if (manifest.matches.length === 0) {
|
|
43
|
+
console.log('→ framework detection: none — generic TS fallthrough');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const summary = manifest.matches
|
|
47
|
+
.map((m) => {
|
|
48
|
+
const variant = typeof m.metadata?.variant === 'string' ? ` (${m.metadata.variant})` : '';
|
|
49
|
+
return `${m.adapter}${variant} @ ${m.rootPath || '.'} · conf ${m.confidence.toFixed(2)}`;
|
|
50
|
+
})
|
|
51
|
+
.join(', ');
|
|
52
|
+
console.log(`→ framework detection: ${manifest.matches.length} stack(s) — ${summary}`);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=detect-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-step.js","sourceRoot":"","sources":["../../src/framework/detect-step.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,gFAAgF;AAChF,kFAAkF;AAClF,6EAA6E;AAC7E,iFAAiF;AACjF,cAAc;AACd,EAAE;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,gBAAgB;AAEhB,OAAO,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACxD,gFAAgF;IAChF,+EAA+E;IAC/E,gFAAgF;IAChF,8EAA8E;IAC9E,iFAAiF;IACjF,gFAAgF;IAChF,IAAI,CAAC;QACH,gCAAgC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACjD,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,mCAAoC,GAAa,CAAC,OAAO,6CAA6C,CACvG,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxC,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,yEAAyE;AACzE,SAAS,WAAW,CAAC,QAA2B;IAC9C,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,OAAO,MAAM,CAAC,CAAC,QAAQ,IAAI,GAAG,WAAW,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,CAAC,OAAO,CAAC,MAAM,eAAe,OAAO,EAAE,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FrameworkDetectContext } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The merged dependency map from a package.json (`dependencies` +
|
|
4
|
+
* `devDependencies`); `{}` on any read/parse error. Deterministic — no source,
|
|
5
|
+
* no install, just the manifest.
|
|
6
|
+
*/
|
|
7
|
+
export declare function readDeps(baseDir: string): Record<string, string>;
|
|
8
|
+
/** True if any of `names` exists as a file/dir directly under `baseDir`. */
|
|
9
|
+
export declare function existsAny(baseDir: string, names: readonly string[]): boolean;
|
|
10
|
+
/** True if `rel` is an existing directory under `baseDir`. */
|
|
11
|
+
export declare function isDir(baseDir: string, rel: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the base dir + repo-relative posix rootPath a detect pass should scan.
|
|
14
|
+
* Mirrors the RN adapter: a workspace `packageDir` (the per-package fan-out shape,
|
|
15
|
+
* ) scopes the scan + reports its repo-relative path; absent ⇒ the repo
|
|
16
|
+
* root (`''`). Path is posix-normalized so manifests are stable cross-platform.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveBase(ctx: FrameworkDetectContext): {
|
|
19
|
+
base: string;
|
|
20
|
+
rootPath: string;
|
|
21
|
+
};
|
|
22
|
+
/** Clamp a raw confidence sum into the [0,1] DetectMatch range, 2-dp stable. */
|
|
23
|
+
export declare function clampConfidence(raw: number): number;
|
|
24
|
+
//# sourceMappingURL=detect-util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-util.d.ts","sourceRoot":"","sources":["../../src/framework/detect-util.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUhE;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE5E;AAED,8DAA8D;AAC9D,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAM3D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,sBAAsB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAQ3F;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// (Slice 2) — shared detection helpers for the manifest+config-existence
|
|
2
|
+
// adapters (Next / Nest / Node / ORM).
|
|
3
|
+
//
|
|
4
|
+
// Every Slice-2 adapter keeps the SAME pure-builder / fs-adapter split the React
|
|
5
|
+
// Native adapter established: a thin fs layer (gather*Signals) reads package.json
|
|
6
|
+
// deps + config-file EXISTENCE only — never source content (never-store-source) —
|
|
7
|
+
// and a PURE scorer (score*) turns the deterministic signal set into a DetectMatch
|
|
8
|
+
// (or null = no match = generic-TS fallthrough). These helpers are the bits the
|
|
9
|
+
// four adapters would otherwise duplicate verbatim, factored once. (The RN adapter
|
|
10
|
+
// predates this and inlines its own copies — intentionally left untouched.)
|
|
11
|
+
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
12
|
+
import { join, relative } from 'node:path';
|
|
13
|
+
/**
|
|
14
|
+
* The merged dependency map from a package.json (`dependencies` +
|
|
15
|
+
* `devDependencies`); `{}` on any read/parse error. Deterministic — no source,
|
|
16
|
+
* no install, just the manifest.
|
|
17
|
+
*/
|
|
18
|
+
export function readDeps(baseDir) {
|
|
19
|
+
try {
|
|
20
|
+
const pkg = JSON.parse(readFileSync(join(baseDir, 'package.json'), 'utf8'));
|
|
21
|
+
return { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** True if any of `names` exists as a file/dir directly under `baseDir`. */
|
|
28
|
+
export function existsAny(baseDir, names) {
|
|
29
|
+
return names.some((n) => existsSync(join(baseDir, n)));
|
|
30
|
+
}
|
|
31
|
+
/** True if `rel` is an existing directory under `baseDir`. */
|
|
32
|
+
export function isDir(baseDir, rel) {
|
|
33
|
+
try {
|
|
34
|
+
return statSync(join(baseDir, rel)).isDirectory();
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve the base dir + repo-relative posix rootPath a detect pass should scan.
|
|
42
|
+
* Mirrors the RN adapter: a workspace `packageDir` (the per-package fan-out shape,
|
|
43
|
+
* ) scopes the scan + reports its repo-relative path; absent ⇒ the repo
|
|
44
|
+
* root (`''`). Path is posix-normalized so manifests are stable cross-platform.
|
|
45
|
+
*/
|
|
46
|
+
export function resolveBase(ctx) {
|
|
47
|
+
if (ctx.packageDir) {
|
|
48
|
+
return {
|
|
49
|
+
base: ctx.packageDir,
|
|
50
|
+
rootPath: relative(ctx.repoDir, ctx.packageDir).split('\\').join('/'),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return { base: ctx.repoDir, rootPath: '' };
|
|
54
|
+
}
|
|
55
|
+
/** Clamp a raw confidence sum into the [0,1] DetectMatch range, 2-dp stable. */
|
|
56
|
+
export function clampConfidence(raw) {
|
|
57
|
+
return Math.min(1, Math.max(0, Number(raw.toFixed(2))));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=detect-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-util.js","sourceRoot":"","sources":["../../src/framework/detect-util.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,uCAAuC;AACvC,EAAE;AACF,iFAAiF;AACjF,kFAAkF;AAClF,kFAAkF;AAClF,mFAAmF;AACnF,gFAAgF;AAChF,mFAAmF;AACnF,4EAA4E;AAE5E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG3C;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAGzE,CAAC;QACF,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,KAAwB;IACjE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,GAAW;IAChD,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,GAA2B;IACrD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,UAAU;YACpB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACtE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC7C,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DetectMatch, FrameworkAdapter } from '../types.js';
|
|
2
|
+
/** The deterministic Django signal set (dependency names + file existence). */
|
|
3
|
+
export interface DjangoSignals {
|
|
4
|
+
hasDjango: boolean;
|
|
5
|
+
hasDrf: boolean;
|
|
6
|
+
hasNinja: boolean;
|
|
7
|
+
hasManagePy: boolean;
|
|
8
|
+
hasSettings: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Gather the signal set for a single root dir (reads manifests + file existence). */
|
|
11
|
+
export declare function gatherDjangoSignals(baseDir: string): DjangoSignals;
|
|
12
|
+
/**
|
|
13
|
+
* Decide Django from the signal set. `django` (dep) is the authoritative signal;
|
|
14
|
+
* absent it, a `manage.py` + a settings module is Django-unique enough to claim at
|
|
15
|
+
* lower confidence. DRF / Ninja only ride in metadata (they enable their passes,
|
|
16
|
+
* they don't decide the stack). Returns null → generic-Python fallthrough,
|
|
17
|
+
* byte-for-byte unchanged.
|
|
18
|
+
*/
|
|
19
|
+
export declare function scoreDjango(s: DjangoSignals, rootPath?: string): DetectMatch | null;
|
|
20
|
+
export type DjangoRole = 'view' | 'command' | 'model' | 'app-config';
|
|
21
|
+
export declare const djangoAdapter: FrameworkAdapter;
|
|
22
|
+
//# sourceMappingURL=django.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"django.d.ts","sourceRoot":"","sources":["../../../src/framework/django/django.ts"],"names":[],"mappings":"AAsEA,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAOjB,MAAM,aAAa,CAAC;AAMrB,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAoFD,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CASlE;AA6BD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,SAAK,GAAG,WAAW,GAAG,IAAI,CA6B/E;AAQD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC;AA+uBrE,eAAO,MAAM,aAAa,EAAE,gBA8C3B,CAAC"}
|