@zivis/cli 0.1.0-alpha.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/dist/commands/app/index.d.ts +10 -0
- package/dist/commands/app/index.js +245 -0
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.d.ts +2 -0
- package/dist/commands/auth/index.js +41 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +8 -0
- package/dist/commands/auth/login.js +65 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +5 -0
- package/dist/commands/auth/logout.js +14 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/sessions.d.ts +4 -0
- package/dist/commands/auth/sessions.js +30 -0
- package/dist/commands/auth/sessions.js.map +1 -0
- package/dist/commands/auth/status.d.ts +4 -0
- package/dist/commands/auth/status.js +53 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/credits/index.d.ts +2 -0
- package/dist/commands/credits/index.js +51 -0
- package/dist/commands/credits/index.js.map +1 -0
- package/dist/commands/mcp/index.d.ts +2 -0
- package/dist/commands/mcp/index.js +70 -0
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/open/index.d.ts +10 -0
- package/dist/commands/open/index.js +57 -0
- package/dist/commands/open/index.js.map +1 -0
- package/dist/commands/scan/index.d.ts +2 -0
- package/dist/commands/scan/index.js +140 -0
- package/dist/commands/scan/index.js.map +1 -0
- package/dist/commands/target/index.d.ts +2 -0
- package/dist/commands/target/index.js +146 -0
- package/dist/commands/target/index.js.map +1 -0
- package/dist/commands/tm/index.d.ts +2 -0
- package/dist/commands/tm/index.js +266 -0
- package/dist/commands/tm/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/index.d.ts +7 -0
- package/dist/internal/extractor/adapters/go/index.js +71 -0
- package/dist/internal/extractor/adapters/go/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/manifest.d.ts +37 -0
- package/dist/internal/extractor/adapters/go/manifest.js +199 -0
- package/dist/internal/extractor/adapters/go/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/go/parser.d.ts +6 -0
- package/dist/internal/extractor/adapters/go/parser.js +23 -0
- package/dist/internal/extractor/adapters/go/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/go/scanner.d.ts +39 -0
- package/dist/internal/extractor/adapters/go/scanner.js +216 -0
- package/dist/internal/extractor/adapters/go/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/python/index.d.ts +5 -0
- package/dist/internal/extractor/adapters/python/index.js +68 -0
- package/dist/internal/extractor/adapters/python/index.js.map +1 -0
- package/dist/internal/extractor/adapters/python/manifest.d.ts +25 -0
- package/dist/internal/extractor/adapters/python/manifest.js +236 -0
- package/dist/internal/extractor/adapters/python/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/python/parser.d.ts +5 -0
- package/dist/internal/extractor/adapters/python/parser.js +22 -0
- package/dist/internal/extractor/adapters/python/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/python/scanner.d.ts +37 -0
- package/dist/internal/extractor/adapters/python/scanner.js +284 -0
- package/dist/internal/extractor/adapters/python/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/index.d.ts +9 -0
- package/dist/internal/extractor/adapters/typescript/index.js +84 -0
- package/dist/internal/extractor/adapters/typescript/index.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/manifest.d.ts +41 -0
- package/dist/internal/extractor/adapters/typescript/manifest.js +156 -0
- package/dist/internal/extractor/adapters/typescript/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/parser.d.ts +14 -0
- package/dist/internal/extractor/adapters/typescript/parser.js +33 -0
- package/dist/internal/extractor/adapters/typescript/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/scanner.d.ts +43 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js +188 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js.map +1 -0
- package/dist/internal/extractor/index.d.ts +22 -0
- package/dist/internal/extractor/index.js +107 -0
- package/dist/internal/extractor/index.js.map +1 -0
- package/dist/internal/extractor/types.d.ts +124 -0
- package/dist/internal/extractor/types.js +28 -0
- package/dist/internal/extractor/types.js.map +1 -0
- package/dist/internal/extractor/walker.d.ts +32 -0
- package/dist/internal/extractor/walker.js +110 -0
- package/dist/internal/extractor/walker.js.map +1 -0
- package/dist/internal/ide-setup.d.ts +7 -0
- package/dist/internal/ide-setup.js +131 -0
- package/dist/internal/ide-setup.js.map +1 -0
- package/dist/internal/orgs.d.ts +8 -0
- package/dist/internal/orgs.js +31 -0
- package/dist/internal/orgs.js.map +1 -0
- package/dist/internal/project-binding.d.ts +11 -0
- package/dist/internal/project-binding.js +96 -0
- package/dist/internal/project-binding.js.map +1 -0
- package/dist/internal/target-auth/api-config.d.ts +37 -0
- package/dist/internal/target-auth/api-config.js +40 -0
- package/dist/internal/target-auth/api-config.js.map +1 -0
- package/dist/internal/target-auth/config.d.ts +20 -0
- package/dist/internal/target-auth/config.js +58 -0
- package/dist/internal/target-auth/config.js.map +1 -0
- package/dist/internal/target-auth/index.d.ts +30 -0
- package/dist/internal/target-auth/index.js +101 -0
- package/dist/internal/target-auth/index.js.map +1 -0
- package/dist/internal/target-auth/keychain.d.ts +23 -0
- package/dist/internal/target-auth/keychain.js +150 -0
- package/dist/internal/target-auth/keychain.js.map +1 -0
- package/dist/internal/target-auth/types.d.ts +51 -0
- package/dist/internal/target-auth/types.js +11 -0
- package/dist/internal/target-auth/types.js.map +1 -0
- package/dist/internal/target-auth/workos.d.ts +20 -0
- package/dist/internal/target-auth/workos.js +196 -0
- package/dist/internal/target-auth/workos.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Go manifest analysis.
|
|
3
|
+
*
|
|
4
|
+
* Parses go.mod (line-based, no real grammar needed) to build the
|
|
5
|
+
* dependency map. Doesn't read go.sum — that's a hash list, not version
|
|
6
|
+
* authority. Direct vs indirect deps are both in the require block;
|
|
7
|
+
* we keep the // indirect annotation as a hint but don't filter on it.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "node:fs/promises";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
export const WEB_FRAMEWORK_MODULES = {
|
|
12
|
+
"github.com/labstack/echo": "echo",
|
|
13
|
+
"github.com/labstack/echo/v4": "echo",
|
|
14
|
+
"github.com/gin-gonic/gin": "gin",
|
|
15
|
+
"github.com/go-chi/chi": "chi",
|
|
16
|
+
"github.com/go-chi/chi/v5": "chi",
|
|
17
|
+
"github.com/gofiber/fiber": "fiber",
|
|
18
|
+
"github.com/gofiber/fiber/v2": "fiber",
|
|
19
|
+
"github.com/gorilla/mux": "gorilla-mux",
|
|
20
|
+
};
|
|
21
|
+
/** stdlib router lives at "net/http"; not in go.mod, only detected via imports. */
|
|
22
|
+
export const STDLIB_FRAMEWORKS = new Set(["net/http"]);
|
|
23
|
+
export const DATA_STORE_MODULES = {
|
|
24
|
+
"github.com/jackc/pgx": { kind: "postgres", client: "pgx" },
|
|
25
|
+
"github.com/jackc/pgx/v5": { kind: "postgres", client: "pgx" },
|
|
26
|
+
"github.com/jackc/pgx/v4": { kind: "postgres", client: "pgx" },
|
|
27
|
+
"github.com/lib/pq": { kind: "postgres", client: "pq" },
|
|
28
|
+
"gorm.io/gorm": { kind: "postgres", client: "gorm" }, // dialect varies; gorm itself is most often pg
|
|
29
|
+
"go.mongodb.org/mongo-driver": { kind: "mongo", client: "mongo-driver" },
|
|
30
|
+
"github.com/redis/go-redis": { kind: "redis", client: "go-redis" },
|
|
31
|
+
"github.com/redis/go-redis/v9": { kind: "redis", client: "go-redis" },
|
|
32
|
+
"github.com/go-redis/redis": { kind: "redis", client: "go-redis" },
|
|
33
|
+
"github.com/go-redis/redis/v8": { kind: "redis", client: "go-redis" },
|
|
34
|
+
"github.com/go-sql-driver/mysql": { kind: "mysql", client: "mysql-driver" },
|
|
35
|
+
};
|
|
36
|
+
export const AI_SDK_MODULES = {
|
|
37
|
+
"github.com/anthropics/anthropic-sdk-go": "Anthropic",
|
|
38
|
+
"github.com/sashabaranov/go-openai": "OpenAI",
|
|
39
|
+
"github.com/openai/openai-go": "OpenAI",
|
|
40
|
+
"github.com/google/generative-ai-go": "Google Generative AI",
|
|
41
|
+
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime": "AWS Bedrock",
|
|
42
|
+
};
|
|
43
|
+
export async function readManifests(rootDir, manifestFiles) {
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const file of manifestFiles) {
|
|
46
|
+
try {
|
|
47
|
+
const raw = await fs.readFile(file, "utf8");
|
|
48
|
+
out.push(parseGoMod(file, rootDir, raw));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// skip unreadable
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Minimal go.mod parser. Supports the two block forms:
|
|
58
|
+
* require modulePath v1.2.3
|
|
59
|
+
* require ( modulePath v1.2.3 \n other v0.0.1 )
|
|
60
|
+
* Strips trailing "// indirect" markers. Does NOT handle replace/exclude
|
|
61
|
+
* directives (out of scope for inventory).
|
|
62
|
+
*/
|
|
63
|
+
export function parseGoMod(filePath, rootDir, raw) {
|
|
64
|
+
const lines = raw.split("\n");
|
|
65
|
+
const result = {
|
|
66
|
+
filePath: relPosix(rootDir, filePath),
|
|
67
|
+
deps: {},
|
|
68
|
+
};
|
|
69
|
+
let inBlock = false;
|
|
70
|
+
for (const line of lines) {
|
|
71
|
+
const trimmed = line.trim();
|
|
72
|
+
if (!trimmed || trimmed.startsWith("//"))
|
|
73
|
+
continue;
|
|
74
|
+
if (trimmed.startsWith("module ")) {
|
|
75
|
+
result.module = trimmed.slice("module ".length).trim();
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (trimmed.startsWith("go ") && /^go\s+\d/.test(trimmed)) {
|
|
79
|
+
result.goVersion = trimmed.slice(3).trim();
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (trimmed === "require (") {
|
|
83
|
+
inBlock = true;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (inBlock && trimmed === ")") {
|
|
87
|
+
inBlock = false;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
let body = trimmed;
|
|
91
|
+
if (body.startsWith("require "))
|
|
92
|
+
body = body.slice("require ".length).trim();
|
|
93
|
+
else if (!inBlock)
|
|
94
|
+
continue;
|
|
95
|
+
// Strip "// indirect" / other line comments
|
|
96
|
+
const commentAt = body.indexOf("//");
|
|
97
|
+
if (commentAt >= 0)
|
|
98
|
+
body = body.slice(0, commentAt).trim();
|
|
99
|
+
const parts = body.split(/\s+/);
|
|
100
|
+
if (parts.length >= 2) {
|
|
101
|
+
const [mod, ver] = parts;
|
|
102
|
+
result.deps[mod] = ver;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
export function summarizeManifests(parsed) {
|
|
108
|
+
return parsed.map((m) => ({
|
|
109
|
+
language: "go",
|
|
110
|
+
file: m.filePath,
|
|
111
|
+
dependencies: m.deps,
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
export function findExternalServices(parsed) {
|
|
115
|
+
const seen = new Map();
|
|
116
|
+
for (const m of parsed) {
|
|
117
|
+
for (const [mod, vendor] of Object.entries(AI_SDK_MODULES)) {
|
|
118
|
+
const ver = matchModuleVersion(m.deps, mod);
|
|
119
|
+
if (!ver)
|
|
120
|
+
continue;
|
|
121
|
+
const key = `ai_sdk::${mod}`;
|
|
122
|
+
const existing = seen.get(key);
|
|
123
|
+
if (existing) {
|
|
124
|
+
existing.callSites.push({ file: m.filePath, line: 1 });
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
seen.set(key, {
|
|
128
|
+
name: vendor,
|
|
129
|
+
kind: "ai_sdk",
|
|
130
|
+
package: mod,
|
|
131
|
+
version: ver,
|
|
132
|
+
callSites: [{ file: m.filePath, line: 1 }],
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return [...seen.values()];
|
|
137
|
+
}
|
|
138
|
+
export function findDataStores(parsed) {
|
|
139
|
+
const seen = new Map();
|
|
140
|
+
for (const m of parsed) {
|
|
141
|
+
for (const [mod, info] of Object.entries(DATA_STORE_MODULES)) {
|
|
142
|
+
const ver = matchModuleVersion(m.deps, mod);
|
|
143
|
+
if (!ver)
|
|
144
|
+
continue;
|
|
145
|
+
const key = `${info.kind}::${info.client}`;
|
|
146
|
+
const existing = seen.get(key);
|
|
147
|
+
if (existing) {
|
|
148
|
+
existing.evidence.push({ file: m.filePath, line: 1, kind: "config" });
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
seen.set(key, {
|
|
152
|
+
name: defaultDataStoreName(info.kind),
|
|
153
|
+
kind: info.kind,
|
|
154
|
+
client: info.client,
|
|
155
|
+
version: ver,
|
|
156
|
+
evidence: [{ file: m.filePath, line: 1, kind: "config" }],
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return [...seen.values()];
|
|
161
|
+
}
|
|
162
|
+
export function detectFrameworkFromManifest(m) {
|
|
163
|
+
for (const [mod, fw] of Object.entries(WEB_FRAMEWORK_MODULES)) {
|
|
164
|
+
if (matchModuleVersion(m.deps, mod))
|
|
165
|
+
return fw;
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Match a module path including its versioned variants (mod, mod/v2, etc.).
|
|
171
|
+
* Returns the version of the first match.
|
|
172
|
+
*/
|
|
173
|
+
function matchModuleVersion(deps, modulePath) {
|
|
174
|
+
if (deps[modulePath])
|
|
175
|
+
return deps[modulePath];
|
|
176
|
+
// Try versioned variants
|
|
177
|
+
for (const [k, v] of Object.entries(deps)) {
|
|
178
|
+
if (k === modulePath)
|
|
179
|
+
return v;
|
|
180
|
+
if (k.startsWith(modulePath + "/v"))
|
|
181
|
+
return v;
|
|
182
|
+
}
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
function defaultDataStoreName(kind) {
|
|
186
|
+
switch (kind) {
|
|
187
|
+
case "postgres": return "postgres";
|
|
188
|
+
case "mysql": return "mysql";
|
|
189
|
+
case "mongo": return "mongo";
|
|
190
|
+
case "redis": return "redis";
|
|
191
|
+
case "sqlite": return "sqlite";
|
|
192
|
+
default: return "data-store";
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function relPosix(rootDir, abs) {
|
|
196
|
+
const rel = path.relative(rootDir, abs);
|
|
197
|
+
return rel.split(path.sep).join("/");
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/go/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tree-sitter-go loader. Lazy-init, reuses the same WASM directory as
|
|
3
|
+
* the TypeScript adapter (both come from @vscode/tree-sitter-wasm).
|
|
4
|
+
*/
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import { Parser, Language } from "web-tree-sitter";
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
let parserPromise = null;
|
|
10
|
+
export function getGoParser() {
|
|
11
|
+
if (!parserPromise) {
|
|
12
|
+
parserPromise = (async () => {
|
|
13
|
+
await Parser.init();
|
|
14
|
+
const wasmDir = path.dirname(require.resolve("@vscode/tree-sitter-wasm/package.json"));
|
|
15
|
+
const lang = await Language.load(path.join(wasmDir, "wasm", "tree-sitter-go.wasm"));
|
|
16
|
+
const p = new Parser();
|
|
17
|
+
p.setLanguage(lang);
|
|
18
|
+
return p;
|
|
19
|
+
})();
|
|
20
|
+
}
|
|
21
|
+
return parserPromise;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/go/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,IAAI,aAAa,GAA2B,IAAI,CAAC;AAEjD,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,CAAC;YACvF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;YACpF,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;YACvB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST scanner for Go source files.
|
|
3
|
+
*
|
|
4
|
+
* Walks tree-sitter-go for two things:
|
|
5
|
+
*
|
|
6
|
+
* 1. import declarations naming any tracked module (AI SDKs, web
|
|
7
|
+
* frameworks, DB clients) → ImportEvidence
|
|
8
|
+
* 2. HTTP route calls. Three flavors:
|
|
9
|
+
* net/http : http.HandleFunc("/path", h)
|
|
10
|
+
* chi : r.Get("/path", h), r.Post(…) (TitleCase)
|
|
11
|
+
* echo/gin : e.GET("/path", h), r.POST(…) (UPPER)
|
|
12
|
+
* fiber : app.Get("/path", h), app.Post(…) (TitleCase)
|
|
13
|
+
*
|
|
14
|
+
* Method-name normalization happens after we identify the call-shape;
|
|
15
|
+
* output is always UPPERCASE in the JSON.
|
|
16
|
+
*
|
|
17
|
+
* Privacy invariant: same as the TS adapter — only identifier names,
|
|
18
|
+
* file paths, line numbers, package paths, and route method/path strings.
|
|
19
|
+
* Function bodies are never read.
|
|
20
|
+
*/
|
|
21
|
+
import type { EvidenceLocation, Evidence, HttpRouteEvidence, ImportEvidence } from "../../types.js";
|
|
22
|
+
export interface FileScanResult {
|
|
23
|
+
file: string;
|
|
24
|
+
imports: ImportEvidence[];
|
|
25
|
+
routes: HttpRouteEvidence[];
|
|
26
|
+
}
|
|
27
|
+
export declare function scanFile(absPath: string, repoRel: string): Promise<FileScanResult>;
|
|
28
|
+
export interface ScannedAggregates {
|
|
29
|
+
components: Array<{
|
|
30
|
+
name: string;
|
|
31
|
+
sourceFile: string;
|
|
32
|
+
framework?: string;
|
|
33
|
+
routes: HttpRouteEvidence[];
|
|
34
|
+
imports: ImportEvidence[];
|
|
35
|
+
}>;
|
|
36
|
+
aiSdkCallSites: Map<string, EvidenceLocation[]>;
|
|
37
|
+
dataStoreEvidence: Map<string, Evidence[]>;
|
|
38
|
+
}
|
|
39
|
+
export declare function aggregate(scans: FileScanResult[]): ScannedAggregates;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST scanner for Go source files.
|
|
3
|
+
*
|
|
4
|
+
* Walks tree-sitter-go for two things:
|
|
5
|
+
*
|
|
6
|
+
* 1. import declarations naming any tracked module (AI SDKs, web
|
|
7
|
+
* frameworks, DB clients) → ImportEvidence
|
|
8
|
+
* 2. HTTP route calls. Three flavors:
|
|
9
|
+
* net/http : http.HandleFunc("/path", h)
|
|
10
|
+
* chi : r.Get("/path", h), r.Post(…) (TitleCase)
|
|
11
|
+
* echo/gin : e.GET("/path", h), r.POST(…) (UPPER)
|
|
12
|
+
* fiber : app.Get("/path", h), app.Post(…) (TitleCase)
|
|
13
|
+
*
|
|
14
|
+
* Method-name normalization happens after we identify the call-shape;
|
|
15
|
+
* output is always UPPERCASE in the JSON.
|
|
16
|
+
*
|
|
17
|
+
* Privacy invariant: same as the TS adapter — only identifier names,
|
|
18
|
+
* file paths, line numbers, package paths, and route method/path strings.
|
|
19
|
+
* Function bodies are never read.
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from "node:fs/promises";
|
|
22
|
+
import { getGoParser } from "./parser.js";
|
|
23
|
+
import { AI_SDK_MODULES, DATA_STORE_MODULES, WEB_FRAMEWORK_MODULES, STDLIB_FRAMEWORKS, } from "./manifest.js";
|
|
24
|
+
const HTTP_METHODS_TITLE = new Set(["Get", "Post", "Put", "Delete", "Patch", "Head", "Options", "Connect", "Trace"]);
|
|
25
|
+
const HTTP_METHODS_UPPER = new Set(["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT", "TRACE", "ANY"]);
|
|
26
|
+
const STDLIB_HANDLER_FNS = new Set(["HandleFunc", "Handle"]);
|
|
27
|
+
const TRACKED_MODULES = new Set([
|
|
28
|
+
...Object.keys(AI_SDK_MODULES),
|
|
29
|
+
...Object.keys(DATA_STORE_MODULES),
|
|
30
|
+
...Object.keys(WEB_FRAMEWORK_MODULES),
|
|
31
|
+
...STDLIB_FRAMEWORKS,
|
|
32
|
+
]);
|
|
33
|
+
export async function scanFile(absPath, repoRel) {
|
|
34
|
+
const parser = await getGoParser();
|
|
35
|
+
const source = await fs.readFile(absPath, "utf8");
|
|
36
|
+
const tree = parser.parse(source);
|
|
37
|
+
if (!tree)
|
|
38
|
+
return { file: repoRel, imports: [], routes: [] };
|
|
39
|
+
const imports = [];
|
|
40
|
+
const routes = [];
|
|
41
|
+
walk(tree.rootNode, (node) => {
|
|
42
|
+
if (node.type === "import_spec") {
|
|
43
|
+
const pkg = extractImportPath(node);
|
|
44
|
+
if (pkg && trackedModuleMatch(pkg)) {
|
|
45
|
+
imports.push({
|
|
46
|
+
kind: "import",
|
|
47
|
+
file: repoRel,
|
|
48
|
+
line: node.startPosition.row + 1,
|
|
49
|
+
package: pkg,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (node.type === "call_expression") {
|
|
55
|
+
const route = extractRouteCall(node);
|
|
56
|
+
if (route) {
|
|
57
|
+
routes.push({
|
|
58
|
+
kind: "http_route",
|
|
59
|
+
file: repoRel,
|
|
60
|
+
line: node.startPosition.row + 1,
|
|
61
|
+
method: route.method,
|
|
62
|
+
path: route.path,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return { file: repoRel, imports, routes };
|
|
68
|
+
}
|
|
69
|
+
function walk(node, visit) {
|
|
70
|
+
visit(node);
|
|
71
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
72
|
+
const child = node.namedChild(i);
|
|
73
|
+
if (child)
|
|
74
|
+
walk(child, visit);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Pull the quoted module path out of an import_spec node. */
|
|
78
|
+
function extractImportPath(node) {
|
|
79
|
+
// import_spec → optional package_identifier + interpreted_string_literal
|
|
80
|
+
const stringNode = node.namedChildren.find((c) => c?.type === "interpreted_string_literal");
|
|
81
|
+
if (!stringNode)
|
|
82
|
+
return null;
|
|
83
|
+
// text is the quoted form; strip the surrounding quotes.
|
|
84
|
+
const text = stringNode.text;
|
|
85
|
+
return text.length >= 2 ? text.slice(1, -1) : null;
|
|
86
|
+
}
|
|
87
|
+
function trackedModuleMatch(pkg) {
|
|
88
|
+
if (TRACKED_MODULES.has(pkg))
|
|
89
|
+
return pkg;
|
|
90
|
+
// Sub-package import — e.g., "github.com/jackc/pgx/v5/pgxpool"
|
|
91
|
+
for (const tracked of TRACKED_MODULES) {
|
|
92
|
+
if (pkg.startsWith(tracked + "/"))
|
|
93
|
+
return tracked;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Match an HTTP-route call by inspecting the call-expression shape.
|
|
99
|
+
* Two AST patterns to handle:
|
|
100
|
+
* - selector_expression(operand=identifier, field=field_identifier) called with args
|
|
101
|
+
* ⇒ http.HandleFunc, app.Get, e.GET, r.Post …
|
|
102
|
+
* - identifier called with args (rare for routes; ignored)
|
|
103
|
+
*/
|
|
104
|
+
function extractRouteCall(node) {
|
|
105
|
+
// call_expression has: function (selector_expression | identifier) + argument_list
|
|
106
|
+
const fn = node.namedChildren.find((c) => c?.type === "selector_expression");
|
|
107
|
+
const args = node.namedChildren.find((c) => c?.type === "argument_list");
|
|
108
|
+
if (!fn || !args)
|
|
109
|
+
return null;
|
|
110
|
+
// selector_expression: operand (any) . field (field_identifier)
|
|
111
|
+
const operand = fn.namedChildren[0];
|
|
112
|
+
const field = fn.namedChildren.find((c) => c?.type === "field_identifier");
|
|
113
|
+
if (!operand || !field)
|
|
114
|
+
return null;
|
|
115
|
+
const operandText = operand.text;
|
|
116
|
+
const fieldName = field.text;
|
|
117
|
+
// Determine the HTTP method from the field name + operand shape.
|
|
118
|
+
let method = null;
|
|
119
|
+
if (HTTP_METHODS_UPPER.has(fieldName)) {
|
|
120
|
+
// echo/gin: e.GET, r.POST … — operand is a router-like local var
|
|
121
|
+
method = fieldName === "ANY" ? "ALL" : fieldName;
|
|
122
|
+
}
|
|
123
|
+
else if (HTTP_METHODS_TITLE.has(fieldName)) {
|
|
124
|
+
// chi/fiber: r.Get, app.Post …
|
|
125
|
+
method = fieldName.toUpperCase();
|
|
126
|
+
}
|
|
127
|
+
else if (STDLIB_HANDLER_FNS.has(fieldName) && operandText === "http") {
|
|
128
|
+
// net/http: http.HandleFunc("/x", h) / http.Handle("/x", h)
|
|
129
|
+
// We don't know the HTTP verb statically — emit "ALL".
|
|
130
|
+
method = "ALL";
|
|
131
|
+
}
|
|
132
|
+
if (!method)
|
|
133
|
+
return null;
|
|
134
|
+
// First arg = string literal route path.
|
|
135
|
+
const firstArg = args.namedChildren[0];
|
|
136
|
+
if (!firstArg)
|
|
137
|
+
return null;
|
|
138
|
+
if (firstArg.type !== "interpreted_string_literal")
|
|
139
|
+
return null;
|
|
140
|
+
const text = firstArg.text;
|
|
141
|
+
if (text.length < 2)
|
|
142
|
+
return null;
|
|
143
|
+
return { method, path: text.slice(1, -1) };
|
|
144
|
+
}
|
|
145
|
+
export function aggregate(scans) {
|
|
146
|
+
const components = [];
|
|
147
|
+
const aiSdkCallSites = new Map();
|
|
148
|
+
const dataStoreEvidence = new Map();
|
|
149
|
+
for (const s of scans) {
|
|
150
|
+
if (s.routes.length === 0 && s.imports.length === 0)
|
|
151
|
+
continue;
|
|
152
|
+
for (const imp of s.imports) {
|
|
153
|
+
// Match against the FULL tracked module (allowing sub-paths).
|
|
154
|
+
const matched = matchTracked(imp.package);
|
|
155
|
+
if (!matched)
|
|
156
|
+
continue;
|
|
157
|
+
if (AI_SDK_MODULES[matched]) {
|
|
158
|
+
const arr = aiSdkCallSites.get(matched) ?? [];
|
|
159
|
+
arr.push({ file: imp.file, line: imp.line });
|
|
160
|
+
aiSdkCallSites.set(matched, arr);
|
|
161
|
+
}
|
|
162
|
+
if (DATA_STORE_MODULES[matched]) {
|
|
163
|
+
const key = DATA_STORE_MODULES[matched].client;
|
|
164
|
+
const arr = dataStoreEvidence.get(key) ?? [];
|
|
165
|
+
arr.push({ kind: "import", file: imp.file, line: imp.line, package: imp.package });
|
|
166
|
+
dataStoreEvidence.set(key, arr);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (s.routes.length === 0)
|
|
170
|
+
continue;
|
|
171
|
+
const name = deriveComponentName(s.file);
|
|
172
|
+
const framework = detectFrameworkFromImports(s.imports);
|
|
173
|
+
components.push({
|
|
174
|
+
name,
|
|
175
|
+
sourceFile: s.file,
|
|
176
|
+
framework,
|
|
177
|
+
routes: s.routes,
|
|
178
|
+
imports: s.imports,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return { components, aiSdkCallSites, dataStoreEvidence };
|
|
182
|
+
}
|
|
183
|
+
function matchTracked(pkg) {
|
|
184
|
+
if (TRACKED_MODULES.has(pkg))
|
|
185
|
+
return pkg;
|
|
186
|
+
for (const tracked of TRACKED_MODULES) {
|
|
187
|
+
if (pkg.startsWith(tracked + "/"))
|
|
188
|
+
return tracked;
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
function deriveComponentName(filePath) {
|
|
193
|
+
const segs = filePath.split("/");
|
|
194
|
+
// Go convention: cmd/foo/main.go → "foo"; internal/auth/handler.go → "auth"
|
|
195
|
+
// Use the deepest directory that isn't a stdlib-ish folder name.
|
|
196
|
+
const skipPrefixes = new Set(["cmd", "internal", "pkg", "src", "app"]);
|
|
197
|
+
const start = skipPrefixes.has(segs[0]) ? 1 : 0;
|
|
198
|
+
if (segs.length - start >= 2)
|
|
199
|
+
return segs[start];
|
|
200
|
+
const last = segs[segs.length - 1];
|
|
201
|
+
return last.replace(/\.go$/, "");
|
|
202
|
+
}
|
|
203
|
+
function detectFrameworkFromImports(imports) {
|
|
204
|
+
for (const imp of imports) {
|
|
205
|
+
const matched = matchTracked(imp.package);
|
|
206
|
+
if (!matched)
|
|
207
|
+
continue;
|
|
208
|
+
const fw = WEB_FRAMEWORK_MODULES[matched];
|
|
209
|
+
if (fw)
|
|
210
|
+
return fw;
|
|
211
|
+
if (STDLIB_FRAMEWORKS.has(matched))
|
|
212
|
+
return "net/http";
|
|
213
|
+
}
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/go/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python language adapter. Same shape as TS/Go.
|
|
3
|
+
*/
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { readManifests, summarizeManifests, findExternalServices, findDataStores, detectFrameworkFromManifest, } from "./manifest.js";
|
|
6
|
+
import { scanFile, aggregate } from "./scanner.js";
|
|
7
|
+
import { repoRelative } from "../../walker.js";
|
|
8
|
+
export const pythonAdapter = {
|
|
9
|
+
language: "python",
|
|
10
|
+
extensions: [".py"],
|
|
11
|
+
manifests: ["pyproject.toml", "requirements.txt"],
|
|
12
|
+
async extract(input) {
|
|
13
|
+
const { rootDir, sourceFiles, manifestFiles } = input;
|
|
14
|
+
const parsedManifests = await readManifests(rootDir, manifestFiles);
|
|
15
|
+
const manifestSummaries = summarizeManifests(parsedManifests);
|
|
16
|
+
const manifestExternalServices = findExternalServices(parsedManifests);
|
|
17
|
+
const manifestDataStores = findDataStores(parsedManifests);
|
|
18
|
+
const MAX_SOURCE_FILES = 5_000;
|
|
19
|
+
const filesToScan = sourceFiles.slice(0, MAX_SOURCE_FILES);
|
|
20
|
+
const scans = await Promise.all(filesToScan.map(async (abs) => {
|
|
21
|
+
try {
|
|
22
|
+
return await scanFile(abs, repoRelative(rootDir, abs));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { file: repoRelative(rootDir, abs), imports: [], routes: [] };
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
const agg = aggregate(scans);
|
|
29
|
+
const components = agg.components.map((c) => {
|
|
30
|
+
const framework = c.framework ?? frameworkFromOwningManifest(c.sourceFile, parsedManifests);
|
|
31
|
+
return {
|
|
32
|
+
name: c.name,
|
|
33
|
+
kind: "process",
|
|
34
|
+
language: "python",
|
|
35
|
+
framework,
|
|
36
|
+
sourceFiles: [c.sourceFile],
|
|
37
|
+
evidence: [...c.routes, ...c.imports],
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
for (const svc of manifestExternalServices) {
|
|
41
|
+
const sites = agg.aiSdkCallSites.get(svc.package);
|
|
42
|
+
if (sites)
|
|
43
|
+
svc.callSites.push(...sites);
|
|
44
|
+
}
|
|
45
|
+
for (const store of manifestDataStores) {
|
|
46
|
+
if (!store.client)
|
|
47
|
+
continue;
|
|
48
|
+
const ev = agg.dataStoreEvidence.get(store.client);
|
|
49
|
+
if (ev)
|
|
50
|
+
store.evidence.push(...ev);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
components,
|
|
54
|
+
externalServices: manifestExternalServices,
|
|
55
|
+
dataStores: manifestDataStores,
|
|
56
|
+
manifests: manifestSummaries,
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
function frameworkFromOwningManifest(sourceFile, manifests) {
|
|
61
|
+
const sourceDir = path.posix.dirname(sourceFile);
|
|
62
|
+
const candidates = manifests
|
|
63
|
+
.map((m) => ({ m, dir: path.posix.dirname(m.filePath) }))
|
|
64
|
+
.filter(({ dir }) => sourceDir === dir || sourceDir.startsWith(dir + "/"))
|
|
65
|
+
.sort((a, b) => b.dir.length - a.dir.length);
|
|
66
|
+
return candidates[0] ? detectFrameworkFromManifest(candidates[0].m) : undefined;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/python/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python manifest analysis.
|
|
3
|
+
*
|
|
4
|
+
* Reads pyproject.toml (PEP 621 + Poetry sections) and requirements.txt.
|
|
5
|
+
* Other formats (Pipfile, setup.py) deferred — they're either rare in
|
|
6
|
+
* modern projects (setup.py) or layer on top of these two.
|
|
7
|
+
*/
|
|
8
|
+
import type { ExtractedExternalService, ExtractedDataStore, ManifestSummary } from "../../types.js";
|
|
9
|
+
export declare const WEB_FRAMEWORK_PACKAGES: Record<string, string>;
|
|
10
|
+
export declare const DATA_STORE_PACKAGES: Record<string, {
|
|
11
|
+
kind: ExtractedDataStore["kind"];
|
|
12
|
+
client: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare const AI_SDK_PACKAGES: Record<string, string>;
|
|
15
|
+
export interface ParsedPyManifest {
|
|
16
|
+
filePath: string;
|
|
17
|
+
format: "pyproject.toml" | "requirements.txt";
|
|
18
|
+
/** package name → version specifier (verbatim, e.g. "^0.30.0", ">=2.0,<3"). */
|
|
19
|
+
deps: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
export declare function readManifests(rootDir: string, manifestFiles: string[]): Promise<ParsedPyManifest[]>;
|
|
22
|
+
export declare function summarizeManifests(parsed: ParsedPyManifest[]): ManifestSummary[];
|
|
23
|
+
export declare function findExternalServices(parsed: ParsedPyManifest[]): ExtractedExternalService[];
|
|
24
|
+
export declare function findDataStores(parsed: ParsedPyManifest[]): ExtractedDataStore[];
|
|
25
|
+
export declare function detectFrameworkFromManifest(m: ParsedPyManifest): string | undefined;
|