@vohongtho.infotech/code-intel 0.1.3 → 0.1.4
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/dist/cli/main.js +3401 -237
- package/dist/cli/main.js.map +1 -1
- package/dist/index.d.ts +386 -31
- package/dist/index.js +3940 -17
- package/dist/index.js.map +1 -1
- package/package.json +15 -12
- package/dist/call-graph/call-builder.d.ts +0 -6
- package/dist/call-graph/call-builder.d.ts.map +0 -1
- package/dist/call-graph/call-builder.js +0 -69
- package/dist/call-graph/call-builder.js.map +0 -1
- package/dist/call-graph/call-classifier.d.ts +0 -12
- package/dist/call-graph/call-classifier.d.ts.map +0 -1
- package/dist/call-graph/call-classifier.js +0 -11
- package/dist/call-graph/call-classifier.js.map +0 -1
- package/dist/call-graph/index.d.ts +0 -4
- package/dist/call-graph/index.d.ts.map +0 -1
- package/dist/call-graph/index.js +0 -3
- package/dist/call-graph/index.js.map +0 -1
- package/dist/cli/context-writer.d.ts +0 -18
- package/dist/cli/context-writer.d.ts.map +0 -1
- package/dist/cli/context-writer.js +0 -104
- package/dist/cli/context-writer.js.map +0 -1
- package/dist/cli/main.d.ts +0 -3
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/skill-writer.d.ts +0 -17
- package/dist/cli/skill-writer.d.ts.map +0 -1
- package/dist/cli/skill-writer.js +0 -249
- package/dist/cli/skill-writer.js.map +0 -1
- package/dist/clustering/community-detector.d.ts +0 -9
- package/dist/clustering/community-detector.d.ts.map +0 -1
- package/dist/clustering/community-detector.js +0 -67
- package/dist/clustering/community-detector.js.map +0 -1
- package/dist/clustering/index.d.ts +0 -3
- package/dist/clustering/index.d.ts.map +0 -1
- package/dist/clustering/index.js +0 -2
- package/dist/clustering/index.js.map +0 -1
- package/dist/flow-detection/entry-point-finder.d.ts +0 -14
- package/dist/flow-detection/entry-point-finder.d.ts.map +0 -1
- package/dist/flow-detection/entry-point-finder.js +0 -86
- package/dist/flow-detection/entry-point-finder.js.map +0 -1
- package/dist/flow-detection/index.d.ts +0 -3
- package/dist/flow-detection/index.d.ts.map +0 -1
- package/dist/flow-detection/index.js +0 -2
- package/dist/flow-detection/index.js.map +0 -1
- package/dist/graph/id-generator.d.ts +0 -4
- package/dist/graph/id-generator.d.ts.map +0 -1
- package/dist/graph/id-generator.js +0 -7
- package/dist/graph/id-generator.js.map +0 -1
- package/dist/graph/index.d.ts +0 -4
- package/dist/graph/index.d.ts.map +0 -1
- package/dist/graph/index.js +0 -3
- package/dist/graph/index.js.map +0 -1
- package/dist/graph/knowledge-graph.d.ts +0 -21
- package/dist/graph/knowledge-graph.d.ts.map +0 -1
- package/dist/graph/knowledge-graph.js +0 -126
- package/dist/graph/knowledge-graph.js.map +0 -1
- package/dist/http/app.d.ts +0 -5
- package/dist/http/app.d.ts.map +0 -1
- package/dist/http/app.js +0 -361
- package/dist/http/app.js.map +0 -1
- package/dist/http/index.d.ts +0 -2
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js +0 -2
- package/dist/http/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/inheritance/heritage-builder.d.ts +0 -9
- package/dist/inheritance/heritage-builder.d.ts.map +0 -1
- package/dist/inheritance/heritage-builder.js +0 -40
- package/dist/inheritance/heritage-builder.js.map +0 -1
- package/dist/inheritance/index.d.ts +0 -6
- package/dist/inheritance/index.d.ts.map +0 -1
- package/dist/inheritance/index.js +0 -4
- package/dist/inheritance/index.js.map +0 -1
- package/dist/inheritance/mro-walker.d.ts +0 -3
- package/dist/inheritance/mro-walker.d.ts.map +0 -1
- package/dist/inheritance/mro-walker.js +0 -80
- package/dist/inheritance/mro-walker.js.map +0 -1
- package/dist/inheritance/override-detector.d.ts +0 -4
- package/dist/inheritance/override-detector.d.ts.map +0 -1
- package/dist/inheritance/override-detector.js +0 -39
- package/dist/inheritance/override-detector.js.map +0 -1
- package/dist/languages/index.d.ts +0 -3
- package/dist/languages/index.d.ts.map +0 -1
- package/dist/languages/index.js +0 -2
- package/dist/languages/index.js.map +0 -1
- package/dist/languages/modules/c.d.ts +0 -3
- package/dist/languages/modules/c.d.ts.map +0 -1
- package/dist/languages/modules/c.js +0 -23
- package/dist/languages/modules/c.js.map +0 -1
- package/dist/languages/modules/cpp.d.ts +0 -3
- package/dist/languages/modules/cpp.d.ts.map +0 -1
- package/dist/languages/modules/cpp.js +0 -23
- package/dist/languages/modules/cpp.js.map +0 -1
- package/dist/languages/modules/csharp.d.ts +0 -3
- package/dist/languages/modules/csharp.d.ts.map +0 -1
- package/dist/languages/modules/csharp.js +0 -21
- package/dist/languages/modules/csharp.js.map +0 -1
- package/dist/languages/modules/dart.d.ts +0 -3
- package/dist/languages/modules/dart.d.ts.map +0 -1
- package/dist/languages/modules/dart.js +0 -30
- package/dist/languages/modules/dart.js.map +0 -1
- package/dist/languages/modules/go.d.ts +0 -3
- package/dist/languages/modules/go.d.ts.map +0 -1
- package/dist/languages/modules/go.js +0 -25
- package/dist/languages/modules/go.js.map +0 -1
- package/dist/languages/modules/java.d.ts +0 -3
- package/dist/languages/modules/java.d.ts.map +0 -1
- package/dist/languages/modules/java.js +0 -23
- package/dist/languages/modules/java.js.map +0 -1
- package/dist/languages/modules/kotlin.d.ts +0 -3
- package/dist/languages/modules/kotlin.d.ts.map +0 -1
- package/dist/languages/modules/kotlin.js +0 -22
- package/dist/languages/modules/kotlin.js.map +0 -1
- package/dist/languages/modules/php.d.ts +0 -3
- package/dist/languages/modules/php.d.ts.map +0 -1
- package/dist/languages/modules/php.js +0 -21
- package/dist/languages/modules/php.js.map +0 -1
- package/dist/languages/modules/python.d.ts +0 -3
- package/dist/languages/modules/python.d.ts.map +0 -1
- package/dist/languages/modules/python.js +0 -36
- package/dist/languages/modules/python.js.map +0 -1
- package/dist/languages/modules/ruby.d.ts +0 -3
- package/dist/languages/modules/ruby.d.ts.map +0 -1
- package/dist/languages/modules/ruby.js +0 -20
- package/dist/languages/modules/ruby.js.map +0 -1
- package/dist/languages/modules/rust.d.ts +0 -3
- package/dist/languages/modules/rust.d.ts.map +0 -1
- package/dist/languages/modules/rust.js +0 -23
- package/dist/languages/modules/rust.js.map +0 -1
- package/dist/languages/modules/swift.d.ts +0 -3
- package/dist/languages/modules/swift.d.ts.map +0 -1
- package/dist/languages/modules/swift.js +0 -21
- package/dist/languages/modules/swift.js.map +0 -1
- package/dist/languages/modules/typescript.d.ts +0 -4
- package/dist/languages/modules/typescript.d.ts.map +0 -1
- package/dist/languages/modules/typescript.js +0 -47
- package/dist/languages/modules/typescript.js.map +0 -1
- package/dist/languages/registry.d.ts +0 -5
- package/dist/languages/registry.d.ts.map +0 -1
- package/dist/languages/registry.js +0 -37
- package/dist/languages/registry.js.map +0 -1
- package/dist/languages/types.d.ts +0 -18
- package/dist/languages/types.d.ts.map +0 -1
- package/dist/languages/types.js +0 -2
- package/dist/languages/types.js.map +0 -1
- package/dist/mcp-server/index.d.ts +0 -2
- package/dist/mcp-server/index.d.ts.map +0 -1
- package/dist/mcp-server/index.js +0 -2
- package/dist/mcp-server/index.js.map +0 -1
- package/dist/mcp-server/server.d.ts +0 -5
- package/dist/mcp-server/server.d.ts.map +0 -1
- package/dist/mcp-server/server.js +0 -224
- package/dist/mcp-server/server.js.map +0 -1
- package/dist/multi-repo/cross-repo-search.d.ts +0 -3
- package/dist/multi-repo/cross-repo-search.d.ts.map +0 -1
- package/dist/multi-repo/cross-repo-search.js +0 -5
- package/dist/multi-repo/cross-repo-search.js.map +0 -1
- package/dist/multi-repo/group-config.d.ts +0 -10
- package/dist/multi-repo/group-config.d.ts.map +0 -1
- package/dist/multi-repo/group-config.js +0 -54
- package/dist/multi-repo/group-config.js.map +0 -1
- package/dist/multi-repo/group-manager.d.ts +0 -6
- package/dist/multi-repo/group-manager.d.ts.map +0 -1
- package/dist/multi-repo/group-manager.js +0 -42
- package/dist/multi-repo/group-manager.js.map +0 -1
- package/dist/multi-repo/index.d.ts +0 -5
- package/dist/multi-repo/index.d.ts.map +0 -1
- package/dist/multi-repo/index.js +0 -4
- package/dist/multi-repo/index.js.map +0 -1
- package/dist/parsing/ast-cache.d.ts +0 -13
- package/dist/parsing/ast-cache.d.ts.map +0 -1
- package/dist/parsing/ast-cache.js +0 -45
- package/dist/parsing/ast-cache.js.map +0 -1
- package/dist/parsing/index.d.ts +0 -5
- package/dist/parsing/index.d.ts.map +0 -1
- package/dist/parsing/index.js +0 -4
- package/dist/parsing/index.js.map +0 -1
- package/dist/parsing/parser-manager.d.ts +0 -7
- package/dist/parsing/parser-manager.d.ts.map +0 -1
- package/dist/parsing/parser-manager.js +0 -48
- package/dist/parsing/parser-manager.js.map +0 -1
- package/dist/parsing/queries/c.d.ts +0 -2
- package/dist/parsing/queries/c.d.ts.map +0 -1
- package/dist/parsing/queries/c.js +0 -32
- package/dist/parsing/queries/c.js.map +0 -1
- package/dist/parsing/queries/cpp.d.ts +0 -2
- package/dist/parsing/queries/cpp.d.ts.map +0 -1
- package/dist/parsing/queries/cpp.js +0 -45
- package/dist/parsing/queries/cpp.js.map +0 -1
- package/dist/parsing/queries/csharp.d.ts +0 -2
- package/dist/parsing/queries/csharp.d.ts.map +0 -1
- package/dist/parsing/queries/csharp.js +0 -55
- package/dist/parsing/queries/csharp.js.map +0 -1
- package/dist/parsing/queries/go.d.ts +0 -2
- package/dist/parsing/queries/go.d.ts.map +0 -1
- package/dist/parsing/queries/go.js +0 -46
- package/dist/parsing/queries/go.js.map +0 -1
- package/dist/parsing/queries/index.d.ts +0 -13
- package/dist/parsing/queries/index.d.ts.map +0 -1
- package/dist/parsing/queries/index.js +0 -13
- package/dist/parsing/queries/index.js.map +0 -1
- package/dist/parsing/queries/java.d.ts +0 -2
- package/dist/parsing/queries/java.d.ts.map +0 -1
- package/dist/parsing/queries/java.js +0 -46
- package/dist/parsing/queries/java.js.map +0 -1
- package/dist/parsing/queries/kotlin.d.ts +0 -2
- package/dist/parsing/queries/kotlin.d.ts.map +0 -1
- package/dist/parsing/queries/kotlin.js +0 -41
- package/dist/parsing/queries/kotlin.js.map +0 -1
- package/dist/parsing/queries/php.d.ts +0 -2
- package/dist/parsing/queries/php.d.ts.map +0 -1
- package/dist/parsing/queries/php.js +0 -60
- package/dist/parsing/queries/php.js.map +0 -1
- package/dist/parsing/queries/python.d.ts +0 -2
- package/dist/parsing/queries/python.d.ts.map +0 -1
- package/dist/parsing/queries/python.js +0 -47
- package/dist/parsing/queries/python.js.map +0 -1
- package/dist/parsing/queries/ruby.d.ts +0 -2
- package/dist/parsing/queries/ruby.d.ts.map +0 -1
- package/dist/parsing/queries/ruby.js +0 -36
- package/dist/parsing/queries/ruby.js.map +0 -1
- package/dist/parsing/queries/rust.d.ts +0 -2
- package/dist/parsing/queries/rust.d.ts.map +0 -1
- package/dist/parsing/queries/rust.js +0 -47
- package/dist/parsing/queries/rust.js.map +0 -1
- package/dist/parsing/queries/swift.d.ts +0 -2
- package/dist/parsing/queries/swift.d.ts.map +0 -1
- package/dist/parsing/queries/swift.js +0 -39
- package/dist/parsing/queries/swift.js.map +0 -1
- package/dist/parsing/queries/typescript.d.ts +0 -2
- package/dist/parsing/queries/typescript.d.ts.map +0 -1
- package/dist/parsing/queries/typescript.js +0 -84
- package/dist/parsing/queries/typescript.js.map +0 -1
- package/dist/parsing/query-runner.d.ts +0 -8
- package/dist/parsing/query-runner.d.ts.map +0 -1
- package/dist/parsing/query-runner.js +0 -16
- package/dist/parsing/query-runner.js.map +0 -1
- package/dist/pipeline/dag-validator.d.ts +0 -8
- package/dist/pipeline/dag-validator.d.ts.map +0 -1
- package/dist/pipeline/dag-validator.js +0 -88
- package/dist/pipeline/dag-validator.js.map +0 -1
- package/dist/pipeline/index.d.ts +0 -6
- package/dist/pipeline/index.d.ts.map +0 -1
- package/dist/pipeline/index.js +0 -4
- package/dist/pipeline/index.js.map +0 -1
- package/dist/pipeline/orchestrator.d.ts +0 -8
- package/dist/pipeline/orchestrator.d.ts.map +0 -1
- package/dist/pipeline/orchestrator.js +0 -47
- package/dist/pipeline/orchestrator.js.map +0 -1
- package/dist/pipeline/phases/cluster-phase.d.ts +0 -3
- package/dist/pipeline/phases/cluster-phase.d.ts.map +0 -1
- package/dist/pipeline/phases/cluster-phase.js +0 -52
- package/dist/pipeline/phases/cluster-phase.js.map +0 -1
- package/dist/pipeline/phases/flow-phase.d.ts +0 -3
- package/dist/pipeline/phases/flow-phase.d.ts.map +0 -1
- package/dist/pipeline/phases/flow-phase.js +0 -92
- package/dist/pipeline/phases/flow-phase.js.map +0 -1
- package/dist/pipeline/phases/index.d.ts +0 -6
- package/dist/pipeline/phases/index.d.ts.map +0 -1
- package/dist/pipeline/phases/index.js +0 -6
- package/dist/pipeline/phases/index.js.map +0 -1
- package/dist/pipeline/phases/parse-phase.d.ts +0 -3
- package/dist/pipeline/phases/parse-phase.d.ts.map +0 -1
- package/dist/pipeline/phases/parse-phase.js +0 -288
- package/dist/pipeline/phases/parse-phase.js.map +0 -1
- package/dist/pipeline/phases/resolve-phase.d.ts +0 -3
- package/dist/pipeline/phases/resolve-phase.d.ts.map +0 -1
- package/dist/pipeline/phases/resolve-phase.js +0 -388
- package/dist/pipeline/phases/resolve-phase.js.map +0 -1
- package/dist/pipeline/phases/scan-phase.d.ts +0 -4
- package/dist/pipeline/phases/scan-phase.d.ts.map +0 -1
- package/dist/pipeline/phases/scan-phase.js +0 -119
- package/dist/pipeline/phases/scan-phase.js.map +0 -1
- package/dist/pipeline/types.d.ts +0 -19
- package/dist/pipeline/types.d.ts.map +0 -1
- package/dist/pipeline/types.js +0 -2
- package/dist/pipeline/types.js.map +0 -1
- package/dist/resolver/binding-tracker.d.ts +0 -15
- package/dist/resolver/binding-tracker.d.ts.map +0 -1
- package/dist/resolver/binding-tracker.js +0 -22
- package/dist/resolver/binding-tracker.js.map +0 -1
- package/dist/resolver/import-resolver.d.ts +0 -16
- package/dist/resolver/import-resolver.d.ts.map +0 -1
- package/dist/resolver/import-resolver.js +0 -43
- package/dist/resolver/import-resolver.js.map +0 -1
- package/dist/resolver/index.d.ts +0 -5
- package/dist/resolver/index.d.ts.map +0 -1
- package/dist/resolver/index.js +0 -3
- package/dist/resolver/index.js.map +0 -1
- package/dist/resolver/strategies/namespace-alias.d.ts +0 -3
- package/dist/resolver/strategies/namespace-alias.d.ts.map +0 -1
- package/dist/resolver/strategies/namespace-alias.js +0 -15
- package/dist/resolver/strategies/namespace-alias.js.map +0 -1
- package/dist/resolver/strategies/package-lookup.d.ts +0 -3
- package/dist/resolver/strategies/package-lookup.d.ts.map +0 -1
- package/dist/resolver/strategies/package-lookup.js +0 -10
- package/dist/resolver/strategies/package-lookup.js.map +0 -1
- package/dist/resolver/strategies/relative-path.d.ts +0 -3
- package/dist/resolver/strategies/relative-path.d.ts.map +0 -1
- package/dist/resolver/strategies/relative-path.js +0 -12
- package/dist/resolver/strategies/relative-path.js.map +0 -1
- package/dist/resolver/strategies/types.d.ts +0 -11
- package/dist/resolver/strategies/types.d.ts.map +0 -1
- package/dist/resolver/strategies/types.js +0 -2
- package/dist/resolver/strategies/types.js.map +0 -1
- package/dist/resolver/strategies/wildcard-expand.d.ts +0 -3
- package/dist/resolver/strategies/wildcard-expand.d.ts.map +0 -1
- package/dist/resolver/strategies/wildcard-expand.js +0 -8
- package/dist/resolver/strategies/wildcard-expand.js.map +0 -1
- package/dist/scope-analysis/index.d.ts +0 -3
- package/dist/scope-analysis/index.d.ts.map +0 -1
- package/dist/scope-analysis/index.js +0 -2
- package/dist/scope-analysis/index.js.map +0 -1
- package/dist/scope-analysis/scope-builder.d.ts +0 -16
- package/dist/scope-analysis/scope-builder.d.ts.map +0 -1
- package/dist/scope-analysis/scope-builder.js +0 -19
- package/dist/scope-analysis/scope-builder.js.map +0 -1
- package/dist/search/embedder.d.ts +0 -14
- package/dist/search/embedder.d.ts.map +0 -1
- package/dist/search/embedder.js +0 -45
- package/dist/search/embedder.js.map +0 -1
- package/dist/search/index.d.ts +0 -7
- package/dist/search/index.d.ts.map +0 -1
- package/dist/search/index.js +0 -4
- package/dist/search/index.js.map +0 -1
- package/dist/search/text-search.d.ts +0 -12
- package/dist/search/text-search.d.ts.map +0 -1
- package/dist/search/text-search.js +0 -72
- package/dist/search/text-search.js.map +0 -1
- package/dist/search/vector-index.d.ts +0 -18
- package/dist/search/vector-index.d.ts.map +0 -1
- package/dist/search/vector-index.js +0 -70
- package/dist/search/vector-index.js.map +0 -1
- package/dist/shared/detection.d.ts +0 -4
- package/dist/shared/detection.d.ts.map +0 -1
- package/dist/shared/detection.js +0 -38
- package/dist/shared/detection.js.map +0 -1
- package/dist/shared/graph-types.d.ts +0 -22
- package/dist/shared/graph-types.d.ts.map +0 -1
- package/dist/shared/graph-types.js +0 -2
- package/dist/shared/graph-types.js.map +0 -1
- package/dist/shared/index.d.ts +0 -5
- package/dist/shared/index.d.ts.map +0 -1
- package/dist/shared/index.js +0 -3
- package/dist/shared/index.js.map +0 -1
- package/dist/shared/languages.d.ts +0 -17
- package/dist/shared/languages.d.ts.map +0 -1
- package/dist/shared/languages.js +0 -18
- package/dist/shared/languages.js.map +0 -1
- package/dist/shared/pipeline-types.d.ts +0 -21
- package/dist/shared/pipeline-types.d.ts.map +0 -1
- package/dist/shared/pipeline-types.js +0 -2
- package/dist/shared/pipeline-types.js.map +0 -1
- package/dist/storage/csv-writer.d.ts +0 -9
- package/dist/storage/csv-writer.d.ts.map +0 -1
- package/dist/storage/csv-writer.js +0 -77
- package/dist/storage/csv-writer.js.map +0 -1
- package/dist/storage/db-manager.d.ts +0 -12
- package/dist/storage/db-manager.d.ts.map +0 -1
- package/dist/storage/db-manager.js +0 -50
- package/dist/storage/db-manager.js.map +0 -1
- package/dist/storage/graph-loader.d.ts +0 -7
- package/dist/storage/graph-loader.d.ts.map +0 -1
- package/dist/storage/graph-loader.js +0 -71
- package/dist/storage/graph-loader.js.map +0 -1
- package/dist/storage/index.d.ts +0 -10
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -7
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/metadata.d.ts +0 -15
- package/dist/storage/metadata.d.ts.map +0 -1
- package/dist/storage/metadata.js +0 -23
- package/dist/storage/metadata.js.map +0 -1
- package/dist/storage/repo-registry.d.ts +0 -15
- package/dist/storage/repo-registry.d.ts.map +0 -1
- package/dist/storage/repo-registry.js +0 -34
- package/dist/storage/repo-registry.js.map +0 -1
- package/dist/storage/schema.d.ts +0 -6
- package/dist/storage/schema.d.ts.map +0 -1
- package/dist/storage/schema.js +0 -54
- package/dist/storage/schema.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vohongtho.infotech/code-intel",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Static code analysis platform — builds a Knowledge Graph from source code with Web UI, HTTP API, CLI, and MCP server",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"bin": {
|
|
10
|
-
"code-intel": "
|
|
10
|
+
"code-intel": "dist/cli/main.js"
|
|
11
11
|
},
|
|
12
12
|
"exports": {
|
|
13
13
|
".": "./dist/index.js"
|
|
@@ -31,33 +31,36 @@
|
|
|
31
31
|
"homepage": "https://github.com/vohongtho/code-intel-platform",
|
|
32
32
|
"repository": {
|
|
33
33
|
"type": "git",
|
|
34
|
-
"url": "https://github.com/vohongtho/code-intel-platform"
|
|
34
|
+
"url": "git+https://github.com/vohongtho/code-intel-platform.git"
|
|
35
35
|
},
|
|
36
36
|
"engines": {
|
|
37
37
|
"node": ">=22.0.0"
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
40
|
-
"build": "
|
|
40
|
+
"build": "tsup --config tsup.config.ts && node scripts/add-shebang.mjs",
|
|
41
|
+
"typecheck": "tsc -b --noEmit",
|
|
41
42
|
"prepublishOnly": "npm run build",
|
|
42
43
|
"clean": "rm -rf dist dist-tests *.tsbuildinfo",
|
|
43
44
|
"test": "tsc -b tsconfig.test.json && node --test dist-tests/tests/**/*.test.js"
|
|
44
45
|
},
|
|
45
46
|
"dependencies": {
|
|
46
|
-
"
|
|
47
|
+
"@huggingface/transformers": "^4.2.0",
|
|
47
48
|
"@ladybugdb/core": "^0.15.3",
|
|
48
49
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
49
|
-
"
|
|
50
|
-
"commander": "^
|
|
50
|
+
"code-intel-shared": "^0.1.0",
|
|
51
|
+
"commander": "^14.0.3",
|
|
51
52
|
"cors": "^2.8.5",
|
|
52
|
-
"express": "^
|
|
53
|
-
"graphology": "^0.
|
|
53
|
+
"express": "^5.2.1",
|
|
54
|
+
"graphology": "^0.26.0",
|
|
54
55
|
"graphology-communities-louvain": "^2.0.1",
|
|
55
|
-
"web-tree-sitter": "^0.
|
|
56
|
+
"web-tree-sitter": "^0.26.8"
|
|
56
57
|
},
|
|
57
58
|
"devDependencies": {
|
|
58
59
|
"@types/cors": "^2.8.17",
|
|
59
|
-
"@types/express": "^
|
|
60
|
+
"@types/express": "^5.0.6",
|
|
60
61
|
"@types/node": "^22.0.0",
|
|
61
|
-
"
|
|
62
|
+
"esbuild": "^0.27.0",
|
|
63
|
+
"tsup": "^8.5.1",
|
|
64
|
+
"typescript": "^5.9.3"
|
|
62
65
|
}
|
|
63
66
|
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { CodeEdge } from '../shared/index.js';
|
|
2
|
-
import type { KnowledgeGraph } from '../graph/knowledge-graph.js';
|
|
3
|
-
import type { BindingTracker } from '../resolver/binding-tracker.js';
|
|
4
|
-
import type { CallSite } from './call-classifier.js';
|
|
5
|
-
export declare function buildCallEdges(callSites: CallSite[], graph: KnowledgeGraph, bindings: BindingTracker): CodeEdge[];
|
|
6
|
-
//# sourceMappingURL=call-builder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"call-builder.d.ts","sourceRoot":"","sources":["../../src/call-graph/call-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQrD,wBAAgB,cAAc,CAC5B,SAAS,EAAE,QAAQ,EAAE,EACrB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,cAAc,GACvB,QAAQ,EAAE,CA2DZ"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { generateEdgeId } from '../graph/id-generator.js';
|
|
2
|
-
export function buildCallEdges(callSites, graph, bindings) {
|
|
3
|
-
const edges = [];
|
|
4
|
-
const symbolIndex = buildSymbolIndex(graph);
|
|
5
|
-
const tiers = [
|
|
6
|
-
{
|
|
7
|
-
name: 'same-file',
|
|
8
|
-
confidence: 0.95,
|
|
9
|
-
resolve(cs) {
|
|
10
|
-
const key = `${cs.callerFilePath}:${cs.name}`;
|
|
11
|
-
return symbolIndex.get(key) ?? null;
|
|
12
|
-
},
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
name: 'imported',
|
|
16
|
-
confidence: 0.9,
|
|
17
|
-
resolve(cs) {
|
|
18
|
-
const binding = bindings.getBinding(cs.callerFilePath, cs.name);
|
|
19
|
-
if (!binding)
|
|
20
|
-
return null;
|
|
21
|
-
const key = `${binding.sourcePath}:${binding.exportedName}`;
|
|
22
|
-
return symbolIndex.get(key) ?? null;
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: 'global',
|
|
27
|
-
confidence: 0.5,
|
|
28
|
-
resolve(cs) {
|
|
29
|
-
return globalSymbolIndex.get(cs.name) ?? null;
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
];
|
|
33
|
-
const globalSymbolIndex = new Map();
|
|
34
|
-
for (const node of graph.allNodes()) {
|
|
35
|
-
if (['function', 'method', 'class', 'constructor'].includes(node.kind)) {
|
|
36
|
-
if (!globalSymbolIndex.has(node.name)) {
|
|
37
|
-
globalSymbolIndex.set(node.name, node.id);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
for (const cs of callSites) {
|
|
42
|
-
for (const tier of tiers) {
|
|
43
|
-
const targetId = tier.resolve(cs);
|
|
44
|
-
if (targetId && targetId !== cs.callerNodeId) {
|
|
45
|
-
edges.push({
|
|
46
|
-
id: generateEdgeId(cs.callerNodeId, targetId, 'calls'),
|
|
47
|
-
source: cs.callerNodeId,
|
|
48
|
-
target: targetId,
|
|
49
|
-
kind: 'calls',
|
|
50
|
-
weight: tier.confidence,
|
|
51
|
-
label: cs.name,
|
|
52
|
-
});
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return edges;
|
|
58
|
-
}
|
|
59
|
-
function buildSymbolIndex(graph) {
|
|
60
|
-
const index = new Map();
|
|
61
|
-
for (const node of graph.allNodes()) {
|
|
62
|
-
if (['function', 'method', 'class', 'constructor', 'variable'].includes(node.kind)) {
|
|
63
|
-
const key = `${node.filePath}:${node.name}`;
|
|
64
|
-
index.set(key, node.id);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return index;
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=call-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"call-builder.js","sourceRoot":"","sources":["../../src/call-graph/call-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export type CallKind = 'free' | 'member' | 'constructor';
|
|
2
|
-
export interface CallSite {
|
|
3
|
-
callerNodeId: string;
|
|
4
|
-
callerFilePath: string;
|
|
5
|
-
name: string;
|
|
6
|
-
receiverText?: string;
|
|
7
|
-
kind: CallKind;
|
|
8
|
-
line: number;
|
|
9
|
-
argCount: number;
|
|
10
|
-
}
|
|
11
|
-
export declare function classifyCall(name: string, hasReceiver: boolean, isNew: boolean): CallKind;
|
|
12
|
-
//# sourceMappingURL=call-classifier.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"call-classifier.d.ts","sourceRoot":"","sources":["../../src/call-graph/call-classifier.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,KAAK,EAAE,OAAO,GACb,QAAQ,CAOV"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export function classifyCall(name, hasReceiver, isNew) {
|
|
2
|
-
if (isNew)
|
|
3
|
-
return 'constructor';
|
|
4
|
-
if (hasReceiver)
|
|
5
|
-
return 'member';
|
|
6
|
-
if (name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase()) {
|
|
7
|
-
return 'constructor';
|
|
8
|
-
}
|
|
9
|
-
return 'free';
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=call-classifier.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"call-classifier.js","sourceRoot":"","sources":["../../src/call-graph/call-classifier.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,WAAoB,EACpB,KAAc;IAEd,IAAI,KAAK;QAAE,OAAO,aAAa,CAAC;IAChC,IAAI,WAAW;QAAE,OAAO,QAAQ,CAAC;IACjC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3E,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/call-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/call-graph/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/call-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context file writer — upserts a <!-- code-intel:start/end --> block into
|
|
3
|
-
* AGENTS.md and CLAUDE.md so AI assistants get accurate codebase stats,
|
|
4
|
-
* CLI commands, and skill links immediately after analysis.
|
|
5
|
-
*/
|
|
6
|
-
import type { SkillSummary } from './skill-writer.js';
|
|
7
|
-
export interface ContextStats {
|
|
8
|
-
nodes: number;
|
|
9
|
-
edges: number;
|
|
10
|
-
files: number;
|
|
11
|
-
duration: number;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Write AGENTS.md and CLAUDE.md at the workspace root.
|
|
15
|
-
* Replaces any existing code-intel block; preserves all other content.
|
|
16
|
-
*/
|
|
17
|
-
export declare function writeContextFiles(workspaceRoot: string, projectName: string, stats: ContextStats, skills: SkillSummary[]): void;
|
|
18
|
-
//# sourceMappingURL=context-writer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-writer.d.ts","sourceRoot":"","sources":["../../src/cli/context-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,EAAE,GACrB,IAAI,CAKN"}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context file writer — upserts a <!-- code-intel:start/end --> block into
|
|
3
|
-
* AGENTS.md and CLAUDE.md so AI assistants get accurate codebase stats,
|
|
4
|
-
* CLI commands, and skill links immediately after analysis.
|
|
5
|
-
*/
|
|
6
|
-
import fs from 'node:fs';
|
|
7
|
-
import path from 'node:path';
|
|
8
|
-
const BLOCK_START = '<!-- code-intel:start -->';
|
|
9
|
-
const BLOCK_END = '<!-- code-intel:end -->';
|
|
10
|
-
/**
|
|
11
|
-
* Write AGENTS.md and CLAUDE.md at the workspace root.
|
|
12
|
-
* Replaces any existing code-intel block; preserves all other content.
|
|
13
|
-
*/
|
|
14
|
-
export function writeContextFiles(workspaceRoot, projectName, stats, skills) {
|
|
15
|
-
const block = buildBlock(projectName, stats, skills);
|
|
16
|
-
upsertFile(path.join(workspaceRoot, 'AGENTS.md'), block);
|
|
17
|
-
upsertFile(path.join(workspaceRoot, 'CLAUDE.md'), block);
|
|
18
|
-
}
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
// Block content
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
function buildBlock(projectName, stats, skills) {
|
|
23
|
-
const skillRows = skills
|
|
24
|
-
.map((s) => `| Work in \`${s.label}\` (${s.symbolCount} symbols) | \`.claude/skills/code-intel/${s.name}/SKILL.md\` |`)
|
|
25
|
-
.join('\n');
|
|
26
|
-
const skillTable = `| Task | Skill file |
|
|
27
|
-
|------|------------|
|
|
28
|
-
| Understand architecture / "How does X work?" | Load \`code-intel-exploring\` skill |
|
|
29
|
-
| Blast radius / "What breaks if I change X?" | Load \`code-intel-impact\` skill |
|
|
30
|
-
| Debugging / "Why is X failing?" | Load \`code-intel-debugging\` skill |
|
|
31
|
-
${skillRows ? skillRows + '\n' : ''}`;
|
|
32
|
-
return `${BLOCK_START}
|
|
33
|
-
# Code Intelligence — ${projectName}
|
|
34
|
-
|
|
35
|
-
Indexed: **${stats.nodes.toLocaleString()} nodes** | **${stats.edges.toLocaleString()} edges** | **${stats.files} files** | analyzed in ${(stats.duration / 1000).toFixed(1)}s
|
|
36
|
-
|
|
37
|
-
> If the index is stale, re-run: \`code-intel analyze\`
|
|
38
|
-
|
|
39
|
-
## Always Do
|
|
40
|
-
|
|
41
|
-
- **Before editing any symbol**, run \`code-intel impact <symbol>\` and review blast radius.
|
|
42
|
-
- **Before committing**, verify scope with \`code-intel inspect <symbol>\`.
|
|
43
|
-
- Use \`code-intel search "<concept>"\` to find related symbols instead of grepping.
|
|
44
|
-
- Warn the user if impact shows ≥ 5 direct callers (HIGH risk).
|
|
45
|
-
|
|
46
|
-
## Never Do
|
|
47
|
-
|
|
48
|
-
- NEVER rename symbols with find-and-replace — use \`code-intel inspect\` to find all usages first.
|
|
49
|
-
- NEVER ignore impact warnings — always report blast radius to the user.
|
|
50
|
-
|
|
51
|
-
## CLI Quick Reference
|
|
52
|
-
|
|
53
|
-
\`\`\`bash
|
|
54
|
-
code-intel analyze [path] # Build / refresh the knowledge graph
|
|
55
|
-
code-intel serve [path] # Start HTTP API + Web UI on :4747
|
|
56
|
-
code-intel search <query> # Text search across all symbols
|
|
57
|
-
code-intel inspect <symbol> # Callers, callees, imports, cluster
|
|
58
|
-
code-intel impact <symbol> # Blast radius (who breaks if this changes)
|
|
59
|
-
code-intel status [path] # Index freshness and stats
|
|
60
|
-
code-intel clean [path] # Remove index data
|
|
61
|
-
\`\`\`
|
|
62
|
-
|
|
63
|
-
## Skills
|
|
64
|
-
|
|
65
|
-
${skillTable}
|
|
66
|
-
${BLOCK_END}`;
|
|
67
|
-
}
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
// File upsert: create → replace block → append
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
function upsertFile(filePath, block) {
|
|
72
|
-
if (!fs.existsSync(filePath)) {
|
|
73
|
-
fs.writeFileSync(filePath, block + '\n', 'utf-8');
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const existing = fs.readFileSync(filePath, 'utf-8');
|
|
77
|
-
const startIdx = findLineMarker(existing, BLOCK_START);
|
|
78
|
-
const endIdx = findLineMarker(existing, BLOCK_END, startIdx === -1 ? 0 : startIdx);
|
|
79
|
-
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
80
|
-
// Replace existing block
|
|
81
|
-
const before = existing.slice(0, startIdx);
|
|
82
|
-
const after = existing.slice(endIdx + BLOCK_END.length);
|
|
83
|
-
fs.writeFileSync(filePath, (before + block + after).trimEnd() + '\n', 'utf-8');
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
// Append block
|
|
87
|
-
fs.writeFileSync(filePath, existing.trimEnd() + '\n\n' + block + '\n', 'utf-8');
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Find a marker that stands alone on its own line (not embedded in prose).
|
|
91
|
-
*/
|
|
92
|
-
function findLineMarker(content, marker, startFrom = 0) {
|
|
93
|
-
let idx = content.indexOf(marker, startFrom);
|
|
94
|
-
while (idx !== -1) {
|
|
95
|
-
const atStart = idx === 0 || content[idx - 1] === '\n';
|
|
96
|
-
const end = idx + marker.length;
|
|
97
|
-
const atEnd = end === content.length || content[end] === '\n' || content[end] === '\r';
|
|
98
|
-
if (atStart && atEnd)
|
|
99
|
-
return idx;
|
|
100
|
-
idx = content.indexOf(marker, idx + 1);
|
|
101
|
-
}
|
|
102
|
-
return -1;
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=context-writer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-writer.js","sourceRoot":"","sources":["../../src/cli/context-writer.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/main.d.ts
DELETED
package/dist/cli/main.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":""}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill file writer — generates .claude/skills/code-intel/ SKILL.md files
|
|
3
|
-
* from the knowledge graph clusters, giving AI assistants structured,
|
|
4
|
-
* high-accuracy context for each functional area of the codebase.
|
|
5
|
-
*/
|
|
6
|
-
import type { KnowledgeGraph } from '../graph/knowledge-graph.js';
|
|
7
|
-
export interface SkillSummary {
|
|
8
|
-
name: string;
|
|
9
|
-
label: string;
|
|
10
|
-
symbolCount: number;
|
|
11
|
-
fileCount: number;
|
|
12
|
-
}
|
|
13
|
-
export declare function writeSkillFiles(graph: KnowledgeGraph, workspaceRoot: string, projectName: string): Promise<{
|
|
14
|
-
skills: SkillSummary[];
|
|
15
|
-
outputDir: string;
|
|
16
|
-
}>;
|
|
17
|
-
//# sourceMappingURL=skill-writer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-writer.d.ts","sourceRoot":"","sources":["../../src/cli/skill-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAiBD,wBAAsB,eAAe,CACnC,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBxD"}
|
package/dist/cli/skill-writer.js
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill file writer — generates .claude/skills/code-intel/ SKILL.md files
|
|
3
|
-
* from the knowledge graph clusters, giving AI assistants structured,
|
|
4
|
-
* high-accuracy context for each functional area of the codebase.
|
|
5
|
-
*/
|
|
6
|
-
import fs from 'node:fs';
|
|
7
|
-
import path from 'node:path';
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
// Public API
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
export async function writeSkillFiles(graph, workspaceRoot, projectName) {
|
|
12
|
-
const outputDir = path.join(workspaceRoot, '.claude', 'skills', 'code-intel');
|
|
13
|
-
const areas = buildAreaMap(graph, workspaceRoot);
|
|
14
|
-
if (areas.length === 0)
|
|
15
|
-
return { skills: [], outputDir };
|
|
16
|
-
fs.rmSync(outputDir, { recursive: true, force: true });
|
|
17
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
18
|
-
const skills = [];
|
|
19
|
-
const usedNames = new Set();
|
|
20
|
-
for (const area of areas) {
|
|
21
|
-
const kebab = uniqueKebab(area.label, usedNames);
|
|
22
|
-
usedNames.add(kebab);
|
|
23
|
-
const content = renderSkill(area, projectName, kebab);
|
|
24
|
-
const dir = path.join(outputDir, kebab);
|
|
25
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
26
|
-
fs.writeFileSync(path.join(dir, 'SKILL.md'), content, 'utf-8');
|
|
27
|
-
skills.push({ name: kebab, label: area.label, symbolCount: area.nodes.length, fileCount: area.files.size });
|
|
28
|
-
}
|
|
29
|
-
return { skills, outputDir };
|
|
30
|
-
}
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
// Build area map from cluster nodes
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
function buildAreaMap(graph, workspaceRoot) {
|
|
35
|
-
// Index cluster labels
|
|
36
|
-
const clusterLabel = new Map();
|
|
37
|
-
const clusterMembers = new Map();
|
|
38
|
-
for (const node of graph.allNodes()) {
|
|
39
|
-
if (node.kind === 'cluster') {
|
|
40
|
-
clusterLabel.set(node.id, node.name);
|
|
41
|
-
clusterMembers.set(node.id, []);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// Assign members via belongs_to
|
|
45
|
-
for (const edge of graph.findEdgesByKind('belongs_to')) {
|
|
46
|
-
const bucket = clusterMembers.get(edge.target);
|
|
47
|
-
const node = graph.getNode(edge.source);
|
|
48
|
-
if (bucket && node)
|
|
49
|
-
bucket.push(node);
|
|
50
|
-
}
|
|
51
|
-
// Precompute degree maps for hot-node detection
|
|
52
|
-
const inDeg = new Map();
|
|
53
|
-
const outDeg = new Map();
|
|
54
|
-
const calledIds = new Set();
|
|
55
|
-
for (const edge of graph.findEdgesByKind('calls')) {
|
|
56
|
-
calledIds.add(edge.target);
|
|
57
|
-
inDeg.set(edge.target, (inDeg.get(edge.target) ?? 0) + 1);
|
|
58
|
-
outDeg.set(edge.source, (outDeg.get(edge.source) ?? 0) + 1);
|
|
59
|
-
}
|
|
60
|
-
const areas = [];
|
|
61
|
-
for (const [clusterId, members] of clusterMembers) {
|
|
62
|
-
if (members.length < 3)
|
|
63
|
-
continue;
|
|
64
|
-
const label = clusterLabel.get(clusterId) ?? 'unknown';
|
|
65
|
-
const dir = members[0]?.filePath.split('/').slice(0, -1).join('/') ?? '';
|
|
66
|
-
// Group by relative file path
|
|
67
|
-
const files = new Map();
|
|
68
|
-
for (const n of members) {
|
|
69
|
-
const rel = relPath(n.filePath, workspaceRoot);
|
|
70
|
-
let list = files.get(rel);
|
|
71
|
-
if (!list) {
|
|
72
|
-
list = [];
|
|
73
|
-
files.set(rel, list);
|
|
74
|
-
}
|
|
75
|
-
list.push(n);
|
|
76
|
-
}
|
|
77
|
-
// Entry points: exported, not called from outside, callable kinds
|
|
78
|
-
const entryPoints = members
|
|
79
|
-
.filter((n) => n.exported && !calledIds.has(n.id) && ['function', 'method', 'class'].includes(n.kind))
|
|
80
|
-
.slice(0, 6);
|
|
81
|
-
// Hot nodes: highest combined degree (most connected = most important)
|
|
82
|
-
const memberIds = new Set(members.map((n) => n.id));
|
|
83
|
-
const hotNodes = members
|
|
84
|
-
.map((n) => ({ node: n, inDeg: inDeg.get(n.id) ?? 0, outDeg: outDeg.get(n.id) ?? 0 }))
|
|
85
|
-
.sort((a, b) => (b.inDeg + b.outDeg) - (a.inDeg + a.outDeg))
|
|
86
|
-
.slice(0, 12);
|
|
87
|
-
// Internal call density
|
|
88
|
-
let callEdgesInArea = 0;
|
|
89
|
-
for (const edge of graph.findEdgesByKind('calls')) {
|
|
90
|
-
if (memberIds.has(edge.source) && memberIds.has(edge.target))
|
|
91
|
-
callEdgesInArea++;
|
|
92
|
-
}
|
|
93
|
-
// Flows touching this area
|
|
94
|
-
const flowIds = [];
|
|
95
|
-
for (const node of graph.allNodes()) {
|
|
96
|
-
if (node.kind !== 'flow')
|
|
97
|
-
continue;
|
|
98
|
-
const steps = node.metadata?.steps;
|
|
99
|
-
if (steps?.some((s) => memberIds.has(s)))
|
|
100
|
-
flowIds.push(node.id);
|
|
101
|
-
if (flowIds.length >= 8)
|
|
102
|
-
break;
|
|
103
|
-
}
|
|
104
|
-
areas.push({ label, dir, nodes: members, files, entryPoints, hotNodes, callEdgesInArea, flowIds });
|
|
105
|
-
}
|
|
106
|
-
areas.sort((a, b) => b.nodes.length - a.nodes.length);
|
|
107
|
-
return areas.slice(0, 20);
|
|
108
|
-
}
|
|
109
|
-
// ---------------------------------------------------------------------------
|
|
110
|
-
// Render optimized SKILL.md
|
|
111
|
-
// ---------------------------------------------------------------------------
|
|
112
|
-
function renderSkill(area, projectName, kebabName) {
|
|
113
|
-
const density = area.nodes.length > 0
|
|
114
|
-
? Math.round((area.callEdgesInArea / area.nodes.length) * 10) / 10
|
|
115
|
-
: 0;
|
|
116
|
-
const topEntryNames = area.entryPoints.slice(0, 3).map((n) => n.name);
|
|
117
|
-
const topHotNames = area.hotNodes.slice(0, 3).map((h) => h.node.name);
|
|
118
|
-
// Pick best symbol names for description triggers
|
|
119
|
-
const triggerNames = topEntryNames.length > 0 ? topEntryNames : topHotNames;
|
|
120
|
-
const triggerStr = triggerNames.map((n) => `\`${n}\``).join(', ');
|
|
121
|
-
// Dominant directory for scoping hint
|
|
122
|
-
const dirs = [...area.files.keys()].map((f) => f.split('/').slice(0, -1).join('/') || '.');
|
|
123
|
-
const dirCounts = new Map();
|
|
124
|
-
for (const d of dirs)
|
|
125
|
-
dirCounts.set(d, (dirCounts.get(d) ?? 0) + 1);
|
|
126
|
-
const dominantDir = [...dirCounts.entries()].sort((a, b) => b[1] - a[1])[0]?.[0] ?? area.dir;
|
|
127
|
-
const lines = [];
|
|
128
|
-
// --- Frontmatter ---
|
|
129
|
-
const description = [
|
|
130
|
-
`Covers the **${area.label}** subsystem of ${projectName}.`,
|
|
131
|
-
`${area.nodes.length} symbols across ${area.files.size} files.`,
|
|
132
|
-
triggerStr ? `Key symbols: ${triggerStr}.` : '',
|
|
133
|
-
`Internal call density: ${density} calls/symbol.`,
|
|
134
|
-
area.flowIds.length > 0 ? `Participates in ${area.flowIds.length} execution flow(s).` : '',
|
|
135
|
-
].filter(Boolean).join(' ');
|
|
136
|
-
lines.push('---');
|
|
137
|
-
lines.push(`name: ${kebabName}`);
|
|
138
|
-
lines.push(`description: "${description.replace(/"/g, "'")}"`);
|
|
139
|
-
lines.push('---', '');
|
|
140
|
-
// --- Title block ---
|
|
141
|
-
lines.push(`# ${area.label}`);
|
|
142
|
-
lines.push('');
|
|
143
|
-
lines.push(`> **${area.nodes.length} symbols** | **${area.files.size} files** | path: \`${dominantDir}/\` | call density: ${density}/sym`);
|
|
144
|
-
lines.push('');
|
|
145
|
-
// --- When to Use (precise triggers for the AI) ---
|
|
146
|
-
lines.push('## When to Use');
|
|
147
|
-
lines.push('');
|
|
148
|
-
lines.push('Load this skill when:');
|
|
149
|
-
lines.push(`- The task involves code in \`${dominantDir}/\``);
|
|
150
|
-
if (triggerStr)
|
|
151
|
-
lines.push(`- The user mentions ${triggerStr} or asks how they work`);
|
|
152
|
-
lines.push(`- Adding, modifying, or debugging ${area.label.toLowerCase()}-related functionality`);
|
|
153
|
-
lines.push(`- Tracing call chains that pass through the ${area.label} layer`);
|
|
154
|
-
lines.push('');
|
|
155
|
-
// --- Key Files ---
|
|
156
|
-
lines.push('## Key Files');
|
|
157
|
-
lines.push('');
|
|
158
|
-
lines.push('| File | Symbols | Notes |');
|
|
159
|
-
lines.push('|------|---------|-------|');
|
|
160
|
-
const sortedFiles = [...area.files.entries()].sort((a, b) => b[1].length - a[1].length);
|
|
161
|
-
for (const [file, nodes] of sortedFiles.slice(0, 10)) {
|
|
162
|
-
const exported = nodes.filter((n) => n.exported);
|
|
163
|
-
const names = nodes.slice(0, 4).map((n) => `\`${n.name}\``).join(', ');
|
|
164
|
-
const extra = nodes.length > 4 ? ` +(${nodes.length - 4})` : '';
|
|
165
|
-
const note = exported.length > 0 ? `${exported.length} exported` : 'internal';
|
|
166
|
-
lines.push(`| \`${file}\` | ${names}${extra} | ${note} |`);
|
|
167
|
-
}
|
|
168
|
-
lines.push('');
|
|
169
|
-
// --- Entry Points ---
|
|
170
|
-
if (area.entryPoints.length > 0) {
|
|
171
|
-
lines.push('## Entry Points');
|
|
172
|
-
lines.push('');
|
|
173
|
-
lines.push('Start exploration here — exported symbols with no external callers:');
|
|
174
|
-
lines.push('');
|
|
175
|
-
for (const ep of area.entryPoints) {
|
|
176
|
-
const loc = ep.startLine ? `:${ep.startLine}` : '';
|
|
177
|
-
lines.push(`- **\`${ep.name}\`** \`(${ep.kind})\` → \`${ep.filePath}${loc}\``);
|
|
178
|
-
}
|
|
179
|
-
lines.push('');
|
|
180
|
-
}
|
|
181
|
-
// --- Hot Symbols (most connected = highest impact) ---
|
|
182
|
-
lines.push('## Hot Symbols');
|
|
183
|
-
lines.push('');
|
|
184
|
-
lines.push('Sorted by call graph degree (changing these has the highest blast radius):');
|
|
185
|
-
lines.push('');
|
|
186
|
-
lines.push('| Symbol | Kind | In ← | → Out | File |');
|
|
187
|
-
lines.push('|--------|------|-----:|------:|------|');
|
|
188
|
-
for (const { node: n, inDeg: i, outDeg: o } of area.hotNodes) {
|
|
189
|
-
lines.push(`| \`${n.name}\` | ${n.kind} | ${i} | ${o} | \`${relFile(n.filePath)}\` |`);
|
|
190
|
-
}
|
|
191
|
-
lines.push('');
|
|
192
|
-
// --- Execution Flows ---
|
|
193
|
-
if (area.flowIds.length > 0) {
|
|
194
|
-
lines.push('## Execution Flows');
|
|
195
|
-
lines.push('');
|
|
196
|
-
lines.push(`**${area.flowIds.length}** execution path(s) pass through this area.`);
|
|
197
|
-
lines.push('Run `code-intel inspect <symbol>` on a hot symbol to trace the full call chain.');
|
|
198
|
-
lines.push('');
|
|
199
|
-
}
|
|
200
|
-
// --- Impact Guidance ---
|
|
201
|
-
lines.push('## Impact Guidance');
|
|
202
|
-
lines.push('');
|
|
203
|
-
lines.push('Before modifying any symbol in this area:');
|
|
204
|
-
lines.push(`1. **High-degree symbols** (In ← ≥ 3) — check all callers before changing signatures`);
|
|
205
|
-
lines.push(`2. **Entry points** — changes propagate to external consumers`);
|
|
206
|
-
lines.push(`3. Run \`code-intel impact <symbol>\` to get full blast radius`);
|
|
207
|
-
lines.push('');
|
|
208
|
-
// --- Quick Commands ---
|
|
209
|
-
const firstHot = area.hotNodes[0]?.node.name ?? area.nodes[0]?.name ?? area.label;
|
|
210
|
-
const firstEntry = area.entryPoints[0]?.name ?? firstHot;
|
|
211
|
-
lines.push('## Quick Commands');
|
|
212
|
-
lines.push('');
|
|
213
|
-
lines.push('```bash');
|
|
214
|
-
lines.push(`# Inspect most-connected symbol`);
|
|
215
|
-
lines.push(`code-intel inspect ${firstHot}`);
|
|
216
|
-
lines.push(`# Blast radius for entry point`);
|
|
217
|
-
lines.push(`code-intel impact ${firstEntry}`);
|
|
218
|
-
lines.push(`# Search this area`);
|
|
219
|
-
lines.push(`code-intel search "${area.label.toLowerCase()}"`);
|
|
220
|
-
lines.push('```');
|
|
221
|
-
lines.push('');
|
|
222
|
-
return lines.join('\n');
|
|
223
|
-
}
|
|
224
|
-
// ---------------------------------------------------------------------------
|
|
225
|
-
// Utility helpers
|
|
226
|
-
// ---------------------------------------------------------------------------
|
|
227
|
-
function uniqueKebab(label, used) {
|
|
228
|
-
let base = label
|
|
229
|
-
.toLowerCase()
|
|
230
|
-
.replace(/[^a-z0-9]+/g, '-')
|
|
231
|
-
.replace(/^-+|-+$/g, '')
|
|
232
|
-
.slice(0, 50) || 'skill';
|
|
233
|
-
let candidate = base;
|
|
234
|
-
let n = 2;
|
|
235
|
-
while (used.has(candidate)) {
|
|
236
|
-
candidate = `${base}-${n++}`;
|
|
237
|
-
}
|
|
238
|
-
return candidate;
|
|
239
|
-
}
|
|
240
|
-
function relPath(filePath, workspaceRoot) {
|
|
241
|
-
const norm = filePath.replace(/\\/g, '/');
|
|
242
|
-
const root = workspaceRoot.replace(/\\/g, '/').replace(/\/?$/, '/');
|
|
243
|
-
return norm.startsWith(root) ? norm.slice(root.length) : norm.replace(/^\//, '');
|
|
244
|
-
}
|
|
245
|
-
function relFile(filePath) {
|
|
246
|
-
const parts = filePath.replace(/\\/g, '/').split('/');
|
|
247
|
-
return parts.slice(-2).join('/');
|
|
248
|
-
}
|
|
249
|
-
//# sourceMappingURL=skill-writer.js.map
|