gitnexus 1.6.9 → 1.6.10-aptos.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/README.md +211 -53
- package/dist/_shared/graph/types.d.ts +67 -3
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +1 -0
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +4 -3
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -0
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +2 -0
- package/dist/_shared/languages.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +8 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/pipeline.d.ts +1 -1
- package/dist/_shared/pipeline.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +1 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +20 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +25 -44
- package/dist/cli/analyze.d.ts +5 -2
- package/dist/cli/analyze.js +197 -11
- package/dist/cli/clean.js +17 -3
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/doctor.d.ts +18 -0
- package/dist/cli/doctor.js +96 -5
- package/dist/cli/editor-targets.d.ts +17 -2
- package/dist/cli/editor-targets.js +44 -0
- package/dist/cli/embeddings.d.ts +12 -0
- package/dist/cli/embeddings.js +49 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +126 -8
- package/dist/cli/help-i18n.js +6 -0
- package/dist/cli/i18n/en.d.ts +18 -8
- package/dist/cli/i18n/en.js +18 -8
- package/dist/cli/i18n/resources.d.ts +28 -8
- package/dist/cli/i18n/zh-CN.d.ts +10 -0
- package/dist/cli/i18n/zh-CN.js +18 -8
- package/dist/cli/index.js +21 -7
- package/dist/cli/lazy-action.d.ts +7 -0
- package/dist/cli/lazy-action.js +27 -0
- package/dist/cli/mcp.js +6 -3
- package/dist/cli/move-availability.d.ts +5 -0
- package/dist/cli/move-availability.js +11 -0
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +230 -32
- package/dist/cli/skill-gen.js +38 -18
- package/dist/cli/standard-skills.d.ts +76 -0
- package/dist/cli/standard-skills.js +45 -0
- package/dist/cli/status.d.ts +4 -1
- package/dist/cli/status.js +57 -4
- package/dist/cli/tool.js +11 -0
- package/dist/cli/uninstall.js +77 -18
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +7 -1
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +27 -0
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +74 -0
- package/dist/core/analyzer-identity.js +1820 -0
- package/dist/core/augmentation/engine.js +13 -8
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +24 -7
- package/dist/core/embeddings/embedding-identity.d.ts +11 -0
- package/dist/core/embeddings/embedding-identity.js +24 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
- package/dist/core/embeddings/embedding-pipeline.js +100 -9
- package/dist/core/embeddings/http-client.d.ts +33 -3
- package/dist/core/embeddings/http-client.js +237 -25
- package/dist/core/embeddings/node-module-compat.d.ts +25 -0
- package/dist/core/embeddings/node-module-compat.js +25 -0
- package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
- package/dist/core/embeddings/runtime-install.d.ts +119 -0
- package/dist/core/embeddings/runtime-install.js +372 -0
- package/dist/core/embeddings/runtime-support.d.ts +48 -17
- package/dist/core/embeddings/runtime-support.js +96 -0
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/group/bridge-db.js +2 -0
- package/dist/core/group/extractors/http-patterns/python.js +246 -108
- package/dist/core/group/extractors/manifest-extractor.js +4 -0
- package/dist/core/incremental/escalation-gate.d.ts +38 -0
- package/dist/core/incremental/escalation-gate.js +48 -0
- package/dist/core/incremental/shadow-candidates.d.ts +3 -3
- package/dist/core/incremental/shadow-candidates.js +3 -3
- package/dist/core/incremental/subgraph-extract.d.ts +2 -2
- package/dist/core/incremental/subgraph-extract.js +2 -2
- package/dist/core/index-freshness.d.ts +5 -0
- package/dist/core/index-freshness.js +13 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
- package/dist/core/ingestion/cobol-processor.js +27 -26
- package/dist/core/ingestion/community-processor.d.ts +51 -1
- package/dist/core/ingestion/community-processor.js +323 -64
- package/dist/core/ingestion/emit-references.js +7 -2
- package/dist/core/ingestion/filesystem-walker.js +4 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/languages/c/captures.js +56 -0
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
- package/dist/core/ingestion/languages/cpp/captures.js +365 -75
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
- package/dist/core/ingestion/languages/csharp/captures.js +25 -0
- package/dist/core/ingestion/languages/dart/captures.js +90 -2
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go/captures.js +34 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +193 -17
- package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/java/package-facts.js +9 -0
- package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
- package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
- package/dist/core/ingestion/languages/java/query.js +23 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/javascript/captures.js +16 -0
- package/dist/core/ingestion/languages/javascript/query.js +21 -0
- package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
- package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
- package/dist/core/ingestion/languages/kotlin/query.js +19 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/kotlin.js +5 -6
- package/dist/core/ingestion/languages/move.d.ts +1 -0
- package/dist/core/ingestion/languages/move.js +27 -0
- package/dist/core/ingestion/languages/php/captures.js +40 -0
- package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
- package/dist/core/ingestion/languages/php/import-target.js +110 -2
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +24 -5
- package/dist/core/ingestion/languages/python/interpret.js +4 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
- package/dist/core/ingestion/languages/ruby/captures.js +42 -0
- package/dist/core/ingestion/languages/rust/captures.js +13 -0
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/query.js +9 -0
- package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
- package/dist/core/ingestion/languages/swift/captures.js +12 -0
- package/dist/core/ingestion/languages/typescript/captures.js +21 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.js +37 -0
- package/dist/core/ingestion/markdown-processor.js +3 -2
- package/dist/core/ingestion/model/registration-table.js +1 -0
- package/dist/core/ingestion/parsing-processor.d.ts +3 -1
- package/dist/core/ingestion/parsing-processor.js +36 -1
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
- package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
- package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
- package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
- package/dist/core/ingestion/pipeline.d.ts +4 -2
- package/dist/core/ingestion/pipeline.js +5 -2
- package/dist/core/ingestion/resolve-references.js +12 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
- package/dist/core/ingestion/scope-extractor.js +306 -43
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
- package/dist/core/ingestion/tree-sitter-queries.js +23 -2
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
- package/dist/core/ingestion/utils/ast-helpers.js +153 -2
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
- package/dist/core/ingestion/utils/line-base.d.ts +20 -0
- package/dist/core/ingestion/utils/line-base.js +20 -0
- package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
- package/dist/core/ingestion/utils/symbol-labels.js +45 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
- package/dist/core/ingestion/workers/parse-worker.js +40 -5
- package/dist/core/ingestion/workers/result-merge.js +4 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
- package/dist/core/ingestion/workers/worker-pool.js +128 -28
- package/dist/core/lbug/csv-generator.d.ts +15 -0
- package/dist/core/lbug/csv-generator.js +124 -27
- package/dist/core/lbug/cypher-escape.d.ts +20 -0
- package/dist/core/lbug/cypher-escape.js +20 -0
- package/dist/core/lbug/extension-load-error.d.ts +67 -0
- package/dist/core/lbug/extension-load-error.js +326 -0
- package/dist/core/lbug/extension-loader.d.ts +17 -2
- package/dist/core/lbug/extension-loader.js +38 -13
- package/dist/core/lbug/lbug-adapter.d.ts +203 -2
- package/dist/core/lbug/lbug-adapter.js +527 -86
- package/dist/core/lbug/lbug-config.d.ts +56 -2
- package/dist/core/lbug/lbug-config.js +267 -7
- package/dist/core/lbug/move-columns.d.ts +7 -0
- package/dist/core/lbug/move-columns.js +86 -0
- package/dist/core/lbug/native-check.d.ts +40 -0
- package/dist/core/lbug/native-check.js +90 -0
- package/dist/core/lbug/node-table-layout.d.ts +29 -0
- package/dist/core/lbug/node-table-layout.js +119 -0
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -8
- package/dist/core/lbug/schema.d.ts +4 -3
- package/dist/core/lbug/schema.js +16 -16
- package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
- package/dist/core/lbug/sidecar-recovery.js +418 -16
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/move/artifact-download.d.ts +19 -0
- package/dist/core/move/artifact-download.js +179 -0
- package/dist/core/move/compiler-facts.d.ts +120 -0
- package/dist/core/move/compiler-facts.js +9 -0
- package/dist/core/move/consistency.d.ts +28 -0
- package/dist/core/move/consistency.js +98 -0
- package/dist/core/move/constants.d.ts +98 -0
- package/dist/core/move/constants.js +136 -0
- package/dist/core/move/discovery.d.ts +10 -0
- package/dist/core/move/discovery.js +22 -0
- package/dist/core/move/entry-points.d.ts +14 -0
- package/dist/core/move/entry-points.js +40 -0
- package/dist/core/move/facts-mapper.d.ts +75 -0
- package/dist/core/move/facts-mapper.js +534 -0
- package/dist/core/move/install-lock.d.ts +14 -0
- package/dist/core/move/install-lock.js +102 -0
- package/dist/core/move/install.d.ts +39 -0
- package/dist/core/move/install.js +391 -0
- package/dist/core/move/mcp-client.d.ts +115 -0
- package/dist/core/move/mcp-client.js +436 -0
- package/dist/core/move/move-ingest.d.ts +49 -0
- package/dist/core/move/move-ingest.js +320 -0
- package/dist/core/move/provision.d.ts +19 -0
- package/dist/core/move/provision.js +91 -0
- package/dist/core/move/release.d.ts +6 -0
- package/dist/core/move/release.js +10 -0
- package/dist/core/move/symbol-id.d.ts +35 -0
- package/dist/core/move/symbol-id.js +65 -0
- package/dist/core/move/type-parser.d.ts +11 -0
- package/dist/core/move/type-parser.js +38 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +39 -8
- package/dist/core/run-analyze.d.ts +3 -3
- package/dist/core/run-analyze.js +1001 -184
- package/dist/core/search/fts-indexes.d.ts +31 -0
- package/dist/core/search/fts-indexes.js +73 -0
- package/dist/core/search/fts-schema.js +2 -0
- package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
- package/dist/core/tree-sitter/safe-parse.js +21 -7
- package/dist/core/wiki/graph-queries.js +6 -5
- package/dist/core/wiki/llm-client.d.ts +8 -2
- package/dist/core/wiki/llm-client.js +41 -5
- package/dist/mcp/core/embedder.js +16 -2
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/bean-metadata.d.ts +2 -0
- package/dist/mcp/local/bean-metadata.js +25 -0
- package/dist/mcp/local/line-display.d.ts +22 -0
- package/dist/mcp/local/line-display.js +3 -0
- package/dist/mcp/local/local-backend.d.ts +19 -1
- package/dist/mcp/local/local-backend.js +402 -155
- package/dist/mcp/local/pdg-impact.d.ts +5 -3
- package/dist/mcp/local/pdg-impact.js +5 -2
- package/dist/mcp/output-budget.d.ts +5 -0
- package/dist/mcp/output-budget.js +52 -0
- package/dist/mcp/read-only-policy.d.ts +12 -0
- package/dist/mcp/read-only-policy.js +102 -0
- package/dist/mcp/repository-policy.d.ts +34 -0
- package/dist/mcp/repository-policy.js +328 -0
- package/dist/mcp/resources.js +32 -5
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +29 -9
- package/dist/mcp/tools.d.ts +0 -8
- package/dist/mcp/tools.js +102 -5
- package/dist/server/analyze-job.d.ts +3 -0
- package/dist/server/analyze-job.js +17 -0
- package/dist/server/analyze-launch.d.ts +6 -0
- package/dist/server/analyze-launch.js +82 -6
- package/dist/server/analyze-worker-core.d.ts +2 -1
- package/dist/server/analyze-worker-core.js +5 -2
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +30 -0
- package/dist/server/api.js +120 -34
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/git.d.ts +31 -0
- package/dist/storage/git.js +111 -1
- package/dist/storage/parse-cache.js +7 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +165 -1
- package/dist/storage/repo-manager.d.ts +194 -2
- package/dist/storage/repo-manager.js +56 -1
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
- package/hooks/claude/gitnexus-hook.cjs +59 -9
- package/hooks/claude/pre-tool-use.sh +0 -0
- package/hooks/claude/session-start.sh +0 -0
- package/package.json +21 -15
- package/scripts/cross-platform-tests.ts +56 -0
- package/scripts/ensure-fts.ts +43 -0
- package/scripts/install-duckdb-extension.mjs +85 -24
- package/scripts/run-cross-platform.ts +61 -6
- package/scripts/shard-arg.ts +30 -0
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +142 -0
- package/skills/gitnexus-plan/SKILL.md +348 -0
- package/skills/gitnexus-plan/references/context-ledger.md +137 -0
- package/skills/gitnexus-plan/references/context-pack.md +126 -0
- package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
- package/skills/gitnexus-plan/references/plan-template.md +201 -0
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
- package/skills/gitnexus-review/SKILL.md +273 -0
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +269 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
- package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/agent-Bqxn-abU.js +626 -0
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
- package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
- package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
- package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
- package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
- package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
- package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
- package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
- package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
- package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
- package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
- package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
- package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
- package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
- package/web/assets/index-CX_fADmQ.css +2 -0
- package/web/assets/index-D1Z3dGGz.js +575 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
- package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
- package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
- package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
- package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
- package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
- package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
- package/web/assets/src-JV30wyV8.js +1 -0
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
- package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
- package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
- package/web/index.html +18 -10
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/agent-Dli_x7bU.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
- package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
- package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
- package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
- package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
- package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
- package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
- package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
- package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
- package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
- package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
- package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
- package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
- package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
- package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
- package/web/assets/index-KctnI3Vq.js +0 -635
- package/web/assets/index-_lgn7hs5.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
- package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
- package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
- package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
package/dist/cli/skill-gen.js
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import fs from 'fs/promises';
|
|
10
10
|
import path from 'path';
|
|
11
|
+
const GENERATED_SKILL_PREFIX = 'gitnexus-area-';
|
|
12
|
+
const MAX_SKILL_NAME_LENGTH = 64;
|
|
13
|
+
const MAX_COMMUNITY_NAME_LENGTH = MAX_SKILL_NAME_LENGTH - GENERATED_SKILL_PREFIX.length;
|
|
11
14
|
// ============================================================================
|
|
12
15
|
// MAIN EXPORT
|
|
13
16
|
// ============================================================================
|
|
@@ -20,7 +23,27 @@ import path from 'path';
|
|
|
20
23
|
*/
|
|
21
24
|
export const generateSkillFiles = async (repoPath, projectName, pipelineResult) => {
|
|
22
25
|
const { communityResult, processResult, graph } = pipelineResult;
|
|
23
|
-
const outputDir = path.join(repoPath, '.claude', 'skills'
|
|
26
|
+
const outputDir = path.join(repoPath, '.claude', 'skills');
|
|
27
|
+
const legacyOutputDir = path.join(outputDir, 'generated');
|
|
28
|
+
// Community skills used to live under an undiscoverable `generated/`
|
|
29
|
+
// grouping directory. Clear that GitNexus-owned legacy output and
|
|
30
|
+
// stale direct outputs in the reserved namespace, while preserving every
|
|
31
|
+
// unrelated project skill under .claude/skills/.
|
|
32
|
+
try {
|
|
33
|
+
const entries = await fs.readdir(outputDir, { withFileTypes: true });
|
|
34
|
+
await Promise.all(entries
|
|
35
|
+
.filter((entry) => entry.isDirectory() && entry.name.startsWith(GENERATED_SKILL_PREFIX))
|
|
36
|
+
.map((entry) => fs.rm(path.join(outputDir, entry.name), { recursive: true, force: true })));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
/* output root may not exist yet */
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
await fs.rm(legacyOutputDir, { recursive: true, force: true });
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* legacy output may not exist */
|
|
46
|
+
}
|
|
24
47
|
if (!communityResult || !communityResult.memberships.length) {
|
|
25
48
|
console.log('\n Skills: no communities detected, skipping skill generation');
|
|
26
49
|
return { skills: [], outputPath: outputDir };
|
|
@@ -47,13 +70,8 @@ export const generateSkillFiles = async (repoPath, projectName, pipelineResult)
|
|
|
47
70
|
// Step 3: Build lookup maps
|
|
48
71
|
const membershipsByComm = buildMembershipMap(communityResult.memberships);
|
|
49
72
|
const nodeIdToCommunityLabel = buildNodeCommunityLabelMap(communityResult.memberships, communities);
|
|
50
|
-
// Step 4:
|
|
51
|
-
|
|
52
|
-
await fs.rm(outputDir, { recursive: true, force: true });
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
/* may not exist */
|
|
56
|
-
}
|
|
73
|
+
// Step 4: Ensure the shared project-skill root exists. Never clear it: it
|
|
74
|
+
// also contains user-authored and standard GitNexus skills.
|
|
57
75
|
await fs.mkdir(outputDir, { recursive: true });
|
|
58
76
|
// Step 5: Generate skill files
|
|
59
77
|
const skills = [];
|
|
@@ -74,14 +92,15 @@ export const generateSkillFiles = async (repoPath, projectName, pipelineResult)
|
|
|
74
92
|
// Generate kebab name
|
|
75
93
|
const kebabName = toKebabName(community.label, usedNames);
|
|
76
94
|
usedNames.add(kebabName);
|
|
95
|
+
const skillName = `${GENERATED_SKILL_PREFIX}${kebabName}`;
|
|
77
96
|
// Generate SKILL.md content
|
|
78
|
-
const content = renderSkillMarkdown(community, projectName, members, files, entryPoints, flows, connections,
|
|
97
|
+
const content = renderSkillMarkdown(community, projectName, members, files, entryPoints, flows, connections, skillName);
|
|
79
98
|
// Write file
|
|
80
|
-
const skillDir = path.join(outputDir,
|
|
99
|
+
const skillDir = path.join(outputDir, skillName);
|
|
81
100
|
await fs.mkdir(skillDir, { recursive: true });
|
|
82
101
|
await fs.writeFile(path.join(skillDir, 'SKILL.md'), content, 'utf-8');
|
|
83
102
|
const info = {
|
|
84
|
-
name:
|
|
103
|
+
name: skillName,
|
|
85
104
|
label: community.label,
|
|
86
105
|
symbolCount: community.symbolCount,
|
|
87
106
|
fileCount: files.length,
|
|
@@ -89,7 +108,7 @@ export const generateSkillFiles = async (repoPath, projectName, pipelineResult)
|
|
|
89
108
|
skills.push(info);
|
|
90
109
|
console.log(` \u2713 ${community.label} (${community.symbolCount} symbols, ${files.length} files)`);
|
|
91
110
|
}
|
|
92
|
-
console.log(`\n ${skills.length} skills generated \u2192 .claude/skills
|
|
111
|
+
console.log(`\n ${skills.length} skills generated \u2192 .claude/skills/${GENERATED_SKILL_PREFIX}*/`);
|
|
93
112
|
return { skills, outputPath: outputDir };
|
|
94
113
|
};
|
|
95
114
|
// ============================================================================
|
|
@@ -380,10 +399,10 @@ const gatherCrossConnections = (rawIds, ownLabel, membershipsByComm, nodeIdToCom
|
|
|
380
399
|
* @param {MemberSymbol[]} entryPoints - Exported entry point symbols
|
|
381
400
|
* @param {ProcessNode[]} flows - Execution flows touching this community
|
|
382
401
|
* @param {CrossConnection[]} connections - Cross-community connections
|
|
383
|
-
* @param {string}
|
|
402
|
+
* @param {string} skillName - Namespaced kebab-case name for the skill
|
|
384
403
|
* @returns {string} Full SKILL.md content
|
|
385
404
|
*/
|
|
386
|
-
const renderSkillMarkdown = (community, projectName, members, files, entryPoints, flows, connections,
|
|
405
|
+
const renderSkillMarkdown = (community, projectName, members, files, entryPoints, flows, connections, skillName) => {
|
|
387
406
|
const cohesionPct = Math.round(community.cohesion * 100);
|
|
388
407
|
// Dominant directory: most common top-level directory
|
|
389
408
|
const dominantDir = getDominantDirectory(files);
|
|
@@ -396,7 +415,7 @@ const renderSkillMarkdown = (community, projectName, members, files, entryPoints
|
|
|
396
415
|
const lines = [];
|
|
397
416
|
// Frontmatter
|
|
398
417
|
lines.push('---');
|
|
399
|
-
lines.push(`name: ${
|
|
418
|
+
lines.push(`name: ${skillName}`);
|
|
400
419
|
lines.push(`description: "Skill for the ${community.label} area of ${projectName}. ${community.symbolCount} symbols across ${files.length} files."`);
|
|
401
420
|
lines.push('---');
|
|
402
421
|
lines.push('');
|
|
@@ -496,20 +515,21 @@ const renderSkillMarkdown = (community, projectName, members, files, entryPoints
|
|
|
496
515
|
* @brief Convert a community label to a kebab-case directory name
|
|
497
516
|
* @param {string} label - The community label
|
|
498
517
|
* @param {Set<string>} usedNames - Already-used names for collision detection
|
|
499
|
-
* @returns {string} Unique kebab-case name
|
|
518
|
+
* @returns {string} Unique kebab-case name that leaves room for the GitNexus prefix
|
|
500
519
|
*/
|
|
501
520
|
const toKebabName = (label, usedNames) => {
|
|
502
521
|
let name = label
|
|
503
522
|
.toLowerCase()
|
|
504
523
|
.replace(/[^a-z0-9]+/g, '-')
|
|
505
524
|
.replace(/^-+|-+$/g, '')
|
|
506
|
-
.slice(0,
|
|
525
|
+
.slice(0, MAX_COMMUNITY_NAME_LENGTH);
|
|
507
526
|
if (!name)
|
|
508
527
|
name = 'skill';
|
|
509
528
|
let candidate = name;
|
|
510
529
|
let counter = 2;
|
|
511
530
|
while (usedNames.has(candidate)) {
|
|
512
|
-
|
|
531
|
+
const suffix = `-${counter}`;
|
|
532
|
+
candidate = `${name.slice(0, MAX_COMMUNITY_NAME_LENGTH - suffix.length)}${suffix}`;
|
|
513
533
|
counter++;
|
|
514
534
|
}
|
|
515
535
|
return candidate;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export type StandardSkillDistribution = 'project' | 'npm' | 'claudePlugin' | 'cursor';
|
|
2
|
+
export interface StandardSkillCatalogEntry {
|
|
3
|
+
readonly name: `gitnexus-${string}`;
|
|
4
|
+
readonly agentTableTask: string;
|
|
5
|
+
readonly fallbackDescription: string;
|
|
6
|
+
readonly distributions: Readonly<Record<StandardSkillDistribution, boolean>>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Canonical metadata for the standard skills installed by `gitnexus analyze`.
|
|
10
|
+
*
|
|
11
|
+
* Keep distribution intent here so generated agent guidance and drift guards
|
|
12
|
+
* cannot disagree about which copies should exist. The ordering intentionally
|
|
13
|
+
* matches the generated AGENTS.md / CLAUDE.md task table.
|
|
14
|
+
*/
|
|
15
|
+
export declare const STANDARD_SKILL_CATALOG: readonly [{
|
|
16
|
+
readonly name: "gitnexus-exploring";
|
|
17
|
+
readonly agentTableTask: "Understand architecture / \"How does X work?\"";
|
|
18
|
+
readonly fallbackDescription: "Use when the user asks how code works, wants to understand architecture, trace execution flows, or explore unfamiliar parts of the codebase. Examples: \"How does X work?\", \"What calls this function?\", \"Show me the auth flow\"";
|
|
19
|
+
readonly distributions: {
|
|
20
|
+
readonly project: true;
|
|
21
|
+
readonly npm: true;
|
|
22
|
+
readonly claudePlugin: true;
|
|
23
|
+
readonly cursor: true;
|
|
24
|
+
};
|
|
25
|
+
}, {
|
|
26
|
+
readonly name: "gitnexus-impact-analysis";
|
|
27
|
+
readonly agentTableTask: "Blast radius / \"What breaks if I change X?\"";
|
|
28
|
+
readonly fallbackDescription: "Use when the user wants to know what will break if they change something, or needs safety analysis before editing code. Examples: \"Is it safe to change X?\", \"What depends on this?\", \"What will break?\"";
|
|
29
|
+
readonly distributions: {
|
|
30
|
+
readonly project: true;
|
|
31
|
+
readonly npm: true;
|
|
32
|
+
readonly claudePlugin: true;
|
|
33
|
+
readonly cursor: true;
|
|
34
|
+
};
|
|
35
|
+
}, {
|
|
36
|
+
readonly name: "gitnexus-debugging";
|
|
37
|
+
readonly agentTableTask: "Trace bugs / \"Why is X failing?\"";
|
|
38
|
+
readonly fallbackDescription: "Use when the user is debugging a bug, tracing an error, or asking why something fails. Examples: \"Why is X failing?\", \"Where does this error come from?\", \"Trace this bug\"";
|
|
39
|
+
readonly distributions: {
|
|
40
|
+
readonly project: true;
|
|
41
|
+
readonly npm: true;
|
|
42
|
+
readonly claudePlugin: true;
|
|
43
|
+
readonly cursor: true;
|
|
44
|
+
};
|
|
45
|
+
}, {
|
|
46
|
+
readonly name: "gitnexus-refactoring";
|
|
47
|
+
readonly agentTableTask: "Rename / extract / split / refactor";
|
|
48
|
+
readonly fallbackDescription: "Use when the user wants to rename, extract, split, move, or restructure code safely. Examples: \"Rename this function\", \"Extract this into a module\", \"Refactor this class\", \"Move this to a separate file\"";
|
|
49
|
+
readonly distributions: {
|
|
50
|
+
readonly project: true;
|
|
51
|
+
readonly npm: true;
|
|
52
|
+
readonly claudePlugin: true;
|
|
53
|
+
readonly cursor: true;
|
|
54
|
+
};
|
|
55
|
+
}, {
|
|
56
|
+
readonly name: "gitnexus-guide";
|
|
57
|
+
readonly agentTableTask: "Tools, resources, schema reference";
|
|
58
|
+
readonly fallbackDescription: "Use when the user asks about GitNexus itself — available tools, how to query the knowledge graph, MCP resources, graph schema, or workflow reference. Examples: \"What GitNexus tools are available?\", \"How do I use GitNexus?\"";
|
|
59
|
+
readonly distributions: {
|
|
60
|
+
readonly project: true;
|
|
61
|
+
readonly npm: true;
|
|
62
|
+
readonly claudePlugin: true;
|
|
63
|
+
readonly cursor: false;
|
|
64
|
+
};
|
|
65
|
+
}, {
|
|
66
|
+
readonly name: "gitnexus-cli";
|
|
67
|
+
readonly agentTableTask: "Index, status, clean, wiki CLI commands";
|
|
68
|
+
readonly fallbackDescription: "Use when the user needs to run GitNexus CLI commands like analyze/index a repo, check status, clean the index, generate a wiki, or list indexed repos. Examples: \"Index this repo\", \"Reanalyze the codebase\", \"Generate a wiki\"";
|
|
69
|
+
readonly distributions: {
|
|
70
|
+
readonly project: true;
|
|
71
|
+
readonly npm: true;
|
|
72
|
+
readonly claudePlugin: true;
|
|
73
|
+
readonly cursor: false;
|
|
74
|
+
};
|
|
75
|
+
}];
|
|
76
|
+
export type StandardSkillName = (typeof STANDARD_SKILL_CATALOG)[number]['name'];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical metadata for the standard skills installed by `gitnexus analyze`.
|
|
3
|
+
*
|
|
4
|
+
* Keep distribution intent here so generated agent guidance and drift guards
|
|
5
|
+
* cannot disagree about which copies should exist. The ordering intentionally
|
|
6
|
+
* matches the generated AGENTS.md / CLAUDE.md task table.
|
|
7
|
+
*/
|
|
8
|
+
export const STANDARD_SKILL_CATALOG = [
|
|
9
|
+
{
|
|
10
|
+
name: 'gitnexus-exploring',
|
|
11
|
+
agentTableTask: 'Understand architecture / "How does X work?"',
|
|
12
|
+
fallbackDescription: 'Use when the user asks how code works, wants to understand architecture, trace execution flows, or explore unfamiliar parts of the codebase. Examples: "How does X work?", "What calls this function?", "Show me the auth flow"',
|
|
13
|
+
distributions: { project: true, npm: true, claudePlugin: true, cursor: true },
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'gitnexus-impact-analysis',
|
|
17
|
+
agentTableTask: 'Blast radius / "What breaks if I change X?"',
|
|
18
|
+
fallbackDescription: 'Use when the user wants to know what will break if they change something, or needs safety analysis before editing code. Examples: "Is it safe to change X?", "What depends on this?", "What will break?"',
|
|
19
|
+
distributions: { project: true, npm: true, claudePlugin: true, cursor: true },
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'gitnexus-debugging',
|
|
23
|
+
agentTableTask: 'Trace bugs / "Why is X failing?"',
|
|
24
|
+
fallbackDescription: 'Use when the user is debugging a bug, tracing an error, or asking why something fails. Examples: "Why is X failing?", "Where does this error come from?", "Trace this bug"',
|
|
25
|
+
distributions: { project: true, npm: true, claudePlugin: true, cursor: true },
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'gitnexus-refactoring',
|
|
29
|
+
agentTableTask: 'Rename / extract / split / refactor',
|
|
30
|
+
fallbackDescription: 'Use when the user wants to rename, extract, split, move, or restructure code safely. Examples: "Rename this function", "Extract this into a module", "Refactor this class", "Move this to a separate file"',
|
|
31
|
+
distributions: { project: true, npm: true, claudePlugin: true, cursor: true },
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'gitnexus-guide',
|
|
35
|
+
agentTableTask: 'Tools, resources, schema reference',
|
|
36
|
+
fallbackDescription: 'Use when the user asks about GitNexus itself — available tools, how to query the knowledge graph, MCP resources, graph schema, or workflow reference. Examples: "What GitNexus tools are available?", "How do I use GitNexus?"',
|
|
37
|
+
distributions: { project: true, npm: true, claudePlugin: true, cursor: false },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'gitnexus-cli',
|
|
41
|
+
agentTableTask: 'Index, status, clean, wiki CLI commands',
|
|
42
|
+
fallbackDescription: 'Use when the user needs to run GitNexus CLI commands like analyze/index a repo, check status, clean the index, generate a wiki, or list indexed repos. Examples: "Index this repo", "Reanalyze the codebase", "Generate a wiki"',
|
|
43
|
+
distributions: { project: true, npm: true, claudePlugin: true, cursor: false },
|
|
44
|
+
},
|
|
45
|
+
];
|
package/dist/cli/status.d.ts
CHANGED
package/dist/cli/status.js
CHANGED
|
@@ -5,11 +5,17 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import path from 'path';
|
|
7
7
|
import { findRepo, getStoragePaths, loadMeta, hasKuzuIndex } from '../storage/repo-manager.js';
|
|
8
|
-
import { getCurrentCommit, getCurrentBranch, isGitRepo, getGitRoot } from '../storage/git.js';
|
|
8
|
+
import { getCurrentCommit, getCurrentBranch, isGitRepo, getGitRoot, isWorkingTreeDirty, } from '../storage/git.js';
|
|
9
|
+
import { analyzerRunnerIdentitiesEqual, resolveAnalyzerRunnerIdentity, } from '../core/analyzer-identity.js';
|
|
10
|
+
import { getIndexIncompleteReasons } from '../core/index-freshness.js';
|
|
9
11
|
import { t } from './i18n/index.js';
|
|
10
|
-
export const statusCommand = async () => {
|
|
12
|
+
export const statusCommand = async (options = {}) => {
|
|
11
13
|
const cwd = process.cwd();
|
|
12
14
|
if (!isGitRepo(cwd)) {
|
|
15
|
+
if (options.json) {
|
|
16
|
+
console.log(JSON.stringify({ schemaVersion: 1, error: 'not-git-repository' }));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
13
19
|
console.log(t('status.notGitRepo'));
|
|
14
20
|
return;
|
|
15
21
|
}
|
|
@@ -18,7 +24,16 @@ export const statusCommand = async () => {
|
|
|
18
24
|
// Check if there's a stale KuzuDB index that needs migration
|
|
19
25
|
const repoRoot = getGitRoot(cwd) ?? cwd;
|
|
20
26
|
const { storagePath } = getStoragePaths(repoRoot);
|
|
21
|
-
|
|
27
|
+
const staleKuzu = await hasKuzuIndex(storagePath);
|
|
28
|
+
if (options.json) {
|
|
29
|
+
console.log(JSON.stringify({
|
|
30
|
+
schemaVersion: 1,
|
|
31
|
+
repository: repoRoot,
|
|
32
|
+
error: staleKuzu ? 'stale-kuzu-index' : 'not-indexed',
|
|
33
|
+
}));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (staleKuzu) {
|
|
22
37
|
console.log(t('status.staleKuzu'));
|
|
23
38
|
console.log(t('status.rebuildLadybug'));
|
|
24
39
|
}
|
|
@@ -45,14 +60,52 @@ export const statusCommand = async () => {
|
|
|
45
60
|
else
|
|
46
61
|
workspaceLagsBranch = true;
|
|
47
62
|
}
|
|
63
|
+
const currentRunnerIdentity = resolveAnalyzerRunnerIdentity(import.meta.url);
|
|
64
|
+
const runnerIdentityIsCurrent = analyzerRunnerIdentitiesEqual(activeMeta.runnerIdentity, currentRunnerIdentity);
|
|
65
|
+
const incompleteReasons = getIndexIncompleteReasons(activeMeta);
|
|
66
|
+
// A matching HEAD is not enough: `analyze` re-indexes a dirty working tree,
|
|
67
|
+
// so a repo with uncommitted source changes is stale even at the same commit.
|
|
68
|
+
// Skip the check for non-git folders (currentCommit === '') to match analyze.
|
|
69
|
+
const isUpToDate = currentCommit === activeMeta.lastCommit &&
|
|
70
|
+
runnerIdentityIsCurrent &&
|
|
71
|
+
incompleteReasons.length === 0 &&
|
|
72
|
+
(currentCommit === '' || !isWorkingTreeDirty(repo.repoPath));
|
|
73
|
+
if (options.json) {
|
|
74
|
+
console.log(JSON.stringify({
|
|
75
|
+
schemaVersion: 1,
|
|
76
|
+
repository: repo.repoPath,
|
|
77
|
+
branch: currentBranch,
|
|
78
|
+
workspaceIndexBranch: workspaceLagsBranch ? (repo.meta.branch ?? null) : null,
|
|
79
|
+
index: {
|
|
80
|
+
indexedAt: activeMeta.indexedAt,
|
|
81
|
+
commit: activeMeta.lastCommit,
|
|
82
|
+
runnerIdentity: activeMeta.runnerIdentity ?? null,
|
|
83
|
+
runnerIdentityStatus: runnerIdentityIsCurrent ? 'current' : 'stale-or-unknown',
|
|
84
|
+
incompleteReasons,
|
|
85
|
+
},
|
|
86
|
+
current: {
|
|
87
|
+
commit: currentCommit,
|
|
88
|
+
runnerIdentity: currentRunnerIdentity,
|
|
89
|
+
},
|
|
90
|
+
status: isUpToDate ? 'up-to-date' : 'stale',
|
|
91
|
+
}));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
48
94
|
console.log(`${t('status.repository')}: ${repo.repoPath}`);
|
|
49
95
|
console.log(`${t('status.branch')}: ${currentBranch ?? t('status.detached')}`);
|
|
50
96
|
if (workspaceLagsBranch) {
|
|
51
97
|
console.log(t('status.workspaceIndexLabel', { primary: repo.meta.branch ?? '' }));
|
|
52
98
|
}
|
|
53
|
-
const isUpToDate = currentCommit === activeMeta.lastCommit;
|
|
54
99
|
console.log(`${t('status.indexed')}: ${new Date(activeMeta.indexedAt).toLocaleString()}`);
|
|
55
100
|
console.log(`${t('status.indexedCommit')}: ${activeMeta.lastCommit?.slice(0, 7)}`);
|
|
56
101
|
console.log(`${t('status.currentCommit')}: ${currentCommit?.slice(0, 7)}`);
|
|
102
|
+
// Emit the complete, versioned receipt as JSON so humans can inspect it and
|
|
103
|
+
// automation can compare it without reverse-engineering a display string.
|
|
104
|
+
// `null` is the backward-compatible signal for pre-receipt metadata.
|
|
105
|
+
console.log(`${t('status.indexRunnerIdentity')}: ${JSON.stringify(activeMeta.runnerIdentity ?? null)}`);
|
|
106
|
+
if (incompleteReasons.length > 0) {
|
|
107
|
+
console.log(`Index incomplete reasons: ${JSON.stringify(incompleteReasons)}`);
|
|
108
|
+
}
|
|
109
|
+
console.log(`${t('status.currentRunnerIdentity')}: ${JSON.stringify(currentRunnerIdentity)}`);
|
|
57
110
|
console.log(`${t('status.status')}: ${isUpToDate ? t('status.upToDate') : t('status.stale')}`);
|
|
58
111
|
};
|
package/dist/cli/tool.js
CHANGED
|
@@ -54,6 +54,17 @@ function output(data) {
|
|
|
54
54
|
// Fallback: stderr (previous behavior, works on all platforms)
|
|
55
55
|
process.stderr.write(text + '\n');
|
|
56
56
|
}
|
|
57
|
+
// Backend failures come back as `{ error }` payloads rather than throws
|
|
58
|
+
// (#2469). Every tool command routes its result through here, so this is
|
|
59
|
+
// the one place that keeps scripted callers honest: print the payload,
|
|
60
|
+
// then exit non-zero.
|
|
61
|
+
if (data &&
|
|
62
|
+
typeof data === 'object' &&
|
|
63
|
+
'error' in data &&
|
|
64
|
+
typeof data.error === 'string' &&
|
|
65
|
+
data.error.trim().length > 0) {
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
}
|
|
57
68
|
}
|
|
58
69
|
/**
|
|
59
70
|
* Parse a `--limit` CLI option into a positive row cap, or `undefined` when the
|
package/dist/cli/uninstall.js
CHANGED
|
@@ -33,7 +33,8 @@ import { execFile } from 'child_process';
|
|
|
33
33
|
import { promisify } from 'util';
|
|
34
34
|
import { fileURLToPath } from 'url';
|
|
35
35
|
import { parseTree, modify, applyEdits, findNodeAtLocation, parse as parseJsonc, } from 'jsonc-parser';
|
|
36
|
-
import { getEditorTargets, detectIndentation } from './editor-targets.js';
|
|
36
|
+
import { getEditorTargets, detectIndentation, isEnoent } from './editor-targets.js';
|
|
37
|
+
import { LEGACY_SKILL_DIR_NAMES } from './setup.js';
|
|
37
38
|
const __filename = fileURLToPath(import.meta.url);
|
|
38
39
|
const __dirname = path.dirname(__filename);
|
|
39
40
|
const execFileAsync = promisify(execFile);
|
|
@@ -50,7 +51,13 @@ async function removeJsoncKey(filePath, keyPath, dryRun) {
|
|
|
50
51
|
try {
|
|
51
52
|
raw = await fs.readFile(filePath, 'utf-8');
|
|
52
53
|
}
|
|
53
|
-
catch {
|
|
54
|
+
catch (err) {
|
|
55
|
+
// ENOENT = genuinely not configured. Any other read failure (EACCES,
|
|
56
|
+
// locks) must not report 'missing' — the file may hold a real gitnexus
|
|
57
|
+
// entry the dry-run would then deny exists. Rethrow into the caller's
|
|
58
|
+
// per-file catch.
|
|
59
|
+
if (!isEnoent(err))
|
|
60
|
+
throw err;
|
|
54
61
|
return 'missing';
|
|
55
62
|
}
|
|
56
63
|
if (raw.trim().length === 0)
|
|
@@ -88,7 +95,12 @@ async function removeHookEntries(filePath, eventNames, commandNeedle, dryRun) {
|
|
|
88
95
|
try {
|
|
89
96
|
raw = await fs.readFile(filePath, 'utf-8');
|
|
90
97
|
}
|
|
91
|
-
catch {
|
|
98
|
+
catch (err) {
|
|
99
|
+
// Masking a non-ENOENT read failure as 'missing' would also let the
|
|
100
|
+
// caller delete the hook scriptDir while the unreadable settings file
|
|
101
|
+
// still references it. Rethrow into the hook uninstaller's catch.
|
|
102
|
+
if (!isEnoent(err))
|
|
103
|
+
throw err;
|
|
92
104
|
return { status: 'missing', count: 0 };
|
|
93
105
|
}
|
|
94
106
|
if (raw.trim().length === 0)
|
|
@@ -166,13 +178,17 @@ async function removeDir(dirPath, dryRun) {
|
|
|
166
178
|
/**
|
|
167
179
|
* The exact set of skill directory names setup installs, derived from the
|
|
168
180
|
* bundled `skills/` source the same way installSkillsTo does (flat
|
|
169
|
-
* `{name}.md` and `{name}/SKILL.md` layouts)
|
|
181
|
+
* `{name}.md` and `{name}/SKILL.md` layouts), plus the legacy names that
|
|
182
|
+
* older setups installed before a shipped rename. Deriving the set — rather
|
|
170
183
|
* than globbing `gitnexus-*` — ensures we never delete a user's own
|
|
171
184
|
* similarly-named skill folder.
|
|
172
185
|
*/
|
|
173
186
|
async function listGitnexusSkillNames() {
|
|
174
187
|
const skillsRoot = process.env.GITNEXUS_TEST_SKILLS_ROOT ?? path.join(__dirname, '..', '..', 'skills');
|
|
175
|
-
|
|
188
|
+
// Seed with legacy names superseded by shipped renames: they dropped out of
|
|
189
|
+
// the bundled source, but a pre-rename install left them behind in every
|
|
190
|
+
// target. Setup only warns about them; uninstall removes by name by design.
|
|
191
|
+
const names = new Set(LEGACY_SKILL_DIR_NAMES);
|
|
176
192
|
try {
|
|
177
193
|
const entries = await fs.readdir(skillsRoot, { withFileTypes: true });
|
|
178
194
|
for (const entry of entries) {
|
|
@@ -323,8 +339,15 @@ async function uninstallCodex(result, dryRun, configPath, tomlSection) {
|
|
|
323
339
|
try {
|
|
324
340
|
raw = await fs.readFile(configPath, 'utf-8');
|
|
325
341
|
}
|
|
326
|
-
catch {
|
|
327
|
-
|
|
342
|
+
catch (err) {
|
|
343
|
+
// Catch locally: this call site has no surrounding try, so a rethrow
|
|
344
|
+
// would abort the hooks/skills cleanup that runs after Codex.
|
|
345
|
+
if (isEnoent(err)) {
|
|
346
|
+
result.skipped.push('Codex MCP (not configured)');
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
result.errors.push(`Codex: ${err instanceof Error ? err.message : String(err)}`);
|
|
350
|
+
}
|
|
328
351
|
return;
|
|
329
352
|
}
|
|
330
353
|
if (!raw.includes(`[${tomlSection}]`)) {
|
|
@@ -369,20 +392,50 @@ export const uninstallCommand = async (options) => {
|
|
|
369
392
|
console.log(' Dry run — nothing will be changed. Re-run with --force to apply.');
|
|
370
393
|
console.log('');
|
|
371
394
|
}
|
|
372
|
-
const result = { removed: [], skipped: [], errors: [] };
|
|
395
|
+
const result = { removed: [], skipped: [], errors: [], corruptLegacy: false };
|
|
373
396
|
// ─── MCP server entries (JSONC editors) ──────────────────────────
|
|
397
|
+
// Sweep legacyFiles too: setup writes into the first existing file of the
|
|
398
|
+
// editor's priority chain, so the gitnexus entry may live in a deprecated
|
|
399
|
+
// location (e.g. CodeBuddy's ~/.codebuddy/mcp.json).
|
|
374
400
|
for (const target of targets.mcpJsonc) {
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
401
|
+
let removedAny = false;
|
|
402
|
+
let erroredAny = false;
|
|
403
|
+
let corruptLegacyAny = false;
|
|
404
|
+
for (const file of [target.file, ...(target.legacyFiles ?? [])]) {
|
|
405
|
+
try {
|
|
406
|
+
const status = await removeJsoncKey(file, target.keyPath, dryRun);
|
|
407
|
+
if (status === 'removed') {
|
|
408
|
+
removedAny = true;
|
|
409
|
+
result.removed.push(`${target.label} MCP server — ${target.keyPath.join('.')} in ${file}`);
|
|
410
|
+
}
|
|
411
|
+
else if (status === 'corrupt') {
|
|
412
|
+
if (file === target.file) {
|
|
413
|
+
// The primary path is where gitnexus itself writes — corruption
|
|
414
|
+
// there is an error worth failing the command over.
|
|
415
|
+
erroredAny = true;
|
|
416
|
+
result.errors.push(`${target.label}: ${path.basename(file)} is corrupt — left untouched`);
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
// Legacy chain files are vendor locations gitnexus may never have
|
|
420
|
+
// touched (e.g. a corrupt ~/.codebuddy.json from an old install).
|
|
421
|
+
// Report informationally without failing uninstall. Deliberate
|
|
422
|
+
// asymmetry: an UNREADABLE (non-ENOENT) legacy file still errors —
|
|
423
|
+
// that's an environmental problem worth surfacing, while corrupt-
|
|
424
|
+
// but-readable proves there is no removable gitnexus entry.
|
|
425
|
+
corruptLegacyAny = true;
|
|
426
|
+
result.corruptLegacy = true;
|
|
427
|
+
result.skipped.push(`${target.label} MCP (legacy ${path.basename(file)} is corrupt — left untouched)`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch (err) {
|
|
432
|
+
erroredAny = true;
|
|
433
|
+
result.errors.push(`${target.label}: ${err instanceof Error ? err.message : String(err)}`);
|
|
434
|
+
}
|
|
383
435
|
}
|
|
384
|
-
|
|
385
|
-
|
|
436
|
+
// A corrupt legacy file makes "not configured" unknowable — suppress it.
|
|
437
|
+
if (!removedAny && !erroredAny && !corruptLegacyAny) {
|
|
438
|
+
result.skipped.push(`${target.label} MCP (not configured)`);
|
|
386
439
|
}
|
|
387
440
|
}
|
|
388
441
|
await uninstallCodex(result, dryRun, targets.codex.configFile, targets.codex.tomlSection);
|
|
@@ -425,6 +478,12 @@ export const uninstallCommand = async (options) => {
|
|
|
425
478
|
for (const name of result.removed)
|
|
426
479
|
console.log(` - ${name}`);
|
|
427
480
|
}
|
|
481
|
+
else if (result.errors.length > 0 || result.corruptLegacy) {
|
|
482
|
+
// Errors (corrupt primary files, unreadable configs) or corrupt legacy
|
|
483
|
+
// configs make "not configured" unknowable — claiming it right above an
|
|
484
|
+
// Errors block would be a contradiction users learn to distrust.
|
|
485
|
+
console.log(' Nothing removed.');
|
|
486
|
+
}
|
|
428
487
|
else {
|
|
429
488
|
console.log(' Nothing to remove — GitNexus is not configured in any detected editor.');
|
|
430
489
|
}
|
package/dist/cli/wiki.d.ts
CHANGED
package/dist/cli/wiki.js
CHANGED
|
@@ -11,7 +11,7 @@ import cliProgress from 'cli-progress';
|
|
|
11
11
|
import { getGitRoot, isGitRepo } from '../storage/git.js';
|
|
12
12
|
import { getStoragePaths, loadMeta, loadCLIConfig, saveCLIConfig, } from '../storage/repo-manager.js';
|
|
13
13
|
import { WikiGenerator } from '../core/wiki/generator.js';
|
|
14
|
-
import { resolveLLMConfig } from '../core/wiki/llm-client.js';
|
|
14
|
+
import { parseLLMAllowedInsecureHttpHosts, resolveLLMConfig, } from '../core/wiki/llm-client.js';
|
|
15
15
|
import { detectCursorCLI } from '../core/wiki/cursor-client.js';
|
|
16
16
|
import { detectLocalCLI } from '../core/wiki/local-cli-client.js';
|
|
17
17
|
import { logger } from '../core/logger.js';
|
|
@@ -152,9 +152,14 @@ const wikiCommandImpl = async (inputPath, options) => {
|
|
|
152
152
|
}
|
|
153
153
|
let timeoutSeconds;
|
|
154
154
|
let retries;
|
|
155
|
+
let allowedInsecureHttpHosts;
|
|
155
156
|
try {
|
|
156
157
|
timeoutSeconds = parsePositiveIntegerOption(options?.timeout, '--timeout', 1000);
|
|
157
158
|
retries = parsePositiveIntegerOption(options?.retries, '--retries');
|
|
159
|
+
allowedInsecureHttpHosts =
|
|
160
|
+
options?.allowInsecureConnection === undefined
|
|
161
|
+
? undefined
|
|
162
|
+
: parseLLMAllowedInsecureHttpHosts(options.allowInsecureConnection);
|
|
158
163
|
}
|
|
159
164
|
catch (error) {
|
|
160
165
|
console.log(` Error: ${error.message}\n`);
|
|
@@ -210,6 +215,7 @@ const wikiCommandImpl = async (inputPath, options) => {
|
|
|
210
215
|
provider: options?.provider,
|
|
211
216
|
apiVersion: options?.apiVersion,
|
|
212
217
|
isReasoningModel: options?.reasoningModel,
|
|
218
|
+
allowedInsecureHttpHosts,
|
|
213
219
|
});
|
|
214
220
|
// Run interactive setup if no saved config and no CLI flags provided
|
|
215
221
|
// (even if env vars exist — let user explicitly choose their provider)
|
|
@@ -10,6 +10,8 @@ export declare const isHardcodedIgnoredDirectory: (name: string) => boolean;
|
|
|
10
10
|
export interface IgnoreOptions {
|
|
11
11
|
/** Skip .gitignore parsing, only read .gitnexusignore. Defaults to GITNEXUS_NO_GITIGNORE env var. */
|
|
12
12
|
noGitignore?: boolean;
|
|
13
|
+
/** Skip core.excludesFile and $GIT_COMMON_DIR/info/exclude. Defaults to GITNEXUS_NO_GLOBAL_IGNORE env var. */
|
|
14
|
+
noGlobalIgnore?: boolean;
|
|
13
15
|
}
|
|
14
16
|
export declare const loadIgnoreRules: (repoPath: string, options?: IgnoreOptions) => Promise<Ignore | null>;
|
|
15
17
|
/**
|
|
@@ -2,6 +2,7 @@ import ignore from 'ignore';
|
|
|
2
2
|
import fs from 'fs/promises';
|
|
3
3
|
import nodePath from 'path';
|
|
4
4
|
import { logger } from '../core/logger.js';
|
|
5
|
+
import { getCoreExcludesFilePath, getGitInfoExcludePath } from '../storage/git.js';
|
|
5
6
|
const DEFAULT_IGNORE_LIST = new Set([
|
|
6
7
|
// Version Control
|
|
7
8
|
'.git',
|
|
@@ -312,6 +313,32 @@ export const isHardcodedIgnoredDirectory = (name) => {
|
|
|
312
313
|
export const loadIgnoreRules = async (repoPath, options) => {
|
|
313
314
|
const ig = ignore();
|
|
314
315
|
let hasRules = false;
|
|
316
|
+
// Mirror git's own precedence for ignore sources (gitignore(5)): patterns
|
|
317
|
+
// from core.excludesFile are consulted first (lowest precedence — git's
|
|
318
|
+
// real global, all-repos file), then $GIT_COMMON_DIR/info/exclude
|
|
319
|
+
// (per-repo, untracked — no write access to the repo needed), then
|
|
320
|
+
// .gitignore/.gitnexusignore below. Later ig.add() calls win on
|
|
321
|
+
// conflicting patterns, matching git's own last-match-wins semantics (#2606).
|
|
322
|
+
const skipGlobalIgnore = options?.noGlobalIgnore ?? !!process.env.GITNEXUS_NO_GLOBAL_IGNORE;
|
|
323
|
+
if (!skipGlobalIgnore) {
|
|
324
|
+
const globalSources = [
|
|
325
|
+
getCoreExcludesFilePath(repoPath),
|
|
326
|
+
getGitInfoExcludePath(repoPath),
|
|
327
|
+
].filter((candidate) => candidate !== null);
|
|
328
|
+
for (const sourcePath of globalSources) {
|
|
329
|
+
try {
|
|
330
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
331
|
+
ig.add(content);
|
|
332
|
+
hasRules = true;
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
const code = err.code;
|
|
336
|
+
if (code !== 'ENOENT') {
|
|
337
|
+
logger.warn(` Warning: could not read ${sourcePath}: ${err.message}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
315
342
|
// Allow users to bypass .gitignore parsing (e.g. when .gitignore accidentally excludes source files)
|
|
316
343
|
const skipGitignore = options?.noGitignore ?? !!process.env.GITNEXUS_NO_GITIGNORE;
|
|
317
344
|
const filenames = skipGitignore ? ['.gitnexusignore'] : ['.gitignore', '.gitnexusignore'];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** A durable statement that one analysis capability was produced by this build. */
|
|
2
|
+
export interface AnalysisFeatureDescriptor {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly version: number;
|
|
5
|
+
readonly appliesTo: (filePaths: readonly string[]) => boolean;
|
|
6
|
+
}
|
|
7
|
+
export type AnalysisFeatureVersions = Readonly<Record<string, number>>;
|
|
8
|
+
/**
|
|
9
|
+
* The Class table shape is global even when a repository contains no JVM code.
|
|
10
|
+
* Existing v8 indexes predate the frameworkAnnotations column and therefore
|
|
11
|
+
* need one full rebuild before any incremental Class write can be safe.
|
|
12
|
+
*/
|
|
13
|
+
export declare const CLASS_FRAMEWORK_ANNOTATIONS_FEATURE: AnalysisFeatureDescriptor;
|
|
14
|
+
/** Resolve the exact feature set this build promises for the supplied files. */
|
|
15
|
+
export declare function resolveAnalysisFeatureVersions(descriptors: readonly AnalysisFeatureDescriptor[], filePaths: readonly string[]): Record<string, number>;
|
|
16
|
+
/**
|
|
17
|
+
* Compare an untrusted metadata value with the exact capabilities produced by
|
|
18
|
+
* this build. Extra keys also mismatch: a rollback must rebuild instead of
|
|
19
|
+
* certifying graph semantics emitted only by a newer binary.
|
|
20
|
+
*/
|
|
21
|
+
export declare function findAnalysisFeatureMismatches(actual: unknown, expected: AnalysisFeatureVersions): readonly string[];
|