@zivis/cli 0.1.0-alpha.40 → 0.1.0-alpha.6

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.
Files changed (124) hide show
  1. package/dist/commands/app/index.d.ts +8 -0
  2. package/dist/commands/app/index.js +16 -4
  3. package/dist/commands/app/index.js.map +1 -0
  4. package/dist/commands/auth/index.js +2 -20
  5. package/dist/commands/auth/index.js.map +1 -0
  6. package/dist/commands/auth/init.d.ts +0 -1
  7. package/dist/commands/auth/init.js +97 -231
  8. package/dist/commands/auth/init.js.map +1 -0
  9. package/dist/commands/auth/login.d.ts +0 -2
  10. package/dist/commands/auth/login.js +18 -136
  11. package/dist/commands/auth/login.js.map +1 -0
  12. package/dist/commands/auth/logout.js +7 -19
  13. package/dist/commands/auth/logout.js.map +1 -0
  14. package/dist/commands/auth/sessions.js +4 -7
  15. package/dist/commands/auth/sessions.js.map +1 -0
  16. package/dist/commands/auth/status.js +12 -33
  17. package/dist/commands/auth/status.js.map +1 -0
  18. package/dist/commands/credits/index.js +3 -2
  19. package/dist/commands/credits/index.js.map +1 -0
  20. package/dist/commands/mcp/index.js +14 -81
  21. package/dist/commands/mcp/index.js.map +1 -0
  22. package/dist/commands/open/index.d.ts +8 -0
  23. package/dist/commands/open/index.js +11 -0
  24. package/dist/commands/open/index.js.map +1 -0
  25. package/dist/commands/scan/index.js +8 -3
  26. package/dist/commands/scan/index.js.map +1 -0
  27. package/dist/commands/target/index.js +3 -0
  28. package/dist/commands/target/index.js.map +1 -0
  29. package/dist/commands/tm/index.js +10 -3
  30. package/dist/commands/tm/index.js.map +1 -0
  31. package/dist/index.js +1 -13
  32. package/dist/index.js.map +1 -0
  33. package/dist/internal/extractor/adapters/go/index.d.ts +4 -0
  34. package/dist/internal/extractor/adapters/go/index.js +6 -0
  35. package/dist/internal/extractor/adapters/go/index.js.map +1 -0
  36. package/dist/internal/extractor/adapters/go/manifest.d.ts +17 -0
  37. package/dist/internal/extractor/adapters/go/manifest.js +25 -19
  38. package/dist/internal/extractor/adapters/go/manifest.js.map +1 -0
  39. package/dist/internal/extractor/adapters/go/parser.d.ts +4 -0
  40. package/dist/internal/extractor/adapters/go/parser.js +5 -0
  41. package/dist/internal/extractor/adapters/go/parser.js.map +1 -0
  42. package/dist/internal/extractor/adapters/go/scanner.d.ts +20 -0
  43. package/dist/internal/extractor/adapters/go/scanner.js +43 -0
  44. package/dist/internal/extractor/adapters/go/scanner.js.map +1 -0
  45. package/dist/internal/extractor/adapters/python/index.d.ts +3 -0
  46. package/dist/internal/extractor/adapters/python/index.js +4 -0
  47. package/dist/internal/extractor/adapters/python/index.js.map +1 -0
  48. package/dist/internal/extractor/adapters/python/manifest.d.ts +8 -0
  49. package/dist/internal/extractor/adapters/python/manifest.js +18 -21
  50. package/dist/internal/extractor/adapters/python/manifest.js.map +1 -0
  51. package/dist/internal/extractor/adapters/python/parser.d.ts +3 -0
  52. package/dist/internal/extractor/adapters/python/parser.js +4 -0
  53. package/dist/internal/extractor/adapters/python/parser.js.map +1 -0
  54. package/dist/internal/extractor/adapters/python/scanner.d.ts +18 -0
  55. package/dist/internal/extractor/adapters/python/scanner.js +54 -1
  56. package/dist/internal/extractor/adapters/python/scanner.js.map +1 -0
  57. package/dist/internal/extractor/adapters/typescript/index.d.ts +7 -0
  58. package/dist/internal/extractor/adapters/typescript/index.js +21 -1
  59. package/dist/internal/extractor/adapters/typescript/index.js.map +1 -0
  60. package/dist/internal/extractor/adapters/typescript/manifest.d.ts +14 -0
  61. package/dist/internal/extractor/adapters/typescript/manifest.js +17 -26
  62. package/dist/internal/extractor/adapters/typescript/manifest.js.map +1 -0
  63. package/dist/internal/extractor/adapters/typescript/parser.d.ts +8 -0
  64. package/dist/internal/extractor/adapters/typescript/parser.js +9 -0
  65. package/dist/internal/extractor/adapters/typescript/parser.js.map +1 -0
  66. package/dist/internal/extractor/adapters/typescript/scanner.d.ts +24 -0
  67. package/dist/internal/extractor/adapters/typescript/scanner.js +43 -0
  68. package/dist/internal/extractor/adapters/typescript/scanner.js.map +1 -0
  69. package/dist/internal/extractor/index.d.ts +14 -0
  70. package/dist/internal/extractor/index.js +13 -0
  71. package/dist/internal/extractor/index.js.map +1 -0
  72. package/dist/internal/extractor/types.d.ts +45 -0
  73. package/dist/internal/extractor/types.js +27 -0
  74. package/dist/internal/extractor/types.js.map +1 -0
  75. package/dist/internal/extractor/walker.d.ts +18 -0
  76. package/dist/internal/extractor/walker.js +18 -0
  77. package/dist/internal/extractor/walker.js.map +1 -0
  78. package/dist/internal/ide-setup.d.ts +7 -16
  79. package/dist/internal/ide-setup.js +46 -320
  80. package/dist/internal/ide-setup.js.map +1 -0
  81. package/dist/internal/orgs.js +1 -0
  82. package/dist/internal/orgs.js.map +1 -0
  83. package/dist/internal/project-binding.d.ts +0 -1
  84. package/dist/internal/project-binding.js +9 -14
  85. package/dist/internal/project-binding.js.map +1 -0
  86. package/dist/internal/target-auth/api-config.d.ts +17 -0
  87. package/dist/internal/target-auth/api-config.js +18 -0
  88. package/dist/internal/target-auth/api-config.js.map +1 -0
  89. package/dist/internal/target-auth/config.d.ts +12 -0
  90. package/dist/internal/target-auth/config.js +13 -0
  91. package/dist/internal/target-auth/config.js.map +1 -0
  92. package/dist/internal/target-auth/index.d.ts +18 -0
  93. package/dist/internal/target-auth/index.js +19 -0
  94. package/dist/internal/target-auth/index.js.map +1 -0
  95. package/dist/internal/target-auth/keychain.d.ts +18 -0
  96. package/dist/internal/target-auth/keychain.js +23 -3
  97. package/dist/internal/target-auth/keychain.js.map +1 -0
  98. package/dist/internal/target-auth/types.d.ts +26 -0
  99. package/dist/internal/target-auth/types.js +10 -0
  100. package/dist/internal/target-auth/types.js.map +1 -0
  101. package/dist/internal/target-auth/workos.d.ts +15 -0
  102. package/dist/internal/target-auth/workos.js +18 -9
  103. package/dist/internal/target-auth/workos.js.map +1 -0
  104. package/package.json +5 -19
  105. package/LICENSE +0 -201
  106. package/README.md +0 -31
  107. package/dist/commands/auth/bind.d.ts +0 -4
  108. package/dist/commands/auth/bind.js +0 -97
  109. package/dist/commands/auth/token.d.ts +0 -4
  110. package/dist/commands/auth/token.js +0 -73
  111. package/dist/commands/check/index.d.ts +0 -2
  112. package/dist/commands/check/index.js +0 -463
  113. package/dist/commands/inspect/index.d.ts +0 -2
  114. package/dist/commands/inspect/index.js +0 -136
  115. package/dist/internal/binding-token-mint.d.ts +0 -33
  116. package/dist/internal/binding-token-mint.js +0 -174
  117. package/dist/internal/extractor/graph-builder.d.ts +0 -10
  118. package/dist/internal/extractor/graph-builder.js +0 -245
  119. package/dist/internal/extractor/graph-types.d.ts +0 -89
  120. package/dist/internal/extractor/graph-types.js +0 -1
  121. package/dist/internal/github-linkage-prompt.d.ts +0 -7
  122. package/dist/internal/github-linkage-prompt.js +0 -95
  123. package/dist/internal/org-picker.d.ts +0 -11
  124. package/dist/internal/org-picker.js +0 -34
@@ -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,2 +1,5 @@
1
+ /**
2
+ * tree-sitter-python loader.
3
+ */
1
4
  import { Parser } from "web-tree-sitter";
2
5
  export declare function getPythonParser(): Promise<Parser>;
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/python/scanner.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,9 @@
1
+ /**
2
+ * TypeScript / JavaScript language adapter.
3
+ *
4
+ * Handles .ts/.tsx/.js/.jsx + package.json. Combines manifest analysis
5
+ * (cheap, runs against package.json) with AST scanning (per source file)
6
+ * to produce components, external services, and data stores.
7
+ */
1
8
  import type { LanguageAdapter } from "../../types.js";
2
9
  export declare const typescriptAdapter: LanguageAdapter;
@@ -1,3 +1,10 @@
1
+ /**
2
+ * TypeScript / JavaScript language adapter.
3
+ *
4
+ * Handles .ts/.tsx/.js/.jsx + package.json. Combines manifest analysis
5
+ * (cheap, runs against package.json) with AST scanning (per source file)
6
+ * to produce components, external services, and data stores.
7
+ */
1
8
  import * as path from "node:path";
2
9
  import { readManifests, summarizeManifests, findExternalServices, findDataStores, detectFrameworkFromManifest, } from "./manifest.js";
3
10
  import { scanFile, aggregate } from "./scanner.js";
@@ -8,10 +15,13 @@ export const typescriptAdapter = {
8
15
  manifests: ["package.json"],
9
16
  async extract(input) {
10
17
  const { rootDir, sourceFiles, manifestFiles } = input;
18
+ // Manifest pass — fast, runs entirely on package.json contents.
11
19
  const parsedManifests = await readManifests(rootDir, manifestFiles);
12
20
  const manifestSummaries = summarizeManifests(parsedManifests);
13
21
  const manifestExternalServices = findExternalServices(parsedManifests);
14
22
  const manifestDataStores = findDataStores(parsedManifests);
23
+ // AST pass — only on source files. Cap at MAX_SOURCE_FILES per run
24
+ // for the Phase J <60s budget on a 100k-LOC monorepo.
15
25
  const MAX_SOURCE_FILES = 5_000;
16
26
  const filesToScan = sourceFiles.slice(0, MAX_SOURCE_FILES);
17
27
  const scans = await Promise.all(filesToScan.map(async (abs) => {
@@ -23,7 +33,10 @@ export const typescriptAdapter = {
23
33
  }
24
34
  }));
25
35
  const agg = aggregate(scans);
36
+ // Map scanner output → ExtractedComponent shape.
26
37
  const components = agg.components.map((c) => {
38
+ // Best-effort framework inference: scanner picks up imports; manifest
39
+ // picks up the dep. Either signal counts.
27
40
  const framework = c.framework ?? frameworkFromOwningManifest(c.sourceFile, parsedManifests);
28
41
  return {
29
42
  name: c.name,
@@ -34,11 +47,13 @@ export const typescriptAdapter = {
34
47
  evidence: [...c.routes, ...c.imports],
35
48
  };
36
49
  });
50
+ // Augment manifest-derived ExternalServices with AST call sites.
37
51
  for (const svc of manifestExternalServices) {
38
52
  const sites = agg.aiSdkCallSites.get(svc.package);
39
53
  if (sites)
40
54
  svc.callSites.push(...sites);
41
55
  }
56
+ // Augment manifest-derived DataStores with import-evidence from source.
42
57
  for (const store of manifestDataStores) {
43
58
  if (!store.client)
44
59
  continue;
@@ -54,11 +69,16 @@ export const typescriptAdapter = {
54
69
  };
55
70
  },
56
71
  };
72
+ /**
73
+ * Walk up from a source file's path to find the closest package.json
74
+ * we parsed; return the framework hint from that manifest.
75
+ */
57
76
  function frameworkFromOwningManifest(sourceFile, manifests) {
58
77
  const sourceDir = path.posix.dirname(sourceFile);
59
78
  const candidates = manifests
60
79
  .map((m) => ({ m, dir: path.posix.dirname(m.filePath) }))
61
80
  .filter(({ dir }) => sourceDir === dir || sourceDir.startsWith(dir + "/"))
62
- .sort((a, b) => b.dir.length - a.dir.length);
81
+ .sort((a, b) => b.dir.length - a.dir.length); // closest wins
63
82
  return candidates[0] ? detectFrameworkFromManifest(candidates[0].m) : undefined;
64
83
  }
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/typescript/index.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * TypeScript / JavaScript manifest analysis.
3
+ *
4
+ * Reads package.json files (root + workspaces) to classify dependencies
5
+ * into the categories the threat-model graph cares about. Used both for
6
+ * the manifests block of the output and as a hint for which AST queries
7
+ * are worth running on which files.
8
+ */
1
9
  import type { ExtractedExternalService, ExtractedDataStore, ManifestSummary } from "../../types.js";
2
10
  export interface PackageJson {
3
11
  name?: string;
@@ -20,8 +28,14 @@ export interface ParsedManifest {
20
28
  packageName?: string;
21
29
  deps: Record<string, string>;
22
30
  }
31
+ /**
32
+ * Read every package.json, return per-file dependency maps. Combines
33
+ * dependencies + devDependencies (we want both — devDeps include things
34
+ * like @types that signal use, plus dev-only auth packages).
35
+ */
23
36
  export declare function readManifests(rootDir: string, manifestFiles: string[]): Promise<ParsedManifest[]>;
24
37
  export declare function summarizeManifests(parsed: ParsedManifest[]): ManifestSummary[];
25
38
  export declare function findExternalServices(parsed: ParsedManifest[]): ExtractedExternalService[];
26
39
  export declare function findDataStores(parsed: ParsedManifest[]): ExtractedDataStore[];
40
+ /** Pick the most likely web framework for a manifest's owning package. */
27
41
  export declare function detectFrameworkFromManifest(m: ParsedManifest): string | undefined;
@@ -1,3 +1,11 @@
1
+ /**
2
+ * TypeScript / JavaScript manifest analysis.
3
+ *
4
+ * Reads package.json files (root + workspaces) to classify dependencies
5
+ * into the categories the threat-model graph cares about. Used both for
6
+ * the manifests block of the output and as a hint for which AST queries
7
+ * are worth running on which files.
8
+ */
1
9
  import * as fs from "node:fs/promises";
2
10
  import * as path from "node:path";
3
11
  export const WEB_FRAMEWORK_PACKAGES = {
@@ -7,14 +15,9 @@ export const WEB_FRAMEWORK_PACKAGES = {
7
15
  "@trpc/server": "trpc",
8
16
  hono: "hono",
9
17
  koa: "koa",
10
- "@nestjs/core": "nestjs",
11
- "@nestjs/common": "nestjs",
12
- "@hapi/hapi": "hapi",
13
- "express-graphql": "express",
14
- "apollo-server-express": "express",
15
18
  };
16
19
  export const DATA_STORE_PACKAGES = {
17
- "@prisma/client": { kind: "postgres", client: "@prisma/client" },
20
+ "@prisma/client": { kind: "postgres", client: "@prisma/client" }, // assumes postgres; could be MySQL/SQLite via schema
18
21
  pg: { kind: "postgres", client: "pg" },
19
22
  postgres: { kind: "postgres", client: "postgres" },
20
23
  mongoose: { kind: "mongo", client: "mongoose" },
@@ -35,6 +38,11 @@ export const AI_SDK_PACKAGES = {
35
38
  "@langchain/core": "LangChain",
36
39
  llamaindex: "LlamaIndex",
37
40
  };
41
+ /**
42
+ * Read every package.json, return per-file dependency maps. Combines
43
+ * dependencies + devDependencies (we want both — devDeps include things
44
+ * like @types that signal use, plus dev-only auth packages).
45
+ */
38
46
  export async function readManifests(rootDir, manifestFiles) {
39
47
  const out = [];
40
48
  for (const file of manifestFiles) {
@@ -55,6 +63,7 @@ export async function readManifests(rootDir, manifestFiles) {
55
63
  });
56
64
  }
57
65
  catch {
66
+ // Skip broken JSON; not our job to validate the customer's manifests.
58
67
  }
59
68
  }
60
69
  return out;
@@ -89,26 +98,6 @@ export function findExternalServices(parsed) {
89
98
  callSites: [{ file: m.filePath, line: 1 }],
90
99
  });
91
100
  }
92
- for (const [pkg, vendor] of Object.entries(WEB_FRAMEWORK_PACKAGES)) {
93
- const ver = m.deps[pkg];
94
- if (!ver)
95
- continue;
96
- const key = `web_framework::${pkg}`;
97
- const existing = seen.get(key);
98
- if (existing) {
99
- existing.callSites.push({ file: m.filePath, line: 1 });
100
- if (!existing.version)
101
- existing.version = ver;
102
- continue;
103
- }
104
- seen.set(key, {
105
- name: vendor,
106
- kind: "web_framework",
107
- package: pkg,
108
- version: ver,
109
- callSites: [{ file: m.filePath, line: 1 }],
110
- });
111
- }
112
101
  }
113
102
  return [...seen.values()];
114
103
  }
@@ -136,6 +125,7 @@ export function findDataStores(parsed) {
136
125
  }
137
126
  return [...seen.values()];
138
127
  }
128
+ /** Pick the most likely web framework for a manifest's owning package. */
139
129
  export function detectFrameworkFromManifest(m) {
140
130
  for (const [pkg, framework] of Object.entries(WEB_FRAMEWORK_PACKAGES)) {
141
131
  if (m.deps[pkg])
@@ -163,3 +153,4 @@ function relPosix(rootDir, abs) {
163
153
  const rel = path.relative(rootDir, abs);
164
154
  return rel.split(path.sep).join("/");
165
155
  }
156
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/typescript/manifest.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * tree-sitter-typescript loader. Initializes the WASM grammar lazily and
3
+ * caches the parser+language for the rest of the run.
4
+ *
5
+ * @vscode/tree-sitter-wasm bundles the prebuilt .wasm files so we don't
6
+ * need a build step on the user's machine. Loading a .wasm grammar is
7
+ * O(50ms); parsing a TS file is O(low ms) per file.
8
+ */
1
9
  import { Parser } from "web-tree-sitter";
2
10
  export declare function getParsers(): Promise<{
3
11
  parser: Parser;
@@ -1,3 +1,11 @@
1
+ /**
2
+ * tree-sitter-typescript loader. Initializes the WASM grammar lazily and
3
+ * caches the parser+language for the rest of the run.
4
+ *
5
+ * @vscode/tree-sitter-wasm bundles the prebuilt .wasm files so we don't
6
+ * need a build step on the user's machine. Loading a .wasm grammar is
7
+ * O(50ms); parsing a TS file is O(low ms) per file.
8
+ */
1
9
  import { createRequire } from "node:module";
2
10
  import * as path from "node:path";
3
11
  import { Parser, Language } from "web-tree-sitter";
@@ -22,3 +30,4 @@ export function getParsers() {
22
30
  export function pickParserForFile(file, parser, tsx) {
23
31
  return file.endsWith(".tsx") || file.endsWith(".jsx") ? tsx : parser;
24
32
  }
33
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/typescript/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;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,GAAoD,IAAI,CAAC;AAE1E,MAAM,UAAU,UAAU;IACxB,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,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC;YAC9F,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;YACxF,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACzB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAc,EAAE,GAAW;IACzE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACvE,CAAC"}
@@ -1,3 +1,24 @@
1
+ /**
2
+ * AST scanner for TypeScript / JavaScript source files.
3
+ *
4
+ * For each file: parses with tree-sitter-typescript, walks the tree
5
+ * looking for:
6
+ *
7
+ * 1. `import` / `require` statements naming any tracked package
8
+ * (AI SDKs, web frameworks, DB clients) → import-evidence + extra
9
+ * ExternalService call sites
10
+ * 2. Express-style route declarations:
11
+ * app.METHOD("/path", ...)
12
+ * router.METHOD("/path", ...)
13
+ * server.METHOD("/path", ...)
14
+ * where METHOD is one of GET/POST/PUT/DELETE/PATCH/ALL/USE
15
+ * → HTTP-route-evidence on a component derived from the file
16
+ *
17
+ * Privacy invariant: we only ever emit identifier names, file paths,
18
+ * line numbers, dependency identifiers, and HTTP method/path strings.
19
+ * Function bodies and inline values are never read past the first arg
20
+ * of a route call.
21
+ */
1
22
  import type { EvidenceLocation, Evidence, HttpRouteEvidence, ImportEvidence } from "../../types.js";
2
23
  export interface FileScanResult {
3
24
  file: string;
@@ -6,6 +27,7 @@ export interface FileScanResult {
6
27
  }
7
28
  export declare function scanFile(absPath: string, repoRel: string): Promise<FileScanResult>;
8
29
  export interface ScannedAggregates {
30
+ /** Per-component findings (one per source file with relevant evidence). */
9
31
  components: Array<{
10
32
  name: string;
11
33
  sourceFile: string;
@@ -13,7 +35,9 @@ export interface ScannedAggregates {
13
35
  routes: HttpRouteEvidence[];
14
36
  imports: ImportEvidence[];
15
37
  }>;
38
+ /** Extra ExternalService call-site evidence beyond what the manifests gave. */
16
39
  aiSdkCallSites: Map<string, EvidenceLocation[]>;
40
+ /** Extra data-store evidence (when AST shows usage of e.g. `new Pool()` etc.; v1 just imports). */
17
41
  dataStoreEvidence: Map<string, Evidence[]>;
18
42
  }
19
43
  export declare function aggregate(scans: FileScanResult[]): ScannedAggregates;