docorbit 0.1.0 → 0.1.2
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/README.md +29 -15
- package/bin/docorbit.js +2 -2
- package/dist/apps/cli/src/commands/add.d.ts +7 -0
- package/dist/apps/cli/src/commands/add.js +35 -0
- package/dist/apps/cli/src/commands/api.d.ts +2 -0
- package/dist/apps/cli/src/commands/api.js +35 -0
- package/dist/apps/cli/src/commands/context.d.ts +10 -0
- package/dist/apps/cli/src/commands/context.js +36 -0
- package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
- package/dist/apps/cli/src/commands/dashboard.js +43 -0
- package/dist/apps/cli/src/commands/diff.d.ts +2 -0
- package/dist/apps/cli/src/commands/diff.js +29 -0
- package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
- package/dist/apps/cli/src/commands/evaluate.js +101 -0
- package/dist/apps/cli/src/commands/examples.d.ts +2 -0
- package/dist/apps/cli/src/commands/examples.js +36 -0
- package/dist/apps/cli/src/commands/export.d.ts +11 -0
- package/dist/apps/cli/src/commands/export.js +72 -0
- package/dist/apps/cli/src/commands/impact.d.ts +2 -0
- package/dist/apps/cli/src/commands/impact.js +30 -0
- package/dist/apps/cli/src/commands/init.d.ts +5 -0
- package/dist/apps/cli/src/commands/init.js +52 -0
- package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
- package/dist/apps/cli/src/commands/inspect.js +24 -0
- package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
- package/dist/apps/cli/src/commands/mcp.js +49 -0
- package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
- package/dist/apps/cli/src/commands/pitfalls.js +35 -0
- package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
- package/dist/apps/cli/src/commands/recipes.js +33 -0
- package/dist/apps/cli/src/commands/search.d.ts +11 -0
- package/dist/apps/cli/src/commands/search.js +36 -0
- package/dist/apps/cli/src/commands/update.d.ts +6 -0
- package/dist/apps/cli/src/commands/update.js +53 -0
- package/dist/apps/cli/src/commands/verify.d.ts +2 -0
- package/dist/apps/cli/src/commands/verify.js +44 -0
- package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
- package/dist/apps/cli/src/formatters/colors.js +22 -0
- package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
- package/dist/apps/cli/src/formatters/inspection.js +88 -0
- package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
- package/dist/apps/cli/src/formatters/knowledge.js +229 -0
- package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
- package/dist/apps/cli/src/formatters/retrieval.js +61 -0
- package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
- package/dist/apps/cli/src/formatters/terminal.js +5 -0
- package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
- package/dist/apps/cli/src/formatters/verification.js +102 -0
- package/dist/apps/cli/src/index.d.ts +1 -0
- package/dist/apps/cli/src/index.js +376 -0
- package/dist/packages/core/src/dashboard/server.d.ts +33 -0
- package/dist/packages/core/src/dashboard/server.js +267 -0
- package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
- package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
- package/dist/packages/core/src/implementation-service.d.ts +73 -0
- package/dist/packages/core/src/implementation-service.js +325 -0
- package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
- package/dist/packages/core/src/index.js +6 -0
- package/dist/packages/core/src/inspector.d.ts +22 -0
- package/dist/packages/core/src/inspector.js +38 -0
- package/dist/packages/core/src/pipeline.d.ts +45 -0
- package/dist/packages/core/src/pipeline.js +246 -0
- package/dist/packages/crawler/src/config.d.ts +2 -0
- package/dist/packages/crawler/src/config.js +10 -0
- package/dist/packages/crawler/src/fetcher.d.ts +31 -0
- package/dist/packages/crawler/src/fetcher.js +139 -0
- package/dist/packages/crawler/src/index.js +2 -0
- package/dist/packages/discovery/src/index.d.ts +11 -0
- package/dist/packages/discovery/src/index.js +29 -0
- package/dist/packages/discovery/src/provider.d.ts +12 -0
- package/dist/packages/discovery/src/provider.js +30 -0
- package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
- package/dist/packages/discovery/src/providers/generic.js +94 -0
- package/dist/packages/discovery/src/providers/github.d.ts +7 -0
- package/dist/packages/discovery/src/providers/github.js +52 -0
- package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
- package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
- package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
- package/dist/packages/discovery/src/providers/markdown.js +38 -0
- package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
- package/dist/packages/discovery/src/providers/openapi.js +77 -0
- package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
- package/dist/packages/discovery/src/providers/sitemap.js +53 -0
- package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
- package/dist/packages/discovery/src/providers/skill.js +46 -0
- package/dist/packages/discovery/src/ranker.d.ts +6 -0
- package/dist/packages/discovery/src/ranker.js +107 -0
- package/dist/packages/evaluation/src/dataset.d.ts +2 -0
- package/dist/packages/evaluation/src/dataset.js +944 -0
- package/dist/packages/evaluation/src/index.js +8 -0
- package/dist/packages/evaluation/src/runner.d.ts +7 -0
- package/dist/packages/evaluation/src/runner.js +196 -0
- package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
- package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
- package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
- package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
- package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
- package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
- package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
- package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
- package/dist/packages/evaluation/src/types.d.ts +15 -0
- package/dist/packages/evaluation/src/types.js +1 -0
- package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
- package/dist/packages/evaluation/src/version-matcher.js +61 -0
- package/dist/packages/export/src/agents-md.d.ts +19 -0
- package/dist/packages/export/src/agents-md.js +170 -0
- package/dist/packages/export/src/claude-md.d.ts +17 -0
- package/dist/packages/export/src/claude-md.js +118 -0
- package/dist/packages/export/src/docs-map.d.ts +14 -0
- package/dist/packages/export/src/docs-map.js +118 -0
- package/dist/packages/export/src/index.js +6 -0
- package/dist/packages/export/src/llms-txt.d.ts +15 -0
- package/dist/packages/export/src/llms-txt.js +73 -0
- package/dist/packages/export/src/service.d.ts +23 -0
- package/dist/packages/export/src/service.js +210 -0
- package/dist/packages/export/src/skill-md.d.ts +14 -0
- package/dist/packages/export/src/skill-md.js +107 -0
- package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
- package/dist/packages/mcp/src/index.js +6 -0
- package/dist/packages/mcp/src/resources/index.d.ts +12 -0
- package/dist/packages/mcp/src/resources/index.js +165 -0
- package/dist/packages/mcp/src/server.d.ts +30 -0
- package/dist/packages/mcp/src/server.js +243 -0
- package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
- package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
- package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
- package/dist/packages/mcp/src/tools/check-api.js +74 -0
- package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
- package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
- package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
- package/dist/packages/mcp/src/tools/export-context.js +61 -0
- package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
- package/dist/packages/mcp/src/tools/find-api.js +91 -0
- package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
- package/dist/packages/mcp/src/tools/find-example.js +92 -0
- package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
- package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
- package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
- package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
- package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
- package/dist/packages/mcp/src/tools/get-doc.js +118 -0
- package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
- package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
- package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
- package/dist/packages/mcp/src/tools/get-version.js +104 -0
- package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
- package/dist/packages/mcp/src/tools/implementation-context.js +102 -0
- package/dist/packages/mcp/src/tools/index.d.ts +19 -0
- package/dist/packages/mcp/src/tools/index.js +41 -0
- package/dist/packages/mcp/src/tools/ingest-doc.d.ts +6 -0
- package/dist/packages/mcp/src/tools/ingest-doc.js +264 -0
- package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
- package/dist/packages/mcp/src/tools/list-sources.js +76 -0
- package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
- package/dist/packages/mcp/src/tools/search-docs.js +113 -0
- package/dist/packages/mcp/src/tools/types.d.ts +22 -0
- package/dist/packages/mcp/src/tools/types.js +1 -0
- package/dist/packages/mcp/src/transports/http.d.ts +31 -0
- package/dist/packages/mcp/src/transports/http.js +215 -0
- package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
- package/dist/packages/mcp/src/transports/stdio.js +86 -0
- package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
- package/dist/packages/mcp/src/transports/types.js +1 -0
- package/dist/packages/mcp/src/types.d.ts +89 -0
- package/dist/packages/mcp/src/types.js +7 -0
- package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
- package/dist/packages/normalizer/src/example-indexer.js +200 -0
- package/dist/packages/normalizer/src/html.d.ts +13 -0
- package/dist/packages/normalizer/src/html.js +221 -0
- package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
- package/dist/packages/normalizer/src/index.js +7 -0
- package/dist/packages/normalizer/src/llms.d.ts +3 -0
- package/dist/packages/normalizer/src/llms.js +71 -0
- package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
- package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
- package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
- package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
- package/dist/packages/normalizer/src/openapi.js +2 -0
- package/dist/packages/normalizer/src/page.d.ts +13 -0
- package/dist/packages/normalizer/src/page.js +150 -0
- package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
- package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
- package/dist/packages/normalizer/src/slicer.d.ts +30 -0
- package/dist/packages/normalizer/src/slicer.js +360 -0
- package/dist/packages/retrieval/src/engine.d.ts +17 -0
- package/dist/packages/retrieval/src/engine.js +93 -0
- package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
- package/dist/packages/retrieval/src/index.js +6 -0
- package/dist/packages/retrieval/src/intent.d.ts +6 -0
- package/dist/packages/retrieval/src/intent.js +39 -0
- package/dist/packages/retrieval/src/packer.d.ts +2 -0
- package/dist/packages/retrieval/src/packer.js +108 -0
- package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
- package/dist/packages/retrieval/src/recipe-engine.js +265 -0
- package/dist/packages/retrieval/src/scorer.d.ts +13 -0
- package/dist/packages/retrieval/src/scorer.js +110 -0
- package/dist/packages/retrieval/src/weights.d.ts +3 -0
- package/dist/packages/retrieval/src/weights.js +28 -0
- package/dist/packages/security/src/annotations.d.ts +10 -0
- package/dist/packages/security/src/annotations.js +100 -0
- package/dist/packages/security/src/index.js +2 -0
- package/dist/packages/security/src/ssrf.d.ts +17 -0
- package/dist/packages/security/src/ssrf.js +132 -0
- package/dist/packages/shared/src/errors.d.ts +22 -0
- package/dist/packages/shared/src/errors.js +44 -0
- package/dist/packages/shared/src/hashing.d.ts +3 -0
- package/dist/packages/shared/src/hashing.js +21 -0
- package/dist/packages/shared/src/index.js +3 -0
- package/dist/packages/shared/src/types.d.ts +715 -0
- package/dist/packages/shared/src/types.js +1 -0
- package/dist/packages/storage/src/db.d.ts +11 -0
- package/dist/packages/storage/src/db.js +128 -0
- package/dist/packages/storage/src/index.js +10 -0
- package/dist/packages/storage/src/interfaces.d.ts +83 -0
- package/dist/packages/storage/src/interfaces.js +1 -0
- package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
- package/dist/packages/storage/src/repositories/api-repository.js +169 -0
- package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
- package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
- package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
- package/dist/packages/storage/src/repositories/example-repository.js +158 -0
- package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
- package/dist/packages/storage/src/repositories/page-repository.js +161 -0
- package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
- package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
- package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
- package/dist/packages/storage/src/repositories/source-repository.js +153 -0
- package/dist/packages/storage/src/repository.d.ts +92 -0
- package/dist/packages/storage/src/repository.js +157 -0
- package/dist/packages/storage/src/schema.d.ts +2 -0
- package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
- package/dist/packages/storage/src/search-tokens.d.ts +6 -0
- package/dist/packages/storage/src/search-tokens.js +26 -0
- package/dist/packages/verification/src/diff-engine.d.ts +18 -0
- package/dist/packages/verification/src/diff-engine.js +218 -0
- package/dist/packages/verification/src/extractor.d.ts +29 -0
- package/dist/packages/verification/src/extractor.js +302 -0
- package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
- package/dist/packages/verification/src/impact-scanner.js +181 -0
- package/dist/packages/verification/src/index.js +5 -0
- package/dist/packages/verification/src/services.d.ts +55 -0
- package/dist/packages/verification/src/services.js +189 -0
- package/dist/packages/verification/src/verifier.d.ts +15 -0
- package/dist/packages/verification/src/verifier.js +315 -0
- package/dist/packages/workspace/src/detector.d.ts +7 -0
- package/dist/packages/workspace/src/detector.js +117 -0
- package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
- package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
- package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
- package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/go.js +49 -0
- package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
- package/dist/packages/workspace/src/ecosystems/index.js +21 -0
- package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
- package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
- package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
- package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
- package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
- package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
- package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
- package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
- package/dist/packages/workspace/src/ecosystems/types.js +1 -0
- package/dist/packages/workspace/src/index.js +5 -0
- package/dist/packages/workspace/src/lockfile.d.ts +21 -0
- package/dist/packages/workspace/src/lockfile.js +153 -0
- package/dist/packages/workspace/src/resolver.d.ts +39 -0
- package/dist/packages/workspace/src/resolver.js +164 -0
- package/dist/packages/workspace/src/semver.d.ts +33 -0
- package/dist/packages/workspace/src/semver.js +235 -0
- package/package.json +13 -9
- package/apps/cli/bin/docorbit.js +0 -8
- package/apps/cli/src/commands/add.ts +0 -44
- package/apps/cli/src/commands/api.ts +0 -38
- package/apps/cli/src/commands/context.ts +0 -47
- package/apps/cli/src/commands/dashboard.ts +0 -55
- package/apps/cli/src/commands/diff.ts +0 -30
- package/apps/cli/src/commands/evaluate.ts +0 -133
- package/apps/cli/src/commands/examples.ts +0 -39
- package/apps/cli/src/commands/export.ts +0 -89
- package/apps/cli/src/commands/impact.ts +0 -31
- package/apps/cli/src/commands/init.ts +0 -69
- package/apps/cli/src/commands/inspect.ts +0 -30
- package/apps/cli/src/commands/mcp.ts +0 -72
- package/apps/cli/src/commands/pitfalls.ts +0 -38
- package/apps/cli/src/commands/recipes.ts +0 -35
- package/apps/cli/src/commands/search.ts +0 -48
- package/apps/cli/src/commands/update.ts +0 -73
- package/apps/cli/src/commands/verify.ts +0 -48
- package/apps/cli/src/formatters/colors.ts +0 -23
- package/apps/cli/src/formatters/inspection.ts +0 -102
- package/apps/cli/src/formatters/knowledge.ts +0 -272
- package/apps/cli/src/formatters/retrieval.ts +0 -74
- package/apps/cli/src/formatters/verification.ts +0 -126
- package/apps/cli/src/index.ts +0 -409
- package/packages/core/src/dashboard/server.ts +0 -314
- package/packages/core/src/implementation-service.ts +0 -451
- package/packages/core/src/inspector.ts +0 -71
- package/packages/core/src/pipeline.ts +0 -331
- package/packages/crawler/src/config.ts +0 -12
- package/packages/crawler/src/fetcher.ts +0 -185
- package/packages/discovery/src/index.ts +0 -31
- package/packages/discovery/src/provider.ts +0 -47
- package/packages/discovery/src/providers/generic.ts +0 -98
- package/packages/discovery/src/providers/github.ts +0 -61
- package/packages/discovery/src/providers/llms-txt.ts +0 -73
- package/packages/discovery/src/providers/markdown.ts +0 -48
- package/packages/discovery/src/providers/openapi.ts +0 -91
- package/packages/discovery/src/providers/sitemap.ts +0 -62
- package/packages/discovery/src/providers/skill.ts +0 -54
- package/packages/discovery/src/ranker.ts +0 -123
- package/packages/evaluation/src/dataset.ts +0 -963
- package/packages/evaluation/src/runner.ts +0 -241
- package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
- package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
- package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
- package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
- package/packages/evaluation/src/types.ts +0 -34
- package/packages/evaluation/src/version-matcher.ts +0 -73
- package/packages/export/src/agents-md.ts +0 -200
- package/packages/export/src/claude-md.ts +0 -141
- package/packages/export/src/docs-map.ts +0 -150
- package/packages/export/src/llms-txt.ts +0 -96
- package/packages/export/src/service.ts +0 -250
- package/packages/export/src/skill-md.ts +0 -128
- package/packages/mcp/src/resources/index.ts +0 -189
- package/packages/mcp/src/server.ts +0 -278
- package/packages/mcp/src/tools/analyze-impact.ts +0 -74
- package/packages/mcp/src/tools/check-api.ts +0 -86
- package/packages/mcp/src/tools/diff-docs.ts +0 -68
- package/packages/mcp/src/tools/export-context.ts +0 -73
- package/packages/mcp/src/tools/find-api.ts +0 -99
- package/packages/mcp/src/tools/find-example.ts +0 -100
- package/packages/mcp/src/tools/find-pitfall.ts +0 -94
- package/packages/mcp/src/tools/find-recipe.ts +0 -98
- package/packages/mcp/src/tools/get-doc.ts +0 -130
- package/packages/mcp/src/tools/get-docs-map.ts +0 -64
- package/packages/mcp/src/tools/get-version.ts +0 -118
- package/packages/mcp/src/tools/implementation-context.ts +0 -88
- package/packages/mcp/src/tools/index.ts +0 -59
- package/packages/mcp/src/tools/list-sources.ts +0 -85
- package/packages/mcp/src/tools/search-docs.ts +0 -123
- package/packages/mcp/src/tools/types.ts +0 -28
- package/packages/mcp/src/transports/http.ts +0 -256
- package/packages/mcp/src/transports/stdio.ts +0 -105
- package/packages/mcp/src/types.ts +0 -102
- package/packages/normalizer/src/example-indexer.ts +0 -240
- package/packages/normalizer/src/html.ts +0 -253
- package/packages/normalizer/src/llms.ts +0 -83
- package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
- package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
- package/packages/normalizer/src/page.ts +0 -184
- package/packages/normalizer/src/pitfall-extractor.ts +0 -190
- package/packages/normalizer/src/slicer.ts +0 -455
- package/packages/retrieval/src/engine.ts +0 -120
- package/packages/retrieval/src/intent.ts +0 -43
- package/packages/retrieval/src/packer.ts +0 -145
- package/packages/retrieval/src/recipe-engine.ts +0 -313
- package/packages/retrieval/src/scorer.ts +0 -139
- package/packages/retrieval/src/weights.ts +0 -31
- package/packages/security/src/annotations.ts +0 -112
- package/packages/security/src/ssrf.ts +0 -153
- package/packages/shared/src/errors.ts +0 -53
- package/packages/shared/src/hashing.ts +0 -23
- package/packages/shared/src/types.ts +0 -881
- package/packages/storage/src/db.ts +0 -72
- package/packages/storage/src/interfaces.ts +0 -115
- package/packages/storage/src/repositories/api-repository.ts +0 -219
- package/packages/storage/src/repositories/chunk-repository.ts +0 -316
- package/packages/storage/src/repositories/example-repository.ts +0 -206
- package/packages/storage/src/repositories/page-repository.ts +0 -205
- package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
- package/packages/storage/src/repositories/source-repository.ts +0 -205
- package/packages/storage/src/repository.ts +0 -256
- package/packages/storage/src/search-tokens.ts +0 -28
- package/packages/verification/src/diff-engine.ts +0 -258
- package/packages/verification/src/extractor.ts +0 -339
- package/packages/verification/src/impact-scanner.ts +0 -203
- package/packages/verification/src/services.ts +0 -238
- package/packages/verification/src/verifier.ts +0 -375
- package/packages/workspace/src/detector.ts +0 -143
- package/packages/workspace/src/ecosystems/cargo.ts +0 -84
- package/packages/workspace/src/ecosystems/composer.ts +0 -42
- package/packages/workspace/src/ecosystems/go.ts +0 -54
- package/packages/workspace/src/ecosystems/maven.ts +0 -34
- package/packages/workspace/src/ecosystems/npm.ts +0 -83
- package/packages/workspace/src/ecosystems/pub.ts +0 -40
- package/packages/workspace/src/ecosystems/pypi.ts +0 -100
- package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
- package/packages/workspace/src/ecosystems/types.ts +0 -18
- package/packages/workspace/src/lockfile.ts +0 -194
- package/packages/workspace/src/resolver.ts +0 -234
- package/packages/workspace/src/semver.ts +0 -259
- /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
- /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
- /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
- /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
- /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
- /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
- /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
- /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
- /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NpmStrategy } from "./npm.js";
|
|
2
|
+
import { CargoStrategy } from "./cargo.js";
|
|
3
|
+
import { GoStrategy } from "./go.js";
|
|
4
|
+
import { PyPiStrategy } from "./pypi.js";
|
|
5
|
+
import { ComposerStrategy } from "./composer.js";
|
|
6
|
+
import { RubyGemsStrategy } from "./rubygems.js";
|
|
7
|
+
import { PubStrategy } from "./pub.js";
|
|
8
|
+
import { MavenStrategy } from "./maven.js";
|
|
9
|
+
export { NpmStrategy, CargoStrategy, GoStrategy, PyPiStrategy, ComposerStrategy, RubyGemsStrategy, PubStrategy, MavenStrategy, };
|
|
10
|
+
export function getDefaultStrategies() {
|
|
11
|
+
return [
|
|
12
|
+
new NpmStrategy(),
|
|
13
|
+
new CargoStrategy(),
|
|
14
|
+
new GoStrategy(),
|
|
15
|
+
new PyPiStrategy(),
|
|
16
|
+
new ComposerStrategy(),
|
|
17
|
+
new RubyGemsStrategy(),
|
|
18
|
+
new PubStrategy(),
|
|
19
|
+
new MavenStrategy(),
|
|
20
|
+
];
|
|
21
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProjectDependency } from '../../../shared/src/index.ts';
|
|
2
|
+
import type { EcosystemStrategy } from './types.ts';
|
|
3
|
+
export declare class MavenStrategy implements EcosystemStrategy {
|
|
4
|
+
readonly ecosystem = "maven";
|
|
5
|
+
readonly manifestNames: string[];
|
|
6
|
+
parseManifest(_fileName: string, content: string, relPath: string, packageDir: string): ProjectDependency[];
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class MavenStrategy {
|
|
2
|
+
ecosystem = 'maven';
|
|
3
|
+
manifestNames = ['pom.xml'];
|
|
4
|
+
parseManifest(_fileName, content, relPath, packageDir) {
|
|
5
|
+
const deps = [];
|
|
6
|
+
const depRegex = /<dependency>([\s\S]*?)<\/dependency>/g;
|
|
7
|
+
let match;
|
|
8
|
+
while ((match = depRegex.exec(content)) !== null) {
|
|
9
|
+
const block = match[1];
|
|
10
|
+
const groupMatch = block.match(/<groupId>([^<]+)<\/groupId>/);
|
|
11
|
+
const artifactMatch = block.match(/<artifactId>([^<]+)<\/artifactId>/);
|
|
12
|
+
const verMatch = block.match(/<version>([^<]+)<\/version>/);
|
|
13
|
+
if (artifactMatch) {
|
|
14
|
+
const name = groupMatch ? `${groupMatch[1]}:${artifactMatch[1]}` : artifactMatch[1];
|
|
15
|
+
deps.push({
|
|
16
|
+
name,
|
|
17
|
+
ecosystem: 'maven',
|
|
18
|
+
requestedVersion: verMatch ? verMatch[1].trim() : '*',
|
|
19
|
+
resolvedVersion: verMatch ? verMatch[1].trim() : undefined,
|
|
20
|
+
sourceFile: relPath,
|
|
21
|
+
packagePath: packageDir,
|
|
22
|
+
isDev: block.includes('<scope>test</scope>'),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return deps;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProjectDependency } from '../../../shared/src/index.ts';
|
|
2
|
+
import type { EcosystemStrategy } from './types.ts';
|
|
3
|
+
export declare class NpmStrategy implements EcosystemStrategy {
|
|
4
|
+
readonly ecosystem = "npm";
|
|
5
|
+
readonly manifestNames: string[];
|
|
6
|
+
readonly lockfileNames: string[];
|
|
7
|
+
parseManifest(_fileName: string, content: string, relPath: string, packageDir: string): ProjectDependency[];
|
|
8
|
+
parseLockfile(_fileName: string, content: string): Map<string, string>;
|
|
9
|
+
resolveVersions(deps: ProjectDependency[], pkgDir: string, lockfileCache: Map<string, Map<string, string>>): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
export class NpmStrategy {
|
|
3
|
+
ecosystem = 'npm';
|
|
4
|
+
manifestNames = ['package.json'];
|
|
5
|
+
lockfileNames = ['package-lock.json'];
|
|
6
|
+
parseManifest(_fileName, content, relPath, packageDir) {
|
|
7
|
+
const deps = [];
|
|
8
|
+
try {
|
|
9
|
+
const pkg = JSON.parse(content);
|
|
10
|
+
const addSection = (section, isDev) => {
|
|
11
|
+
if (!section)
|
|
12
|
+
return;
|
|
13
|
+
for (const [name, version] of Object.entries(section)) {
|
|
14
|
+
deps.push({
|
|
15
|
+
name,
|
|
16
|
+
ecosystem: 'npm',
|
|
17
|
+
requestedVersion: String(version),
|
|
18
|
+
sourceFile: relPath,
|
|
19
|
+
packagePath: packageDir,
|
|
20
|
+
isDev,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
addSection(pkg.dependencies, false);
|
|
25
|
+
addSection(pkg.devDependencies, true);
|
|
26
|
+
addSection(pkg.peerDependencies, false);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Malformed JSON
|
|
30
|
+
}
|
|
31
|
+
return deps;
|
|
32
|
+
}
|
|
33
|
+
parseLockfile(_fileName, content) {
|
|
34
|
+
const resolved = new Map();
|
|
35
|
+
try {
|
|
36
|
+
const lock = JSON.parse(content);
|
|
37
|
+
// npm v2/v3 lockfile format
|
|
38
|
+
if (lock.packages && typeof lock.packages === 'object') {
|
|
39
|
+
for (const [key, val] of Object.entries(lock.packages)) {
|
|
40
|
+
if (val && typeof val === 'object' && val.version) {
|
|
41
|
+
const pkgName = key.replace(/^node_modules\//, '');
|
|
42
|
+
if (pkgName && !pkgName.includes('node_modules')) {
|
|
43
|
+
resolved.set(pkgName, String(val.version));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// npm v1 lockfile format fallback
|
|
49
|
+
if (lock.dependencies && typeof lock.dependencies === 'object') {
|
|
50
|
+
for (const [name, val] of Object.entries(lock.dependencies)) {
|
|
51
|
+
if (val && typeof val === 'object' && val.version) {
|
|
52
|
+
resolved.set(name, String(val.version));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Malformed lockfile
|
|
59
|
+
}
|
|
60
|
+
return resolved;
|
|
61
|
+
}
|
|
62
|
+
resolveVersions(deps, pkgDir, lockfileCache) {
|
|
63
|
+
const lockMap = lockfileCache.get('package-lock.json') ||
|
|
64
|
+
lockfileCache.get(join(pkgDir, 'package-lock.json'));
|
|
65
|
+
if (lockMap) {
|
|
66
|
+
for (const dep of deps) {
|
|
67
|
+
const resolved = lockMap.get(dep.name);
|
|
68
|
+
if (resolved)
|
|
69
|
+
dep.resolvedVersion = resolved;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProjectDependency } from '../../../shared/src/index.ts';
|
|
2
|
+
import type { EcosystemStrategy } from './types.ts';
|
|
3
|
+
export declare class PubStrategy implements EcosystemStrategy {
|
|
4
|
+
readonly ecosystem = "pub";
|
|
5
|
+
readonly manifestNames: string[];
|
|
6
|
+
parseManifest(_fileName: string, content: string, relPath: string, packageDir: string): ProjectDependency[];
|
|
7
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class PubStrategy {
|
|
2
|
+
ecosystem = 'pub';
|
|
3
|
+
manifestNames = ['pubspec.yaml'];
|
|
4
|
+
parseManifest(_fileName, content, relPath, packageDir) {
|
|
5
|
+
const deps = [];
|
|
6
|
+
const lines = content.split('\n');
|
|
7
|
+
let inDependencies = false;
|
|
8
|
+
for (const line of lines) {
|
|
9
|
+
const trimmed = line.trim();
|
|
10
|
+
if (trimmed === 'dependencies:' || trimmed === 'dev_dependencies:') {
|
|
11
|
+
inDependencies = true;
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
if (inDependencies && /^[a-zA-Z0-9_]+:/.test(line) && !line.startsWith(' ')) {
|
|
15
|
+
inDependencies = false;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (inDependencies && trimmed && !trimmed.startsWith('#')) {
|
|
19
|
+
const match = trimmed.match(/^([a-zA-Z0-9_]+)\s*:\s*(.+)$/);
|
|
20
|
+
if (match && match[1] !== 'sdk' && match[1] !== 'flutter') {
|
|
21
|
+
deps.push({
|
|
22
|
+
name: match[1],
|
|
23
|
+
ecosystem: 'pub',
|
|
24
|
+
requestedVersion: match[2]?.trim() || '*',
|
|
25
|
+
sourceFile: relPath,
|
|
26
|
+
packagePath: packageDir,
|
|
27
|
+
isDev: false,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return deps;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ProjectDependency } from '../../../shared/src/index.ts';
|
|
2
|
+
import type { EcosystemStrategy } from './types.ts';
|
|
3
|
+
export declare class PyPiStrategy implements EcosystemStrategy {
|
|
4
|
+
readonly ecosystem = "pypi";
|
|
5
|
+
readonly manifestNames: string[];
|
|
6
|
+
parseManifest(fileName: string, content: string, relPath: string, packageDir: string): ProjectDependency[];
|
|
7
|
+
private parseRequirementsTxt;
|
|
8
|
+
private parsePyprojectToml;
|
|
9
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export class PyPiStrategy {
|
|
2
|
+
ecosystem = 'pypi';
|
|
3
|
+
manifestNames = ['requirements.txt', 'pyproject.toml'];
|
|
4
|
+
parseManifest(fileName, content, relPath, packageDir) {
|
|
5
|
+
const lower = fileName.toLowerCase();
|
|
6
|
+
if (lower === 'requirements.txt') {
|
|
7
|
+
return this.parseRequirementsTxt(content, relPath, packageDir);
|
|
8
|
+
}
|
|
9
|
+
if (lower === 'pyproject.toml') {
|
|
10
|
+
return this.parsePyprojectToml(content, relPath, packageDir);
|
|
11
|
+
}
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
parseRequirementsTxt(content, relPath, packageDir) {
|
|
15
|
+
const deps = [];
|
|
16
|
+
const lines = content.split('\n');
|
|
17
|
+
for (const line of lines) {
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-'))
|
|
20
|
+
continue;
|
|
21
|
+
// Match name and version specifier (e.g. requests==2.31.0, flask>=3.0.0, numpy)
|
|
22
|
+
const match = trimmed.match(/^([a-zA-Z0-9_.-]+)\s*([=><~^!].*)?$/);
|
|
23
|
+
if (match) {
|
|
24
|
+
const name = match[1];
|
|
25
|
+
const spec = match[2]?.trim() || '*';
|
|
26
|
+
const exactMatch = spec.match(/^==\s*([a-zA-Z0-9_.-]+)$/);
|
|
27
|
+
deps.push({
|
|
28
|
+
name,
|
|
29
|
+
ecosystem: 'pypi',
|
|
30
|
+
requestedVersion: spec,
|
|
31
|
+
resolvedVersion: exactMatch ? exactMatch[1] : undefined,
|
|
32
|
+
sourceFile: relPath,
|
|
33
|
+
packagePath: packageDir,
|
|
34
|
+
isDev: false,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return deps;
|
|
39
|
+
}
|
|
40
|
+
parsePyprojectToml(content, relPath, packageDir) {
|
|
41
|
+
const deps = [];
|
|
42
|
+
const lines = content.split('\n');
|
|
43
|
+
let inDependencies = false;
|
|
44
|
+
for (const line of lines) {
|
|
45
|
+
const trimmed = line.trim();
|
|
46
|
+
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
|
|
47
|
+
const sec = trimmed.slice(1, -1).trim();
|
|
48
|
+
inDependencies =
|
|
49
|
+
sec === 'project.dependencies' ||
|
|
50
|
+
sec === 'tool.poetry.dependencies' ||
|
|
51
|
+
sec === 'project.optional-dependencies';
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (inDependencies && trimmed && !trimmed.startsWith('#')) {
|
|
55
|
+
// Poetry format: name = "^1.2.3" or name = { version = "1.2.3" }
|
|
56
|
+
const eqIdx = trimmed.indexOf('=');
|
|
57
|
+
if (eqIdx !== -1) {
|
|
58
|
+
const name = trimmed.slice(0, eqIdx).trim();
|
|
59
|
+
if (name.toLowerCase() === 'python')
|
|
60
|
+
continue;
|
|
61
|
+
const val = trimmed.slice(eqIdx + 1).trim();
|
|
62
|
+
let ver = '*';
|
|
63
|
+
const vMatch = val.match(/"([^"]+)"/);
|
|
64
|
+
if (vMatch)
|
|
65
|
+
ver = vMatch[1];
|
|
66
|
+
deps.push({
|
|
67
|
+
name,
|
|
68
|
+
ecosystem: 'pypi',
|
|
69
|
+
requestedVersion: ver,
|
|
70
|
+
sourceFile: relPath,
|
|
71
|
+
packagePath: packageDir,
|
|
72
|
+
isDev: false,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else if (trimmed.startsWith('"') || trimmed.startsWith("'")) {
|
|
76
|
+
// Standard PEP 621: "requests>=2.28.0",
|
|
77
|
+
const clean = trimmed.replace(/^[",']|[",']$/g, '');
|
|
78
|
+
const match = clean.match(/^([a-zA-Z0-9_.-]+)\s*([=><~^!].*)?$/);
|
|
79
|
+
if (match) {
|
|
80
|
+
deps.push({
|
|
81
|
+
name: match[1],
|
|
82
|
+
ecosystem: 'pypi',
|
|
83
|
+
requestedVersion: match[2]?.trim() || '*',
|
|
84
|
+
sourceFile: relPath,
|
|
85
|
+
packagePath: packageDir,
|
|
86
|
+
isDev: false,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return deps;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProjectDependency } from '../../../shared/src/index.ts';
|
|
2
|
+
import type { EcosystemStrategy } from './types.ts';
|
|
3
|
+
export declare class RubyGemsStrategy implements EcosystemStrategy {
|
|
4
|
+
readonly ecosystem = "rubygems";
|
|
5
|
+
readonly manifestNames: string[];
|
|
6
|
+
parseManifest(_fileName: string, content: string, relPath: string, packageDir: string): ProjectDependency[];
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class RubyGemsStrategy {
|
|
2
|
+
ecosystem = 'rubygems';
|
|
3
|
+
manifestNames = ['gemfile'];
|
|
4
|
+
parseManifest(_fileName, content, relPath, packageDir) {
|
|
5
|
+
const deps = [];
|
|
6
|
+
const lines = content.split('\n');
|
|
7
|
+
for (const line of lines) {
|
|
8
|
+
const trimmed = line.trim();
|
|
9
|
+
if (trimmed.startsWith('gem ') || trimmed.startsWith("gem\t")) {
|
|
10
|
+
const match = trimmed.match(/^gem\s+['"]([^'"]+)['"](?:\s*,\s*['"]([^'"]+)['"])?/);
|
|
11
|
+
if (match) {
|
|
12
|
+
deps.push({
|
|
13
|
+
name: match[1],
|
|
14
|
+
ecosystem: 'rubygems',
|
|
15
|
+
requestedVersion: match[2] || '*',
|
|
16
|
+
sourceFile: relPath,
|
|
17
|
+
packagePath: packageDir,
|
|
18
|
+
isDev: false,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return deps;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Ecosystem, ProjectDependency } from '../../../shared/src/index.ts';
|
|
2
|
+
export interface EcosystemStrategy {
|
|
3
|
+
readonly ecosystem: Ecosystem;
|
|
4
|
+
readonly manifestNames: string[];
|
|
5
|
+
readonly lockfileNames?: string[];
|
|
6
|
+
parseManifest(fileName: string, content: string, relPath: string, packageDir: string): ProjectDependency[];
|
|
7
|
+
parseLockfile?(fileName: string, content: string): Map<string, string>;
|
|
8
|
+
resolveVersions?(deps: ProjectDependency[], pkgDir: string, lockfileCache: Map<string, Map<string, string>>): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DocsLock, WorkspaceScanResult } from '../../shared/src/index.ts';
|
|
2
|
+
import type { DocOrbitRepository } from '../../storage/src/index.ts';
|
|
3
|
+
export declare const DOCS_LOCK_FILENAME = "docs.lock";
|
|
4
|
+
/**
|
|
5
|
+
* Reads and parses docs.lock from a project directory if present.
|
|
6
|
+
*/
|
|
7
|
+
export declare function readDocsLock(projectDir: string): DocsLock | null;
|
|
8
|
+
/**
|
|
9
|
+
* Deterministically writes a docs.lock file to project directory.
|
|
10
|
+
* Sorts dependency keys alphabetically and uses 2-space indentation.
|
|
11
|
+
*/
|
|
12
|
+
export declare function writeDocsLock(projectDir: string, lock: DocsLock): void;
|
|
13
|
+
/**
|
|
14
|
+
* Generates a DocsLock manifest from workspace scan result and repository state.
|
|
15
|
+
* Preserves timestamps for unchanged documentation snapshots to prevent lockfile churn.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateDocsLock(scanResult: WorkspaceScanResult, repo: DocOrbitRepository, existingLock?: DocsLock | null): DocsLock;
|
|
18
|
+
/**
|
|
19
|
+
* Selectively or globally updates docs.lock for a project.
|
|
20
|
+
*/
|
|
21
|
+
export declare function updateDocsLock(scanResult: WorkspaceScanResult, repo: DocOrbitRepository, existingLock: DocsLock, specificDependency?: string): DocsLock;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { resolveDocVersion } from "./semver.js";
|
|
4
|
+
export const DOCS_LOCK_FILENAME = 'docs.lock';
|
|
5
|
+
/**
|
|
6
|
+
* Reads and parses docs.lock from a project directory if present.
|
|
7
|
+
*/
|
|
8
|
+
export function readDocsLock(projectDir) {
|
|
9
|
+
const filePath = join(projectDir, DOCS_LOCK_FILENAME);
|
|
10
|
+
if (!existsSync(filePath))
|
|
11
|
+
return null;
|
|
12
|
+
try {
|
|
13
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
14
|
+
const parsed = JSON.parse(raw);
|
|
15
|
+
if (parsed && parsed.version === 1 && typeof parsed.dependencies === 'object') {
|
|
16
|
+
return parsed;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Malformed lockfile
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Deterministically writes a docs.lock file to project directory.
|
|
26
|
+
* Sorts dependency keys alphabetically and uses 2-space indentation.
|
|
27
|
+
*/
|
|
28
|
+
export function writeDocsLock(projectDir, lock) {
|
|
29
|
+
const filePath = join(projectDir, DOCS_LOCK_FILENAME);
|
|
30
|
+
// Sort dependency keys alphabetically
|
|
31
|
+
const sortedDeps = {};
|
|
32
|
+
for (const key of Object.keys(lock.dependencies).sort()) {
|
|
33
|
+
sortedDeps[key] = lock.dependencies[key];
|
|
34
|
+
}
|
|
35
|
+
const deterministicLock = {
|
|
36
|
+
version: 1,
|
|
37
|
+
workspaceRoot: lock.workspaceRoot,
|
|
38
|
+
dependencies: sortedDeps,
|
|
39
|
+
};
|
|
40
|
+
const serialized = JSON.stringify(deterministicLock, null, 2) + '\n';
|
|
41
|
+
writeFileSync(filePath, serialized, 'utf-8');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Helper to match a project dependency to an ingested source in the repository.
|
|
45
|
+
*/
|
|
46
|
+
function findMatchingSource(dep, repo) {
|
|
47
|
+
const sources = repo.listSources();
|
|
48
|
+
const depClean = dep.name.toLowerCase().replace(/^@[^/]+\//, ''); // e.g. @stripe/stripe-js -> stripe-js
|
|
49
|
+
for (const src of sources) {
|
|
50
|
+
const srcUrl = src.url.toLowerCase();
|
|
51
|
+
// Direct match: URL or metadata contains dependency name
|
|
52
|
+
if (srcUrl.includes(depClean) ||
|
|
53
|
+
srcUrl.includes(dep.name.toLowerCase()) ||
|
|
54
|
+
(src.metadata && String(src.metadata.name || '').toLowerCase() === depClean)) {
|
|
55
|
+
return src;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Generates a DocsLock manifest from workspace scan result and repository state.
|
|
62
|
+
* Preserves timestamps for unchanged documentation snapshots to prevent lockfile churn.
|
|
63
|
+
*/
|
|
64
|
+
export function generateDocsLock(scanResult, repo, existingLock) {
|
|
65
|
+
const lockedDeps = {};
|
|
66
|
+
const allSnapshots = repo.listSnapshots();
|
|
67
|
+
// Detect duplicate package names across monorepo packages
|
|
68
|
+
const nameCounts = new Map();
|
|
69
|
+
for (const dep of scanResult.dependencies) {
|
|
70
|
+
nameCounts.set(dep.name, (nameCounts.get(dep.name) || 0) + 1);
|
|
71
|
+
}
|
|
72
|
+
for (const dep of scanResult.dependencies) {
|
|
73
|
+
// Monorepo key disambiguation
|
|
74
|
+
const isMulti = (nameCounts.get(dep.name) || 0) > 1;
|
|
75
|
+
const depKey = isMulti && dep.packagePath && dep.packagePath !== '.'
|
|
76
|
+
? `${dep.packagePath}:${dep.name}`
|
|
77
|
+
: dep.name;
|
|
78
|
+
// Check if we have documentation for this dependency
|
|
79
|
+
const matchingSource = findMatchingSource(dep, repo);
|
|
80
|
+
if (!matchingSource)
|
|
81
|
+
continue;
|
|
82
|
+
// Find snapshots for matching source
|
|
83
|
+
const sourceSnapshots = allSnapshots.filter(s => s.sourceId === matchingSource.id);
|
|
84
|
+
if (sourceSnapshots.length === 0)
|
|
85
|
+
continue;
|
|
86
|
+
// Gather available versions from snapshots
|
|
87
|
+
const versionToSnapshot = new Map();
|
|
88
|
+
for (const snap of sourceSnapshots) {
|
|
89
|
+
const v = snap.docVersion || 'latest';
|
|
90
|
+
if (!versionToSnapshot.has(v)) {
|
|
91
|
+
versionToSnapshot.set(v, snap);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const availableVersions = Array.from(versionToSnapshot.keys());
|
|
95
|
+
const projectVersion = dep.resolvedVersion || dep.requestedVersion;
|
|
96
|
+
const resolution = resolveDocVersion(projectVersion, availableVersions, dep.name);
|
|
97
|
+
const selectedSnapshot = versionToSnapshot.get(resolution.selectedDocVersion) || sourceSnapshots[0];
|
|
98
|
+
const snapshotHash = selectedSnapshot.snapshotHash;
|
|
99
|
+
// Deterministic timestamp preservation:
|
|
100
|
+
// If existingLock already has this dependency with identical snapshotHash and resolvedVersion, keep the timestamp
|
|
101
|
+
const existing = existingLock?.dependencies[depKey];
|
|
102
|
+
const isUnchanged = existing &&
|
|
103
|
+
existing.snapshotHash === snapshotHash &&
|
|
104
|
+
existing.resolvedDependencyVersion === (dep.resolvedVersion || dep.requestedVersion) &&
|
|
105
|
+
existing.docVersion === resolution.selectedDocVersion;
|
|
106
|
+
const retrievedAt = isUnchanged ? existing.retrievedAt : new Date().toISOString();
|
|
107
|
+
lockedDeps[depKey] = {
|
|
108
|
+
name: dep.name,
|
|
109
|
+
ecosystem: dep.ecosystem,
|
|
110
|
+
requestedVersion: dep.requestedVersion,
|
|
111
|
+
resolvedDependencyVersion: dep.resolvedVersion || dep.requestedVersion,
|
|
112
|
+
sourceFile: dep.sourceFile,
|
|
113
|
+
docSourceUrl: matchingSource.url,
|
|
114
|
+
docVersion: resolution.selectedDocVersion,
|
|
115
|
+
matchType: resolution.matchType,
|
|
116
|
+
confidence: resolution.confidence,
|
|
117
|
+
snapshotId: selectedSnapshot.id,
|
|
118
|
+
snapshotHash,
|
|
119
|
+
retrievedAt,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
version: 1,
|
|
124
|
+
workspaceRoot: scanResult.workspaceRoot,
|
|
125
|
+
dependencies: lockedDeps,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Selectively or globally updates docs.lock for a project.
|
|
130
|
+
*/
|
|
131
|
+
export function updateDocsLock(scanResult, repo, existingLock, specificDependency) {
|
|
132
|
+
if (!specificDependency) {
|
|
133
|
+
// Full update: regenerate with existing lock as baseline for unchanged items
|
|
134
|
+
return generateDocsLock(scanResult, repo, existingLock);
|
|
135
|
+
}
|
|
136
|
+
// Selective update: only force refresh of specific dependency
|
|
137
|
+
const updated = generateDocsLock(scanResult, repo, existingLock);
|
|
138
|
+
const resultDeps = { ...existingLock.dependencies };
|
|
139
|
+
for (const [key, doc] of Object.entries(updated.dependencies)) {
|
|
140
|
+
if (doc.name === specificDependency || key === specificDependency) {
|
|
141
|
+
// Force new timestamp for the target dependency being updated
|
|
142
|
+
resultDeps[key] = {
|
|
143
|
+
...doc,
|
|
144
|
+
retrievedAt: new Date().toISOString(),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
version: 1,
|
|
150
|
+
workspaceRoot: scanResult.workspaceRoot,
|
|
151
|
+
dependencies: resultDeps,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { DocsLock, ProjectDependency, WorkspaceScanResult, VersionResolutionResult } from '../../shared/src/index.ts';
|
|
2
|
+
import type { DocOrbitRepository } from '../../storage/src/index.ts';
|
|
3
|
+
export interface ResolvedProjectContext {
|
|
4
|
+
projectDir: string;
|
|
5
|
+
hasLockfile: boolean;
|
|
6
|
+
matchedDependency?: {
|
|
7
|
+
name: string;
|
|
8
|
+
projectVersion: string;
|
|
9
|
+
targetDocVersion: string;
|
|
10
|
+
targetSnapshotId?: string;
|
|
11
|
+
confidence: number;
|
|
12
|
+
matchType: string;
|
|
13
|
+
};
|
|
14
|
+
allDependencies: ProjectDependency[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolves project context and detects if a query targets a specific dependency in the project.
|
|
18
|
+
* Uses docs.lock if present for zero-overhead deterministic pinned resolution,
|
|
19
|
+
* or falls back to live manifest scanning and resolution.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveProjectContext(projectDir: string, query: string, repo: DocOrbitRepository): ResolvedProjectContext;
|
|
22
|
+
export interface WorkspaceMatch {
|
|
23
|
+
dependency: ProjectDependency;
|
|
24
|
+
targetVersion: string;
|
|
25
|
+
confidence: number;
|
|
26
|
+
snapshotId?: string;
|
|
27
|
+
matchedBy: string;
|
|
28
|
+
}
|
|
29
|
+
export interface WorkspaceResolutionSummary {
|
|
30
|
+
matches: WorkspaceMatch[];
|
|
31
|
+
}
|
|
32
|
+
export declare class WorkspaceResolver {
|
|
33
|
+
private repo;
|
|
34
|
+
constructor(repo: DocOrbitRepository);
|
|
35
|
+
resolveProjectContext(projectDir: string, query: string): ResolvedProjectContext;
|
|
36
|
+
scanWorkspace(projectDir: string): WorkspaceScanResult;
|
|
37
|
+
resolveWorkspace(scan: WorkspaceScanResult, _existingLock?: DocsLock | null): WorkspaceResolutionSummary;
|
|
38
|
+
resolveVersion(projectVersion: string, availableDocVersions: string[], packageName?: string): VersionResolutionResult;
|
|
39
|
+
}
|