openlore 2.0.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 +268 -0
- package/dist/api/analyze.d.ts +17 -0
- package/dist/api/analyze.d.ts.map +1 -0
- package/dist/api/analyze.js +143 -0
- package/dist/api/analyze.js.map +1 -0
- package/dist/api/audit.d.ts +10 -0
- package/dist/api/audit.d.ts.map +1 -0
- package/dist/api/audit.js +117 -0
- package/dist/api/audit.js.map +1 -0
- package/dist/api/decisions.d.ts +55 -0
- package/dist/api/decisions.d.ts.map +1 -0
- package/dist/api/decisions.js +157 -0
- package/dist/api/decisions.js.map +1 -0
- package/dist/api/drift.d.ts +21 -0
- package/dist/api/drift.d.ts.map +1 -0
- package/dist/api/drift.js +152 -0
- package/dist/api/drift.js.map +1 -0
- package/dist/api/generate.d.ts +18 -0
- package/dist/api/generate.d.ts.map +1 -0
- package/dist/api/generate.js +259 -0
- package/dist/api/generate.js.map +1 -0
- package/dist/api/index.d.ts +41 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +34 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/init.d.ts +18 -0
- package/dist/api/init.d.ts.map +1 -0
- package/dist/api/init.js +83 -0
- package/dist/api/init.js.map +1 -0
- package/dist/api/run.d.ts +19 -0
- package/dist/api/run.d.ts.map +1 -0
- package/dist/api/run.js +312 -0
- package/dist/api/run.js.map +1 -0
- package/dist/api/specs.d.ts +49 -0
- package/dist/api/specs.d.ts.map +1 -0
- package/dist/api/specs.js +137 -0
- package/dist/api/specs.js.map +1 -0
- package/dist/api/types.d.ts +201 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +9 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/verify.d.ts +20 -0
- package/dist/api/verify.d.ts.map +1 -0
- package/dist/api/verify.js +117 -0
- package/dist/api/verify.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +30 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +683 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +9 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +98 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/decisions.d.ts +16 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +864 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/digest.d.ts +9 -0
- package/dist/cli/commands/digest.d.ts.map +1 -0
- package/dist/cli/commands/digest.js +61 -0
- package/dist/cli/commands/digest.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +9 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +398 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/drift.d.ts +9 -0
- package/dist/cli/commands/drift.d.ts.map +1 -0
- package/dist/cli/commands/drift.js +550 -0
- package/dist/cli/commands/drift.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +9 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +565 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +173 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +2235 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +1384 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/refresh-stories.d.ts +10 -0
- package/dist/cli/commands/refresh-stories.d.ts.map +1 -0
- package/dist/cli/commands/refresh-stories.js +314 -0
- package/dist/cli/commands/refresh-stories.js.map +1 -0
- package/dist/cli/commands/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +459 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +19 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +355 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/test.d.ts +22 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +180 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +9 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +383 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/view.d.ts +13 -0
- package/dist/cli/commands/view.d.ts.map +1 -0
- package/dist/cli/commands/view.js +547 -0
- package/dist/cli/commands/view.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +118 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui-approval.d.ts +11 -0
- package/dist/cli/tui-approval.d.ts.map +1 -0
- package/dist/cli/tui-approval.js +129 -0
- package/dist/cli/tui-approval.js.map +1 -0
- package/dist/constants.d.ts +314 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +382 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/analyzer/ai-config-generator.d.ts +54 -0
- package/dist/core/analyzer/ai-config-generator.d.ts.map +1 -0
- package/dist/core/analyzer/ai-config-generator.js +98 -0
- package/dist/core/analyzer/ai-config-generator.js.map +1 -0
- package/dist/core/analyzer/architecture-writer.d.ts +67 -0
- package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
- package/dist/core/analyzer/architecture-writer.js +209 -0
- package/dist/core/analyzer/architecture-writer.js.map +1 -0
- package/dist/core/analyzer/artifact-generator.d.ts +261 -0
- package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
- package/dist/core/analyzer/artifact-generator.js +909 -0
- package/dist/core/analyzer/artifact-generator.js.map +1 -0
- package/dist/core/analyzer/ast-chunker.d.ts +24 -0
- package/dist/core/analyzer/ast-chunker.d.ts.map +1 -0
- package/dist/core/analyzer/ast-chunker.js +198 -0
- package/dist/core/analyzer/ast-chunker.js.map +1 -0
- package/dist/core/analyzer/call-graph.d.ts +162 -0
- package/dist/core/analyzer/call-graph.d.ts.map +1 -0
- package/dist/core/analyzer/call-graph.js +2040 -0
- package/dist/core/analyzer/call-graph.js.map +1 -0
- package/dist/core/analyzer/code-shaper.d.ts +33 -0
- package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
- package/dist/core/analyzer/code-shaper.js +154 -0
- package/dist/core/analyzer/code-shaper.js.map +1 -0
- package/dist/core/analyzer/codebase-digest.d.ts +40 -0
- package/dist/core/analyzer/codebase-digest.d.ts.map +1 -0
- package/dist/core/analyzer/codebase-digest.js +195 -0
- package/dist/core/analyzer/codebase-digest.js.map +1 -0
- package/dist/core/analyzer/cpp-header-resolver.d.ts +30 -0
- package/dist/core/analyzer/cpp-header-resolver.d.ts.map +1 -0
- package/dist/core/analyzer/cpp-header-resolver.js +71 -0
- package/dist/core/analyzer/cpp-header-resolver.js.map +1 -0
- package/dist/core/analyzer/dependency-graph.d.ts +230 -0
- package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
- package/dist/core/analyzer/dependency-graph.js +752 -0
- package/dist/core/analyzer/dependency-graph.js.map +1 -0
- package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
- package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
- package/dist/core/analyzer/duplicate-detector.js +289 -0
- package/dist/core/analyzer/duplicate-detector.js.map +1 -0
- package/dist/core/analyzer/embedding-service.d.ts +56 -0
- package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
- package/dist/core/analyzer/embedding-service.js +118 -0
- package/dist/core/analyzer/embedding-service.js.map +1 -0
- package/dist/core/analyzer/env-extractor.d.ts +33 -0
- package/dist/core/analyzer/env-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/env-extractor.js +196 -0
- package/dist/core/analyzer/env-extractor.js.map +1 -0
- package/dist/core/analyzer/external-packages.d.ts +20 -0
- package/dist/core/analyzer/external-packages.d.ts.map +1 -0
- package/dist/core/analyzer/external-packages.js +175 -0
- package/dist/core/analyzer/external-packages.js.map +1 -0
- package/dist/core/analyzer/file-walker.d.ts +78 -0
- package/dist/core/analyzer/file-walker.d.ts.map +1 -0
- package/dist/core/analyzer/file-walker.js +532 -0
- package/dist/core/analyzer/file-walker.js.map +1 -0
- package/dist/core/analyzer/function-registry-trie.d.ts +21 -0
- package/dist/core/analyzer/function-registry-trie.d.ts.map +1 -0
- package/dist/core/analyzer/function-registry-trie.js +39 -0
- package/dist/core/analyzer/function-registry-trie.js.map +1 -0
- package/dist/core/analyzer/http-route-parser.d.ts +152 -0
- package/dist/core/analyzer/http-route-parser.d.ts.map +1 -0
- package/dist/core/analyzer/http-route-parser.js +971 -0
- package/dist/core/analyzer/http-route-parser.js.map +1 -0
- package/dist/core/analyzer/import-parser.d.ts +100 -0
- package/dist/core/analyzer/import-parser.d.ts.map +1 -0
- package/dist/core/analyzer/import-parser.js +952 -0
- package/dist/core/analyzer/import-parser.js.map +1 -0
- package/dist/core/analyzer/import-resolver-bridge.d.ts +25 -0
- package/dist/core/analyzer/import-resolver-bridge.d.ts.map +1 -0
- package/dist/core/analyzer/import-resolver-bridge.js +99 -0
- package/dist/core/analyzer/import-resolver-bridge.js.map +1 -0
- package/dist/core/analyzer/index.d.ts +10 -0
- package/dist/core/analyzer/index.d.ts.map +1 -0
- package/dist/core/analyzer/index.js +10 -0
- package/dist/core/analyzer/index.js.map +1 -0
- package/dist/core/analyzer/middleware-extractor.d.ts +29 -0
- package/dist/core/analyzer/middleware-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/middleware-extractor.js +195 -0
- package/dist/core/analyzer/middleware-extractor.js.map +1 -0
- package/dist/core/analyzer/refactor-analyzer.d.ts +83 -0
- package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
- package/dist/core/analyzer/refactor-analyzer.js +351 -0
- package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
- package/dist/core/analyzer/repository-mapper.d.ts +150 -0
- package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
- package/dist/core/analyzer/repository-mapper.js +740 -0
- package/dist/core/analyzer/repository-mapper.js.map +1 -0
- package/dist/core/analyzer/schema-extractor.d.ts +41 -0
- package/dist/core/analyzer/schema-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/schema-extractor.js +229 -0
- package/dist/core/analyzer/schema-extractor.js.map +1 -0
- package/dist/core/analyzer/signature-extractor.d.ts +31 -0
- package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/signature-extractor.js +675 -0
- package/dist/core/analyzer/signature-extractor.js.map +1 -0
- package/dist/core/analyzer/significance-scorer.d.ts +79 -0
- package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
- package/dist/core/analyzer/significance-scorer.js +407 -0
- package/dist/core/analyzer/significance-scorer.js.map +1 -0
- package/dist/core/analyzer/spec-snapshot-generator.d.ts +17 -0
- package/dist/core/analyzer/spec-snapshot-generator.d.ts.map +1 -0
- package/dist/core/analyzer/spec-snapshot-generator.js +201 -0
- package/dist/core/analyzer/spec-snapshot-generator.js.map +1 -0
- package/dist/core/analyzer/spec-vector-index.d.ts +68 -0
- package/dist/core/analyzer/spec-vector-index.d.ts.map +1 -0
- package/dist/core/analyzer/spec-vector-index.js +340 -0
- package/dist/core/analyzer/spec-vector-index.js.map +1 -0
- package/dist/core/analyzer/subgraph-extractor.d.ts +51 -0
- package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/subgraph-extractor.js +147 -0
- package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
- package/dist/core/analyzer/type-inference-engine.d.ts +23 -0
- package/dist/core/analyzer/type-inference-engine.d.ts.map +1 -0
- package/dist/core/analyzer/type-inference-engine.js +130 -0
- package/dist/core/analyzer/type-inference-engine.js.map +1 -0
- package/dist/core/analyzer/ui-component-extractor.d.ts +43 -0
- package/dist/core/analyzer/ui-component-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/ui-component-extractor.js +245 -0
- package/dist/core/analyzer/ui-component-extractor.js.map +1 -0
- package/dist/core/analyzer/unified-search.d.ts +116 -0
- package/dist/core/analyzer/unified-search.d.ts.map +1 -0
- package/dist/core/analyzer/unified-search.js +231 -0
- package/dist/core/analyzer/unified-search.js.map +1 -0
- package/dist/core/analyzer/vector-index.d.ts +92 -0
- package/dist/core/analyzer/vector-index.d.ts.map +1 -0
- package/dist/core/analyzer/vector-index.js +451 -0
- package/dist/core/analyzer/vector-index.js.map +1 -0
- package/dist/core/decisions/consolidator.d.ts +14 -0
- package/dist/core/decisions/consolidator.d.ts.map +1 -0
- package/dist/core/decisions/consolidator.js +169 -0
- package/dist/core/decisions/consolidator.js.map +1 -0
- package/dist/core/decisions/extractor.d.ts +26 -0
- package/dist/core/decisions/extractor.d.ts.map +1 -0
- package/dist/core/decisions/extractor.js +156 -0
- package/dist/core/decisions/extractor.js.map +1 -0
- package/dist/core/decisions/index.d.ts +19 -0
- package/dist/core/decisions/index.d.ts.map +1 -0
- package/dist/core/decisions/index.js +16 -0
- package/dist/core/decisions/index.js.map +1 -0
- package/dist/core/decisions/store.d.ts +36 -0
- package/dist/core/decisions/store.d.ts.map +1 -0
- package/dist/core/decisions/store.js +109 -0
- package/dist/core/decisions/store.js.map +1 -0
- package/dist/core/decisions/syncer.d.ts +27 -0
- package/dist/core/decisions/syncer.d.ts.map +1 -0
- package/dist/core/decisions/syncer.js +214 -0
- package/dist/core/decisions/syncer.js.map +1 -0
- package/dist/core/decisions/verifier.d.ts +20 -0
- package/dist/core/decisions/verifier.d.ts.map +1 -0
- package/dist/core/decisions/verifier.js +115 -0
- package/dist/core/decisions/verifier.js.map +1 -0
- package/dist/core/digest/digest-generator.d.ts +29 -0
- package/dist/core/digest/digest-generator.d.ts.map +1 -0
- package/dist/core/digest/digest-generator.js +181 -0
- package/dist/core/digest/digest-generator.js.map +1 -0
- package/dist/core/drift/drift-detector.d.ts +102 -0
- package/dist/core/drift/drift-detector.d.ts.map +1 -0
- package/dist/core/drift/drift-detector.js +598 -0
- package/dist/core/drift/drift-detector.js.map +1 -0
- package/dist/core/drift/git-diff.d.ts +60 -0
- package/dist/core/drift/git-diff.d.ts.map +1 -0
- package/dist/core/drift/git-diff.js +383 -0
- package/dist/core/drift/git-diff.js.map +1 -0
- package/dist/core/drift/index.d.ts +12 -0
- package/dist/core/drift/index.d.ts.map +1 -0
- package/dist/core/drift/index.js +9 -0
- package/dist/core/drift/index.js.map +1 -0
- package/dist/core/drift/spec-mapper.d.ts +73 -0
- package/dist/core/drift/spec-mapper.d.ts.map +1 -0
- package/dist/core/drift/spec-mapper.js +353 -0
- package/dist/core/drift/spec-mapper.js.map +1 -0
- package/dist/core/drift/test-suggester.d.ts +18 -0
- package/dist/core/drift/test-suggester.d.ts.map +1 -0
- package/dist/core/drift/test-suggester.js +107 -0
- package/dist/core/drift/test-suggester.js.map +1 -0
- package/dist/core/generator/adr-generator.d.ts +32 -0
- package/dist/core/generator/adr-generator.d.ts.map +1 -0
- package/dist/core/generator/adr-generator.js +192 -0
- package/dist/core/generator/adr-generator.js.map +1 -0
- package/dist/core/generator/index.d.ts +9 -0
- package/dist/core/generator/index.d.ts.map +1 -0
- package/dist/core/generator/index.js +12 -0
- package/dist/core/generator/index.js.map +1 -0
- package/dist/core/generator/mapping-generator.d.ts +54 -0
- package/dist/core/generator/mapping-generator.d.ts.map +1 -0
- package/dist/core/generator/mapping-generator.js +240 -0
- package/dist/core/generator/mapping-generator.js.map +1 -0
- package/dist/core/generator/openspec-compat.d.ts +160 -0
- package/dist/core/generator/openspec-compat.d.ts.map +1 -0
- package/dist/core/generator/openspec-compat.js +524 -0
- package/dist/core/generator/openspec-compat.js.map +1 -0
- package/dist/core/generator/openspec-format-generator.d.ts +131 -0
- package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
- package/dist/core/generator/openspec-format-generator.js +963 -0
- package/dist/core/generator/openspec-format-generator.js.map +1 -0
- package/dist/core/generator/openspec-writer.d.ts +130 -0
- package/dist/core/generator/openspec-writer.d.ts.map +1 -0
- package/dist/core/generator/openspec-writer.js +404 -0
- package/dist/core/generator/openspec-writer.js.map +1 -0
- package/dist/core/generator/prompts.d.ts +35 -0
- package/dist/core/generator/prompts.d.ts.map +1 -0
- package/dist/core/generator/prompts.js +212 -0
- package/dist/core/generator/prompts.js.map +1 -0
- package/dist/core/generator/rag-manifest-generator.d.ts +37 -0
- package/dist/core/generator/rag-manifest-generator.d.ts.map +1 -0
- package/dist/core/generator/rag-manifest-generator.js +134 -0
- package/dist/core/generator/rag-manifest-generator.js.map +1 -0
- package/dist/core/generator/schemas.d.ts +365 -0
- package/dist/core/generator/schemas.d.ts.map +1 -0
- package/dist/core/generator/schemas.js +190 -0
- package/dist/core/generator/schemas.js.map +1 -0
- package/dist/core/generator/spec-pipeline.d.ts +123 -0
- package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
- package/dist/core/generator/spec-pipeline.js +699 -0
- package/dist/core/generator/spec-pipeline.js.map +1 -0
- package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
- package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
- package/dist/core/generator/stages/stage1-survey.js +171 -0
- package/dist/core/generator/stages/stage1-survey.js.map +1 -0
- package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
- package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
- package/dist/core/generator/stages/stage2-entities.js +74 -0
- package/dist/core/generator/stages/stage2-entities.js.map +1 -0
- package/dist/core/generator/stages/stage3-services.d.ts +11 -0
- package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
- package/dist/core/generator/stages/stage3-services.js +85 -0
- package/dist/core/generator/stages/stage3-services.js.map +1 -0
- package/dist/core/generator/stages/stage4-api.d.ts +11 -0
- package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
- package/dist/core/generator/stages/stage4-api.js +72 -0
- package/dist/core/generator/stages/stage4-api.js.map +1 -0
- package/dist/core/generator/stages/stage5-architecture.d.ts +11 -0
- package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
- package/dist/core/generator/stages/stage5-architecture.js +75 -0
- package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
- package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
- package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
- package/dist/core/generator/stages/stage6-adr.js +47 -0
- package/dist/core/generator/stages/stage6-adr.js.map +1 -0
- package/dist/core/services/chat-agent.d.ts +50 -0
- package/dist/core/services/chat-agent.d.ts.map +1 -0
- package/dist/core/services/chat-agent.js +369 -0
- package/dist/core/services/chat-agent.js.map +1 -0
- package/dist/core/services/chat-tools.d.ts +32 -0
- package/dist/core/services/chat-tools.d.ts.map +1 -0
- package/dist/core/services/chat-tools.js +494 -0
- package/dist/core/services/chat-tools.js.map +1 -0
- package/dist/core/services/config-manager.d.ts +61 -0
- package/dist/core/services/config-manager.d.ts.map +1 -0
- package/dist/core/services/config-manager.js +149 -0
- package/dist/core/services/config-manager.js.map +1 -0
- package/dist/core/services/edge-store.d.ts +57 -0
- package/dist/core/services/edge-store.d.ts.map +1 -0
- package/dist/core/services/edge-store.js +419 -0
- package/dist/core/services/edge-store.js.map +1 -0
- package/dist/core/services/gitignore-manager.d.ts +29 -0
- package/dist/core/services/gitignore-manager.d.ts.map +1 -0
- package/dist/core/services/gitignore-manager.js +95 -0
- package/dist/core/services/gitignore-manager.js.map +1 -0
- package/dist/core/services/index.d.ts +8 -0
- package/dist/core/services/index.d.ts.map +1 -0
- package/dist/core/services/index.js +8 -0
- package/dist/core/services/index.js.map +1 -0
- package/dist/core/services/llm-service.d.ts +379 -0
- package/dist/core/services/llm-service.d.ts.map +1 -0
- package/dist/core/services/llm-service.js +1553 -0
- package/dist/core/services/llm-service.js.map +1 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts +127 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/analysis.js +1185 -0
- package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
- package/dist/core/services/mcp-handlers/change.d.ts +14 -0
- package/dist/core/services/mcp-handlers/change.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/change.js +416 -0
- package/dist/core/services/mcp-handlers/change.js.map +1 -0
- package/dist/core/services/mcp-handlers/decisions.d.ts +16 -0
- package/dist/core/services/mcp-handlers/decisions.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/decisions.js +239 -0
- package/dist/core/services/mcp-handlers/decisions.js.map +1 -0
- package/dist/core/services/mcp-handlers/graph.d.ts +94 -0
- package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/graph.js +693 -0
- package/dist/core/services/mcp-handlers/graph.js.map +1 -0
- package/dist/core/services/mcp-handlers/orient.d.ts +17 -0
- package/dist/core/services/mcp-handlers/orient.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/orient.js +357 -0
- package/dist/core/services/mcp-handlers/orient.js.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts +66 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.js +432 -0
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
- package/dist/core/services/mcp-handlers/utils.d.ts +85 -0
- package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/utils.js +262 -0
- package/dist/core/services/mcp-handlers/utils.js.map +1 -0
- package/dist/core/services/mcp-watcher.d.ts +41 -0
- package/dist/core/services/mcp-watcher.d.ts.map +1 -0
- package/dist/core/services/mcp-watcher.js +254 -0
- package/dist/core/services/mcp-watcher.js.map +1 -0
- package/dist/core/services/project-detector.d.ts +32 -0
- package/dist/core/services/project-detector.d.ts.map +1 -0
- package/dist/core/services/project-detector.js +100 -0
- package/dist/core/services/project-detector.js.map +1 -0
- package/dist/core/test-generator/coverage-analyzer.d.ts +27 -0
- package/dist/core/test-generator/coverage-analyzer.d.ts.map +1 -0
- package/dist/core/test-generator/coverage-analyzer.js +285 -0
- package/dist/core/test-generator/coverage-analyzer.js.map +1 -0
- package/dist/core/test-generator/framework-detector.d.ts +17 -0
- package/dist/core/test-generator/framework-detector.d.ts.map +1 -0
- package/dist/core/test-generator/framework-detector.js +65 -0
- package/dist/core/test-generator/framework-detector.js.map +1 -0
- package/dist/core/test-generator/index.d.ts +14 -0
- package/dist/core/test-generator/index.d.ts.map +1 -0
- package/dist/core/test-generator/index.js +11 -0
- package/dist/core/test-generator/index.js.map +1 -0
- package/dist/core/test-generator/renderers/catch2.d.ts +8 -0
- package/dist/core/test-generator/renderers/catch2.d.ts.map +1 -0
- package/dist/core/test-generator/renderers/catch2.js +47 -0
- package/dist/core/test-generator/renderers/catch2.js.map +1 -0
- package/dist/core/test-generator/renderers/gtest.d.ts +8 -0
- package/dist/core/test-generator/renderers/gtest.d.ts.map +1 -0
- package/dist/core/test-generator/renderers/gtest.js +45 -0
- package/dist/core/test-generator/renderers/gtest.js.map +1 -0
- package/dist/core/test-generator/renderers/index.d.ts +20 -0
- package/dist/core/test-generator/renderers/index.d.ts.map +1 -0
- package/dist/core/test-generator/renderers/index.js +35 -0
- package/dist/core/test-generator/renderers/index.js.map +1 -0
- package/dist/core/test-generator/renderers/playwright.d.ts +8 -0
- package/dist/core/test-generator/renderers/playwright.d.ts.map +1 -0
- package/dist/core/test-generator/renderers/playwright.js +44 -0
- package/dist/core/test-generator/renderers/playwright.js.map +1 -0
- package/dist/core/test-generator/renderers/pytest.d.ts +8 -0
- package/dist/core/test-generator/renderers/pytest.d.ts.map +1 -0
- package/dist/core/test-generator/renderers/pytest.js +44 -0
- package/dist/core/test-generator/renderers/pytest.js.map +1 -0
- package/dist/core/test-generator/renderers/shared.d.ts +21 -0
- package/dist/core/test-generator/renderers/shared.d.ts.map +1 -0
- package/dist/core/test-generator/renderers/shared.js +56 -0
- package/dist/core/test-generator/renderers/shared.js.map +1 -0
- package/dist/core/test-generator/renderers/vitest.d.ts +8 -0
- package/dist/core/test-generator/renderers/vitest.d.ts.map +1 -0
- package/dist/core/test-generator/renderers/vitest.js +52 -0
- package/dist/core/test-generator/renderers/vitest.js.map +1 -0
- package/dist/core/test-generator/scenario-parser.d.ts +33 -0
- package/dist/core/test-generator/scenario-parser.d.ts.map +1 -0
- package/dist/core/test-generator/scenario-parser.js +244 -0
- package/dist/core/test-generator/scenario-parser.js.map +1 -0
- package/dist/core/test-generator/test-generator.d.ts +30 -0
- package/dist/core/test-generator/test-generator.d.ts.map +1 -0
- package/dist/core/test-generator/test-generator.js +174 -0
- package/dist/core/test-generator/test-generator.js.map +1 -0
- package/dist/core/test-generator/test-writer.d.ts +25 -0
- package/dist/core/test-generator/test-writer.d.ts.map +1 -0
- package/dist/core/test-generator/test-writer.js +128 -0
- package/dist/core/test-generator/test-writer.js.map +1 -0
- package/dist/core/test-generator/then-matchers.d.ts +35 -0
- package/dist/core/test-generator/then-matchers.d.ts.map +1 -0
- package/dist/core/test-generator/then-matchers.js +211 -0
- package/dist/core/test-generator/then-matchers.js.map +1 -0
- package/dist/core/verifier/index.d.ts +5 -0
- package/dist/core/verifier/index.d.ts.map +1 -0
- package/dist/core/verifier/index.js +5 -0
- package/dist/core/verifier/index.js.map +1 -0
- package/dist/core/verifier/verification-engine.d.ts +293 -0
- package/dist/core/verifier/verification-engine.d.ts.map +1 -0
- package/dist/core/verifier/verification-engine.js +919 -0
- package/dist/core/verifier/verification-engine.js.map +1 -0
- package/dist/types/index.d.ts +368 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pipeline.d.ts +167 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +5 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/types/test-generator.d.ts +103 -0
- package/dist/types/test-generator.d.ts.map +1 -0
- package/dist/types/test-generator.js +17 -0
- package/dist/types/test-generator.js.map +1 -0
- package/dist/utils/command-helpers.d.ts +68 -0
- package/dist/utils/command-helpers.d.ts.map +1 -0
- package/dist/utils/command-helpers.js +150 -0
- package/dist/utils/command-helpers.js.map +1 -0
- package/dist/utils/errors.d.ts +51 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +129 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +149 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +342 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/misc.d.ts +10 -0
- package/dist/utils/misc.d.ts.map +1 -0
- package/dist/utils/misc.js +21 -0
- package/dist/utils/misc.js.map +1 -0
- package/dist/utils/progress.d.ts +142 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +283 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/prompts.d.ts +53 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +199 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/shutdown.d.ts +89 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +238 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/examples/bmad/README.md +113 -0
- package/examples/bmad/agents/architect.md +226 -0
- package/examples/bmad/agents/dev-brownfield.md +69 -0
- package/examples/bmad/setup/architect.customize.yaml +14 -0
- package/examples/bmad/tasks/implement-story.md +254 -0
- package/examples/bmad/tasks/onboarding.md +169 -0
- package/examples/bmad/tasks/refactor.md +178 -0
- package/examples/bmad/tasks/sprint-planning.md +168 -0
- package/examples/bmad/templates/story.md +108 -0
- package/examples/cline-workflows/openlore-analyze-codebase.md +101 -0
- package/examples/cline-workflows/openlore-check-spec-drift.md +102 -0
- package/examples/cline-workflows/openlore-execute-refactor.md +212 -0
- package/examples/cline-workflows/openlore-implement-feature.md +266 -0
- package/examples/cline-workflows/openlore-plan-refactor.md +279 -0
- package/examples/cline-workflows/openlore-refactor-codebase.md +16 -0
- package/examples/cline-workflows/openlore-write-tests.md +177 -0
- package/examples/drift-demo/openspec/config.yaml +14 -0
- package/examples/drift-demo/openspec/specs/architecture/spec.md +30 -0
- package/examples/drift-demo/openspec/specs/auth/spec.md +71 -0
- package/examples/drift-demo/openspec/specs/database/spec.md +33 -0
- package/examples/drift-demo/openspec/specs/overview/spec.md +20 -0
- package/examples/drift-demo/openspec/specs/projects/spec.md +55 -0
- package/examples/drift-demo/openspec/specs/tasks/spec.md +78 -0
- package/examples/drift-demo/package.json +21 -0
- package/examples/drift-demo/src/auth/auth-middleware.ts +30 -0
- package/examples/drift-demo/src/auth/auth-routes.ts +29 -0
- package/examples/drift-demo/src/auth/auth-service.ts +45 -0
- package/examples/drift-demo/src/database/connection.ts +27 -0
- package/examples/drift-demo/src/index.ts +16 -0
- package/examples/drift-demo/src/projects/project-model.ts +15 -0
- package/examples/drift-demo/src/projects/project-service.ts +34 -0
- package/examples/drift-demo/src/tasks/task-model.ts +37 -0
- package/examples/drift-demo/src/tasks/task-routes.ts +53 -0
- package/examples/drift-demo/src/tasks/task-service.ts +60 -0
- package/examples/drift-demo/src/utils/validation.ts +11 -0
- package/examples/drift-demo/tests/auth.test.ts +4 -0
- package/examples/drift-demo/tests/tasks.test.ts +4 -0
- package/examples/drift-demo/tsconfig.json +10 -0
- package/examples/drift-test/run-drift-test.sh +1087 -0
- package/examples/gsd/README.md +119 -0
- package/examples/gsd/commands/gsd/openlore-drift.md +111 -0
- package/examples/gsd/commands/gsd/openlore-orient.md +191 -0
- package/examples/mistral-vibe/README.md +101 -0
- package/examples/mistral-vibe/antipatterns-template.md +18 -0
- package/examples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md +124 -0
- package/examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md +379 -0
- package/examples/mistral-vibe/skills/openlore-debug/SKILL.md +330 -0
- package/examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md +291 -0
- package/examples/mistral-vibe/skills/openlore-generate/SKILL.md +245 -0
- package/examples/mistral-vibe/skills/openlore-implement-story/SKILL.md +326 -0
- package/examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md +365 -0
- package/examples/mistral-vibe/skills/openlore-review-changes/SKILL.md +128 -0
- package/examples/mistral-vibe/skills/openlore-write-tests/SKILL.md +261 -0
- package/examples/opencode/agent-guard.ts +170 -0
- package/examples/opencode/plugins/anti-laziness.ts +202 -0
- package/examples/opencode/plugins/lib/openlore-context-injector-helpers.ts +116 -0
- package/examples/opencode/plugins/lib/openlore-decision-extractor-helpers.ts +65 -0
- package/examples/opencode/plugins/openlore-context-injector.test.ts +211 -0
- package/examples/opencode/plugins/openlore-context-injector.ts +165 -0
- package/examples/opencode/plugins/openlore-decision-extractor.test.ts +131 -0
- package/examples/opencode/plugins/openlore-decision-extractor.ts +322 -0
- package/examples/opencode/plugins/openlore-enforcer.ts +227 -0
- package/examples/opencode/prompts/sisyphus-sdd.md +150 -0
- package/examples/opencode-skills/openlore-analyze-codebase/SKILL.md +101 -0
- package/examples/opencode-skills/openlore-brainstorm/SKILL.md +354 -0
- package/examples/opencode-skills/openlore-debug/SKILL.md +291 -0
- package/examples/opencode-skills/openlore-execute-refactor/SKILL.md +241 -0
- package/examples/opencode-skills/openlore-generate/SKILL.md +236 -0
- package/examples/opencode-skills/openlore-implement-story/SKILL.md +251 -0
- package/examples/opencode-skills/openlore-plan-refactor/SKILL.md +298 -0
- package/examples/opencode-skills/openlore-review-changes/SKILL.md +134 -0
- package/examples/opencode-skills/openlore-write-tests/SKILL.md +230 -0
- package/examples/openspec-analysis/README.md +59 -0
- package/examples/openspec-analysis/SUMMARY.md +72 -0
- package/examples/openspec-analysis/config.json +16 -0
- package/examples/openspec-analysis/dependencies.mermaid +35 -0
- package/examples/openspec-analysis/dependency-graph.json +12116 -0
- package/examples/openspec-analysis/llm-context.json +119 -0
- package/examples/openspec-analysis/repo-structure.json +871 -0
- package/examples/openspec-cli/README.md +67 -0
- package/examples/openspec-cli/openspec/config.yaml +26 -0
- package/examples/openspec-cli/openspec/specs/architecture/spec.md +178 -0
- package/examples/openspec-cli/openspec/specs/artifact-graph/spec.md +143 -0
- package/examples/openspec-cli/openspec/specs/cli/spec.md +138 -0
- package/examples/openspec-cli/openspec/specs/overview/spec.md +60 -0
- package/examples/openspec-cli/openspec/specs/parsing/spec.md +123 -0
- package/examples/openspec-cli/openspec/specs/validation/spec.md +108 -0
- package/examples/spec-kit/README.md +104 -0
- package/examples/spec-kit/commands/drift.md +87 -0
- package/examples/spec-kit/commands/orient.md +138 -0
- package/examples/spec-kit/extension.yml +54 -0
- package/package.json +125 -0
- package/src/viewer/InteractiveGraphViewer.jsx +1600 -0
- package/src/viewer/app/index.html +17 -0
- package/src/viewer/app/main.jsx +13 -0
- package/src/viewer/components/ArchitectureView.jsx +177 -0
- package/src/viewer/components/ChatPanel.jsx +450 -0
- package/src/viewer/components/ClassGraph.jsx +782 -0
- package/src/viewer/components/ClusterGraph.jsx +469 -0
- package/src/viewer/components/FilterBar.jsx +179 -0
- package/src/viewer/components/FlatGraph.jsx +282 -0
- package/src/viewer/components/MicroComponents.jsx +85 -0
- package/src/viewer/hooks/usePanZoom.js +79 -0
- package/src/viewer/utils/constants.js +64 -0
- package/src/viewer/utils/graph-helpers.js +303 -0
- package/src/viewer/utils/graph-helpers.test.ts +39 -0
- package/src/viewer/utils/themes.js +206 -0
- package/stubs/tree-sitter-cli-stub/package.json +6 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Clay Good
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# openlore
|
|
2
|
+
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> **`spec-gen` has been renamed to `OpenLore`.** The npm package is now [`openlore`](https://www.npmjs.com/package/openlore) and the CLI command is `openlore`. Existing projects: rename your `.spec-gen/` directory to `.openlore/` and reinstall (`npm i -g openlore`). See [docs/RENAME-TO-OPENLORE.md](docs/RENAME-TO-OPENLORE.md) for the full migration checklist.
|
|
5
|
+
|
|
6
|
+
**Persistent architectural memory and structural cognition for AI coding agents.**
|
|
7
|
+
|
|
8
|
+
openlore turns any evolving codebase into a navigable knowledge graph backed by [OpenSpec](https://github.com/Fission-AI/OpenSpec) living specifications. It maintains persistent architectural context across agent sessions: graph structure, specs, decisions, drift state, and semantic retrieval — so agents start each task already oriented instead of re-discovering the system from file reads.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Why It Exists
|
|
13
|
+
|
|
14
|
+
AI agents are powerful but amnesiac. On every new task:
|
|
15
|
+
|
|
16
|
+
- They re-read the same source files to understand structure
|
|
17
|
+
- They forget architectural decisions made two sessions ago
|
|
18
|
+
- They have no link between specs and code — drift is invisible
|
|
19
|
+
- File-by-file navigation often burns **15,000–50,000 tokens** per orientation pass, before a single line of useful code is written
|
|
20
|
+
|
|
21
|
+
openlore closes this loop. Run a full analysis once, then keep the graph incrementally updated as the codebase evolves. Even greenfield projects become cognitively "brownfield" after only a few agent sessions — architectural context fragments, decisions disappear, and agents repeatedly reconstruct the same understanding from scratch.
|
|
22
|
+
|
|
23
|
+
openlore persists that context continuously: structure, specs, decisions, drift state, and graph relationships remain queryable across sessions.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## How It Works
|
|
28
|
+
|
|
29
|
+
Three layers, each usable independently:
|
|
30
|
+
|
|
31
|
+
| Layer | What it does | API key? |
|
|
32
|
+
|-------|-------------|----------|
|
|
33
|
+
| **1. Static Analysis** | Call graph, clusters, McCabe CC, external deps → `CODEBASE.md` digest | No |
|
|
34
|
+
| **2. Spec Layer** | LLM-generated living specs, ADRs, drift detection, decision gates | For generation |
|
|
35
|
+
| **3. Agent Runtime** | 45 MCP tools — `orient()`, semantic search, graph expansion | No |
|
|
36
|
+
|
|
37
|
+
You can use layer 1 alone to give agents structural context. Add layer 2 for semantic intent and architectural governance through OpenSpec-compatible living specifications. Layer 3 keeps that context continuously accessible through graph-native MCP tools once `openlore mcp` is running.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## openlore vs. Alternatives
|
|
42
|
+
|
|
43
|
+
| | Cursor / Claude Code | Sourcegraph | openlore |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| Graph-aware MCP context | ❌ file-based reads | Partial | ✓ call graph + clusters |
|
|
46
|
+
| Spec drift detection | ❌ | ❌ | ✓ milliseconds, no API |
|
|
47
|
+
| Architectural decision gates | ❌ | ❌ | ✓ pre-commit hook |
|
|
48
|
+
| Offline structural analysis | ❌ | ❌ | ✓ |
|
|
49
|
+
| Token-efficient orient() | ❌ | ❌ | ✓ ~1–3k vs 15–50k tokens |
|
|
50
|
+
| Living spec generation | ❌ | ❌ | ✓ |
|
|
51
|
+
| Persistent cross-session architectural memory | ❌ | Partial | ✓ |
|
|
52
|
+
|
|
53
|
+
Traditional coding agents reconstruct architecture from repeated file reads every session. openlore persists it as a queryable graph.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 5-Minute Quickstart
|
|
58
|
+
|
|
59
|
+
> **Minimum to see value — no API key needed:**
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm install -g openlore
|
|
63
|
+
cd /path/to/your-project
|
|
64
|
+
|
|
65
|
+
openlore analyze # build call graph, clusters, CODEBASE.md
|
|
66
|
+
openlore mcp # start MCP server
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Then ask your agent: **`orient("add a new payment method")`**
|
|
70
|
+
|
|
71
|
+
That single call returns the relevant functions, their call neighbours, matching spec sections, and insertion-point candidates — preserving architectural continuity across sessions instead of forcing the agent to repeatedly reconstruct context from raw file reads. In practice, this often reduces orientation cost from ~30,000 exploratory tokens to ~1,000 targeted tokens.
|
|
72
|
+
|
|
73
|
+
**Full pipeline** (specs + decisions — optional and additive):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
openlore generate # generate living specs (requires API key)
|
|
77
|
+
openlore drift # detect spec/code drift
|
|
78
|
+
openlore decisions # manage architectural decisions
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
<details>
|
|
82
|
+
<summary>Install from source</summary>
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
git clone https://github.com/clay-good/openlore
|
|
86
|
+
cd openlore
|
|
87
|
+
npm install && npm run build && npm link
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
</details>
|
|
91
|
+
|
|
92
|
+
<details>
|
|
93
|
+
<summary>Nix / NixOS</summary>
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
nix run github:clay-good/openlore -- analyze
|
|
97
|
+
nix shell github:clay-good/openlore
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
System flake:
|
|
101
|
+
```nix
|
|
102
|
+
environment.systemPackages = [ openlore.packages.x86_64-linux.default ];
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
</details>
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## See It In Action
|
|
110
|
+
|
|
111
|
+
<details>
|
|
112
|
+
<summary>Example: orient("add a payment method")</summary>
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"functions": [
|
|
117
|
+
{
|
|
118
|
+
"name": "processPayment",
|
|
119
|
+
"file": "src/payments/processor.ts",
|
|
120
|
+
"risk": "medium",
|
|
121
|
+
"fanIn": 4,
|
|
122
|
+
"callers": ["handleCheckout", "retryFailedCharge"],
|
|
123
|
+
"callType": "direct"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "validateCard",
|
|
127
|
+
"file": "src/payments/validator.ts",
|
|
128
|
+
"risk": "low",
|
|
129
|
+
"fanIn": 1,
|
|
130
|
+
"testedBy": [{ "name": "validateCard.test.ts", "confidence": "called" }]
|
|
131
|
+
}
|
|
132
|
+
],
|
|
133
|
+
"specDomains": ["payments — §CardValidation, §PaymentFlow"],
|
|
134
|
+
"insertionPoints": [
|
|
135
|
+
"src/payments/processor.ts:87 — after existing charge logic"
|
|
136
|
+
],
|
|
137
|
+
"callPath": "POST /charge → handleCheckout → processPayment → validateCard → stripeClient.charge"
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
One graph query replaces most exploratory file reads. The agent knows exactly where to look and what risks to consider.
|
|
142
|
+
|
|
143
|
+
</details>
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Core Features
|
|
148
|
+
|
|
149
|
+
**Analyze** (no API key)
|
|
150
|
+
|
|
151
|
+
Continuously maintains a structural representation of your codebase using pure static analysis. Builds a full call graph persisted to SQLite, runs label-propagation community detection to cluster tightly coupled functions, computes McCabe cyclomatic complexity for every function, and extracts DB schemas, HTTP routes, UI components, middleware chains, and environment variables. Outputs `.openlore/analysis/CODEBASE.md` — a ~600-token structural digest that compresses the equivalent of tens of thousands of exploratory tokens into a small, queryable summary.
|
|
152
|
+
|
|
153
|
+
With `--watch-auto`, the call graph updates incrementally on every file save: changed file and its direct callers are re-parsed and the graph is atomically swapped. Orient and BFS queries remain live between full analyze runs.
|
|
154
|
+
|
|
155
|
+
**Generate** (API key required)
|
|
156
|
+
|
|
157
|
+
Sends the analysis to an LLM in 6 structured stages: project survey → entity extraction → service analysis → API extraction → architecture synthesis → ADR enrichment. Produces `openspec/specs/` living specifications in RFC 2119 format with Given/When/Then scenarios.
|
|
158
|
+
|
|
159
|
+
**Drift** (no API key)
|
|
160
|
+
|
|
161
|
+
Compares git changes against spec mappings in milliseconds. Detects: Gap (code changed, spec not updated), Uncovered (new file, no spec), Stale (spec references deleted files), ADR gap (code changed in an ADR-referenced domain). Installs as a pre-commit hook.
|
|
162
|
+
|
|
163
|
+
**MCP** (no API key)
|
|
164
|
+
|
|
165
|
+
45 graph-native tools exposed over stdio. Together they act as a persistent architectural runtime for coding agents: orientation, graph traversal, semantic retrieval, drift awareness, decision context, and structural risk analysis.
|
|
166
|
+
`orient()` is the main entry point — one call replaces 10+ file reads. `detect_changes` risk-scores changed functions using call graph centrality × change type multiplier. See [docs/mcp-tools.md](docs/mcp-tools.md).
|
|
167
|
+
|
|
168
|
+
`orient()` runs in **~430µs p50** against a 15k-node codebase (TypeScript compiler, ~79k edges). Full benchmark results: [scripts/BENCHMARKS.md](scripts/BENCHMARKS.md).
|
|
169
|
+
|
|
170
|
+
**Decisions** (API key for consolidation)
|
|
171
|
+
|
|
172
|
+
Agents call `record_decision` before writing code. Consolidation runs immediately in the background. At commit time, a pre-commit hook gates the commit until all verified decisions are reviewed and written back as requirements in `spec.md` files. Decisions are classified by scope (`local / component / cross-domain / system`); only `cross-domain` and `system` decisions produce ADR files, keeping the decision log signal-dense.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Architecture
|
|
177
|
+
|
|
178
|
+
OpenSpec provides semantic intent and workflow structure. openlore maintains the evolving implementation as a continuously queryable architectural graph for agents.
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
Codebase
|
|
182
|
+
│
|
|
183
|
+
▼
|
|
184
|
+
openlore analyze ──► SQLite graph store (.openlore/analysis/call-graph.db)
|
|
185
|
+
│ │
|
|
186
|
+
│ MCP tools (orient, BFS, search…)
|
|
187
|
+
│ │
|
|
188
|
+
Artifact Generator Agent
|
|
189
|
+
│
|
|
190
|
+
┌─────┴──────┐
|
|
191
|
+
▼ ▼
|
|
192
|
+
CODEBASE.md (optional)
|
|
193
|
+
openlore generate ──► openspec/specs/*.md
|
|
194
|
+
openlore drift ──► drift report
|
|
195
|
+
openlore decisions ► ADR gates
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
The graph and the OpenSpec spec layer are co-equal: the graph makes orientation fast, the specs make it semantically grounded. Drift detection and decision gates connect both. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full pipeline diagram.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Documentation
|
|
203
|
+
|
|
204
|
+
| Topic | Doc |
|
|
205
|
+
|-------|-----|
|
|
206
|
+
| MCP tools reference (45 tools + parameters) | [docs/mcp-tools.md](docs/mcp-tools.md) |
|
|
207
|
+
| Agent setup (Claude Code, Cline, OpenCode, Vibe…) | [docs/agent-setup.md](docs/agent-setup.md) |
|
|
208
|
+
| LLM providers + embedding config | [docs/providers.md](docs/providers.md) |
|
|
209
|
+
| Drift detection in depth | [docs/drift-detection.md](docs/drift-detection.md) |
|
|
210
|
+
| Spec-driven tests + spec digest | [docs/spec-tests.md](docs/spec-tests.md) |
|
|
211
|
+
| CI/CD integration | [docs/ci-cd.md](docs/ci-cd.md) |
|
|
212
|
+
| CLI command reference | [docs/cli-reference.md](docs/cli-reference.md) |
|
|
213
|
+
| Interactive graph viewer | [docs/viewer.md](docs/viewer.md) |
|
|
214
|
+
| Analysis output files | [docs/output.md](docs/output.md) |
|
|
215
|
+
| Configuration reference | [docs/configuration.md](docs/configuration.md) |
|
|
216
|
+
| Programmatic API | [docs/api.md](docs/api.md) |
|
|
217
|
+
| Pipeline architecture | [docs/pipeline.md](docs/pipeline.md) |
|
|
218
|
+
| Internal design | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) |
|
|
219
|
+
| Algorithms | [docs/ALGORITHMS.md](docs/ALGORITHMS.md) |
|
|
220
|
+
| Agentic workflows (BMAD, Vibe, GSD, spec-kit) | [docs/agentic-workflows.md](docs/agentic-workflows.md) |
|
|
221
|
+
| Troubleshooting | [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) |
|
|
222
|
+
| Philosophy | [docs/PHILOSOPHY.md](docs/PHILOSOPHY.md) |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Known Limitations
|
|
227
|
+
|
|
228
|
+
- **Incremental call graph updates are depth-1 only**: `--watch-auto` re-indexes signatures and edges on save for the changed file and its direct callers. Transitive callers (A→B→C, C changes, A stays stale) are only refreshed by the next `analyze --force`. For hub files with 100+ callerFiles, re-parse may take several seconds.
|
|
229
|
+
- **Static analysis only**: dynamic dispatch, runtime metaprogramming, and `eval`-based patterns are not captured in the call graph.
|
|
230
|
+
- **LLM spec quality varies**: generated specs reflect the model's understanding. Review sections covering complex business logic before treating them as authoritative.
|
|
231
|
+
- **Embedding is optional**: without an embedding endpoint, `orient` and `search_code` fall back to BM25 keyword search (still useful, less accurate for semantic queries).
|
|
232
|
+
- **Large monorepos**: `openlore analyze` on large codebases may take several minutes. Graph storage itself has no practical limit — the pipeline (AST parsing, symbol extraction) is the bottleneck.
|
|
233
|
+
- **`node:sqlite` experimental warning on Node 22**: Node.js 22 prints `ExperimentalWarning: SQLite is an experimental feature` to stderr. The warning is gone on Node 24+. Suppress on Node 22 with `NODE_NO_WARNINGS=1 openlore analyze`.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Requirements
|
|
238
|
+
|
|
239
|
+
- Node.js 22.5+
|
|
240
|
+
- API key for `generate`, `verify`, and `drift --use-llm`:
|
|
241
|
+
```bash
|
|
242
|
+
export ANTHROPIC_API_KEY=sk-ant-... # default provider
|
|
243
|
+
export OPENAI_API_KEY=sk-... # OpenAI
|
|
244
|
+
export GEMINI_API_KEY=... # Google Gemini
|
|
245
|
+
```
|
|
246
|
+
Or use a CLI-based provider (`claude-code`, `gemini-cli`, `mistral-vibe`, `cursor-agent`) — no API key, just the CLI on your PATH.
|
|
247
|
+
- `analyze`, `drift`, `mcp`, and `init` require no API key
|
|
248
|
+
|
|
249
|
+
**Languages supported**: TypeScript · JavaScript · Python · Go · Rust · Ruby · Java · C++ · Swift
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Development
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
npm install
|
|
257
|
+
npm run build
|
|
258
|
+
npm test # 2660+ unit tests
|
|
259
|
+
npm run typecheck
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Links
|
|
265
|
+
|
|
266
|
+
- [OpenSpec](https://github.com/Fission-AI/OpenSpec) — spec-driven development framework
|
|
267
|
+
- [AGENTS.md](AGENTS.md) — system prompt for direct LLM prompting
|
|
268
|
+
- [Examples](examples/) — BMAD, Vibe, GSD, drift-demo, spec-kit integrations
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openlore analyze — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Runs static analysis on the codebase (no LLM required).
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import type { AnalyzeApiOptions, AnalyzeResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run static analysis on the codebase.
|
|
10
|
+
*
|
|
11
|
+
* Scans the repository, builds a dependency graph, and generates
|
|
12
|
+
* analysis artifacts. No LLM involvement.
|
|
13
|
+
*
|
|
14
|
+
* @throws Error if no openlore configuration found
|
|
15
|
+
*/
|
|
16
|
+
export declare function openloreAnalyze(options?: AnalyzeApiOptions): Promise<AnalyzeResult>;
|
|
17
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/api/analyze.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAC;AAkCrF;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiI7F"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openlore analyze — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Runs static analysis on the codebase (no LLM required).
|
|
5
|
+
* No side effects (no process.exit, no console.log).
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { readFile, stat, mkdir, writeFile } from 'node:fs/promises';
|
|
9
|
+
import { ANALYSIS_STALE_THRESHOLD_MS, DEFAULT_MAX_FILES, OPENLORE_ANALYSIS_REL_PATH, ARTIFACT_REPO_STRUCTURE, ARTIFACT_DEPENDENCY_GRAPH, ARTIFACT_LLM_CONTEXT, OPENSPEC_DIR } from '../constants.js';
|
|
10
|
+
import { fileExists, readJsonFile } from '../utils/command-helpers.js';
|
|
11
|
+
import { readOpenLoreConfig } from '../core/services/config-manager.js';
|
|
12
|
+
import { RepositoryMapper } from '../core/analyzer/repository-mapper.js';
|
|
13
|
+
import { DependencyGraphBuilder, } from '../core/analyzer/dependency-graph.js';
|
|
14
|
+
import { AnalysisArtifactGenerator, repoStructureToRepoMap } from '../core/analyzer/artifact-generator.js';
|
|
15
|
+
import { SpecSnapshotGenerator } from '../core/analyzer/spec-snapshot-generator.js';
|
|
16
|
+
function progress(onProgress, step, status, detail) {
|
|
17
|
+
onProgress?.({ phase: 'analyze', step, status, detail });
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Load cached analysis artifacts from disk.
|
|
21
|
+
* All four artifact files are saved by AnalysisArtifactGenerator.generateAndSave().
|
|
22
|
+
*/
|
|
23
|
+
async function loadCachedArtifacts(outputPath, repoStructure) {
|
|
24
|
+
const llmContext = await readJsonFile(join(outputPath, ARTIFACT_LLM_CONTEXT), ARTIFACT_LLM_CONTEXT) ?? { phase1_survey: { purpose: '', files: [] }, phase2_deep: { purpose: '', files: [] }, phase3_validation: { purpose: '', files: [] } };
|
|
25
|
+
let summaryMarkdown = '';
|
|
26
|
+
let dependencyDiagram = '';
|
|
27
|
+
try {
|
|
28
|
+
summaryMarkdown = await readFile(join(outputPath, 'SUMMARY.md'), 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
catch { /* optional */ }
|
|
31
|
+
try {
|
|
32
|
+
dependencyDiagram = await readFile(join(outputPath, 'dependencies.mermaid'), 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
catch { /* optional */ }
|
|
35
|
+
return { repoStructure, summaryMarkdown, dependencyDiagram, llmContext };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Run static analysis on the codebase.
|
|
39
|
+
*
|
|
40
|
+
* Scans the repository, builds a dependency graph, and generates
|
|
41
|
+
* analysis artifacts. No LLM involvement.
|
|
42
|
+
*
|
|
43
|
+
* @throws Error if no openlore configuration found
|
|
44
|
+
*/
|
|
45
|
+
export async function openloreAnalyze(options = {}) {
|
|
46
|
+
const startTime = Date.now();
|
|
47
|
+
const rootPath = options.rootPath ?? process.cwd();
|
|
48
|
+
const maxFiles = options.maxFiles ?? DEFAULT_MAX_FILES;
|
|
49
|
+
const excludePatterns = options.excludePatterns ?? [];
|
|
50
|
+
const includePatterns = options.includePatterns ?? [];
|
|
51
|
+
const force = options.force ?? false;
|
|
52
|
+
const outputRelPath = options.outputPath ?? `${OPENLORE_ANALYSIS_REL_PATH}/`;
|
|
53
|
+
const outputPath = join(rootPath, outputRelPath);
|
|
54
|
+
const { onProgress } = options;
|
|
55
|
+
// Validate config exists
|
|
56
|
+
const openloreConfig = await readOpenLoreConfig(rootPath);
|
|
57
|
+
if (!openloreConfig) {
|
|
58
|
+
throw new Error('No openlore configuration found. Run openloreInit() first.');
|
|
59
|
+
}
|
|
60
|
+
// Check for existing recent analysis
|
|
61
|
+
if (!force) {
|
|
62
|
+
const repoStructurePath = join(outputPath, ARTIFACT_REPO_STRUCTURE);
|
|
63
|
+
if (await fileExists(repoStructurePath)) {
|
|
64
|
+
const stats = await stat(repoStructurePath);
|
|
65
|
+
const age = Date.now() - stats.mtime.getTime();
|
|
66
|
+
if (age < ANALYSIS_STALE_THRESHOLD_MS) {
|
|
67
|
+
progress(onProgress, 'Recent analysis exists', 'skip', `${Math.floor(age / 60000)} minutes old`);
|
|
68
|
+
// Load and return existing analysis
|
|
69
|
+
const repoStructure = await readJsonFile(repoStructurePath, ARTIFACT_REPO_STRUCTURE);
|
|
70
|
+
if (!repoStructure) {
|
|
71
|
+
throw new Error(`Failed to load ${ARTIFACT_REPO_STRUCTURE} — run openlore analyze --force to regenerate`);
|
|
72
|
+
}
|
|
73
|
+
const depGraph = await readJsonFile(join(outputPath, ARTIFACT_DEPENDENCY_GRAPH), ARTIFACT_DEPENDENCY_GRAPH) ?? undefined;
|
|
74
|
+
return {
|
|
75
|
+
repoMap: repoStructureToRepoMap(repoStructure),
|
|
76
|
+
depGraph: depGraph ?? {
|
|
77
|
+
nodes: [],
|
|
78
|
+
edges: [],
|
|
79
|
+
clusters: [],
|
|
80
|
+
cycles: [],
|
|
81
|
+
structuralClusters: [],
|
|
82
|
+
rankings: {
|
|
83
|
+
byImportance: [],
|
|
84
|
+
byConnectivity: [],
|
|
85
|
+
clusterCenters: [],
|
|
86
|
+
leafNodes: [],
|
|
87
|
+
bridgeNodes: [],
|
|
88
|
+
orphanNodes: [],
|
|
89
|
+
},
|
|
90
|
+
statistics: {
|
|
91
|
+
nodeCount: 0,
|
|
92
|
+
edgeCount: 0,
|
|
93
|
+
importEdgeCount: 0,
|
|
94
|
+
httpEdgeCount: 0,
|
|
95
|
+
clusterCount: 0,
|
|
96
|
+
cycleCount: 0,
|
|
97
|
+
avgDegree: 0,
|
|
98
|
+
density: 0,
|
|
99
|
+
structuralClusterCount: 0,
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
artifacts: await loadCachedArtifacts(outputPath, repoStructure),
|
|
103
|
+
duration: Date.now() - startTime,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Ensure output directory exists
|
|
109
|
+
await mkdir(outputPath, { recursive: true });
|
|
110
|
+
// Phase 1: Repository Mapping
|
|
111
|
+
progress(onProgress, 'Scanning directory structure', 'start');
|
|
112
|
+
const mapper = new RepositoryMapper(rootPath, {
|
|
113
|
+
maxFiles,
|
|
114
|
+
excludePatterns: excludePatterns.length > 0 ? excludePatterns : undefined,
|
|
115
|
+
includePatterns: includePatterns.length > 0 ? includePatterns : undefined,
|
|
116
|
+
});
|
|
117
|
+
const repoMap = await mapper.map();
|
|
118
|
+
progress(onProgress, 'Scanning directory structure', 'complete', `${repoMap.summary.analyzedFiles} files`);
|
|
119
|
+
// Phase 2: Dependency Graph
|
|
120
|
+
progress(onProgress, 'Building dependency graph', 'start');
|
|
121
|
+
const graphBuilder = new DependencyGraphBuilder({ rootDir: rootPath });
|
|
122
|
+
const depGraph = await graphBuilder.build(repoMap.allFiles);
|
|
123
|
+
progress(onProgress, 'Building dependency graph', 'complete', `${depGraph.statistics.nodeCount} nodes, ${depGraph.statistics.edgeCount} edges`);
|
|
124
|
+
// Phase 3: Generate Artifacts
|
|
125
|
+
progress(onProgress, 'Generating analysis artifacts', 'start');
|
|
126
|
+
const artifactGenerator = new AnalysisArtifactGenerator({
|
|
127
|
+
rootDir: rootPath,
|
|
128
|
+
outputDir: outputPath,
|
|
129
|
+
maxDeepAnalysisFiles: Math.min(20, Math.ceil(repoMap.highValueFiles.length * 0.3)),
|
|
130
|
+
maxValidationFiles: 5,
|
|
131
|
+
});
|
|
132
|
+
const artifacts = await artifactGenerator.generateAndSave(repoMap, depGraph);
|
|
133
|
+
// Save dependency graph
|
|
134
|
+
await writeFile(join(outputPath, ARTIFACT_DEPENDENCY_GRAPH), JSON.stringify(depGraph, null, 2));
|
|
135
|
+
progress(onProgress, 'Generating analysis artifacts', 'complete');
|
|
136
|
+
// Generate spec snapshot (non-fatal — snapshot is a derived artifact)
|
|
137
|
+
const openspecRelPath = openloreConfig.openspecPath ?? OPENSPEC_DIR;
|
|
138
|
+
const snapshotGenerator = new SpecSnapshotGenerator(rootPath, openspecRelPath);
|
|
139
|
+
await snapshotGenerator.generate().catch(() => { });
|
|
140
|
+
const duration = Date.now() - startTime;
|
|
141
|
+
return { repoMap, depGraph, artifacts, duration };
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/api/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openlore audit — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Compares current codebase state to the spec snapshot to report coverage gaps.
|
|
5
|
+
* No LLM required.
|
|
6
|
+
*/
|
|
7
|
+
import type { AuditReport } from '../types/index.js';
|
|
8
|
+
import type { AuditApiOptions } from './types.js';
|
|
9
|
+
export declare function openloreAudit(options?: AuditApiOptions): Promise<AuditReport>;
|
|
10
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/api/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA4ClD,wBAAsB,aAAa,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmFvF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openlore audit — programmatic API
|
|
3
|
+
*
|
|
4
|
+
* Compares current codebase state to the spec snapshot to report coverage gaps.
|
|
5
|
+
* No LLM required.
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
9
|
+
import { readOpenLoreConfig } from '../core/services/config-manager.js';
|
|
10
|
+
import { SpecSnapshotGenerator } from '../core/analyzer/spec-snapshot-generator.js';
|
|
11
|
+
import { OPENLORE_DIR, OPENLORE_ANALYSIS_SUBDIR, ARTIFACT_LLM_CONTEXT, ARTIFACT_MAPPING, ARTIFACT_AUDIT_REPORT, OPENSPEC_DIR, } from '../constants.js';
|
|
12
|
+
const DEFAULT_MAX_UNCOVERED = 50;
|
|
13
|
+
const DEFAULT_HUB_THRESHOLD = 5;
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// HELPERS
|
|
16
|
+
// ============================================================================
|
|
17
|
+
function buildCoveredSet(mapping) {
|
|
18
|
+
const covered = new Set();
|
|
19
|
+
for (const m of mapping.mappings) {
|
|
20
|
+
for (const fn of m.functions) {
|
|
21
|
+
if (fn.name && fn.name !== '*') {
|
|
22
|
+
covered.add(`${fn.file}::${fn.name}`);
|
|
23
|
+
covered.add(fn.name);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return covered;
|
|
28
|
+
}
|
|
29
|
+
function isNodeCovered(node, covered) {
|
|
30
|
+
return covered.has(`${node.filePath}::${node.name}`) || covered.has(node.name);
|
|
31
|
+
}
|
|
32
|
+
function toAuditFunction(node, isHub) {
|
|
33
|
+
return {
|
|
34
|
+
name: node.name,
|
|
35
|
+
file: node.filePath,
|
|
36
|
+
kind: node.className ? 'method' : 'function',
|
|
37
|
+
fanIn: node.fanIn,
|
|
38
|
+
fanOut: node.fanOut,
|
|
39
|
+
isHub,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// PUBLIC API
|
|
44
|
+
// ============================================================================
|
|
45
|
+
export async function openloreAudit(options = {}) {
|
|
46
|
+
const rootPath = options.rootPath ?? process.cwd();
|
|
47
|
+
const maxUncovered = options.maxUncovered ?? DEFAULT_MAX_UNCOVERED;
|
|
48
|
+
const hubThreshold = options.hubThreshold ?? DEFAULT_HUB_THRESHOLD;
|
|
49
|
+
const shouldSave = options.save ?? true;
|
|
50
|
+
const analysisDir = join(rootPath, OPENLORE_DIR, OPENLORE_ANALYSIS_SUBDIR);
|
|
51
|
+
// Load (or refresh) snapshot
|
|
52
|
+
const openloreConfig = await readOpenLoreConfig(rootPath);
|
|
53
|
+
const openspecRelPath = openloreConfig?.openspecPath ?? OPENSPEC_DIR;
|
|
54
|
+
const snapshotGen = new SpecSnapshotGenerator(rootPath, openspecRelPath);
|
|
55
|
+
const snapshot = await snapshotGen.generate().catch(() => null);
|
|
56
|
+
// Load raw artifacts for deep analysis
|
|
57
|
+
const [llmContextRaw, mappingRaw] = await Promise.all([
|
|
58
|
+
readFile(join(analysisDir, ARTIFACT_LLM_CONTEXT), 'utf-8').catch(() => null),
|
|
59
|
+
readFile(join(analysisDir, ARTIFACT_MAPPING), 'utf-8').catch(() => null),
|
|
60
|
+
]);
|
|
61
|
+
const llmContext = llmContextRaw ? JSON.parse(llmContextRaw) : null;
|
|
62
|
+
const mapping = mappingRaw ? JSON.parse(mappingRaw) : null;
|
|
63
|
+
const callGraph = llmContext?.callGraph;
|
|
64
|
+
const allNodes = callGraph?.nodes ?? [];
|
|
65
|
+
const hubNodes = new Set((callGraph?.hubFunctions ?? []).map(n => n.id));
|
|
66
|
+
// Build coverage set
|
|
67
|
+
const covered = mapping ? buildCoveredSet(mapping) : new Set();
|
|
68
|
+
// 1. Uncovered functions
|
|
69
|
+
const uncoveredNodes = allNodes.filter(n => !isNodeCovered(n, covered));
|
|
70
|
+
const uncoveredFunctions = uncoveredNodes
|
|
71
|
+
.slice(0, maxUncovered)
|
|
72
|
+
.map(n => toAuditFunction(n, hubNodes.has(n.id) || n.fanIn >= hubThreshold));
|
|
73
|
+
// 2. Hub gaps (hubs with no spec coverage)
|
|
74
|
+
const hubGaps = allNodes
|
|
75
|
+
.filter(n => (hubNodes.has(n.id) || n.fanIn >= hubThreshold) && !isNodeCovered(n, covered))
|
|
76
|
+
.map(n => toAuditFunction(n, true));
|
|
77
|
+
// 3. Orphan requirements (requirements in mapping with no matched function)
|
|
78
|
+
const orphanRequirements = mapping
|
|
79
|
+
? mapping.mappings
|
|
80
|
+
.filter(m => m.functions.length === 0 || m.functions.every(f => f.name === '*'))
|
|
81
|
+
.map(m => ({ requirement: m.requirement, domain: m.domain, specFile: m.specFile }))
|
|
82
|
+
: [];
|
|
83
|
+
// 4. Stale domains (source files modified after spec)
|
|
84
|
+
const staleDomains = snapshot
|
|
85
|
+
? snapshot.domains
|
|
86
|
+
.filter(d => d.sourcesModifiedAt > d.specModifiedAt)
|
|
87
|
+
.map(d => ({
|
|
88
|
+
name: d.name,
|
|
89
|
+
specFile: d.specFile,
|
|
90
|
+
specModifiedAt: d.specModifiedAt,
|
|
91
|
+
sourcesModifiedAt: d.sourcesModifiedAt,
|
|
92
|
+
staleSince: d.sourcesModifiedAt,
|
|
93
|
+
}))
|
|
94
|
+
: [];
|
|
95
|
+
const coveredCount = allNodes.length - uncoveredNodes.length;
|
|
96
|
+
const report = {
|
|
97
|
+
generatedAt: new Date().toISOString(),
|
|
98
|
+
summary: {
|
|
99
|
+
totalFunctions: allNodes.length,
|
|
100
|
+
coveredFunctions: coveredCount,
|
|
101
|
+
coveragePct: allNodes.length > 0 ? Math.round((coveredCount / allNodes.length) * 100) : 0,
|
|
102
|
+
uncoveredCount: uncoveredNodes.length,
|
|
103
|
+
hubGapCount: hubGaps.length,
|
|
104
|
+
orphanRequirementCount: orphanRequirements.length,
|
|
105
|
+
staleDomainCount: staleDomains.length,
|
|
106
|
+
},
|
|
107
|
+
uncoveredFunctions,
|
|
108
|
+
hubGaps,
|
|
109
|
+
orphanRequirements,
|
|
110
|
+
staleDomains,
|
|
111
|
+
};
|
|
112
|
+
if (shouldSave) {
|
|
113
|
+
await writeFile(join(analysisDir, ARTIFACT_AUDIT_REPORT), JSON.stringify(report, null, 2));
|
|
114
|
+
}
|
|
115
|
+
return report;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/api/audit.ts"],"names":[],"mappings":"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"}
|