@zivis/cli 0.1.0-alpha.39 → 0.1.0-alpha.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/commands/app/index.d.ts +8 -0
- package/dist/commands/app/index.js +14 -2
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.js +2 -19
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/init.d.ts +0 -1
- package/dist/commands/auth/init.js +73 -245
- package/dist/commands/auth/init.js.map +1 -0
- package/dist/commands/auth/login.d.ts +0 -1
- package/dist/commands/auth/login.js +9 -34
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.js +7 -19
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/sessions.js +4 -7
- package/dist/commands/auth/sessions.js.map +1 -0
- package/dist/commands/auth/status.js +12 -33
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/credits/index.js +3 -2
- package/dist/commands/credits/index.js.map +1 -0
- package/dist/commands/mcp/index.js +14 -81
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/open/index.d.ts +8 -0
- package/dist/commands/open/index.js +11 -0
- package/dist/commands/open/index.js.map +1 -0
- package/dist/commands/scan/index.js +8 -2
- package/dist/commands/scan/index.js.map +1 -0
- package/dist/commands/target/index.js +3 -0
- package/dist/commands/target/index.js.map +1 -0
- package/dist/commands/tm/index.js +10 -3
- package/dist/commands/tm/index.js.map +1 -0
- package/dist/index.js +1 -13
- package/dist/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/index.d.ts +4 -0
- package/dist/internal/extractor/adapters/go/index.js +6 -0
- package/dist/internal/extractor/adapters/go/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/manifest.d.ts +17 -0
- package/dist/internal/extractor/adapters/go/manifest.js +25 -19
- package/dist/internal/extractor/adapters/go/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/go/parser.d.ts +4 -0
- package/dist/internal/extractor/adapters/go/parser.js +5 -0
- package/dist/internal/extractor/adapters/go/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/go/scanner.d.ts +20 -0
- package/dist/internal/extractor/adapters/go/scanner.js +43 -0
- package/dist/internal/extractor/adapters/go/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/python/index.d.ts +3 -0
- package/dist/internal/extractor/adapters/python/index.js +4 -0
- package/dist/internal/extractor/adapters/python/index.js.map +1 -0
- package/dist/internal/extractor/adapters/python/manifest.d.ts +8 -0
- package/dist/internal/extractor/adapters/python/manifest.js +18 -21
- package/dist/internal/extractor/adapters/python/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/python/parser.d.ts +3 -0
- package/dist/internal/extractor/adapters/python/parser.js +4 -0
- package/dist/internal/extractor/adapters/python/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/python/scanner.d.ts +18 -0
- package/dist/internal/extractor/adapters/python/scanner.js +54 -1
- package/dist/internal/extractor/adapters/python/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/index.d.ts +7 -0
- package/dist/internal/extractor/adapters/typescript/index.js +21 -1
- package/dist/internal/extractor/adapters/typescript/index.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/manifest.d.ts +14 -0
- package/dist/internal/extractor/adapters/typescript/manifest.js +17 -26
- package/dist/internal/extractor/adapters/typescript/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/parser.d.ts +8 -0
- package/dist/internal/extractor/adapters/typescript/parser.js +9 -0
- package/dist/internal/extractor/adapters/typescript/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/scanner.d.ts +24 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js +43 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js.map +1 -0
- package/dist/internal/extractor/index.d.ts +14 -0
- package/dist/internal/extractor/index.js +13 -0
- package/dist/internal/extractor/index.js.map +1 -0
- package/dist/internal/extractor/types.d.ts +45 -0
- package/dist/internal/extractor/types.js +27 -0
- package/dist/internal/extractor/types.js.map +1 -0
- package/dist/internal/extractor/walker.d.ts +18 -0
- package/dist/internal/extractor/walker.js +18 -0
- package/dist/internal/extractor/walker.js.map +1 -0
- package/dist/internal/ide-setup.d.ts +7 -16
- package/dist/internal/ide-setup.js +46 -320
- package/dist/internal/ide-setup.js.map +1 -0
- package/dist/internal/orgs.js +1 -0
- package/dist/internal/orgs.js.map +1 -0
- package/dist/internal/project-binding.d.ts +0 -1
- package/dist/internal/project-binding.js +9 -14
- package/dist/internal/project-binding.js.map +1 -0
- package/dist/internal/target-auth/api-config.d.ts +17 -0
- package/dist/internal/target-auth/api-config.js +18 -0
- package/dist/internal/target-auth/api-config.js.map +1 -0
- package/dist/internal/target-auth/config.d.ts +12 -0
- package/dist/internal/target-auth/config.js +13 -0
- package/dist/internal/target-auth/config.js.map +1 -0
- package/dist/internal/target-auth/index.d.ts +18 -0
- package/dist/internal/target-auth/index.js +19 -0
- package/dist/internal/target-auth/index.js.map +1 -0
- package/dist/internal/target-auth/keychain.d.ts +18 -0
- package/dist/internal/target-auth/keychain.js +23 -3
- package/dist/internal/target-auth/keychain.js.map +1 -0
- package/dist/internal/target-auth/types.d.ts +26 -0
- package/dist/internal/target-auth/types.js +10 -0
- package/dist/internal/target-auth/types.js.map +1 -0
- package/dist/internal/target-auth/workos.d.ts +15 -0
- package/dist/internal/target-auth/workos.js +17 -0
- package/dist/internal/target-auth/workos.js.map +1 -0
- package/package.json +4 -18
- package/LICENSE +0 -201
- package/README.md +0 -31
- package/dist/commands/auth/bind.d.ts +0 -4
- package/dist/commands/auth/bind.js +0 -97
- package/dist/commands/auth/token.d.ts +0 -4
- package/dist/commands/auth/token.js +0 -73
- package/dist/commands/check/index.d.ts +0 -2
- package/dist/commands/check/index.js +0 -463
- package/dist/commands/inspect/index.d.ts +0 -2
- package/dist/commands/inspect/index.js +0 -136
- package/dist/internal/binding-token-mint.d.ts +0 -33
- package/dist/internal/binding-token-mint.js +0 -174
- package/dist/internal/extractor/graph-builder.d.ts +0 -10
- package/dist/internal/extractor/graph-builder.js +0 -245
- package/dist/internal/extractor/graph-types.d.ts +0 -89
- package/dist/internal/extractor/graph-types.js +0 -1
- package/dist/internal/github-linkage-prompt.d.ts +0 -7
- package/dist/internal/github-linkage-prompt.js +0 -95
|
@@ -1,3 +1,11 @@
|
|
|
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
|
+
*/
|
|
1
9
|
import * as fs from "node:fs/promises";
|
|
2
10
|
import * as path from "node:path";
|
|
3
11
|
export const WEB_FRAMEWORK_MODULES = {
|
|
@@ -10,13 +18,14 @@ export const WEB_FRAMEWORK_MODULES = {
|
|
|
10
18
|
"github.com/gofiber/fiber/v2": "fiber",
|
|
11
19
|
"github.com/gorilla/mux": "gorilla-mux",
|
|
12
20
|
};
|
|
21
|
+
/** stdlib router lives at "net/http"; not in go.mod, only detected via imports. */
|
|
13
22
|
export const STDLIB_FRAMEWORKS = new Set(["net/http"]);
|
|
14
23
|
export const DATA_STORE_MODULES = {
|
|
15
24
|
"github.com/jackc/pgx": { kind: "postgres", client: "pgx" },
|
|
16
25
|
"github.com/jackc/pgx/v5": { kind: "postgres", client: "pgx" },
|
|
17
26
|
"github.com/jackc/pgx/v4": { kind: "postgres", client: "pgx" },
|
|
18
27
|
"github.com/lib/pq": { kind: "postgres", client: "pq" },
|
|
19
|
-
"gorm.io/gorm": { kind: "postgres", client: "gorm" },
|
|
28
|
+
"gorm.io/gorm": { kind: "postgres", client: "gorm" }, // dialect varies; gorm itself is most often pg
|
|
20
29
|
"go.mongodb.org/mongo-driver": { kind: "mongo", client: "mongo-driver" },
|
|
21
30
|
"github.com/redis/go-redis": { kind: "redis", client: "go-redis" },
|
|
22
31
|
"github.com/redis/go-redis/v9": { kind: "redis", client: "go-redis" },
|
|
@@ -39,10 +48,18 @@ export async function readManifests(rootDir, manifestFiles) {
|
|
|
39
48
|
out.push(parseGoMod(file, rootDir, raw));
|
|
40
49
|
}
|
|
41
50
|
catch {
|
|
51
|
+
// skip unreadable
|
|
42
52
|
}
|
|
43
53
|
}
|
|
44
54
|
return out;
|
|
45
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
|
+
*/
|
|
46
63
|
export function parseGoMod(filePath, rootDir, raw) {
|
|
47
64
|
const lines = raw.split("\n");
|
|
48
65
|
const result = {
|
|
@@ -75,6 +92,7 @@ export function parseGoMod(filePath, rootDir, raw) {
|
|
|
75
92
|
body = body.slice("require ".length).trim();
|
|
76
93
|
else if (!inBlock)
|
|
77
94
|
continue;
|
|
95
|
+
// Strip "// indirect" / other line comments
|
|
78
96
|
const commentAt = body.indexOf("//");
|
|
79
97
|
if (commentAt >= 0)
|
|
80
98
|
body = body.slice(0, commentAt).trim();
|
|
@@ -114,24 +132,6 @@ export function findExternalServices(parsed) {
|
|
|
114
132
|
callSites: [{ file: m.filePath, line: 1 }],
|
|
115
133
|
});
|
|
116
134
|
}
|
|
117
|
-
for (const [mod, vendor] of Object.entries(WEB_FRAMEWORK_MODULES)) {
|
|
118
|
-
const ver = matchModuleVersion(m.deps, mod);
|
|
119
|
-
if (!ver)
|
|
120
|
-
continue;
|
|
121
|
-
const key = `web_framework::${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: "web_framework",
|
|
130
|
-
package: mod,
|
|
131
|
-
version: ver,
|
|
132
|
-
callSites: [{ file: m.filePath, line: 1 }],
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
135
|
}
|
|
136
136
|
return [...seen.values()];
|
|
137
137
|
}
|
|
@@ -166,9 +166,14 @@ export function detectFrameworkFromManifest(m) {
|
|
|
166
166
|
}
|
|
167
167
|
return undefined;
|
|
168
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Match a module path including its versioned variants (mod, mod/v2, etc.).
|
|
171
|
+
* Returns the version of the first match.
|
|
172
|
+
*/
|
|
169
173
|
function matchModuleVersion(deps, modulePath) {
|
|
170
174
|
if (deps[modulePath])
|
|
171
175
|
return deps[modulePath];
|
|
176
|
+
// Try versioned variants
|
|
172
177
|
for (const [k, v] of Object.entries(deps)) {
|
|
173
178
|
if (k === modulePath)
|
|
174
179
|
return v;
|
|
@@ -191,3 +196,4 @@ function relPosix(rootDir, abs) {
|
|
|
191
196
|
const rel = path.relative(rootDir, abs);
|
|
192
197
|
return rel.split(path.sep).join("/");
|
|
193
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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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
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
|
+
*/
|
|
1
5
|
import { createRequire } from "node:module";
|
|
2
6
|
import * as path from "node:path";
|
|
3
7
|
import { Parser, Language } from "web-tree-sitter";
|
|
@@ -16,3 +20,4 @@ export function getGoParser() {
|
|
|
16
20
|
}
|
|
17
21
|
return parserPromise;
|
|
18
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"}
|
|
@@ -1,3 +1,23 @@
|
|
|
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
|
+
*/
|
|
1
21
|
import type { EvidenceLocation, Evidence, HttpRouteEvidence, ImportEvidence } from "../../types.js";
|
|
2
22
|
export interface FileScanResult {
|
|
3
23
|
file: string;
|
|
@@ -1,3 +1,23 @@
|
|
|
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
|
+
*/
|
|
1
21
|
import * as fs from "node:fs/promises";
|
|
2
22
|
import { getGoParser } from "./parser.js";
|
|
3
23
|
import { AI_SDK_MODULES, DATA_STORE_MODULES, WEB_FRAMEWORK_MODULES, STDLIB_FRAMEWORKS, } from "./manifest.js";
|
|
@@ -54,45 +74,64 @@ function walk(node, visit) {
|
|
|
54
74
|
walk(child, visit);
|
|
55
75
|
}
|
|
56
76
|
}
|
|
77
|
+
/** Pull the quoted module path out of an import_spec node. */
|
|
57
78
|
function extractImportPath(node) {
|
|
79
|
+
// import_spec → optional package_identifier + interpreted_string_literal
|
|
58
80
|
const stringNode = node.namedChildren.find((c) => c?.type === "interpreted_string_literal");
|
|
59
81
|
if (!stringNode)
|
|
60
82
|
return null;
|
|
83
|
+
// text is the quoted form; strip the surrounding quotes.
|
|
61
84
|
const text = stringNode.text;
|
|
62
85
|
return text.length >= 2 ? text.slice(1, -1) : null;
|
|
63
86
|
}
|
|
64
87
|
function trackedModuleMatch(pkg) {
|
|
65
88
|
if (TRACKED_MODULES.has(pkg))
|
|
66
89
|
return pkg;
|
|
90
|
+
// Sub-package import — e.g., "github.com/jackc/pgx/v5/pgxpool"
|
|
67
91
|
for (const tracked of TRACKED_MODULES) {
|
|
68
92
|
if (pkg.startsWith(tracked + "/"))
|
|
69
93
|
return tracked;
|
|
70
94
|
}
|
|
71
95
|
return null;
|
|
72
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
|
+
*/
|
|
73
104
|
function extractRouteCall(node) {
|
|
105
|
+
// call_expression has: function (selector_expression | identifier) + argument_list
|
|
74
106
|
const fn = node.namedChildren.find((c) => c?.type === "selector_expression");
|
|
75
107
|
const args = node.namedChildren.find((c) => c?.type === "argument_list");
|
|
76
108
|
if (!fn || !args)
|
|
77
109
|
return null;
|
|
110
|
+
// selector_expression: operand (any) . field (field_identifier)
|
|
78
111
|
const operand = fn.namedChildren[0];
|
|
79
112
|
const field = fn.namedChildren.find((c) => c?.type === "field_identifier");
|
|
80
113
|
if (!operand || !field)
|
|
81
114
|
return null;
|
|
82
115
|
const operandText = operand.text;
|
|
83
116
|
const fieldName = field.text;
|
|
117
|
+
// Determine the HTTP method from the field name + operand shape.
|
|
84
118
|
let method = null;
|
|
85
119
|
if (HTTP_METHODS_UPPER.has(fieldName)) {
|
|
120
|
+
// echo/gin: e.GET, r.POST … — operand is a router-like local var
|
|
86
121
|
method = fieldName === "ANY" ? "ALL" : fieldName;
|
|
87
122
|
}
|
|
88
123
|
else if (HTTP_METHODS_TITLE.has(fieldName)) {
|
|
124
|
+
// chi/fiber: r.Get, app.Post …
|
|
89
125
|
method = fieldName.toUpperCase();
|
|
90
126
|
}
|
|
91
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".
|
|
92
130
|
method = "ALL";
|
|
93
131
|
}
|
|
94
132
|
if (!method)
|
|
95
133
|
return null;
|
|
134
|
+
// First arg = string literal route path.
|
|
96
135
|
const firstArg = args.namedChildren[0];
|
|
97
136
|
if (!firstArg)
|
|
98
137
|
return null;
|
|
@@ -111,6 +150,7 @@ export function aggregate(scans) {
|
|
|
111
150
|
if (s.routes.length === 0 && s.imports.length === 0)
|
|
112
151
|
continue;
|
|
113
152
|
for (const imp of s.imports) {
|
|
153
|
+
// Match against the FULL tracked module (allowing sub-paths).
|
|
114
154
|
const matched = matchTracked(imp.package);
|
|
115
155
|
if (!matched)
|
|
116
156
|
continue;
|
|
@@ -151,6 +191,8 @@ function matchTracked(pkg) {
|
|
|
151
191
|
}
|
|
152
192
|
function deriveComponentName(filePath) {
|
|
153
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.
|
|
154
196
|
const skipPrefixes = new Set(["cmd", "internal", "pkg", "src", "app"]);
|
|
155
197
|
const start = skipPrefixes.has(segs[0]) ? 1 : 0;
|
|
156
198
|
if (segs.length - start >= 2)
|
|
@@ -171,3 +213,4 @@ function detectFrameworkFromImports(imports) {
|
|
|
171
213
|
}
|
|
172
214
|
return undefined;
|
|
173
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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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python language adapter. Same shape as TS/Go.
|
|
3
|
+
*/
|
|
1
4
|
import * as path from "node:path";
|
|
2
5
|
import { readManifests, summarizeManifests, findExternalServices, findDataStores, detectFrameworkFromManifest, } from "./manifest.js";
|
|
3
6
|
import { scanFile, aggregate } from "./scanner.js";
|
|
@@ -62,3 +65,4 @@ function frameworkFromOwningManifest(sourceFile, manifests) {
|
|
|
62
65
|
.sort((a, b) => b.dir.length - a.dir.length);
|
|
63
66
|
return candidates[0] ? detectFrameworkFromManifest(candidates[0].m) : undefined;
|
|
64
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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"}
|
|
@@ -1,3 +1,10 @@
|
|
|
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
|
+
*/
|
|
1
8
|
import type { ExtractedExternalService, ExtractedDataStore, ManifestSummary } from "../../types.js";
|
|
2
9
|
export declare const WEB_FRAMEWORK_PACKAGES: Record<string, string>;
|
|
3
10
|
export declare const DATA_STORE_PACKAGES: Record<string, {
|
|
@@ -8,6 +15,7 @@ export declare const AI_SDK_PACKAGES: Record<string, string>;
|
|
|
8
15
|
export interface ParsedPyManifest {
|
|
9
16
|
filePath: string;
|
|
10
17
|
format: "pyproject.toml" | "requirements.txt";
|
|
18
|
+
/** package name → version specifier (verbatim, e.g. "^0.30.0", ">=2.0,<3"). */
|
|
11
19
|
deps: Record<string, string>;
|
|
12
20
|
}
|
|
13
21
|
export declare function readManifests(rootDir: string, manifestFiles: string[]): Promise<ParsedPyManifest[]>;
|
|
@@ -1,3 +1,10 @@
|
|
|
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
|
+
*/
|
|
1
8
|
import * as fs from "node:fs/promises";
|
|
2
9
|
import * as path from "node:path";
|
|
3
10
|
import TOML from "@iarna/toml";
|
|
@@ -13,7 +20,7 @@ export const WEB_FRAMEWORK_PACKAGES = {
|
|
|
13
20
|
quart: "quart",
|
|
14
21
|
};
|
|
15
22
|
export const DATA_STORE_PACKAGES = {
|
|
16
|
-
sqlalchemy: { kind: "postgres", client: "sqlalchemy" },
|
|
23
|
+
sqlalchemy: { kind: "postgres", client: "sqlalchemy" }, // dialect varies; default to pg
|
|
17
24
|
asyncpg: { kind: "postgres", client: "asyncpg" },
|
|
18
25
|
psycopg: { kind: "postgres", client: "psycopg" },
|
|
19
26
|
psycopg2: { kind: "postgres", client: "psycopg2" },
|
|
@@ -38,7 +45,7 @@ export const AI_SDK_PACKAGES = {
|
|
|
38
45
|
vertexai: "Vertex AI",
|
|
39
46
|
"google-generativeai": "Google Generative AI",
|
|
40
47
|
cohere: "Cohere",
|
|
41
|
-
"boto3": "AWS (boto3)",
|
|
48
|
+
"boto3": "AWS (boto3)", // bedrock typically uses boto3
|
|
42
49
|
};
|
|
43
50
|
export async function readManifests(rootDir, manifestFiles) {
|
|
44
51
|
const out = [];
|
|
@@ -54,6 +61,7 @@ export async function readManifests(rootDir, manifestFiles) {
|
|
|
54
61
|
}
|
|
55
62
|
}
|
|
56
63
|
catch {
|
|
64
|
+
// skip unreadable / unparsable
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
67
|
return out;
|
|
@@ -71,6 +79,7 @@ function parsePyproject(filePath, rootDir, raw) {
|
|
|
71
79
|
catch {
|
|
72
80
|
return result;
|
|
73
81
|
}
|
|
82
|
+
// PEP 621: project.dependencies = ["fastapi >=0.100", ...]
|
|
74
83
|
const projectDeps = parsed?.project?.dependencies;
|
|
75
84
|
if (Array.isArray(projectDeps)) {
|
|
76
85
|
for (const spec of projectDeps) {
|
|
@@ -81,6 +90,7 @@ function parsePyproject(filePath, rootDir, raw) {
|
|
|
81
90
|
result.deps[name] = version;
|
|
82
91
|
}
|
|
83
92
|
}
|
|
93
|
+
// PEP 621: optional-dependencies = { test = [...], dev = [...] }
|
|
84
94
|
const opt = parsed?.project?.["optional-dependencies"];
|
|
85
95
|
if (opt && typeof opt === "object") {
|
|
86
96
|
for (const groupSpec of Object.values(opt)) {
|
|
@@ -95,6 +105,7 @@ function parsePyproject(filePath, rootDir, raw) {
|
|
|
95
105
|
}
|
|
96
106
|
}
|
|
97
107
|
}
|
|
108
|
+
// Poetry: tool.poetry.dependencies = { fastapi = "^0.100" } (also dev-dependencies)
|
|
98
109
|
const poetryDeps = parsed?.tool?.poetry?.dependencies;
|
|
99
110
|
if (poetryDeps && typeof poetryDeps === "object") {
|
|
100
111
|
for (const [name, value] of Object.entries(poetryDeps)) {
|
|
@@ -126,7 +137,8 @@ function parseRequirementsTxt(filePath, rootDir, raw) {
|
|
|
126
137
|
if (!line || line.startsWith("#"))
|
|
127
138
|
continue;
|
|
128
139
|
if (line.startsWith("-"))
|
|
129
|
-
continue;
|
|
140
|
+
continue; // -e, -r, -c, --hash, etc.
|
|
141
|
+
// strip inline comments
|
|
130
142
|
const hashAt = line.indexOf(" #");
|
|
131
143
|
if (hashAt > 0)
|
|
132
144
|
line = line.slice(0, hashAt).trim();
|
|
@@ -136,7 +148,9 @@ function parseRequirementsTxt(filePath, rootDir, raw) {
|
|
|
136
148
|
}
|
|
137
149
|
return result;
|
|
138
150
|
}
|
|
151
|
+
/** "fastapi>=0.100,<0.110" → ["fastapi", ">=0.100,<0.110"] */
|
|
139
152
|
function splitPep508(spec) {
|
|
153
|
+
// strip extras like fastapi[all]
|
|
140
154
|
const cleaned = spec.replace(/\[[^\]]*\]/g, "").trim();
|
|
141
155
|
const m = cleaned.match(/^([A-Za-z0-9_.\-]+)\s*(.*)$/);
|
|
142
156
|
if (!m)
|
|
@@ -171,24 +185,6 @@ export function findExternalServices(parsed) {
|
|
|
171
185
|
callSites: [{ file: m.filePath, line: 1 }],
|
|
172
186
|
});
|
|
173
187
|
}
|
|
174
|
-
for (const [pkg, vendor] of Object.entries(WEB_FRAMEWORK_PACKAGES)) {
|
|
175
|
-
const ver = m.deps[pkg];
|
|
176
|
-
if (!ver)
|
|
177
|
-
continue;
|
|
178
|
-
const key = `web_framework::${pkg}`;
|
|
179
|
-
const existing = seen.get(key);
|
|
180
|
-
if (existing) {
|
|
181
|
-
existing.callSites.push({ file: m.filePath, line: 1 });
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
seen.set(key, {
|
|
185
|
-
name: vendor,
|
|
186
|
-
kind: "web_framework",
|
|
187
|
-
package: pkg,
|
|
188
|
-
version: ver,
|
|
189
|
-
callSites: [{ file: m.filePath, line: 1 }],
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
188
|
}
|
|
193
189
|
return [...seen.values()];
|
|
194
190
|
}
|
|
@@ -237,3 +233,4 @@ function relPosix(rootDir, abs) {
|
|
|
237
233
|
const rel = path.relative(rootDir, abs);
|
|
238
234
|
return rel.split(path.sep).join("/");
|
|
239
235
|
}
|
|
236
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/python/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tree-sitter-python loader.
|
|
3
|
+
*/
|
|
1
4
|
import { createRequire } from "node:module";
|
|
2
5
|
import * as path from "node:path";
|
|
3
6
|
import { Parser, Language } from "web-tree-sitter";
|
|
@@ -16,3 +19,4 @@ export function getPythonParser() {
|
|
|
16
19
|
}
|
|
17
20
|
return parserPromise;
|
|
18
21
|
}
|
|
22
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/python/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;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,eAAe;IAC7B,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,yBAAyB,CAAC,CAAC,CAAC;YACxF,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"}
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST scanner for Python source files.
|
|
3
|
+
*
|
|
4
|
+
* Patterns covered:
|
|
5
|
+
* 1. import_statement / import_from_statement → tracked-package imports
|
|
6
|
+
* (AI SDKs, web frameworks, DB clients).
|
|
7
|
+
* 2. Decorator-based routes (FastAPI, Flask):
|
|
8
|
+
* @app.get("/path") → method=GET
|
|
9
|
+
* @app.post("/path") → method=POST
|
|
10
|
+
* @app.route("/path", …) → method=ALL (Flask default; verbs in `methods=` kw not parsed yet)
|
|
11
|
+
* @router.get("/x", …) → method=GET (FastAPI APIRouter convention)
|
|
12
|
+
* 3. Django urls.py-style call: path("/route", view, …) / re_path(…) → method=ALL
|
|
13
|
+
* 4. aiohttp: app.router.add_get("/path", h) / add_post(…) / etc.
|
|
14
|
+
*
|
|
15
|
+
* Privacy invariant: identifier names + dotted attribute names + string
|
|
16
|
+
* literals on routes only. Function bodies and decorator args beyond the
|
|
17
|
+
* route path are never inspected.
|
|
18
|
+
*/
|
|
1
19
|
import type { EvidenceLocation, Evidence, HttpRouteEvidence, ImportEvidence } from "../../types.js";
|
|
2
20
|
export interface FileScanResult {
|
|
3
21
|
file: string;
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST scanner for Python source files.
|
|
3
|
+
*
|
|
4
|
+
* Patterns covered:
|
|
5
|
+
* 1. import_statement / import_from_statement → tracked-package imports
|
|
6
|
+
* (AI SDKs, web frameworks, DB clients).
|
|
7
|
+
* 2. Decorator-based routes (FastAPI, Flask):
|
|
8
|
+
* @app.get("/path") → method=GET
|
|
9
|
+
* @app.post("/path") → method=POST
|
|
10
|
+
* @app.route("/path", …) → method=ALL (Flask default; verbs in `methods=` kw not parsed yet)
|
|
11
|
+
* @router.get("/x", …) → method=GET (FastAPI APIRouter convention)
|
|
12
|
+
* 3. Django urls.py-style call: path("/route", view, …) / re_path(…) → method=ALL
|
|
13
|
+
* 4. aiohttp: app.router.add_get("/path", h) / add_post(…) / etc.
|
|
14
|
+
*
|
|
15
|
+
* Privacy invariant: identifier names + dotted attribute names + string
|
|
16
|
+
* literals on routes only. Function bodies and decorator args beyond the
|
|
17
|
+
* route path are never inspected.
|
|
18
|
+
*/
|
|
1
19
|
import * as fs from "node:fs/promises";
|
|
2
20
|
import { getPythonParser } from "./parser.js";
|
|
3
21
|
import { AI_SDK_PACKAGES, DATA_STORE_PACKAGES, WEB_FRAMEWORK_PACKAGES, } from "./manifest.js";
|
|
@@ -69,9 +87,22 @@ function walk(node, visit) {
|
|
|
69
87
|
walk(child, visit);
|
|
70
88
|
}
|
|
71
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Pull the top-level package(s) out of an import statement.
|
|
92
|
+
*
|
|
93
|
+
* - `import anthropic` → ["anthropic"]
|
|
94
|
+
* - `import langchain.chat_models` → ["langchain"] (we track the root)
|
|
95
|
+
* - `from fastapi import FastAPI` → ["fastapi"]
|
|
96
|
+
* - `from langchain.schema import HumanMessage` → ["langchain"]
|
|
97
|
+
*
|
|
98
|
+
* Sub-modules collapse to the root because the manifest table is keyed
|
|
99
|
+
* by distribution name, which is also the import root for the packages
|
|
100
|
+
* we care about.
|
|
101
|
+
*/
|
|
72
102
|
function extractImportPackages(node) {
|
|
73
103
|
const out = [];
|
|
74
104
|
if (node.type === "import_from_statement") {
|
|
105
|
+
// import_from_statement → module_name as the "module" field
|
|
75
106
|
const moduleField = node.childForFieldName("module_name");
|
|
76
107
|
if (moduleField) {
|
|
77
108
|
const root = topLevelImportName(moduleField);
|
|
@@ -80,6 +111,7 @@ function extractImportPackages(node) {
|
|
|
80
111
|
}
|
|
81
112
|
return out;
|
|
82
113
|
}
|
|
114
|
+
// import_statement: one or more dotted_name (or aliased_import wrapping it)
|
|
83
115
|
for (const child of node.namedChildren) {
|
|
84
116
|
if (!child)
|
|
85
117
|
continue;
|
|
@@ -109,7 +141,13 @@ function topLevelImportName(node) {
|
|
|
109
141
|
function trackedPackageMatch(pkg) {
|
|
110
142
|
return TRACKED_PACKAGES.has(pkg) ? pkg : null;
|
|
111
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Match @app.get("/path"), @router.post(…), @app.route("/x", …).
|
|
146
|
+
* Returns the route + method, or null if it isn't a known shape.
|
|
147
|
+
*/
|
|
112
148
|
function extractDecoratorRoute(node) {
|
|
149
|
+
// decorator → `@` + (call | attribute | identifier)
|
|
150
|
+
// We only care about call shapes: @app.get("/path", …)
|
|
113
151
|
const callNode = node.namedChildren.find((c) => c?.type === "call");
|
|
114
152
|
if (!callNode)
|
|
115
153
|
return null;
|
|
@@ -125,28 +163,37 @@ function extractDecoratorRoute(node) {
|
|
|
125
163
|
return null;
|
|
126
164
|
const objectName = objectNode.text.toLowerCase();
|
|
127
165
|
const attrName = attrNode.text.toLowerCase();
|
|
166
|
+
// Object must be a router-y identifier — keep the false-positive surface
|
|
167
|
+
// tight even though we'd lose decorators on uncommon names like `myapi`.
|
|
128
168
|
if (!ROUTER_IDENTIFIERS.has(objectName))
|
|
129
169
|
return null;
|
|
130
170
|
let method = null;
|
|
131
171
|
if (HTTP_METHODS.has(attrName))
|
|
132
172
|
method = attrName.toUpperCase();
|
|
133
173
|
else if (attrName === "route")
|
|
134
|
-
method = "ALL";
|
|
174
|
+
method = "ALL"; // Flask default; verbs in methods= kwarg not yet parsed
|
|
135
175
|
if (!method)
|
|
136
176
|
return null;
|
|
137
177
|
return readRoutePath(args, method);
|
|
138
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Match Django path("/route", view, …) / re_path(…) and aiohttp
|
|
181
|
+
* app.router.add_get("/path", h) / add_post(…) etc.
|
|
182
|
+
*/
|
|
139
183
|
function extractCallRoute(node) {
|
|
140
184
|
const fn = node.childForFieldName("function");
|
|
141
185
|
const args = node.childForFieldName("arguments");
|
|
142
186
|
if (!fn || !args)
|
|
143
187
|
return null;
|
|
188
|
+
// Django: bare identifier function, e.g. `path("/route", view)`.
|
|
144
189
|
if (fn.type === "identifier") {
|
|
145
190
|
const name = fn.text;
|
|
146
191
|
if (!DJANGO_PATH_FNS.has(name))
|
|
147
192
|
return null;
|
|
148
193
|
return readRoutePath(args, "ALL");
|
|
149
194
|
}
|
|
195
|
+
// aiohttp: app.router.add_get("/path", h) — attribute call where the
|
|
196
|
+
// method name is encoded into the attribute (add_get, add_post, …).
|
|
150
197
|
if (fn.type === "attribute") {
|
|
151
198
|
const attrNode = fn.childForFieldName("attribute");
|
|
152
199
|
if (!attrNode)
|
|
@@ -158,16 +205,20 @@ function extractCallRoute(node) {
|
|
|
158
205
|
}
|
|
159
206
|
return null;
|
|
160
207
|
}
|
|
208
|
+
/** Pull the first positional string-literal argument as the route path. */
|
|
161
209
|
function readRoutePath(argsNode, method) {
|
|
162
210
|
for (const arg of argsNode.namedChildren) {
|
|
163
211
|
if (!arg)
|
|
164
212
|
continue;
|
|
213
|
+
// Skip kwargs (we only want the first positional).
|
|
165
214
|
if (arg.type === "keyword_argument")
|
|
166
215
|
continue;
|
|
167
216
|
if (arg.type !== "string")
|
|
168
217
|
return null;
|
|
218
|
+
// string → string_start, string_content, string_end
|
|
169
219
|
const content = arg.namedChildren.find((c) => c?.type === "string_content");
|
|
170
220
|
if (!content) {
|
|
221
|
+
// fall back: strip leading/trailing quote chars from raw text
|
|
171
222
|
const text = arg.text;
|
|
172
223
|
if (text.length >= 2 && (text.startsWith('"') || text.startsWith("'"))) {
|
|
173
224
|
return { method, path: text.slice(1, -1) };
|
|
@@ -214,6 +265,7 @@ export function aggregate(scans) {
|
|
|
214
265
|
}
|
|
215
266
|
function deriveComponentName(filePath) {
|
|
216
267
|
const segs = filePath.split("/");
|
|
268
|
+
// Skip common project-layout prefixes.
|
|
217
269
|
const skipPrefixes = new Set(["src", "app", "apps", "backend", "api"]);
|
|
218
270
|
const start = skipPrefixes.has(segs[0]) ? 1 : 0;
|
|
219
271
|
if (segs.length - start >= 2)
|
|
@@ -229,3 +281,4 @@ function detectFrameworkFromImports(imports) {
|
|
|
229
281
|
}
|
|
230
282
|
return undefined;
|
|
231
283
|
}
|
|
284
|
+
//# sourceMappingURL=scanner.js.map
|