@vpxa/kb 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1140 -0
- package/bin/kb.mjs +10 -0
- package/package.json +67 -0
- package/packages/analyzers/dist/blast-radius-analyzer.d.ts +23 -0
- package/packages/analyzers/dist/blast-radius-analyzer.js +114 -0
- package/packages/analyzers/dist/dependency-analyzer.d.ts +29 -0
- package/packages/analyzers/dist/dependency-analyzer.js +425 -0
- package/packages/analyzers/dist/diagram-generator.d.ts +13 -0
- package/packages/analyzers/dist/diagram-generator.js +86 -0
- package/packages/analyzers/dist/entry-point-analyzer.d.ts +19 -0
- package/packages/analyzers/dist/entry-point-analyzer.js +239 -0
- package/packages/analyzers/dist/index.d.ts +14 -0
- package/packages/analyzers/dist/index.js +23 -0
- package/packages/analyzers/dist/knowledge-producer.d.ts +32 -0
- package/packages/analyzers/dist/knowledge-producer.js +113 -0
- package/packages/analyzers/dist/pattern-analyzer.d.ts +12 -0
- package/packages/analyzers/dist/pattern-analyzer.js +359 -0
- package/packages/analyzers/dist/regex-call-graph.d.ts +17 -0
- package/packages/analyzers/dist/regex-call-graph.js +428 -0
- package/packages/analyzers/dist/structure-analyzer.d.ts +11 -0
- package/packages/analyzers/dist/structure-analyzer.js +258 -0
- package/packages/analyzers/dist/symbol-analyzer.d.ts +10 -0
- package/packages/analyzers/dist/symbol-analyzer.js +442 -0
- package/packages/analyzers/dist/ts-call-graph.d.ts +27 -0
- package/packages/analyzers/dist/ts-call-graph.js +160 -0
- package/packages/analyzers/dist/types.d.ts +98 -0
- package/packages/analyzers/dist/types.js +1 -0
- package/packages/chunker/dist/call-graph-extractor.d.ts +22 -0
- package/packages/chunker/dist/call-graph-extractor.js +90 -0
- package/packages/chunker/dist/chunker-factory.d.ts +7 -0
- package/packages/chunker/dist/chunker-factory.js +36 -0
- package/packages/chunker/dist/chunker.interface.d.ts +10 -0
- package/packages/chunker/dist/chunker.interface.js +1 -0
- package/packages/chunker/dist/code-chunker.d.ts +14 -0
- package/packages/chunker/dist/code-chunker.js +134 -0
- package/packages/chunker/dist/generic-chunker.d.ts +12 -0
- package/packages/chunker/dist/generic-chunker.js +72 -0
- package/packages/chunker/dist/index.d.ts +8 -0
- package/packages/chunker/dist/index.js +21 -0
- package/packages/chunker/dist/markdown-chunker.d.ts +14 -0
- package/packages/chunker/dist/markdown-chunker.js +122 -0
- package/packages/chunker/dist/treesitter-chunker.d.ts +47 -0
- package/packages/chunker/dist/treesitter-chunker.js +234 -0
- package/packages/cli/dist/commands/analyze.d.ts +3 -0
- package/packages/cli/dist/commands/analyze.js +112 -0
- package/packages/cli/dist/commands/context-cmds.d.ts +3 -0
- package/packages/cli/dist/commands/context-cmds.js +155 -0
- package/packages/cli/dist/commands/environment.d.ts +3 -0
- package/packages/cli/dist/commands/environment.js +204 -0
- package/packages/cli/dist/commands/execution.d.ts +3 -0
- package/packages/cli/dist/commands/execution.js +137 -0
- package/packages/cli/dist/commands/graph.d.ts +3 -0
- package/packages/cli/dist/commands/graph.js +81 -0
- package/packages/cli/dist/commands/init.d.ts +8 -0
- package/packages/cli/dist/commands/init.js +87 -0
- package/packages/cli/dist/commands/knowledge.d.ts +3 -0
- package/packages/cli/dist/commands/knowledge.js +139 -0
- package/packages/cli/dist/commands/search.d.ts +3 -0
- package/packages/cli/dist/commands/search.js +267 -0
- package/packages/cli/dist/commands/system.d.ts +3 -0
- package/packages/cli/dist/commands/system.js +241 -0
- package/packages/cli/dist/commands/workspace.d.ts +3 -0
- package/packages/cli/dist/commands/workspace.js +388 -0
- package/packages/cli/dist/context.d.ts +5 -0
- package/packages/cli/dist/context.js +14 -0
- package/packages/cli/dist/helpers.d.ts +52 -0
- package/packages/cli/dist/helpers.js +458 -0
- package/packages/cli/dist/index.d.ts +8 -0
- package/packages/cli/dist/index.js +69 -0
- package/packages/cli/dist/kb-init.d.ts +57 -0
- package/packages/cli/dist/kb-init.js +82 -0
- package/packages/cli/dist/types.d.ts +7 -0
- package/packages/cli/dist/types.js +1 -0
- package/packages/core/dist/constants.d.ts +49 -0
- package/packages/core/dist/constants.js +43 -0
- package/packages/core/dist/content-detector.d.ts +9 -0
- package/packages/core/dist/content-detector.js +79 -0
- package/packages/core/dist/errors.d.ts +18 -0
- package/packages/core/dist/errors.js +40 -0
- package/packages/core/dist/index.d.ts +6 -0
- package/packages/core/dist/index.js +9 -0
- package/packages/core/dist/logger.d.ts +9 -0
- package/packages/core/dist/logger.js +34 -0
- package/packages/core/dist/types.d.ts +108 -0
- package/packages/core/dist/types.js +1 -0
- package/packages/embeddings/dist/embedder.interface.d.ts +24 -0
- package/packages/embeddings/dist/embedder.interface.js +1 -0
- package/packages/embeddings/dist/index.d.ts +3 -0
- package/packages/embeddings/dist/index.js +5 -0
- package/packages/embeddings/dist/onnx-embedder.d.ts +24 -0
- package/packages/embeddings/dist/onnx-embedder.js +82 -0
- package/packages/indexer/dist/file-hasher.d.ts +11 -0
- package/packages/indexer/dist/file-hasher.js +13 -0
- package/packages/indexer/dist/filesystem-crawler.d.ts +27 -0
- package/packages/indexer/dist/filesystem-crawler.js +125 -0
- package/packages/indexer/dist/graph-extractor.d.ts +22 -0
- package/packages/indexer/dist/graph-extractor.js +111 -0
- package/packages/indexer/dist/incremental-indexer.d.ts +47 -0
- package/packages/indexer/dist/incremental-indexer.js +278 -0
- package/packages/indexer/dist/index.d.ts +5 -0
- package/packages/indexer/dist/index.js +14 -0
- package/packages/server/dist/api.d.ts +8 -0
- package/packages/server/dist/api.js +9 -0
- package/packages/server/dist/config.d.ts +3 -0
- package/packages/server/dist/config.js +75 -0
- package/packages/server/dist/curated-manager.d.ts +86 -0
- package/packages/server/dist/curated-manager.js +357 -0
- package/packages/server/dist/index.d.ts +2 -0
- package/packages/server/dist/index.js +134 -0
- package/packages/server/dist/replay-interceptor.d.ts +11 -0
- package/packages/server/dist/replay-interceptor.js +38 -0
- package/packages/server/dist/resources/resources.d.ts +4 -0
- package/packages/server/dist/resources/resources.js +40 -0
- package/packages/server/dist/server.d.ts +21 -0
- package/packages/server/dist/server.js +247 -0
- package/packages/server/dist/tools/analyze.tools.d.ts +11 -0
- package/packages/server/dist/tools/analyze.tools.js +288 -0
- package/packages/server/dist/tools/forge.tools.d.ts +12 -0
- package/packages/server/dist/tools/forge.tools.js +501 -0
- package/packages/server/dist/tools/forget.tool.d.ts +4 -0
- package/packages/server/dist/tools/forget.tool.js +43 -0
- package/packages/server/dist/tools/graph.tool.d.ts +4 -0
- package/packages/server/dist/tools/graph.tool.js +110 -0
- package/packages/server/dist/tools/list.tool.d.ts +4 -0
- package/packages/server/dist/tools/list.tool.js +56 -0
- package/packages/server/dist/tools/lookup.tool.d.ts +4 -0
- package/packages/server/dist/tools/lookup.tool.js +53 -0
- package/packages/server/dist/tools/onboard.tool.d.ts +5 -0
- package/packages/server/dist/tools/onboard.tool.js +112 -0
- package/packages/server/dist/tools/produce.tool.d.ts +3 -0
- package/packages/server/dist/tools/produce.tool.js +74 -0
- package/packages/server/dist/tools/read.tool.d.ts +4 -0
- package/packages/server/dist/tools/read.tool.js +49 -0
- package/packages/server/dist/tools/reindex.tool.d.ts +7 -0
- package/packages/server/dist/tools/reindex.tool.js +70 -0
- package/packages/server/dist/tools/remember.tool.d.ts +4 -0
- package/packages/server/dist/tools/remember.tool.js +45 -0
- package/packages/server/dist/tools/replay.tool.d.ts +3 -0
- package/packages/server/dist/tools/replay.tool.js +89 -0
- package/packages/server/dist/tools/search.tool.d.ts +5 -0
- package/packages/server/dist/tools/search.tool.js +331 -0
- package/packages/server/dist/tools/status.tool.d.ts +4 -0
- package/packages/server/dist/tools/status.tool.js +68 -0
- package/packages/server/dist/tools/toolkit.tools.d.ts +35 -0
- package/packages/server/dist/tools/toolkit.tools.js +1674 -0
- package/packages/server/dist/tools/update.tool.d.ts +4 -0
- package/packages/server/dist/tools/update.tool.js +42 -0
- package/packages/server/dist/tools/utility.tools.d.ts +15 -0
- package/packages/server/dist/tools/utility.tools.js +461 -0
- package/packages/store/dist/graph-store.interface.d.ts +104 -0
- package/packages/store/dist/graph-store.interface.js +1 -0
- package/packages/store/dist/index.d.ts +6 -0
- package/packages/store/dist/index.js +9 -0
- package/packages/store/dist/lance-store.d.ts +32 -0
- package/packages/store/dist/lance-store.js +258 -0
- package/packages/store/dist/sqlite-graph-store.d.ts +43 -0
- package/packages/store/dist/sqlite-graph-store.js +374 -0
- package/packages/store/dist/store-factory.d.ts +9 -0
- package/packages/store/dist/store-factory.js +14 -0
- package/packages/store/dist/store.interface.d.ts +48 -0
- package/packages/store/dist/store.interface.js +1 -0
- package/packages/tools/dist/batch.d.ts +21 -0
- package/packages/tools/dist/batch.js +45 -0
- package/packages/tools/dist/changelog.d.ts +34 -0
- package/packages/tools/dist/changelog.js +112 -0
- package/packages/tools/dist/check.d.ts +26 -0
- package/packages/tools/dist/check.js +59 -0
- package/packages/tools/dist/checkpoint.d.ts +17 -0
- package/packages/tools/dist/checkpoint.js +43 -0
- package/packages/tools/dist/codemod.d.ts +37 -0
- package/packages/tools/dist/codemod.js +69 -0
- package/packages/tools/dist/compact.d.ts +41 -0
- package/packages/tools/dist/compact.js +60 -0
- package/packages/tools/dist/data-transform.d.ts +10 -0
- package/packages/tools/dist/data-transform.js +124 -0
- package/packages/tools/dist/dead-symbols.d.ts +21 -0
- package/packages/tools/dist/dead-symbols.js +71 -0
- package/packages/tools/dist/delegate.d.ts +34 -0
- package/packages/tools/dist/delegate.js +130 -0
- package/packages/tools/dist/diff-parse.d.ts +26 -0
- package/packages/tools/dist/diff-parse.js +153 -0
- package/packages/tools/dist/digest.d.ts +53 -0
- package/packages/tools/dist/digest.js +242 -0
- package/packages/tools/dist/encode.d.ts +14 -0
- package/packages/tools/dist/encode.js +46 -0
- package/packages/tools/dist/env-info.d.ts +28 -0
- package/packages/tools/dist/env-info.js +58 -0
- package/packages/tools/dist/eval.d.ts +13 -0
- package/packages/tools/dist/eval.js +79 -0
- package/packages/tools/dist/evidence-map.d.ts +79 -0
- package/packages/tools/dist/evidence-map.js +203 -0
- package/packages/tools/dist/file-summary.d.ts +32 -0
- package/packages/tools/dist/file-summary.js +106 -0
- package/packages/tools/dist/file-walk.d.ts +4 -0
- package/packages/tools/dist/file-walk.js +75 -0
- package/packages/tools/dist/find-examples.d.ts +25 -0
- package/packages/tools/dist/find-examples.js +48 -0
- package/packages/tools/dist/find.d.ts +47 -0
- package/packages/tools/dist/find.js +120 -0
- package/packages/tools/dist/forge-classify.d.ts +44 -0
- package/packages/tools/dist/forge-classify.js +319 -0
- package/packages/tools/dist/forge-ground.d.ts +64 -0
- package/packages/tools/dist/forge-ground.js +184 -0
- package/packages/tools/dist/git-context.d.ts +22 -0
- package/packages/tools/dist/git-context.js +46 -0
- package/packages/tools/dist/graph-query.d.ts +89 -0
- package/packages/tools/dist/graph-query.js +194 -0
- package/packages/tools/dist/health.d.ts +14 -0
- package/packages/tools/dist/health.js +118 -0
- package/packages/tools/dist/http-request.d.ts +23 -0
- package/packages/tools/dist/http-request.js +58 -0
- package/packages/tools/dist/index.d.ts +49 -0
- package/packages/tools/dist/index.js +273 -0
- package/packages/tools/dist/lane.d.ts +39 -0
- package/packages/tools/dist/lane.js +227 -0
- package/packages/tools/dist/measure.d.ts +38 -0
- package/packages/tools/dist/measure.js +119 -0
- package/packages/tools/dist/onboard.d.ts +41 -0
- package/packages/tools/dist/onboard.js +1139 -0
- package/packages/tools/dist/parse-output.d.ts +80 -0
- package/packages/tools/dist/parse-output.js +158 -0
- package/packages/tools/dist/process-manager.d.ts +18 -0
- package/packages/tools/dist/process-manager.js +69 -0
- package/packages/tools/dist/queue.d.ts +38 -0
- package/packages/tools/dist/queue.js +126 -0
- package/packages/tools/dist/regex-test.d.ts +31 -0
- package/packages/tools/dist/regex-test.js +39 -0
- package/packages/tools/dist/rename.d.ts +29 -0
- package/packages/tools/dist/rename.js +70 -0
- package/packages/tools/dist/replay.d.ts +56 -0
- package/packages/tools/dist/replay.js +108 -0
- package/packages/tools/dist/schema-validate.d.ts +23 -0
- package/packages/tools/dist/schema-validate.js +141 -0
- package/packages/tools/dist/scope-map.d.ts +52 -0
- package/packages/tools/dist/scope-map.js +72 -0
- package/packages/tools/dist/snippet.d.ts +34 -0
- package/packages/tools/dist/snippet.js +80 -0
- package/packages/tools/dist/stash.d.ts +12 -0
- package/packages/tools/dist/stash.js +60 -0
- package/packages/tools/dist/stratum-card.d.ts +31 -0
- package/packages/tools/dist/stratum-card.js +239 -0
- package/packages/tools/dist/symbol.d.ts +28 -0
- package/packages/tools/dist/symbol.js +87 -0
- package/packages/tools/dist/test-run.d.ts +23 -0
- package/packages/tools/dist/test-run.js +55 -0
- package/packages/tools/dist/text-utils.d.ts +16 -0
- package/packages/tools/dist/text-utils.js +31 -0
- package/packages/tools/dist/time-utils.d.ts +18 -0
- package/packages/tools/dist/time-utils.js +135 -0
- package/packages/tools/dist/trace.d.ts +24 -0
- package/packages/tools/dist/trace.js +114 -0
- package/packages/tools/dist/truncation.d.ts +22 -0
- package/packages/tools/dist/truncation.js +45 -0
- package/packages/tools/dist/watch.d.ts +30 -0
- package/packages/tools/dist/watch.js +61 -0
- package/packages/tools/dist/web-fetch.d.ts +45 -0
- package/packages/tools/dist/web-fetch.js +249 -0
- package/packages/tools/dist/web-search.d.ts +23 -0
- package/packages/tools/dist/web-search.js +46 -0
- package/packages/tools/dist/workset.d.ts +45 -0
- package/packages/tools/dist/workset.js +77 -0
- package/packages/tui/dist/App.d.ts +8 -0
- package/packages/tui/dist/App.js +52659 -0
- package/packages/tui/dist/index.d.ts +19 -0
- package/packages/tui/dist/index.js +54742 -0
- package/packages/tui/dist/panels/CuratedPanel.d.ts +8 -0
- package/packages/tui/dist/panels/CuratedPanel.js +34452 -0
- package/packages/tui/dist/panels/LogPanel.d.ts +3 -0
- package/packages/tui/dist/panels/LogPanel.js +51894 -0
- package/packages/tui/dist/panels/SearchPanel.d.ts +10 -0
- package/packages/tui/dist/panels/SearchPanel.js +34985 -0
- package/packages/tui/dist/panels/StatusPanel.d.ts +8 -0
- package/packages/tui/dist/panels/StatusPanel.js +34465 -0
- package/skills/knowledge-base/SKILL.md +316 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { access, readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { extname, join, relative } from "node:path";
|
|
3
|
+
const DEFAULT_EXCLUDES = /* @__PURE__ */ new Set([
|
|
4
|
+
"node_modules",
|
|
5
|
+
".git",
|
|
6
|
+
"dist",
|
|
7
|
+
"build",
|
|
8
|
+
"coverage",
|
|
9
|
+
".turbo",
|
|
10
|
+
".cache",
|
|
11
|
+
"cdk.out",
|
|
12
|
+
"__pycache__",
|
|
13
|
+
".venv",
|
|
14
|
+
"target",
|
|
15
|
+
"bin",
|
|
16
|
+
"obj",
|
|
17
|
+
".gradle",
|
|
18
|
+
"venv",
|
|
19
|
+
"env"
|
|
20
|
+
]);
|
|
21
|
+
const DIRECTORY_PATTERNS = [
|
|
22
|
+
{
|
|
23
|
+
dirs: ["adapters", "ports"],
|
|
24
|
+
pattern: "Hexagonal Architecture",
|
|
25
|
+
description: "Ports & adapters (hexagonal) separation"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
dirs: ["domain", "infrastructure", "application"],
|
|
29
|
+
pattern: "Clean Architecture",
|
|
30
|
+
description: "Layered with domain/infrastructure separation"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
dirs: ["controllers", "models"],
|
|
34
|
+
pattern: "MVC Pattern",
|
|
35
|
+
description: "Model-View-Controller structure"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
dirs: ["repositories"],
|
|
39
|
+
pattern: "Repository Pattern",
|
|
40
|
+
description: "Data access abstraction via repositories"
|
|
41
|
+
},
|
|
42
|
+
{ dirs: ["factories"], pattern: "Factory Pattern", description: "Object creation via factories" },
|
|
43
|
+
{
|
|
44
|
+
dirs: ["handlers"],
|
|
45
|
+
pattern: "Handler Pattern",
|
|
46
|
+
description: "Event/request handler separation"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
dirs: ["middleware"],
|
|
50
|
+
pattern: "Middleware Pattern",
|
|
51
|
+
description: "Request pipeline middleware"
|
|
52
|
+
},
|
|
53
|
+
{ dirs: ["hooks"], pattern: "React Hooks", description: "Custom React hooks for logic reuse" },
|
|
54
|
+
{
|
|
55
|
+
dirs: ["components"],
|
|
56
|
+
pattern: "Component Architecture",
|
|
57
|
+
description: "UI component-based structure"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
dirs: ["stacks", "constructs"],
|
|
61
|
+
pattern: "CDK IaC",
|
|
62
|
+
description: "AWS CDK infrastructure as code"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
dirs: ["lambdas", "functions"],
|
|
66
|
+
pattern: "Serverless",
|
|
67
|
+
description: "Serverless function architecture"
|
|
68
|
+
}
|
|
69
|
+
];
|
|
70
|
+
function collapseLocations(locations) {
|
|
71
|
+
if (locations.length <= 3) return locations;
|
|
72
|
+
const byDir = /* @__PURE__ */ new Map();
|
|
73
|
+
for (const loc of locations) {
|
|
74
|
+
const parts = loc.split("/");
|
|
75
|
+
const dir = parts.length > 1 ? parts.slice(0, -1).join("/") : ".";
|
|
76
|
+
const arr = byDir.get(dir);
|
|
77
|
+
if (arr) arr.push(loc);
|
|
78
|
+
else byDir.set(dir, [loc]);
|
|
79
|
+
}
|
|
80
|
+
const result = [];
|
|
81
|
+
for (const [dir, files] of byDir) {
|
|
82
|
+
if (files.length >= 3) {
|
|
83
|
+
result.push(`${dir}/ (${files.length} files)`);
|
|
84
|
+
} else {
|
|
85
|
+
result.push(...files);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result.slice(0, 5);
|
|
89
|
+
}
|
|
90
|
+
const CODE_PATTERNS = [
|
|
91
|
+
{
|
|
92
|
+
regex: /container\.register|@injectable|@inject/i,
|
|
93
|
+
pattern: "Dependency Injection",
|
|
94
|
+
description: "IoC container or DI decorators"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
regex: /\.pipe\(|Observable|BehaviorSubject/i,
|
|
98
|
+
pattern: "Reactive (RxJS)",
|
|
99
|
+
description: "Reactive programming with observables",
|
|
100
|
+
lang: "js"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
regex: /createContext|useContext/i,
|
|
104
|
+
pattern: "React Context",
|
|
105
|
+
description: "React Context API for state sharing",
|
|
106
|
+
lang: "js"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
regex: /createSlice|configureStore/i,
|
|
110
|
+
pattern: "Redux Toolkit",
|
|
111
|
+
description: "Redux state management",
|
|
112
|
+
lang: "js"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
regex: /defineStore|usePinia/i,
|
|
116
|
+
pattern: "Pinia Store",
|
|
117
|
+
description: "Vue Pinia state management",
|
|
118
|
+
lang: "js"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
regex: /\.(test|spec)\.[jt]sx?|describe\s*\(|\bit\s*\([\s'"]/i,
|
|
122
|
+
pattern: "Test Suite",
|
|
123
|
+
description: "Unit/integration test files"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
regex: /@SpringBootApplication|@EnableAutoConfiguration/,
|
|
127
|
+
pattern: "Spring Boot",
|
|
128
|
+
description: "Spring Boot application framework",
|
|
129
|
+
lang: "java",
|
|
130
|
+
definitive: true
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
regex: /@Autowired|@Component|@Service|@Repository|@Controller/,
|
|
134
|
+
pattern: "Spring DI",
|
|
135
|
+
description: "Spring dependency injection",
|
|
136
|
+
lang: "java"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
regex: /@RestController|@RequestMapping|@GetMapping|@PostMapping/,
|
|
140
|
+
pattern: "Spring REST",
|
|
141
|
+
description: "Spring REST API controllers",
|
|
142
|
+
lang: "java"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
regex: /app\s*=\s*Flask\s*\(|@app\.route/,
|
|
146
|
+
pattern: "Flask",
|
|
147
|
+
description: "Flask web framework",
|
|
148
|
+
lang: "python"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
regex: /app\s*=\s*FastAPI\s*\(|@app\.get|@app\.post/,
|
|
152
|
+
pattern: "FastAPI",
|
|
153
|
+
description: "FastAPI web framework",
|
|
154
|
+
lang: "python"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
regex: /func\s+main\s*\(\s*\)|http\.ListenAndServe/,
|
|
158
|
+
pattern: "Go Application",
|
|
159
|
+
description: "Go main application",
|
|
160
|
+
lang: "go"
|
|
161
|
+
}
|
|
162
|
+
];
|
|
163
|
+
class PatternAnalyzer {
|
|
164
|
+
name = "patterns";
|
|
165
|
+
async analyze(rootPath, _options = {}) {
|
|
166
|
+
const startTime = Date.now();
|
|
167
|
+
const dirs = await this.collectDirectories(rootPath);
|
|
168
|
+
const dirPatterns = this.detectDirectoryPatterns(dirs, rootPath);
|
|
169
|
+
const files = await this.collectCodeFiles(rootPath);
|
|
170
|
+
const codePatterns = await this.detectCodePatterns(files, rootPath);
|
|
171
|
+
const allPatterns = [...dirPatterns, ...codePatterns];
|
|
172
|
+
const configPatterns = await this.detectConfigPatterns(rootPath);
|
|
173
|
+
const primaryBuild = configPatterns.find(
|
|
174
|
+
(p) => p.pattern === "Maven" || p.pattern === "Gradle" || p.pattern === "Gradle (Kotlin DSL)" || p.pattern === "Node.js Project" || p.pattern === "Go Module" || p.pattern === "Rust (Cargo)"
|
|
175
|
+
);
|
|
176
|
+
const secondaryLangPatterns = /* @__PURE__ */ new Set([
|
|
177
|
+
"Ruby (Bundler)",
|
|
178
|
+
"PHP (Composer)",
|
|
179
|
+
"Swift Package",
|
|
180
|
+
"SBT"
|
|
181
|
+
]);
|
|
182
|
+
for (const cp of configPatterns) {
|
|
183
|
+
if (primaryBuild && secondaryLangPatterns.has(cp.pattern)) continue;
|
|
184
|
+
allPatterns.push(cp);
|
|
185
|
+
}
|
|
186
|
+
const output = this.formatMarkdown(allPatterns, rootPath);
|
|
187
|
+
return {
|
|
188
|
+
output,
|
|
189
|
+
data: { patterns: allPatterns, total: allPatterns.length },
|
|
190
|
+
meta: {
|
|
191
|
+
analyzedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
192
|
+
scope: rootPath,
|
|
193
|
+
fileCount: files.length,
|
|
194
|
+
durationMs: Date.now() - startTime
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
async collectDirectories(rootPath) {
|
|
199
|
+
const dirs = [];
|
|
200
|
+
const walk = async (dir, depth) => {
|
|
201
|
+
if (depth > 5) return;
|
|
202
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
203
|
+
for (const entry of entries) {
|
|
204
|
+
if (!entry.isDirectory()) continue;
|
|
205
|
+
if (DEFAULT_EXCLUDES.has(entry.name)) continue;
|
|
206
|
+
if (entry.name.startsWith(".")) continue;
|
|
207
|
+
const fullPath = join(dir, entry.name);
|
|
208
|
+
dirs.push(entry.name);
|
|
209
|
+
await walk(fullPath, depth + 1);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
await walk(rootPath, 0);
|
|
213
|
+
return dirs;
|
|
214
|
+
}
|
|
215
|
+
async collectCodeFiles(rootPath) {
|
|
216
|
+
const files = [];
|
|
217
|
+
const codeExts = /* @__PURE__ */ new Set([
|
|
218
|
+
".ts",
|
|
219
|
+
".tsx",
|
|
220
|
+
".js",
|
|
221
|
+
".jsx",
|
|
222
|
+
".java",
|
|
223
|
+
".py",
|
|
224
|
+
".go",
|
|
225
|
+
".cs",
|
|
226
|
+
".kt",
|
|
227
|
+
".scala",
|
|
228
|
+
".rb",
|
|
229
|
+
".rs",
|
|
230
|
+
".php",
|
|
231
|
+
".swift"
|
|
232
|
+
]);
|
|
233
|
+
const walk = async (dir) => {
|
|
234
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
235
|
+
for (const entry of entries) {
|
|
236
|
+
if (DEFAULT_EXCLUDES.has(entry.name)) continue;
|
|
237
|
+
if (entry.name.startsWith(".")) continue;
|
|
238
|
+
const fullPath = join(dir, entry.name);
|
|
239
|
+
if (entry.isDirectory()) {
|
|
240
|
+
await walk(fullPath);
|
|
241
|
+
} else if (codeExts.has(extname(entry.name))) {
|
|
242
|
+
files.push(fullPath);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
await walk(rootPath);
|
|
247
|
+
return files;
|
|
248
|
+
}
|
|
249
|
+
detectDirectoryPatterns(dirs, _rootPath) {
|
|
250
|
+
const dirSet = new Set(dirs.map((d) => d.toLowerCase()));
|
|
251
|
+
const matches = [];
|
|
252
|
+
for (const dp of DIRECTORY_PATTERNS) {
|
|
253
|
+
const found = dp.dirs.filter((d) => dirSet.has(d));
|
|
254
|
+
if (found.length === 0) continue;
|
|
255
|
+
if (dp.dirs.length > 1 && found.length < 2) continue;
|
|
256
|
+
matches.push({
|
|
257
|
+
pattern: dp.pattern,
|
|
258
|
+
description: dp.description,
|
|
259
|
+
locations: found.map((d) => `${d}/`),
|
|
260
|
+
confidence: found.length === dp.dirs.length ? "high" : "medium"
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return matches;
|
|
264
|
+
}
|
|
265
|
+
async detectCodePatterns(files, rootPath) {
|
|
266
|
+
const matches = [];
|
|
267
|
+
const patternFiles = {};
|
|
268
|
+
const priorityFiles = files.filter(
|
|
269
|
+
(f) => /Application\.\w+$|Main\.\w+$|app\.\w+$|main\.\w+$/i.test(f) || /Controller|Service|Handler|Router/i.test(f)
|
|
270
|
+
);
|
|
271
|
+
const rest = files.filter((f) => !priorityFiles.includes(f));
|
|
272
|
+
const sampled = [...priorityFiles.slice(0, 50), ...rest.slice(0, 150)];
|
|
273
|
+
for (const filePath of sampled) {
|
|
274
|
+
try {
|
|
275
|
+
const content = await readFile(filePath, "utf-8");
|
|
276
|
+
const ext = extname(filePath).toLowerCase();
|
|
277
|
+
const fileLang = ext === ".java" || ext === ".kt" || ext === ".scala" ? "java" : ext === ".py" ? "python" : ext === ".go" ? "go" : "js";
|
|
278
|
+
for (const cp of CODE_PATTERNS) {
|
|
279
|
+
if (cp.lang && cp.lang !== fileLang) continue;
|
|
280
|
+
if (cp.regex.test(content)) {
|
|
281
|
+
if (!patternFiles[cp.pattern]) patternFiles[cp.pattern] = /* @__PURE__ */ new Set();
|
|
282
|
+
patternFiles[cp.pattern].add(relative(rootPath, filePath).replace(/\\/g, "/"));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
} catch {
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
for (const cp of CODE_PATTERNS) {
|
|
289
|
+
const locations = patternFiles[cp.pattern];
|
|
290
|
+
if (locations && locations.size > 0) {
|
|
291
|
+
const collapsed = collapseLocations([...locations]);
|
|
292
|
+
matches.push({
|
|
293
|
+
pattern: cp.pattern,
|
|
294
|
+
description: cp.description,
|
|
295
|
+
locations: collapsed,
|
|
296
|
+
confidence: cp.definitive || locations.size >= 3 ? "high" : locations.size >= 2 ? "medium" : "low"
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return matches;
|
|
301
|
+
}
|
|
302
|
+
async detectConfigPatterns(rootPath) {
|
|
303
|
+
const matches = [];
|
|
304
|
+
const checks = [
|
|
305
|
+
{ file: "Dockerfile", pattern: "Docker", description: "Containerized application" },
|
|
306
|
+
{
|
|
307
|
+
file: "docker-compose.yml",
|
|
308
|
+
pattern: "Docker Compose",
|
|
309
|
+
description: "Container orchestration"
|
|
310
|
+
},
|
|
311
|
+
{ file: "cdk.json", pattern: "AWS CDK", description: "AWS CDK infrastructure as code" },
|
|
312
|
+
{ file: "terraform.tf", pattern: "Terraform", description: "Terraform IaC" },
|
|
313
|
+
{ file: "main.tf", pattern: "Terraform", description: "Terraform IaC" }
|
|
314
|
+
];
|
|
315
|
+
for (const check of checks) {
|
|
316
|
+
try {
|
|
317
|
+
await access(join(rootPath, check.file));
|
|
318
|
+
matches.push({
|
|
319
|
+
pattern: check.pattern,
|
|
320
|
+
description: check.description,
|
|
321
|
+
locations: [check.file],
|
|
322
|
+
confidence: "high"
|
|
323
|
+
});
|
|
324
|
+
} catch {
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return matches;
|
|
328
|
+
}
|
|
329
|
+
formatMarkdown(patterns, rootPath) {
|
|
330
|
+
const lines = [];
|
|
331
|
+
lines.push(`## Patterns Detected: ${rootPath}
|
|
332
|
+
`);
|
|
333
|
+
lines.push(`**${patterns.length} patterns** found
|
|
334
|
+
`);
|
|
335
|
+
const byConfidence = {
|
|
336
|
+
high: [],
|
|
337
|
+
medium: [],
|
|
338
|
+
low: []
|
|
339
|
+
};
|
|
340
|
+
for (const p of patterns) {
|
|
341
|
+
byConfidence[p.confidence].push(p);
|
|
342
|
+
}
|
|
343
|
+
for (const [level, group] of Object.entries(byConfidence)) {
|
|
344
|
+
if (group.length === 0) continue;
|
|
345
|
+
lines.push(`### ${level.charAt(0).toUpperCase() + level.slice(1)} Confidence
|
|
346
|
+
`);
|
|
347
|
+
for (const p of group) {
|
|
348
|
+
lines.push(`- **${p.pattern}**: ${p.description}`);
|
|
349
|
+
lines.push(` Locations: ${p.locations.slice(0, 5).join(", ")}`);
|
|
350
|
+
}
|
|
351
|
+
lines.push("");
|
|
352
|
+
}
|
|
353
|
+
return lines.join("\n");
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
export {
|
|
357
|
+
PatternAnalyzer
|
|
358
|
+
};
|
|
359
|
+
//# sourceMappingURL=pattern-analyzer.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regex-based call graph extractor for all languages.
|
|
3
|
+
*
|
|
4
|
+
* Parses import statements to extract imported symbol names and source modules,
|
|
5
|
+
* then scans the file body for usage of those symbols to build module-level
|
|
6
|
+
* call edges. Works for TS/JS, Java, Python, Go, C#, Rust, PHP, Ruby, Kotlin, Scala.
|
|
7
|
+
*
|
|
8
|
+
* Less precise than the TypeScript Compiler API version (ts-call-graph.ts) but
|
|
9
|
+
* works across all languages without requiring language-specific compilers.
|
|
10
|
+
*/
|
|
11
|
+
import type { CallGraphResult } from './ts-call-graph.js';
|
|
12
|
+
/**
|
|
13
|
+
* Extract regex-based call graph for any supported language.
|
|
14
|
+
* Returns null if no source files found.
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractRegexCallGraph(rootPath: string): Promise<CallGraphResult | null>;
|
|
17
|
+
//# sourceMappingURL=regex-call-graph.d.ts.map
|