codesift-mcp 0.5.28 → 0.5.30

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 (92) hide show
  1. package/dist/cli/commands.d.ts.map +1 -1
  2. package/dist/cli/commands.js +4 -1
  3. package/dist/cli/commands.js.map +1 -1
  4. package/dist/cli/git-hooks-installer.d.ts +29 -0
  5. package/dist/cli/git-hooks-installer.d.ts.map +1 -0
  6. package/dist/cli/git-hooks-installer.js +145 -0
  7. package/dist/cli/git-hooks-installer.js.map +1 -0
  8. package/dist/cli/help.d.ts.map +1 -1
  9. package/dist/cli/help.js +5 -0
  10. package/dist/cli/help.js.map +1 -1
  11. package/dist/cli/setup.d.ts +5 -0
  12. package/dist/cli/setup.d.ts.map +1 -1
  13. package/dist/cli/setup.js +15 -1
  14. package/dist/cli/setup.js.map +1 -1
  15. package/dist/register-tools.d.ts.map +1 -1
  16. package/dist/register-tools.js +125 -11
  17. package/dist/register-tools.js.map +1 -1
  18. package/dist/storage/index-store.d.ts.map +1 -1
  19. package/dist/storage/index-store.js +15 -14
  20. package/dist/storage/index-store.js.map +1 -1
  21. package/dist/storage/registry.d.ts +9 -0
  22. package/dist/storage/registry.d.ts.map +1 -1
  23. package/dist/storage/registry.js +28 -0
  24. package/dist/storage/registry.js.map +1 -1
  25. package/dist/tools/astro-content-collections.d.ts.map +1 -1
  26. package/dist/tools/astro-content-collections.js +1 -141
  27. package/dist/tools/astro-content-collections.js.map +1 -1
  28. package/dist/tools/astro-db-audit.d.ts +30 -0
  29. package/dist/tools/astro-db-audit.d.ts.map +1 -0
  30. package/dist/tools/astro-db-audit.js +244 -0
  31. package/dist/tools/astro-db-audit.js.map +1 -0
  32. package/dist/tools/astro-db-parser.d.ts +24 -0
  33. package/dist/tools/astro-db-parser.d.ts.map +1 -0
  34. package/dist/tools/astro-db-parser.js +150 -0
  35. package/dist/tools/astro-db-parser.js.map +1 -0
  36. package/dist/tools/astro-helpers.d.ts +13 -0
  37. package/dist/tools/astro-helpers.d.ts.map +1 -0
  38. package/dist/tools/astro-helpers.js +116 -0
  39. package/dist/tools/astro-helpers.js.map +1 -0
  40. package/dist/tools/astro-middleware.d.ts +26 -0
  41. package/dist/tools/astro-middleware.d.ts.map +1 -0
  42. package/dist/tools/astro-middleware.js +139 -0
  43. package/dist/tools/astro-middleware.js.map +1 -0
  44. package/dist/tools/astro-sessions.d.ts +26 -0
  45. package/dist/tools/astro-sessions.d.ts.map +1 -0
  46. package/dist/tools/astro-sessions.js +140 -0
  47. package/dist/tools/astro-sessions.js.map +1 -0
  48. package/dist/tools/constant-resolution-tools.d.ts.map +1 -1
  49. package/dist/tools/constant-resolution-tools.js +8 -4
  50. package/dist/tools/constant-resolution-tools.js.map +1 -1
  51. package/dist/tools/index-tools.d.ts.map +1 -1
  52. package/dist/tools/index-tools.js +16 -40
  53. package/dist/tools/index-tools.js.map +1 -1
  54. package/dist/tools/pattern-tools.d.ts.map +1 -1
  55. package/dist/tools/pattern-tools.js +20 -25
  56. package/dist/tools/pattern-tools.js.map +1 -1
  57. package/dist/tools/python-constants-tools.d.ts +3 -1
  58. package/dist/tools/python-constants-tools.d.ts.map +1 -1
  59. package/dist/tools/python-constants-tools.js +3 -2
  60. package/dist/tools/python-constants-tools.js.map +1 -1
  61. package/dist/tools/react-tools.d.ts +7 -1
  62. package/dist/tools/react-tools.d.ts.map +1 -1
  63. package/dist/tools/react-tools.js.map +1 -1
  64. package/dist/tools/sql-tools.d.ts +26 -0
  65. package/dist/tools/sql-tools.d.ts.map +1 -1
  66. package/dist/tools/sql-tools.js +84 -9
  67. package/dist/tools/sql-tools.js.map +1 -1
  68. package/dist/tools/status-tools.js +12 -19
  69. package/dist/tools/status-tools.js.map +1 -1
  70. package/dist/tools/typescript-constants-tools.d.ts +3 -0
  71. package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
  72. package/dist/tools/typescript-constants-tools.js +53 -13
  73. package/dist/tools/typescript-constants-tools.js.map +1 -1
  74. package/dist/utils/constant-file-pattern.d.ts +6 -0
  75. package/dist/utils/constant-file-pattern.d.ts.map +1 -0
  76. package/dist/utils/constant-file-pattern.js +27 -0
  77. package/dist/utils/constant-file-pattern.js.map +1 -0
  78. package/dist/utils/import-graph.d.ts.map +1 -1
  79. package/dist/utils/import-graph.js +15 -9
  80. package/dist/utils/import-graph.js.map +1 -1
  81. package/dist/utils/ts-imports.d.ts +2 -1
  82. package/dist/utils/ts-imports.d.ts.map +1 -1
  83. package/dist/utils/ts-imports.js +8 -0
  84. package/dist/utils/ts-imports.js.map +1 -1
  85. package/dist/utils/tsconfig-paths.d.ts +5 -4
  86. package/dist/utils/tsconfig-paths.d.ts.map +1 -1
  87. package/dist/utils/tsconfig-paths.js +17 -14
  88. package/dist/utils/tsconfig-paths.js.map +1 -1
  89. package/hooks/hook-chain.sh +7 -0
  90. package/hooks/post-commit +8 -0
  91. package/hooks/post-commit-review-backlog.sh +107 -0
  92. package/package.json +2 -1
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Astro DB audit. Orchestrates astro-db-parser (Task 4) for schema extraction
3
+ * and adds runtime detectors:
4
+ * DB02 N+1 — db.select inside for/while/forEach loop
5
+ * DB03 missing-fk-index — FK column without explicit indexes entry
6
+ * DB04 reference-cycle — table references form a cycle
7
+ */
8
+ import { readFile } from "node:fs/promises";
9
+ import { existsSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ import { walkDirectory } from "../utils/walk.js";
12
+ import { getCodeIndex } from "./index-tools.js";
13
+ import { getParser, initParser } from "../parser/parser-manager.js";
14
+ import { getProperty } from "./astro-helpers.js";
15
+ import { parseAstroDbSchema } from "./astro-db-parser.js";
16
+ const CANDIDATES = ["db/config.ts", "db/config.js", "db/config.mjs", "src/db/config.ts"];
17
+ async function findDbConfig(root) {
18
+ for (const rel of CANDIDATES) {
19
+ const abs = join(root, rel);
20
+ if (existsSync(abs))
21
+ return { abs, rel };
22
+ }
23
+ return null;
24
+ }
25
+ async function readIndexedColumns(content) {
26
+ // Parse indexes scoped per table — return set of "TableName.columnName" entries.
27
+ // Avoids cross-table contamination where shared FK column names bleed across tables.
28
+ await initParser();
29
+ const parser = await getParser("typescript");
30
+ if (!parser)
31
+ return new Set();
32
+ let tree;
33
+ try {
34
+ tree = parser.parse(content);
35
+ }
36
+ catch {
37
+ return new Set();
38
+ }
39
+ try {
40
+ const indexed = new Set();
41
+ for (const lex of tree.rootNode.descendantsOfType("lexical_declaration")) {
42
+ for (const v of lex.namedChildren) {
43
+ if (v.type !== "variable_declarator")
44
+ continue;
45
+ const nameNode = v.childForFieldName("name");
46
+ const valueNode = v.childForFieldName("value");
47
+ if (!nameNode || !valueNode || valueNode.type !== "call_expression")
48
+ continue;
49
+ const fn = valueNode.childForFieldName("function");
50
+ if (!fn || fn.text !== "defineTable")
51
+ continue;
52
+ const args = valueNode.childForFieldName("arguments");
53
+ const obj = args?.namedChildren.find((n) => n.type === "object");
54
+ if (!obj)
55
+ continue;
56
+ const idx = getProperty(obj, "indexes");
57
+ if (!idx || idx.type !== "array")
58
+ continue;
59
+ for (const entry of idx.namedChildren) {
60
+ if (entry.type !== "object")
61
+ continue;
62
+ const on = getProperty(entry, "on");
63
+ if (!on || on.type !== "array")
64
+ continue;
65
+ for (const col of on.namedChildren) {
66
+ if (col.type === "string")
67
+ indexed.add(`${nameNode.text}.${col.text.slice(1, -1)}`);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ return indexed;
73
+ }
74
+ finally {
75
+ tree.delete();
76
+ }
77
+ }
78
+ function detectCycle(tables) {
79
+ // Build adjacency: tableName → set of referenced tableNames
80
+ const graph = new Map();
81
+ for (const t of tables) {
82
+ const targets = new Set();
83
+ for (const c of t.columns) {
84
+ if (c.references) {
85
+ const target = c.references.split(".")[0];
86
+ if (target && target !== t.name)
87
+ targets.add(target);
88
+ }
89
+ }
90
+ graph.set(t.name, targets);
91
+ }
92
+ const visiting = new Set();
93
+ const visited = new Set();
94
+ function dfs(node) {
95
+ if (visiting.has(node))
96
+ return true;
97
+ if (visited.has(node))
98
+ return false;
99
+ visiting.add(node);
100
+ for (const next of graph.get(node) ?? [])
101
+ if (dfs(next))
102
+ return true;
103
+ visiting.delete(node);
104
+ visited.add(node);
105
+ return false;
106
+ }
107
+ for (const name of graph.keys())
108
+ if (dfs(name))
109
+ return true;
110
+ return false;
111
+ }
112
+ const DB_OP = /^(select|insert|update|delete)$/;
113
+ /** AST-based detection: db.<op>(...) call inside any loop ancestor (for/while/forEach). */
114
+ async function findNPlusOneSites(source, file) {
115
+ await initParser();
116
+ const ext = file.endsWith(".astro") ? "typescript" : (file.endsWith(".js") || file.endsWith(".jsx") || file.endsWith(".mjs")) ? "javascript" : "typescript";
117
+ const parser = await getParser(ext);
118
+ if (!parser)
119
+ return [];
120
+ let tree;
121
+ try {
122
+ tree = parser.parse(source);
123
+ }
124
+ catch {
125
+ return [];
126
+ }
127
+ try {
128
+ const issues = [];
129
+ for (const call of tree.rootNode.descendantsOfType("call_expression")) {
130
+ const fn = call.childForFieldName("function");
131
+ if (!fn || fn.type !== "member_expression")
132
+ continue;
133
+ const obj = fn.childForFieldName("object");
134
+ const prop = fn.childForFieldName("property");
135
+ if (!obj || obj.text !== "db" || !prop || !DB_OP.test(prop.text))
136
+ continue;
137
+ // Walk up to see if any ancestor is a for/while/forEach loop body.
138
+ let cur = call;
139
+ while (cur) {
140
+ if (cur.type === "for_statement" || cur.type === "for_in_statement" || cur.type === "while_statement") {
141
+ issues.push({ code: "DB02", severity: "warning", message: `db.${prop.text}() inside ${cur.type.replace("_", " ")} — likely N+1`, file, line: call.startPosition.row + 1 });
142
+ break;
143
+ }
144
+ // forEach detection: the call is inside an arrow_function whose parent
145
+ // call_expression has function .forEach
146
+ if (cur.type === "arrow_function" || cur.type === "function") {
147
+ const parent = cur.parent;
148
+ if (parent && parent.type === "arguments") {
149
+ const grand = parent.parent;
150
+ if (grand && grand.type === "call_expression") {
151
+ const grandFn = grand.childForFieldName("function");
152
+ if (grandFn && grandFn.type === "member_expression") {
153
+ const grandProp = grandFn.childForFieldName("property");
154
+ if (grandProp && (grandProp.text === "forEach" || grandProp.text === "map")) {
155
+ issues.push({ code: "DB02", severity: "warning", message: `db.${prop.text}() inside .${grandProp.text}() — likely N+1`, file, line: call.startPosition.row + 1 });
156
+ break;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ cur = cur.parent;
163
+ }
164
+ }
165
+ return issues;
166
+ }
167
+ finally {
168
+ tree.delete();
169
+ }
170
+ }
171
+ export async function auditDbFromRoot(root) {
172
+ const cfg = await findDbConfig(root);
173
+ if (!cfg)
174
+ return { config_file: null, tables: [], n_plus_one: [], missing_indexes: [], issues: [], summary: { tables_total: 0, issues_total: 0 } };
175
+ let configSource;
176
+ try {
177
+ configSource = await readFile(cfg.abs, "utf-8");
178
+ }
179
+ catch {
180
+ return { config_file: cfg.rel, tables: [], n_plus_one: [], missing_indexes: [], issues: [{ code: "DB00", severity: "error", message: "Cannot read db config", file: cfg.rel, line: 1 }], summary: { tables_total: 0, issues_total: 1 } };
181
+ }
182
+ const parsed = await parseAstroDbSchema(configSource);
183
+ const tables = parsed.tables;
184
+ const indexedCols = await readIndexedColumns(configSource);
185
+ const issues = [];
186
+ if (detectCycle(tables)) {
187
+ issues.push({ code: "DB04", severity: "warning", message: "Reference cycle detected between tables — review FK design", file: cfg.rel, line: 1 });
188
+ }
189
+ // Missing FK indexes
190
+ const missing_indexes = [];
191
+ for (const t of tables) {
192
+ for (const c of t.columns) {
193
+ if (c.references && !indexedCols.has(`${t.name}.${c.name}`)) {
194
+ missing_indexes.push({ column: c.name, table: t.name, code: "DB03" });
195
+ issues.push({ code: "DB03", severity: "warning", message: `FK column ${t.name}.${c.name} has no explicit index — slow joins likely`, file: cfg.rel, line: 1, column: c.name });
196
+ }
197
+ }
198
+ }
199
+ // N+1 scan across project source
200
+ const files = await walkDirectory(root, {
201
+ maxFiles: 5000, relative: true,
202
+ fileFilter: (ext) => ext === ".ts" || ext === ".tsx" || ext === ".js" || ext === ".jsx" || ext === ".astro" || ext === ".mjs",
203
+ });
204
+ const n_plus_one = [];
205
+ for (const rel of files) {
206
+ if (rel.startsWith("db/"))
207
+ continue;
208
+ let src;
209
+ try {
210
+ src = await readFile(join(root, rel), "utf-8");
211
+ }
212
+ catch {
213
+ continue;
214
+ }
215
+ if (!/\bdb\s*\./.test(src))
216
+ continue;
217
+ // For .astro files, parse only the frontmatter section (between ---/---).
218
+ const toParse = rel.endsWith(".astro")
219
+ ? (src.match(/^---\s*\n([\s\S]*?)\n---/)?.[1] ?? "")
220
+ : src;
221
+ if (!toParse)
222
+ continue;
223
+ const found = await findNPlusOneSites(toParse, rel);
224
+ n_plus_one.push(...found);
225
+ issues.push(...found);
226
+ }
227
+ return {
228
+ config_file: cfg.rel,
229
+ tables,
230
+ n_plus_one,
231
+ missing_indexes,
232
+ issues,
233
+ summary: { tables_total: tables.length, issues_total: issues.length },
234
+ };
235
+ }
236
+ export async function astroDbAudit(args) {
237
+ if (args.project_root)
238
+ return auditDbFromRoot(args.project_root);
239
+ const index = await getCodeIndex(args.repo ?? "");
240
+ if (!index)
241
+ return { config_file: null, tables: [], n_plus_one: [], missing_indexes: [], issues: [], summary: { tables_total: 0, issues_total: 0 } };
242
+ return auditDbFromRoot(index.root);
243
+ }
244
+ //# sourceMappingURL=astro-db-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-db-audit.js","sourceRoot":"","sources":["../../src/tools/astro-db-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface ColumnDef {
2
+ name: string;
3
+ type: string;
4
+ primaryKey?: boolean;
5
+ unique?: boolean;
6
+ optional?: boolean;
7
+ references?: string;
8
+ }
9
+ export interface TableDef {
10
+ name: string;
11
+ columns: ColumnDef[];
12
+ }
13
+ export interface DbParserIssue {
14
+ code: "DB00";
15
+ severity: "error" | "warning";
16
+ message: string;
17
+ line: number;
18
+ }
19
+ export interface DbParserResult {
20
+ tables: TableDef[];
21
+ issues: DbParserIssue[];
22
+ }
23
+ export declare function parseAstroDbSchema(content: string): Promise<DbParserResult>;
24
+ //# sourceMappingURL=astro-db-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-db-parser.d.ts","sourceRoot":"","sources":["../../src/tools/astro-db-parser.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AA2FD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA+BjF"}
@@ -0,0 +1,150 @@
1
+ import { getParser, initParser } from "../parser/parser-manager.js";
2
+ import { getProperty, stripQuotes } from "./astro-helpers.js";
3
+ function parseColumnCall(callNode) {
4
+ if (callNode.type !== "call_expression")
5
+ return null;
6
+ const fn = callNode.childForFieldName("function");
7
+ if (!fn || fn.type !== "member_expression")
8
+ return null;
9
+ const obj = fn.childForFieldName("object");
10
+ const prop = fn.childForFieldName("property");
11
+ if (!obj || obj.text !== "column" || !prop)
12
+ return null;
13
+ const type = prop.text;
14
+ const args = callNode.childForFieldName("arguments");
15
+ const props = new Map();
16
+ if (args) {
17
+ const objArg = args.namedChildren.find((n) => n.type === "object");
18
+ if (objArg) {
19
+ for (const pair of objArg.namedChildren) {
20
+ if (pair.type !== "pair")
21
+ continue;
22
+ const k = pair.childForFieldName("key");
23
+ const v = pair.childForFieldName("value");
24
+ if (!k || !v)
25
+ continue;
26
+ const keyText = k.type === "string" ? stripQuotes(k.text) : k.text;
27
+ props.set(keyText, v);
28
+ }
29
+ }
30
+ }
31
+ return { type, props };
32
+ }
33
+ function parseReferences(node) {
34
+ // Pattern: () => Author.columns.id → arrow_function with body member_expression
35
+ if (node.type === "arrow_function") {
36
+ const body = node.childForFieldName("body");
37
+ if (body && body.type === "member_expression")
38
+ return memberToFkPath(body);
39
+ }
40
+ if (node.type === "member_expression")
41
+ return memberToFkPath(node);
42
+ return null;
43
+ }
44
+ function memberToFkPath(node) {
45
+ // Author.columns.id → "Author.id". Skip the middle `columns` segment.
46
+ const parts = [];
47
+ let cur = node;
48
+ while (cur && cur.type === "member_expression") {
49
+ const p = cur.childForFieldName("property");
50
+ if (p)
51
+ parts.unshift(p.text);
52
+ cur = cur.childForFieldName("object");
53
+ }
54
+ if (cur && cur.type === "identifier")
55
+ parts.unshift(cur.text);
56
+ if (parts.length < 2)
57
+ return null;
58
+ // Drop "columns" segment(s) — they're a syntactic detail of Astro DB FK syntax,
59
+ // not part of the logical reference path. Preserve all other segments so that
60
+ // namespaced refs like `db.User.columns.id` resolve to `db.User.id`, not `db.id`.
61
+ const filtered = parts.filter((p) => p !== "columns");
62
+ return filtered.length >= 2 ? filtered.join(".") : null;
63
+ }
64
+ function parseTableCall(callNode) {
65
+ const fn = callNode.childForFieldName("function");
66
+ if (!fn || fn.text !== "defineTable")
67
+ return null;
68
+ const args = callNode.childForFieldName("arguments");
69
+ const objArg = args?.namedChildren.find((n) => n.type === "object");
70
+ if (!objArg)
71
+ return [];
72
+ const columnsObj = getProperty(objArg, "columns");
73
+ if (!columnsObj || columnsObj.type !== "object")
74
+ return [];
75
+ const columns = [];
76
+ for (const pair of columnsObj.namedChildren) {
77
+ if (pair.type !== "pair")
78
+ continue;
79
+ const keyNode = pair.childForFieldName("key");
80
+ const valueNode = pair.childForFieldName("value");
81
+ if (!keyNode || !valueNode)
82
+ continue;
83
+ const colName = keyNode.type === "string" ? stripQuotes(keyNode.text) : keyNode.text;
84
+ const parsed = parseColumnCall(valueNode);
85
+ if (!parsed)
86
+ continue;
87
+ const col = { name: colName, type: parsed.type };
88
+ const pk = parsed.props.get("primaryKey");
89
+ if (pk && pk.text === "true")
90
+ col.primaryKey = true;
91
+ const uniq = parsed.props.get("unique");
92
+ if (uniq && uniq.text === "true")
93
+ col.unique = true;
94
+ const opt = parsed.props.get("optional");
95
+ if (opt && opt.text === "true")
96
+ col.optional = true;
97
+ const refs = parsed.props.get("references");
98
+ if (refs) {
99
+ const fk = parseReferences(refs);
100
+ if (fk)
101
+ col.references = fk;
102
+ }
103
+ columns.push(col);
104
+ }
105
+ return columns;
106
+ }
107
+ export async function parseAstroDbSchema(content) {
108
+ if (!content || content.trim() === "")
109
+ return { tables: [], issues: [] };
110
+ await initParser();
111
+ const lang = /:\s*\w+\s*=>/.test(content) || /<[A-Z]/.test(content) ? "typescript" : "typescript";
112
+ const parser = await getParser(lang);
113
+ if (!parser)
114
+ return { tables: [], issues: [{ code: "DB00", severity: "error", message: "TypeScript parser unavailable", line: 1 }] };
115
+ let tree;
116
+ try {
117
+ tree = parser.parse(content);
118
+ }
119
+ catch {
120
+ return { tables: [], issues: [{ code: "DB00", severity: "error", message: "Parse error in schema source", line: 1 }] };
121
+ }
122
+ try {
123
+ const root = tree.rootNode;
124
+ // Tolerate hasError — tree-sitter recovers and exposes valid sub-trees.
125
+ // Aborting here would silently zero out a schema during in-flight edits.
126
+ const issues = root.hasError
127
+ ? [{ code: "DB00", severity: "warning", message: "Source has syntax errors; partial schema extracted", line: 1 }]
128
+ : [];
129
+ const tables = [];
130
+ // Walk variable declarations: `const Author = defineTable(...)`
131
+ for (const lex of root.descendantsOfType("lexical_declaration")) {
132
+ for (const v of lex.namedChildren) {
133
+ if (v.type !== "variable_declarator")
134
+ continue;
135
+ const name = v.childForFieldName("name");
136
+ const value = v.childForFieldName("value");
137
+ if (!name || !value || value.type !== "call_expression")
138
+ continue;
139
+ const cols = parseTableCall(value);
140
+ if (cols !== null)
141
+ tables.push({ name: name.text, columns: cols });
142
+ }
143
+ }
144
+ return { tables, issues };
145
+ }
146
+ finally {
147
+ tree.delete();
148
+ }
149
+ }
150
+ //# sourceMappingURL=astro-db-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-db-parser.js","sourceRoot":"","sources":["../../src/tools/astro-db-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type Parser from "web-tree-sitter";
2
+ export declare function stripQuotes(s: string): string;
3
+ export declare function getProperty(obj: Parser.SyntaxNode, name: string): Parser.SyntaxNode | null;
4
+ export declare function isLiteral(n: Parser.SyntaxNode): boolean;
5
+ export declare function innermostCall(node: Parser.SyntaxNode): Parser.SyntaxNode;
6
+ export declare function methodChain(node: Parser.SyntaxNode): string[];
7
+ export interface ZodFieldInfo {
8
+ type: string;
9
+ required: boolean;
10
+ references?: string;
11
+ }
12
+ export declare function classifyZodField(valueNode: Parser.SyntaxNode): ZodFieldInfo;
13
+ //# sourceMappingURL=astro-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-helpers.d.ts","sourceRoot":"","sources":["../../src/tools/astro-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE1C,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAS1F;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAGvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAUxE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAiB7D;AAED,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAAE;AAEvF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,GAAG,YAAY,CAqC3E"}
@@ -0,0 +1,116 @@
1
+ export function stripQuotes(s) {
2
+ if (s.length < 2)
3
+ return s;
4
+ const f = s[0], l = s[s.length - 1];
5
+ if ((f === '"' || f === "'" || f === "`") && f === l)
6
+ return s.slice(1, -1);
7
+ return s;
8
+ }
9
+ export function getProperty(obj, name) {
10
+ for (const p of obj.namedChildren) {
11
+ if (p.type !== "pair")
12
+ continue;
13
+ const k = p.childForFieldName("key");
14
+ if (!k)
15
+ continue;
16
+ const keyText = k.type === "string" ? stripQuotes(k.text) : k.text;
17
+ if (keyText === name)
18
+ return p.childForFieldName("value") ?? null;
19
+ }
20
+ return null;
21
+ }
22
+ export function isLiteral(n) {
23
+ return n.type === "string" || n.type === "number" || n.type === "true"
24
+ || n.type === "false" || n.type === "null" || n.type === "undefined";
25
+ }
26
+ export function innermostCall(node) {
27
+ let current = node;
28
+ while (current.type === "call_expression") {
29
+ const fn = current.childForFieldName("function");
30
+ if (!fn || fn.type !== "member_expression")
31
+ break;
32
+ const obj = fn.childForFieldName("object");
33
+ if (obj && obj.type === "call_expression") {
34
+ current = obj;
35
+ continue;
36
+ }
37
+ break;
38
+ }
39
+ return current;
40
+ }
41
+ export function methodChain(node) {
42
+ const chain = [];
43
+ let current = node;
44
+ while (current && current.type === "call_expression") {
45
+ const fn = current.childForFieldName("function");
46
+ if (!fn)
47
+ break;
48
+ if (fn.type === "member_expression") {
49
+ const prop = fn.childForFieldName("property");
50
+ const obj = fn.childForFieldName("object");
51
+ if (prop)
52
+ chain.unshift(prop.text);
53
+ if (obj && obj.type === "call_expression") {
54
+ current = obj;
55
+ continue;
56
+ }
57
+ break;
58
+ }
59
+ if (fn.type === "identifier") {
60
+ chain.unshift(fn.text);
61
+ break;
62
+ }
63
+ break;
64
+ }
65
+ return chain;
66
+ }
67
+ export function classifyZodField(valueNode) {
68
+ let required = true;
69
+ let cursor = valueNode;
70
+ while (cursor && cursor.type === "call_expression") {
71
+ const fn = cursor.childForFieldName("function");
72
+ if (!fn)
73
+ break;
74
+ if (fn.type === "member_expression") {
75
+ const prop = fn.childForFieldName("property");
76
+ if (prop && (prop.text === "optional" || prop.text === "nullish"
77
+ || prop.text === "nullable" || prop.text === "default"))
78
+ required = false;
79
+ const obj = fn.childForFieldName("object");
80
+ if (obj && obj.type === "call_expression") {
81
+ cursor = obj;
82
+ continue;
83
+ }
84
+ cursor = obj;
85
+ break;
86
+ }
87
+ if (fn.type === "identifier")
88
+ break;
89
+ break;
90
+ }
91
+ const base = innermostCall(valueNode);
92
+ if (base.type !== "call_expression")
93
+ return { type: "unknown", required };
94
+ const baseFn = base.childForFieldName("function");
95
+ if (!baseFn)
96
+ return { type: "unknown", required };
97
+ if (baseFn.type === "identifier" && baseFn.text === "reference") {
98
+ const args = base.childForFieldName("arguments");
99
+ const first = args?.namedChildren.find((n) => isLiteral(n));
100
+ const ref = first ? stripQuotes(first.text) : undefined;
101
+ const out = { type: "reference", required };
102
+ if (ref)
103
+ out.references = ref;
104
+ return out;
105
+ }
106
+ if (baseFn.type === "member_expression") {
107
+ const prop = baseFn.childForFieldName("property");
108
+ if (prop)
109
+ return { type: prop.text, required };
110
+ }
111
+ const chain = methodChain(valueNode);
112
+ if (chain.length > 0)
113
+ return { type: chain[0], required };
114
+ return { type: "unknown", required };
115
+ }
116
+ //# sourceMappingURL=astro-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-helpers.js","sourceRoot":"","sources":["../../src/tools/astro-helpers.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAsB,EAAE,IAAY;IAC9D,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAoB;IAC5C,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;WACjE,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAuB;IACnD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,mBAAmB;YAAE,MAAM;QAClD,MAAM,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAAC,OAAO,GAAG,GAAG,CAAC;YAAC,SAAS;QAAC,CAAC;QACvE,MAAM;IACR,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAA6B,IAAI,CAAC;IAC7C,OAAO,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACrD,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE;YAAE,MAAM;QACf,IAAI,EAAE,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,IAAI;gBAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAAC,OAAO,GAAG,GAAG,CAAC;gBAAC,SAAS;YAAC,CAAC;YACvE,MAAM;QACR,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;QAChE,MAAM;IACR,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAID,MAAM,UAAU,gBAAgB,CAAC,SAA4B;IAC3D,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,MAAM,GAA6B,SAAS,CAAC;IACjD,OAAO,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE;YAAE,MAAM;QACf,IAAI,EAAE,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;mBACzD,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;gBAAE,QAAQ,GAAG,KAAK,CAAC;YAC9E,MAAM,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAAC,MAAM,GAAG,GAAG,CAAC;gBAAC,SAAS;YAAC,CAAC;YACtE,MAAM,GAAG,GAAG,CAAC;YACb,MAAM;QACR,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM;QACpC,MAAM;IACR,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxD,MAAM,GAAG,GAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QAC1D,IAAI,GAAG;YAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QAC9B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,QAAQ,EAAE,CAAC;IAC3D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { CodeIndex } from "../types.js";
2
+ export interface MiddlewareIssue {
3
+ code: "MW00" | "MW01" | "MW02" | "MW03";
4
+ severity: "error" | "warning" | "info";
5
+ message: string;
6
+ file: string;
7
+ line: number;
8
+ }
9
+ export interface MiddlewareAuditResult {
10
+ middleware_file: string | null;
11
+ handlers: string[];
12
+ sequence: string[];
13
+ routes_protected_count: number;
14
+ issues: MiddlewareIssue[];
15
+ summary: {
16
+ handlers_total: number;
17
+ issues_total: number;
18
+ };
19
+ }
20
+ export declare function auditAstroMiddlewareFromRoot(root: string): Promise<MiddlewareAuditResult>;
21
+ export declare function auditAstroMiddlewareFromIndex(index: CodeIndex): Promise<MiddlewareAuditResult>;
22
+ export declare function astroMiddlewareAudit(args: {
23
+ project_root?: string;
24
+ repo?: string;
25
+ }): Promise<MiddlewareAuditResult>;
26
+ //# sourceMappingURL=astro-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-middleware.d.ts","sourceRoot":"","sources":["../../src/tools/astro-middleware.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAwED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,qBAAqB,CAAC,CA+BhC;AAED,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,qBAAqB,CAAC,CAEhC;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,qBAAqB,CAAC,CAKhC"}