cotx-engine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +94 -0
- package/README.md +103 -0
- package/dist/commands/compile.d.ts +3 -0
- package/dist/commands/compile.js +93 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/context.d.ts +1 -0
- package/dist/commands/context.js +98 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/diff.d.ts +19 -0
- package/dist/commands/diff.js +127 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/impact.d.ts +3 -0
- package/dist/commands/impact.js +91 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +13 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +13 -0
- package/dist/commands/lint.js +290 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/map.d.ts +6 -0
- package/dist/commands/map.js +409 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/migrate.d.ts +16 -0
- package/dist/commands/migrate.js +150 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/query.d.ts +3 -0
- package/dist/commands/query.js +47 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/rename.d.ts +5 -0
- package/dist/commands/rename.js +163 -0
- package/dist/commands/rename.js.map +1 -0
- package/dist/commands/snapshot.d.ts +6 -0
- package/dist/commands/snapshot.js +48 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +72 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +8 -0
- package/dist/commands/update.js +163 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/write.d.ts +6 -0
- package/dist/commands/write.js +221 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/compiler/auto-describe.d.ts +13 -0
- package/dist/compiler/auto-describe.js +91 -0
- package/dist/compiler/auto-describe.js.map +1 -0
- package/dist/compiler/concept-compiler.d.ts +21 -0
- package/dist/compiler/concept-compiler.js +125 -0
- package/dist/compiler/concept-compiler.js.map +1 -0
- package/dist/compiler/contract-compiler.d.ts +16 -0
- package/dist/compiler/contract-compiler.js +90 -0
- package/dist/compiler/contract-compiler.js.map +1 -0
- package/dist/compiler/delta-detector.d.ts +8 -0
- package/dist/compiler/delta-detector.js +34 -0
- package/dist/compiler/delta-detector.js.map +1 -0
- package/dist/compiler/flow-compiler.d.ts +18 -0
- package/dist/compiler/flow-compiler.js +69 -0
- package/dist/compiler/flow-compiler.js.map +1 -0
- package/dist/compiler/module-compiler.d.ts +18 -0
- package/dist/compiler/module-compiler.js +420 -0
- package/dist/compiler/module-compiler.js.map +1 -0
- package/dist/compiler/stale-detector.d.ts +22 -0
- package/dist/compiler/stale-detector.js +79 -0
- package/dist/compiler/stale-detector.js.map +1 -0
- package/dist/config/ignore-service.d.ts +26 -0
- package/dist/config/ignore-service.js +366 -0
- package/dist/config/ignore-service.js.map +1 -0
- package/dist/core/analysis/cluster-enricher.d.ts +38 -0
- package/dist/core/analysis/cluster-enricher.js +169 -0
- package/dist/core/analysis/cluster-enricher.js.map +1 -0
- package/dist/core/analysis/community-processor.d.ts +39 -0
- package/dist/core/analysis/community-processor.js +319 -0
- package/dist/core/analysis/community-processor.js.map +1 -0
- package/dist/core/analysis/process-processor.d.ts +51 -0
- package/dist/core/analysis/process-processor.js +318 -0
- package/dist/core/analysis/process-processor.js.map +1 -0
- package/dist/core/bridge.d.ts +15 -0
- package/dist/core/bridge.js +63 -0
- package/dist/core/bridge.js.map +1 -0
- package/dist/core/export/json-exporter.d.ts +43 -0
- package/dist/core/export/json-exporter.js +13 -0
- package/dist/core/export/json-exporter.js.map +1 -0
- package/dist/core/graph/graph.d.ts +2 -0
- package/dist/core/graph/graph.js +79 -0
- package/dist/core/graph/graph.js.map +1 -0
- package/dist/core/graph/types.d.ts +25 -0
- package/dist/core/graph/types.js +2 -0
- package/dist/core/graph/types.js.map +1 -0
- package/dist/core/parser/ast-cache.d.ts +11 -0
- package/dist/core/parser/ast-cache.js +36 -0
- package/dist/core/parser/ast-cache.js.map +1 -0
- package/dist/core/parser/call-processor.d.ts +105 -0
- package/dist/core/parser/call-processor.js +1807 -0
- package/dist/core/parser/call-processor.js.map +1 -0
- package/dist/core/parser/call-routing.d.ts +55 -0
- package/dist/core/parser/call-routing.js +113 -0
- package/dist/core/parser/call-routing.js.map +1 -0
- package/dist/core/parser/call-sites/extract-language-call-site.d.ts +10 -0
- package/dist/core/parser/call-sites/extract-language-call-site.js +23 -0
- package/dist/core/parser/call-sites/extract-language-call-site.js.map +1 -0
- package/dist/core/parser/call-sites/java.d.ts +9 -0
- package/dist/core/parser/call-sites/java.js +31 -0
- package/dist/core/parser/call-sites/java.js.map +1 -0
- package/dist/core/parser/cluster-enricher.d.ts +38 -0
- package/dist/core/parser/cluster-enricher.js +169 -0
- package/dist/core/parser/cluster-enricher.js.map +1 -0
- package/dist/core/parser/community-processor.d.ts +39 -0
- package/dist/core/parser/community-processor.js +321 -0
- package/dist/core/parser/community-processor.js.map +1 -0
- package/dist/core/parser/constants.d.ts +16 -0
- package/dist/core/parser/constants.js +17 -0
- package/dist/core/parser/constants.js.map +1 -0
- package/dist/core/parser/entry-point-scoring.d.ts +57 -0
- package/dist/core/parser/entry-point-scoring.js +377 -0
- package/dist/core/parser/entry-point-scoring.js.map +1 -0
- package/dist/core/parser/export-detection.d.ts +57 -0
- package/dist/core/parser/export-detection.js +234 -0
- package/dist/core/parser/export-detection.js.map +1 -0
- package/dist/core/parser/field-extractor.d.ts +34 -0
- package/dist/core/parser/field-extractor.js +33 -0
- package/dist/core/parser/field-extractor.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/c-cpp.d.ts +16 -0
- package/dist/core/parser/field-extractors/configs/c-cpp.js +129 -0
- package/dist/core/parser/field-extractors/configs/c-cpp.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/csharp.d.ts +15 -0
- package/dist/core/parser/field-extractors/configs/csharp.js +129 -0
- package/dist/core/parser/field-extractors/configs/csharp.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/dart.d.ts +12 -0
- package/dist/core/parser/field-extractors/configs/dart.js +93 -0
- package/dist/core/parser/field-extractors/configs/dart.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/go.d.ts +12 -0
- package/dist/core/parser/field-extractors/configs/go.js +66 -0
- package/dist/core/parser/field-extractors/configs/go.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/helpers.d.ts +40 -0
- package/dist/core/parser/field-extractors/configs/helpers.js +118 -0
- package/dist/core/parser/field-extractors/configs/helpers.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/jvm.d.ts +17 -0
- package/dist/core/parser/field-extractors/configs/jvm.js +139 -0
- package/dist/core/parser/field-extractors/configs/jvm.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/php.d.ts +12 -0
- package/dist/core/parser/field-extractors/configs/php.js +69 -0
- package/dist/core/parser/field-extractors/configs/php.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/python.d.ts +15 -0
- package/dist/core/parser/field-extractors/configs/python.js +92 -0
- package/dist/core/parser/field-extractors/configs/python.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/ruby.d.ts +15 -0
- package/dist/core/parser/field-extractors/configs/ruby.js +68 -0
- package/dist/core/parser/field-extractors/configs/ruby.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/rust.d.ts +12 -0
- package/dist/core/parser/field-extractors/configs/rust.js +58 -0
- package/dist/core/parser/field-extractors/configs/rust.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/swift.d.ts +15 -0
- package/dist/core/parser/field-extractors/configs/swift.js +75 -0
- package/dist/core/parser/field-extractors/configs/swift.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/typescript-javascript.d.ts +14 -0
- package/dist/core/parser/field-extractors/configs/typescript-javascript.js +72 -0
- package/dist/core/parser/field-extractors/configs/typescript-javascript.js.map +1 -0
- package/dist/core/parser/field-extractors/generic.d.ts +61 -0
- package/dist/core/parser/field-extractors/generic.js +170 -0
- package/dist/core/parser/field-extractors/generic.js.map +1 -0
- package/dist/core/parser/field-extractors/typescript.d.ts +16 -0
- package/dist/core/parser/field-extractors/typescript.js +167 -0
- package/dist/core/parser/field-extractors/typescript.js.map +1 -0
- package/dist/core/parser/field-types.d.ts +46 -0
- package/dist/core/parser/field-types.js +2 -0
- package/dist/core/parser/field-types.js.map +1 -0
- package/dist/core/parser/filesystem-walker.d.ts +28 -0
- package/dist/core/parser/filesystem-walker.js +82 -0
- package/dist/core/parser/filesystem-walker.js.map +1 -0
- package/dist/core/parser/framework-detection.d.ts +149 -0
- package/dist/core/parser/framework-detection.js +782 -0
- package/dist/core/parser/framework-detection.js.map +1 -0
- package/dist/core/parser/heritage-processor.d.ts +52 -0
- package/dist/core/parser/heritage-processor.js +339 -0
- package/dist/core/parser/heritage-processor.js.map +1 -0
- package/dist/core/parser/import-processor.d.ts +33 -0
- package/dist/core/parser/import-processor.js +382 -0
- package/dist/core/parser/import-processor.js.map +1 -0
- package/dist/core/parser/import-resolvers/csharp.d.ts +19 -0
- package/dist/core/parser/import-resolvers/csharp.js +132 -0
- package/dist/core/parser/import-resolvers/csharp.js.map +1 -0
- package/dist/core/parser/import-resolvers/dart.d.ts +7 -0
- package/dist/core/parser/import-resolvers/dart.js +45 -0
- package/dist/core/parser/import-resolvers/dart.js.map +1 -0
- package/dist/core/parser/import-resolvers/go.d.ts +18 -0
- package/dist/core/parser/import-resolvers/go.js +62 -0
- package/dist/core/parser/import-resolvers/go.js.map +1 -0
- package/dist/core/parser/import-resolvers/jvm.d.ts +32 -0
- package/dist/core/parser/import-resolvers/jvm.js +160 -0
- package/dist/core/parser/import-resolvers/jvm.js.map +1 -0
- package/dist/core/parser/import-resolvers/php.d.ts +25 -0
- package/dist/core/parser/import-resolvers/php.js +81 -0
- package/dist/core/parser/import-resolvers/php.js.map +1 -0
- package/dist/core/parser/import-resolvers/python.d.ts +25 -0
- package/dist/core/parser/import-resolvers/python.js +85 -0
- package/dist/core/parser/import-resolvers/python.js.map +1 -0
- package/dist/core/parser/import-resolvers/ruby.d.ts +15 -0
- package/dist/core/parser/import-resolvers/ruby.js +21 -0
- package/dist/core/parser/import-resolvers/ruby.js.map +1 -0
- package/dist/core/parser/import-resolvers/rust.d.ts +18 -0
- package/dist/core/parser/import-resolvers/rust.js +119 -0
- package/dist/core/parser/import-resolvers/rust.js.map +1 -0
- package/dist/core/parser/import-resolvers/standard.d.ts +36 -0
- package/dist/core/parser/import-resolvers/standard.js +144 -0
- package/dist/core/parser/import-resolvers/standard.js.map +1 -0
- package/dist/core/parser/import-resolvers/swift.d.ts +7 -0
- package/dist/core/parser/import-resolvers/swift.js +25 -0
- package/dist/core/parser/import-resolvers/swift.js.map +1 -0
- package/dist/core/parser/import-resolvers/types.d.ts +44 -0
- package/dist/core/parser/import-resolvers/types.js +7 -0
- package/dist/core/parser/import-resolvers/types.js.map +1 -0
- package/dist/core/parser/import-resolvers/utils.d.ts +35 -0
- package/dist/core/parser/import-resolvers/utils.js +150 -0
- package/dist/core/parser/import-resolvers/utils.js.map +1 -0
- package/dist/core/parser/import-resolvers/vue.d.ts +8 -0
- package/dist/core/parser/import-resolvers/vue.js +10 -0
- package/dist/core/parser/import-resolvers/vue.js.map +1 -0
- package/dist/core/parser/language-config.d.ts +52 -0
- package/dist/core/parser/language-config.js +182 -0
- package/dist/core/parser/language-config.js.map +1 -0
- package/dist/core/parser/language-provider.d.ts +126 -0
- package/dist/core/parser/language-provider.js +25 -0
- package/dist/core/parser/language-provider.js.map +1 -0
- package/dist/core/parser/languages/c-cpp.d.ts +12 -0
- package/dist/core/parser/languages/c-cpp.js +312 -0
- package/dist/core/parser/languages/c-cpp.js.map +1 -0
- package/dist/core/parser/languages/csharp.d.ts +8 -0
- package/dist/core/parser/languages/csharp.js +127 -0
- package/dist/core/parser/languages/csharp.js.map +1 -0
- package/dist/core/parser/languages/dart.d.ts +12 -0
- package/dist/core/parser/languages/dart.js +91 -0
- package/dist/core/parser/languages/dart.js.map +1 -0
- package/dist/core/parser/languages/go.d.ts +11 -0
- package/dist/core/parser/languages/go.js +32 -0
- package/dist/core/parser/languages/go.js.map +1 -0
- package/dist/core/parser/languages/index.d.ts +38 -0
- package/dist/core/parser/languages/index.js +63 -0
- package/dist/core/parser/languages/index.js.map +1 -0
- package/dist/core/parser/languages/java.d.ts +9 -0
- package/dist/core/parser/languages/java.js +33 -0
- package/dist/core/parser/languages/java.js.map +1 -0
- package/dist/core/parser/languages/kotlin.d.ts +9 -0
- package/dist/core/parser/languages/kotlin.js +112 -0
- package/dist/core/parser/languages/kotlin.js.map +1 -0
- package/dist/core/parser/languages/php.d.ts +8 -0
- package/dist/core/parser/languages/php.js +226 -0
- package/dist/core/parser/languages/php.js.map +1 -0
- package/dist/core/parser/languages/python.d.ts +12 -0
- package/dist/core/parser/languages/python.js +66 -0
- package/dist/core/parser/languages/python.js.map +1 -0
- package/dist/core/parser/languages/ruby.d.ts +9 -0
- package/dist/core/parser/languages/ruby.js +109 -0
- package/dist/core/parser/languages/ruby.js.map +1 -0
- package/dist/core/parser/languages/rust.d.ts +12 -0
- package/dist/core/parser/languages/rust.js +121 -0
- package/dist/core/parser/languages/rust.js.map +1 -0
- package/dist/core/parser/languages/swift.d.ts +12 -0
- package/dist/core/parser/languages/swift.js +233 -0
- package/dist/core/parser/languages/swift.js.map +1 -0
- package/dist/core/parser/languages/typescript.d.ts +11 -0
- package/dist/core/parser/languages/typescript.js +169 -0
- package/dist/core/parser/languages/typescript.js.map +1 -0
- package/dist/core/parser/languages/vue.d.ts +13 -0
- package/dist/core/parser/languages/vue.js +65 -0
- package/dist/core/parser/languages/vue.js.map +1 -0
- package/dist/core/parser/markdown-processor.d.ts +17 -0
- package/dist/core/parser/markdown-processor.js +125 -0
- package/dist/core/parser/markdown-processor.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/c-cpp.d.ts +3 -0
- package/dist/core/parser/method-extractors/configs/c-cpp.js +276 -0
- package/dist/core/parser/method-extractors/configs/c-cpp.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/csharp.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/csharp.js +243 -0
- package/dist/core/parser/method-extractors/configs/csharp.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/dart.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/dart.js +263 -0
- package/dist/core/parser/method-extractors/configs/dart.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/go.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/go.js +120 -0
- package/dist/core/parser/method-extractors/configs/go.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/jvm.d.ts +3 -0
- package/dist/core/parser/method-extractors/configs/jvm.js +309 -0
- package/dist/core/parser/method-extractors/configs/jvm.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/php.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/php.js +243 -0
- package/dist/core/parser/method-extractors/configs/php.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/python.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/python.js +219 -0
- package/dist/core/parser/method-extractors/configs/python.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/ruby.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/ruby.js +201 -0
- package/dist/core/parser/method-extractors/configs/ruby.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/rust.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/rust.js +120 -0
- package/dist/core/parser/method-extractors/configs/rust.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/swift.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/swift.js +191 -0
- package/dist/core/parser/method-extractors/configs/swift.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/typescript-javascript.d.ts +3 -0
- package/dist/core/parser/method-extractors/configs/typescript-javascript.js +231 -0
- package/dist/core/parser/method-extractors/configs/typescript-javascript.js.map +1 -0
- package/dist/core/parser/method-extractors/generic.d.ts +11 -0
- package/dist/core/parser/method-extractors/generic.js +162 -0
- package/dist/core/parser/method-extractors/generic.js.map +1 -0
- package/dist/core/parser/method-types.d.ts +110 -0
- package/dist/core/parser/method-types.js +2 -0
- package/dist/core/parser/method-types.js.map +1 -0
- package/dist/core/parser/mro-processor.d.ts +46 -0
- package/dist/core/parser/mro-processor.js +677 -0
- package/dist/core/parser/mro-processor.js.map +1 -0
- package/dist/core/parser/named-binding-processor.d.ts +18 -0
- package/dist/core/parser/named-binding-processor.js +43 -0
- package/dist/core/parser/named-binding-processor.js.map +1 -0
- package/dist/core/parser/named-bindings/csharp.d.ts +3 -0
- package/dist/core/parser/named-bindings/csharp.js +38 -0
- package/dist/core/parser/named-bindings/csharp.js.map +1 -0
- package/dist/core/parser/named-bindings/java.d.ts +3 -0
- package/dist/core/parser/named-bindings/java.js +30 -0
- package/dist/core/parser/named-bindings/java.js.map +1 -0
- package/dist/core/parser/named-bindings/kotlin.d.ts +3 -0
- package/dist/core/parser/named-bindings/kotlin.js +37 -0
- package/dist/core/parser/named-bindings/kotlin.js.map +1 -0
- package/dist/core/parser/named-bindings/php.d.ts +3 -0
- package/dist/core/parser/named-bindings/php.js +62 -0
- package/dist/core/parser/named-bindings/php.js.map +1 -0
- package/dist/core/parser/named-bindings/python.d.ts +3 -0
- package/dist/core/parser/named-bindings/python.js +50 -0
- package/dist/core/parser/named-bindings/python.js.map +1 -0
- package/dist/core/parser/named-bindings/rust.d.ts +3 -0
- package/dist/core/parser/named-bindings/rust.js +67 -0
- package/dist/core/parser/named-bindings/rust.js.map +1 -0
- package/dist/core/parser/named-bindings/types.d.ts +16 -0
- package/dist/core/parser/named-bindings/types.js +7 -0
- package/dist/core/parser/named-bindings/types.js.map +1 -0
- package/dist/core/parser/named-bindings/typescript.d.ts +3 -0
- package/dist/core/parser/named-bindings/typescript.js +59 -0
- package/dist/core/parser/named-bindings/typescript.js.map +1 -0
- package/dist/core/parser/parsing-processor.d.ts +23 -0
- package/dist/core/parser/parsing-processor.js +464 -0
- package/dist/core/parser/parsing-processor.js.map +1 -0
- package/dist/core/parser/pipeline.d.ts +17 -0
- package/dist/core/parser/pipeline.js +1405 -0
- package/dist/core/parser/pipeline.js.map +1 -0
- package/dist/core/parser/process-processor.d.ts +51 -0
- package/dist/core/parser/process-processor.js +318 -0
- package/dist/core/parser/process-processor.js.map +1 -0
- package/dist/core/parser/resolution-context.d.ts +58 -0
- package/dist/core/parser/resolution-context.js +136 -0
- package/dist/core/parser/resolution-context.js.map +1 -0
- package/dist/core/parser/route-extractors/expo.d.ts +1 -0
- package/dist/core/parser/route-extractors/expo.js +37 -0
- package/dist/core/parser/route-extractors/expo.js.map +1 -0
- package/dist/core/parser/route-extractors/middleware.d.ts +47 -0
- package/dist/core/parser/route-extractors/middleware.js +168 -0
- package/dist/core/parser/route-extractors/middleware.js.map +1 -0
- package/dist/core/parser/route-extractors/nextjs.d.ts +3 -0
- package/dist/core/parser/route-extractors/nextjs.js +77 -0
- package/dist/core/parser/route-extractors/nextjs.js.map +1 -0
- package/dist/core/parser/route-extractors/php.d.ts +7 -0
- package/dist/core/parser/route-extractors/php.js +23 -0
- package/dist/core/parser/route-extractors/php.js.map +1 -0
- package/dist/core/parser/route-extractors/response-shapes.d.ts +20 -0
- package/dist/core/parser/route-extractors/response-shapes.js +295 -0
- package/dist/core/parser/route-extractors/response-shapes.js.map +1 -0
- package/dist/core/parser/structure-processor.d.ts +2 -0
- package/dist/core/parser/structure-processor.js +37 -0
- package/dist/core/parser/structure-processor.js.map +1 -0
- package/dist/core/parser/symbol-table.d.ts +79 -0
- package/dist/core/parser/symbol-table.js +116 -0
- package/dist/core/parser/symbol-table.js.map +1 -0
- package/dist/core/parser/tree-sitter-queries.d.ts +16 -0
- package/dist/core/parser/tree-sitter-queries.js +1180 -0
- package/dist/core/parser/tree-sitter-queries.js.map +1 -0
- package/dist/core/parser/type-env.d.ts +81 -0
- package/dist/core/parser/type-env.js +1048 -0
- package/dist/core/parser/type-env.js.map +1 -0
- package/dist/core/parser/type-extractors/c-cpp.d.ts +7 -0
- package/dist/core/parser/type-extractors/c-cpp.js +533 -0
- package/dist/core/parser/type-extractors/c-cpp.js.map +1 -0
- package/dist/core/parser/type-extractors/csharp.d.ts +2 -0
- package/dist/core/parser/type-extractors/csharp.js +584 -0
- package/dist/core/parser/type-extractors/csharp.js.map +1 -0
- package/dist/core/parser/type-extractors/dart.d.ts +15 -0
- package/dist/core/parser/type-extractors/dart.js +370 -0
- package/dist/core/parser/type-extractors/dart.js.map +1 -0
- package/dist/core/parser/type-extractors/go.d.ts +2 -0
- package/dist/core/parser/type-extractors/go.js +514 -0
- package/dist/core/parser/type-extractors/go.js.map +1 -0
- package/dist/core/parser/type-extractors/jvm.d.ts +3 -0
- package/dist/core/parser/type-extractors/jvm.js +857 -0
- package/dist/core/parser/type-extractors/jvm.js.map +1 -0
- package/dist/core/parser/type-extractors/php.d.ts +2 -0
- package/dist/core/parser/type-extractors/php.js +535 -0
- package/dist/core/parser/type-extractors/php.js.map +1 -0
- package/dist/core/parser/type-extractors/python.d.ts +2 -0
- package/dist/core/parser/type-extractors/python.js +475 -0
- package/dist/core/parser/type-extractors/python.js.map +1 -0
- package/dist/core/parser/type-extractors/ruby.d.ts +2 -0
- package/dist/core/parser/type-extractors/ruby.js +378 -0
- package/dist/core/parser/type-extractors/ruby.js.map +1 -0
- package/dist/core/parser/type-extractors/rust.d.ts +2 -0
- package/dist/core/parser/type-extractors/rust.js +516 -0
- package/dist/core/parser/type-extractors/rust.js.map +1 -0
- package/dist/core/parser/type-extractors/shared.d.ts +131 -0
- package/dist/core/parser/type-extractors/shared.js +797 -0
- package/dist/core/parser/type-extractors/shared.js.map +1 -0
- package/dist/core/parser/type-extractors/swift.d.ts +2 -0
- package/dist/core/parser/type-extractors/swift.js +485 -0
- package/dist/core/parser/type-extractors/swift.js.map +1 -0
- package/dist/core/parser/type-extractors/types.d.ts +172 -0
- package/dist/core/parser/type-extractors/types.js +2 -0
- package/dist/core/parser/type-extractors/types.js.map +1 -0
- package/dist/core/parser/type-extractors/typescript.d.ts +2 -0
- package/dist/core/parser/type-extractors/typescript.js +662 -0
- package/dist/core/parser/type-extractors/typescript.js.map +1 -0
- package/dist/core/parser/utils/ast-helpers.d.ts +73 -0
- package/dist/core/parser/utils/ast-helpers.js +415 -0
- package/dist/core/parser/utils/ast-helpers.js.map +1 -0
- package/dist/core/parser/utils/call-analysis.d.ts +75 -0
- package/dist/core/parser/utils/call-analysis.js +575 -0
- package/dist/core/parser/utils/call-analysis.js.map +1 -0
- package/dist/core/parser/utils/event-loop.d.ts +5 -0
- package/dist/core/parser/utils/event-loop.js +6 -0
- package/dist/core/parser/utils/event-loop.js.map +1 -0
- package/dist/core/parser/utils/method-props.d.ts +8 -0
- package/dist/core/parser/utils/method-props.js +39 -0
- package/dist/core/parser/utils/method-props.js.map +1 -0
- package/dist/core/parser/utils/verbose.d.ts +1 -0
- package/dist/core/parser/utils/verbose.js +8 -0
- package/dist/core/parser/utils/verbose.js.map +1 -0
- package/dist/core/parser/vue-sfc-extractor.d.ts +44 -0
- package/dist/core/parser/vue-sfc-extractor.js +95 -0
- package/dist/core/parser/vue-sfc-extractor.js.map +1 -0
- package/dist/core/parser/workers/parse-worker.d.ts +171 -0
- package/dist/core/parser/workers/parse-worker.js +1724 -0
- package/dist/core/parser/workers/parse-worker.js.map +1 -0
- package/dist/core/parser/workers/worker-pool.d.ts +16 -0
- package/dist/core/parser/workers/worker-pool.js +124 -0
- package/dist/core/parser/workers/worker-pool.js.map +1 -0
- package/dist/core/shared/graph-types.d.ts +61 -0
- package/dist/core/shared/graph-types.js +5 -0
- package/dist/core/shared/graph-types.js.map +1 -0
- package/dist/core/shared/index.d.ts +4 -0
- package/dist/core/shared/index.js +4 -0
- package/dist/core/shared/index.js.map +1 -0
- package/dist/core/shared/language-detection.d.ts +22 -0
- package/dist/core/shared/language-detection.js +137 -0
- package/dist/core/shared/language-detection.js.map +1 -0
- package/dist/core/shared/languages.d.ts +23 -0
- package/dist/core/shared/languages.js +25 -0
- package/dist/core/shared/languages.js.map +1 -0
- package/dist/core/shared/pipeline.d.ts +15 -0
- package/dist/core/shared/pipeline.js +5 -0
- package/dist/core/shared/pipeline.js.map +1 -0
- package/dist/core/tree-sitter/parser-loader.d.ts +5 -0
- package/dist/core/tree-sitter/parser-loader.js +71 -0
- package/dist/core/tree-sitter/parser-loader.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/hash.d.ts +1 -0
- package/dist/lib/hash.js +6 -0
- package/dist/lib/hash.js.map +1 -0
- package/dist/lib/naming.d.ts +12 -0
- package/dist/lib/naming.js +28 -0
- package/dist/lib/naming.js.map +1 -0
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.js +4 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/mcp/server.d.ts +26 -0
- package/dist/mcp/server.js +282 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +37 -0
- package/dist/mcp/tools.js +650 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/query/bm25.d.ts +19 -0
- package/dist/query/bm25.js +60 -0
- package/dist/query/bm25.js.map +1 -0
- package/dist/query/graph-index.d.ts +40 -0
- package/dist/query/graph-index.js +178 -0
- package/dist/query/graph-index.js.map +1 -0
- package/dist/store/derived-index.d.ts +4 -0
- package/dist/store/derived-index.js +68 -0
- package/dist/store/derived-index.js.map +1 -0
- package/dist/store/meta.d.ts +1 -0
- package/dist/store/meta.js +3 -0
- package/dist/store/meta.js.map +1 -0
- package/dist/store/schema.d.ts +135 -0
- package/dist/store/schema.js +2 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/store.d.ts +49 -0
- package/dist/store/store.js +254 -0
- package/dist/store/store.js.map +1 -0
- package/dist/types/pipeline.d.ts +12 -0
- package/dist/types/pipeline.js +2 -0
- package/dist/types/pipeline.js.map +1 -0
- package/package.json +69 -0
- package/skills/cotx-enrich/SKILL.md +59 -0
- package/vendor/leiden/index.cjs +355 -0
- package/vendor/leiden/utils.cjs +392 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { CotxStore } from '../store/store.js';
|
|
2
|
+
import { rebuildDerivedIndex } from '../store/derived-index.js';
|
|
3
|
+
import { CotxGraph } from '../query/graph-index.js';
|
|
4
|
+
// ── Zone protection ─────────────────────────────────────────────────────────
|
|
5
|
+
const DETERMINISTIC_FIELDS = new Set([
|
|
6
|
+
'id',
|
|
7
|
+
'files',
|
|
8
|
+
'struct_hash',
|
|
9
|
+
'canonical_entry',
|
|
10
|
+
'depends_on',
|
|
11
|
+
'depended_by',
|
|
12
|
+
'provider',
|
|
13
|
+
'consumer',
|
|
14
|
+
'interface',
|
|
15
|
+
'trigger',
|
|
16
|
+
'steps',
|
|
17
|
+
'states',
|
|
18
|
+
'transitions',
|
|
19
|
+
'aliases',
|
|
20
|
+
'appears_in',
|
|
21
|
+
'layer',
|
|
22
|
+
'type',
|
|
23
|
+
'owner_module',
|
|
24
|
+
'state_field',
|
|
25
|
+
'auto_description',
|
|
26
|
+
]);
|
|
27
|
+
const ENRICHED_FIELD_SHAPES = {
|
|
28
|
+
module: {
|
|
29
|
+
responsibility: 'string',
|
|
30
|
+
key_patterns: 'string',
|
|
31
|
+
},
|
|
32
|
+
concept: {
|
|
33
|
+
definition: 'string',
|
|
34
|
+
distinguished_from: 'distinguished_from',
|
|
35
|
+
},
|
|
36
|
+
contract: {
|
|
37
|
+
guarantees: 'string[]',
|
|
38
|
+
invariants: 'string[]',
|
|
39
|
+
},
|
|
40
|
+
flow: {
|
|
41
|
+
error_paths: 'error_paths',
|
|
42
|
+
guards: 'guards',
|
|
43
|
+
invariants: 'string[]',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
function parseStructuredArray(content) {
|
|
47
|
+
const parsed = JSON.parse(content);
|
|
48
|
+
if (!Array.isArray(parsed)) {
|
|
49
|
+
throw new Error('expected a JSON array');
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
function parseEnrichedValue(layer, fieldName, content) {
|
|
54
|
+
const shape = ENRICHED_FIELD_SHAPES[layer]?.[fieldName] ?? 'string';
|
|
55
|
+
switch (shape) {
|
|
56
|
+
case 'string':
|
|
57
|
+
return content;
|
|
58
|
+
case 'string[]': {
|
|
59
|
+
const parsed = parseStructuredArray(content);
|
|
60
|
+
if (!parsed.every((item) => typeof item === 'string')) {
|
|
61
|
+
throw new Error('expected an array of strings');
|
|
62
|
+
}
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
case 'error_paths': {
|
|
66
|
+
const parsed = parseStructuredArray(content);
|
|
67
|
+
if (!parsed.every((item) => item &&
|
|
68
|
+
typeof item === 'object' &&
|
|
69
|
+
typeof item.condition === 'string' &&
|
|
70
|
+
typeof item.behavior === 'string')) {
|
|
71
|
+
throw new Error('expected [{condition, behavior}, ...]');
|
|
72
|
+
}
|
|
73
|
+
return parsed;
|
|
74
|
+
}
|
|
75
|
+
case 'guards': {
|
|
76
|
+
const parsed = parseStructuredArray(content);
|
|
77
|
+
if (!parsed.every((item) => item &&
|
|
78
|
+
typeof item === 'object' &&
|
|
79
|
+
typeof item.transition === 'string' &&
|
|
80
|
+
typeof item.condition === 'string')) {
|
|
81
|
+
throw new Error('expected [{transition, condition}, ...]');
|
|
82
|
+
}
|
|
83
|
+
return parsed;
|
|
84
|
+
}
|
|
85
|
+
case 'distinguished_from': {
|
|
86
|
+
const parsed = parseStructuredArray(content);
|
|
87
|
+
if (!parsed.every((item) => item &&
|
|
88
|
+
typeof item === 'object' &&
|
|
89
|
+
typeof item.term === 'string' &&
|
|
90
|
+
typeof item.difference === 'string')) {
|
|
91
|
+
throw new Error('expected [{term, difference}, ...]');
|
|
92
|
+
}
|
|
93
|
+
return parsed;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// ── Node lookup ──────────────────────────────────────────────────────────────
|
|
98
|
+
function findNodeAcrossLayers(store, nodeId) {
|
|
99
|
+
if (store.listModules().includes(nodeId)) {
|
|
100
|
+
return { layer: 'module', data: store.readModule(nodeId) };
|
|
101
|
+
}
|
|
102
|
+
if (store.listConcepts().includes(nodeId)) {
|
|
103
|
+
return { layer: 'concept', data: store.readConcept(nodeId) };
|
|
104
|
+
}
|
|
105
|
+
if (store.listContracts().includes(nodeId)) {
|
|
106
|
+
return {
|
|
107
|
+
layer: 'contract',
|
|
108
|
+
data: store.readContract(nodeId),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (store.listFlows().includes(nodeId)) {
|
|
112
|
+
return { layer: 'flow', data: store.readFlow(nodeId) };
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
// ── Write helpers ────────────────────────────────────────────────────────────
|
|
117
|
+
function writeNodeToStore(store, layer, data) {
|
|
118
|
+
switch (layer) {
|
|
119
|
+
case 'module':
|
|
120
|
+
store.writeModule(data);
|
|
121
|
+
break;
|
|
122
|
+
case 'concept':
|
|
123
|
+
store.writeConcept(data);
|
|
124
|
+
break;
|
|
125
|
+
case 'contract':
|
|
126
|
+
store.writeContract(data);
|
|
127
|
+
break;
|
|
128
|
+
case 'flow':
|
|
129
|
+
store.writeFlow(data);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function writeEnriched(store, node, fieldName, content) {
|
|
134
|
+
if (DETERMINISTIC_FIELDS.has(fieldName)) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
message: `Field "${fieldName}" is deterministic-only and cannot be written via enriched zone.`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const data = node.data;
|
|
141
|
+
if (!data.enriched) {
|
|
142
|
+
data.enriched = { source_hash: data.struct_hash, enriched_at: new Date().toISOString() };
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
data.enriched[fieldName] = parseEnrichedValue(node.layer, fieldName, content);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
message: `Invalid enriched.${fieldName}: ${message}`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
data.enriched['source_hash'] = data.struct_hash;
|
|
155
|
+
data.enriched['enriched_at'] = new Date().toISOString();
|
|
156
|
+
writeNodeToStore(store, node.layer, data);
|
|
157
|
+
rebuildDerivedIndex(store);
|
|
158
|
+
CotxGraph.invalidateCache();
|
|
159
|
+
return { success: true, message: `Updated ${node.layer}/${data.id} enriched.${fieldName}` };
|
|
160
|
+
}
|
|
161
|
+
function writeAnnotation(store, node, annotationType, content, options) {
|
|
162
|
+
const validTypes = ['constraint', 'intent', 'concern', 'question'];
|
|
163
|
+
if (!validTypes.includes(annotationType)) {
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
message: `Invalid annotation type: ${annotationType}. Use: ${validTypes.join(', ')}`,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const data = node.data;
|
|
170
|
+
if (!data.annotations)
|
|
171
|
+
data.annotations = [];
|
|
172
|
+
data.annotations.push({
|
|
173
|
+
author: options?.author ?? 'human',
|
|
174
|
+
type: annotationType,
|
|
175
|
+
content,
|
|
176
|
+
date: new Date().toISOString().split('T')[0],
|
|
177
|
+
});
|
|
178
|
+
writeNodeToStore(store, node.layer, data);
|
|
179
|
+
rebuildDerivedIndex(store);
|
|
180
|
+
CotxGraph.invalidateCache();
|
|
181
|
+
return {
|
|
182
|
+
success: true,
|
|
183
|
+
message: `Added ${annotationType} annotation to ${node.layer}/${data.id}`,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// ── Public API ───────────────────────────────────────────────────────────────
|
|
187
|
+
export async function commandWrite(projectRoot, nodeId, field, content, options) {
|
|
188
|
+
const store = new CotxStore(projectRoot);
|
|
189
|
+
if (!store.exists()) {
|
|
190
|
+
return { success: false, message: 'No .cotx/ found. Run: cotx compile' };
|
|
191
|
+
}
|
|
192
|
+
const [zone, fieldName] = field.split('.', 2);
|
|
193
|
+
if (!zone || !fieldName) {
|
|
194
|
+
return {
|
|
195
|
+
success: false,
|
|
196
|
+
message: `Invalid field: ${field}. Use enriched.<field> or annotation.<type>`,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
const node = findNodeAcrossLayers(store, nodeId);
|
|
200
|
+
if (!node) {
|
|
201
|
+
return { success: false, message: `Node "${nodeId}" not found` };
|
|
202
|
+
}
|
|
203
|
+
let result;
|
|
204
|
+
if (zone === 'enriched') {
|
|
205
|
+
result = writeEnriched(store, node, fieldName, content);
|
|
206
|
+
}
|
|
207
|
+
else if (zone === 'annotation') {
|
|
208
|
+
result = writeAnnotation(store, node, fieldName, content, options);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
return {
|
|
212
|
+
success: false,
|
|
213
|
+
message: `Unknown zone: ${zone}. Use enriched or annotation`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
if (result.success) {
|
|
217
|
+
store.appendLog({ operation: 'write', affected_nodes: [nodeId], summary: `${field} on ${nodeId}` });
|
|
218
|
+
}
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CotxStore } from '../store/store.js';
|
|
2
|
+
import type { ModuleNode } from '../store/schema.js';
|
|
3
|
+
import type { GraphNode } from '../core/export/json-exporter.js';
|
|
4
|
+
/**
|
|
5
|
+
* Generate deterministic one-line descriptions for modules that lack
|
|
6
|
+
* enriched.responsibility. Uses function/type names to extract the
|
|
7
|
+
* top action verbs and domain nouns.
|
|
8
|
+
*
|
|
9
|
+
* Only writes auto_description (not enriched.responsibility) to avoid
|
|
10
|
+
* overwriting LLM-quality enrichments. The map display prefers
|
|
11
|
+
* enriched.responsibility when available, falls back to auto_description.
|
|
12
|
+
*/
|
|
13
|
+
export declare function autoDescribeModules(store: CotxStore, nodes: GraphNode[], modules: ModuleNode[]): void;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { splitCompoundName } from '../lib/naming.js';
|
|
2
|
+
import { eng as ENGLISH_STOPWORDS } from 'stopword';
|
|
3
|
+
const SKIP_WORDS = new Set([
|
|
4
|
+
...ENGLISH_STOPWORDS,
|
|
5
|
+
'get', 'set', 'new', 'create', 'handle', 'error', 'config', 'init',
|
|
6
|
+
'test', 'mock', 'base', 'default', 'internal', 'util', 'helper',
|
|
7
|
+
'func', 'run', 'load', 'save', 'read', 'write', 'parse',
|
|
8
|
+
'string', 'value', 'result', 'node', 'file', 'path', 'name',
|
|
9
|
+
'args', 'options', 'command', 'true', 'false', 'null',
|
|
10
|
+
]);
|
|
11
|
+
/**
|
|
12
|
+
* Generate deterministic one-line descriptions for modules that lack
|
|
13
|
+
* enriched.responsibility. Uses function/type names to extract the
|
|
14
|
+
* top action verbs and domain nouns.
|
|
15
|
+
*
|
|
16
|
+
* Only writes auto_description (not enriched.responsibility) to avoid
|
|
17
|
+
* overwriting LLM-quality enrichments. The map display prefers
|
|
18
|
+
* enriched.responsibility when available, falls back to auto_description.
|
|
19
|
+
*/
|
|
20
|
+
export function autoDescribeModules(store, nodes, modules) {
|
|
21
|
+
// Build: moduleId → list of exported function/type names
|
|
22
|
+
const moduleNames = new Map();
|
|
23
|
+
// Map file → moduleId
|
|
24
|
+
const fileToModule = new Map();
|
|
25
|
+
for (const mod of modules) {
|
|
26
|
+
for (const f of mod.files) {
|
|
27
|
+
fileToModule.set(f, mod.id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (const node of nodes) {
|
|
31
|
+
const fp = node.properties.filePath;
|
|
32
|
+
const name = node.properties.name;
|
|
33
|
+
const exported = node.properties.isExported;
|
|
34
|
+
if (!fp || !name || !exported)
|
|
35
|
+
continue;
|
|
36
|
+
const modId = fileToModule.get(fp);
|
|
37
|
+
if (!modId)
|
|
38
|
+
continue;
|
|
39
|
+
if (!moduleNames.has(modId))
|
|
40
|
+
moduleNames.set(modId, []);
|
|
41
|
+
moduleNames.get(modId).push(name);
|
|
42
|
+
}
|
|
43
|
+
for (const mod of modules) {
|
|
44
|
+
const existing = store.readModule(mod.id);
|
|
45
|
+
const names = moduleNames.get(mod.id) ?? [];
|
|
46
|
+
if (names.length === 0)
|
|
47
|
+
continue;
|
|
48
|
+
const desc = generateDescription(names, mod.canonical_entry);
|
|
49
|
+
if (!desc)
|
|
50
|
+
continue;
|
|
51
|
+
// Write as auto_description — a deterministic fallback.
|
|
52
|
+
// Never overwrites LLM-written responsibility.
|
|
53
|
+
const enriched = existing.enriched ?? {
|
|
54
|
+
source_hash: mod.struct_hash,
|
|
55
|
+
enriched_at: new Date().toISOString(),
|
|
56
|
+
};
|
|
57
|
+
enriched.auto_description = desc;
|
|
58
|
+
enriched.source_hash = mod.struct_hash;
|
|
59
|
+
enriched.enriched_at = new Date().toISOString();
|
|
60
|
+
store.writeModule({ ...existing, enriched });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function generateDescription(names, canonicalEntry) {
|
|
64
|
+
// Extract word roots from all exported names
|
|
65
|
+
const wordCounts = new Map();
|
|
66
|
+
for (const name of names) {
|
|
67
|
+
const words = splitCompoundName(name);
|
|
68
|
+
for (const w of words) {
|
|
69
|
+
if (w.length < 3 || SKIP_WORDS.has(w))
|
|
70
|
+
continue;
|
|
71
|
+
wordCounts.set(w, (wordCounts.get(w) ?? 0) + 1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (wordCounts.size === 0)
|
|
75
|
+
return null;
|
|
76
|
+
// Top 5 words by frequency, then alphabetically
|
|
77
|
+
const sorted = [...wordCounts.entries()]
|
|
78
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
79
|
+
.slice(0, 5);
|
|
80
|
+
const topWords = sorted.map(([w]) => w);
|
|
81
|
+
// Build: "Handles <top words> operations via <canonical entry>"
|
|
82
|
+
const wordsStr = topWords.join(', ');
|
|
83
|
+
if (canonicalEntry) {
|
|
84
|
+
return `${capitalize(topWords[0])} operations: ${wordsStr} (entry: ${canonicalEntry})`;
|
|
85
|
+
}
|
|
86
|
+
return `${capitalize(topWords[0])} operations: ${wordsStr}`;
|
|
87
|
+
}
|
|
88
|
+
function capitalize(s) {
|
|
89
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=auto-describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-describe.js","sourceRoot":"","sources":["../../src/compiler/auto-describe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { GraphNode } from '../core/export/json-exporter.js';
|
|
2
|
+
import type { ModuleNode, ConceptNode } from '../store/schema.js';
|
|
3
|
+
export interface ConceptCompilerOptions {
|
|
4
|
+
/** Minimum distinct symbols a word root must appear in. Default: 3 */
|
|
5
|
+
minSymbolCount?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Compile exported symbols into ConceptNode[].
|
|
9
|
+
*
|
|
10
|
+
* Algorithm:
|
|
11
|
+
* 1. Collect candidate nodes: exported types + functions.
|
|
12
|
+
* 2. Split each symbol name into word roots via splitCompoundName().
|
|
13
|
+
* 3. Count how many distinct symbols each word root appears in.
|
|
14
|
+
* 4. Threshold filter: keep roots appearing in ≥ 3 distinct symbols.
|
|
15
|
+
* 5. Noise filter: remove generic programming words.
|
|
16
|
+
* 6. For each surviving root, collect all file paths where it appears.
|
|
17
|
+
* 7. Assign to the module where it appears most frequently (→ layer).
|
|
18
|
+
* 8. Compute struct_hash from { id, aliases, appears_in }.
|
|
19
|
+
* 9. Return ConceptNode[] sorted alphabetically by id.
|
|
20
|
+
*/
|
|
21
|
+
export declare function compileConcepts(nodes: GraphNode[], modules: ModuleNode[], options?: ConceptCompilerOptions): ConceptNode[];
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { splitCompoundName, moduleIdForFile } from '../lib/naming.js';
|
|
2
|
+
import { structHash } from '../lib/hash.js';
|
|
3
|
+
import { eng as ENGLISH_STOPWORDS } from 'stopword';
|
|
4
|
+
/** Minimum word length to be considered a concept. */
|
|
5
|
+
const MIN_WORD_LENGTH = 3;
|
|
6
|
+
/**
|
|
7
|
+
* Words too generic to carry domain meaning.
|
|
8
|
+
* Combines English stopwords + code-specific noise.
|
|
9
|
+
*/
|
|
10
|
+
const NOISE_WORDS = new Set([
|
|
11
|
+
// English stopwords (about, after, all, also, and, any, are, as, at, be, ...)
|
|
12
|
+
...ENGLISH_STOPWORDS,
|
|
13
|
+
// Code-generic verbs/nouns
|
|
14
|
+
'get', 'set', 'new', 'create', 'handle', 'error', 'config', 'init',
|
|
15
|
+
'type', 'data', 'info', 'item', 'list', 'map', 'test', 'mock', 'base',
|
|
16
|
+
'default', 'internal', 'util', 'helper', 'manager', 'service', 'handler',
|
|
17
|
+
'processor', 'builder', 'factory', 'impl', 'abstract', 'interface',
|
|
18
|
+
// Common low-signal code words
|
|
19
|
+
'load', 'save', 'read', 'write', 'parse', 'string', 'value', 'result',
|
|
20
|
+
'node', 'file', 'path', 'name', 'func', 'call', 'args', 'options',
|
|
21
|
+
'command', 'input', 'output', 'check', 'find', 'make', 'return',
|
|
22
|
+
'run', 'start', 'stop', 'open', 'close', 'send', 'copy', 'move',
|
|
23
|
+
'true', 'false', 'null', 'none', 'empty', 'count', 'size', 'length',
|
|
24
|
+
'index', 'key', 'val', 'err', 'msg', 'log', 'flag', 'mode', 'kind',
|
|
25
|
+
'uses', 'used', 'using', 'with', 'from', 'into', 'when', 'then',
|
|
26
|
+
'each', 'next', 'prev', 'last', 'first', 'has', 'was', 'did', 'does',
|
|
27
|
+
'should', 'must', 'can', 'may', 'will', 'try', 'not', 'only',
|
|
28
|
+
]);
|
|
29
|
+
/** Node labels that are potential concept carriers. */
|
|
30
|
+
const CONCEPT_LABELS = new Set(['Class', 'Interface', 'Struct', 'Enum', 'Type', 'Function']);
|
|
31
|
+
/**
|
|
32
|
+
* Produce CamelCase, snake_case, and kebab-case variants of a word root.
|
|
33
|
+
*/
|
|
34
|
+
function buildAliases(word) {
|
|
35
|
+
const camel = word.charAt(0).toUpperCase() + word.slice(1);
|
|
36
|
+
const snake = word; // already lower-cased word root = snake_case atom
|
|
37
|
+
const kebab = word; // single word: same as snake
|
|
38
|
+
return [...new Set([camel, snake, kebab])];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compile exported symbols into ConceptNode[].
|
|
42
|
+
*
|
|
43
|
+
* Algorithm:
|
|
44
|
+
* 1. Collect candidate nodes: exported types + functions.
|
|
45
|
+
* 2. Split each symbol name into word roots via splitCompoundName().
|
|
46
|
+
* 3. Count how many distinct symbols each word root appears in.
|
|
47
|
+
* 4. Threshold filter: keep roots appearing in ≥ 3 distinct symbols.
|
|
48
|
+
* 5. Noise filter: remove generic programming words.
|
|
49
|
+
* 6. For each surviving root, collect all file paths where it appears.
|
|
50
|
+
* 7. Assign to the module where it appears most frequently (→ layer).
|
|
51
|
+
* 8. Compute struct_hash from { id, aliases, appears_in }.
|
|
52
|
+
* 9. Return ConceptNode[] sorted alphabetically by id.
|
|
53
|
+
*/
|
|
54
|
+
export function compileConcepts(nodes, modules, options) {
|
|
55
|
+
const minSymbolCount = options?.minSymbolCount ?? 3;
|
|
56
|
+
// Step 1: filter to exported symbols (types + functions)
|
|
57
|
+
const candidates = nodes.filter((n) => CONCEPT_LABELS.has(n.label) &&
|
|
58
|
+
n.properties.isExported === true);
|
|
59
|
+
// Build a lookup: moduleId → Set<filePath> (for tie-breaking later, not strictly needed)
|
|
60
|
+
const moduleFileSet = new Map();
|
|
61
|
+
for (const mod of modules) {
|
|
62
|
+
moduleFileSet.set(mod.id, new Set(mod.files));
|
|
63
|
+
}
|
|
64
|
+
// Step 2 & 3: map word root → Set of symbol IDs that contain it
|
|
65
|
+
// Also track word root → Set of file paths where it appears
|
|
66
|
+
const rootToSymbols = new Map();
|
|
67
|
+
const rootToFiles = new Map();
|
|
68
|
+
for (const node of candidates) {
|
|
69
|
+
const name = node.properties.name;
|
|
70
|
+
if (!name)
|
|
71
|
+
continue;
|
|
72
|
+
const filePath = node.properties.filePath;
|
|
73
|
+
const words = splitCompoundName(name);
|
|
74
|
+
for (const word of words) {
|
|
75
|
+
if (word.length < MIN_WORD_LENGTH)
|
|
76
|
+
continue;
|
|
77
|
+
if (!rootToSymbols.has(word)) {
|
|
78
|
+
rootToSymbols.set(word, new Set());
|
|
79
|
+
rootToFiles.set(word, new Set());
|
|
80
|
+
}
|
|
81
|
+
rootToSymbols.get(word).add(node.id);
|
|
82
|
+
if (filePath) {
|
|
83
|
+
rootToFiles.get(word).add(filePath);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Step 4 & 5: threshold ≥ 3 distinct symbols, remove noise
|
|
88
|
+
const concepts = [];
|
|
89
|
+
for (const [word, symbolIds] of rootToSymbols) {
|
|
90
|
+
if (symbolIds.size < minSymbolCount)
|
|
91
|
+
continue;
|
|
92
|
+
if (NOISE_WORDS.has(word))
|
|
93
|
+
continue;
|
|
94
|
+
// Step 6: file paths where this concept appears
|
|
95
|
+
const appearsIn = [...rootToFiles.get(word)].sort();
|
|
96
|
+
// Step 7: find module where this concept appears most
|
|
97
|
+
const moduleCount = new Map();
|
|
98
|
+
for (const filePath of appearsIn) {
|
|
99
|
+
const modId = moduleIdForFile(filePath);
|
|
100
|
+
moduleCount.set(modId, (moduleCount.get(modId) ?? 0) + 1);
|
|
101
|
+
}
|
|
102
|
+
let layer = '_root';
|
|
103
|
+
let maxCount = 0;
|
|
104
|
+
for (const [modId, count] of moduleCount) {
|
|
105
|
+
if (count > maxCount || (count === maxCount && modId < layer)) {
|
|
106
|
+
maxCount = count;
|
|
107
|
+
layer = modId;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Step 8: struct_hash
|
|
111
|
+
const aliases = buildAliases(word);
|
|
112
|
+
const hash = structHash({ id: word, aliases, appears_in: appearsIn });
|
|
113
|
+
concepts.push({
|
|
114
|
+
id: word,
|
|
115
|
+
aliases,
|
|
116
|
+
appears_in: appearsIn,
|
|
117
|
+
layer,
|
|
118
|
+
struct_hash: hash,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
// Step 9: sort alphabetically by id
|
|
122
|
+
concepts.sort((a, b) => a.id.localeCompare(b.id));
|
|
123
|
+
return concepts;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=concept-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concept-compiler.js","sourceRoot":"","sources":["../../src/compiler/concept-compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { GraphNode, GraphEdge } from '../core/export/json-exporter.js';
|
|
2
|
+
import type { ModuleNode, ContractNode } from '../store/schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* Compile GraphNode + GraphEdge + ModuleNode data into ContractNode records.
|
|
5
|
+
*
|
|
6
|
+
* Algorithm:
|
|
7
|
+
* 1. Build file→module map from ModuleNode[].
|
|
8
|
+
* 2. Build nodeId→module map by looking up each GraphNode's filePath.
|
|
9
|
+
* 3. Find cross-module CALLS edges (source module ≠ target module).
|
|
10
|
+
* 4. Group by (provider, consumer): target's module = provider, source's module = consumer.
|
|
11
|
+
* 5. Collect unique target function names per (provider, consumer) pair as interface[].
|
|
12
|
+
* 6. Generate contract ID as `${consumer}--${provider}` (consumer < provider alphabetically).
|
|
13
|
+
* 7. Compute struct_hash from { id, provider, consumer, interface }.
|
|
14
|
+
* 8. Return ContractNode[] sorted alphabetically by id.
|
|
15
|
+
*/
|
|
16
|
+
export declare function compileContracts(nodes: GraphNode[], edges: GraphEdge[], modules: ModuleNode[]): ContractNode[];
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { structHash } from '../lib/hash.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compile GraphNode + GraphEdge + ModuleNode data into ContractNode records.
|
|
4
|
+
*
|
|
5
|
+
* Algorithm:
|
|
6
|
+
* 1. Build file→module map from ModuleNode[].
|
|
7
|
+
* 2. Build nodeId→module map by looking up each GraphNode's filePath.
|
|
8
|
+
* 3. Find cross-module CALLS edges (source module ≠ target module).
|
|
9
|
+
* 4. Group by (provider, consumer): target's module = provider, source's module = consumer.
|
|
10
|
+
* 5. Collect unique target function names per (provider, consumer) pair as interface[].
|
|
11
|
+
* 6. Generate contract ID as `${consumer}--${provider}` (consumer < provider alphabetically).
|
|
12
|
+
* 7. Compute struct_hash from { id, provider, consumer, interface }.
|
|
13
|
+
* 8. Return ContractNode[] sorted alphabetically by id.
|
|
14
|
+
*/
|
|
15
|
+
export function compileContracts(nodes, edges, modules) {
|
|
16
|
+
// Step 1: build file→module map
|
|
17
|
+
const fileToModule = new Map();
|
|
18
|
+
for (const mod of modules) {
|
|
19
|
+
for (const file of mod.files) {
|
|
20
|
+
fileToModule.set(file, mod.id);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Step 2: build nodeId→module map
|
|
24
|
+
const nodeToModule = new Map();
|
|
25
|
+
for (const node of nodes) {
|
|
26
|
+
const filePath = node.properties.filePath;
|
|
27
|
+
if (!filePath)
|
|
28
|
+
continue;
|
|
29
|
+
const modId = fileToModule.get(filePath);
|
|
30
|
+
if (modId !== undefined) {
|
|
31
|
+
nodeToModule.set(node.id, modId);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Build nodeId→name map for looking up target function names
|
|
35
|
+
const nodeToName = new Map();
|
|
36
|
+
for (const node of nodes) {
|
|
37
|
+
const name = node.properties.name;
|
|
38
|
+
if (name !== undefined) {
|
|
39
|
+
nodeToName.set(node.id, name);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Step 3 & 4: find cross-module CALLS and group by (provider, consumer)
|
|
43
|
+
// key: `${consumer}::${provider}`, value: Set of function names
|
|
44
|
+
const pairInterface = new Map();
|
|
45
|
+
for (const edge of edges) {
|
|
46
|
+
if (edge.type !== 'CALLS')
|
|
47
|
+
continue;
|
|
48
|
+
const srcMod = nodeToModule.get(edge.sourceId);
|
|
49
|
+
const tgtMod = nodeToModule.get(edge.targetId);
|
|
50
|
+
if (!srcMod || !tgtMod)
|
|
51
|
+
continue;
|
|
52
|
+
if (srcMod === tgtMod)
|
|
53
|
+
continue;
|
|
54
|
+
// source = consumer, target = provider
|
|
55
|
+
const consumer = srcMod;
|
|
56
|
+
const provider = tgtMod;
|
|
57
|
+
const pairKey = `${consumer}::${provider}`;
|
|
58
|
+
if (!pairInterface.has(pairKey)) {
|
|
59
|
+
pairInterface.set(pairKey, new Set());
|
|
60
|
+
}
|
|
61
|
+
const fnName = nodeToName.get(edge.targetId);
|
|
62
|
+
if (fnName !== undefined) {
|
|
63
|
+
pairInterface.get(pairKey).add(fnName);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Step 5–8: assemble ContractNode records
|
|
67
|
+
const contracts = [];
|
|
68
|
+
for (const [pairKey, fnNames] of pairInterface) {
|
|
69
|
+
const colonIdx = pairKey.indexOf('::');
|
|
70
|
+
const consumer = pairKey.slice(0, colonIdx);
|
|
71
|
+
const provider = pairKey.slice(colonIdx + 2);
|
|
72
|
+
// Step 6: ID is always consumer--provider
|
|
73
|
+
const id = `${consumer}--${provider}`;
|
|
74
|
+
// Step 5: sorted, deduplicated interface list
|
|
75
|
+
const iface = [...fnNames].sort();
|
|
76
|
+
// Step 7: struct_hash
|
|
77
|
+
const hash = structHash({ id, provider, consumer, interface: iface });
|
|
78
|
+
contracts.push({
|
|
79
|
+
id,
|
|
80
|
+
provider,
|
|
81
|
+
consumer,
|
|
82
|
+
interface: iface,
|
|
83
|
+
struct_hash: hash,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Step 8: sort alphabetically by id
|
|
87
|
+
contracts.sort((a, b) => a.id.localeCompare(b.id));
|
|
88
|
+
return contracts;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=contract-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-compiler.js","sourceRoot":"","sources":["../../src/compiler/contract-compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CotxStore } from '../store/store.js';
|
|
2
|
+
export interface DeltaResult {
|
|
3
|
+
changedFiles: string[];
|
|
4
|
+
affectedModules: string[];
|
|
5
|
+
affectedContracts: string[];
|
|
6
|
+
affectedFlows: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function detectDelta(store: CotxStore, changedFiles: string[]): DeltaResult;
|