codesift-mcp 0.5.27 → 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.
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +4 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/git-hooks-installer.d.ts +29 -0
- package/dist/cli/git-hooks-installer.d.ts.map +1 -0
- package/dist/cli/git-hooks-installer.js +145 -0
- package/dist/cli/git-hooks-installer.js.map +1 -0
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +5 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/setup.d.ts +5 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +15 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/register-tool-loaders.d.ts +1 -1
- package/dist/register-tool-loaders.d.ts.map +1 -1
- package/dist/register-tool-loaders.js +2 -2
- package/dist/register-tool-loaders.js.map +1 -1
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +125 -11
- package/dist/register-tools.js.map +1 -1
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +15 -14
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/registry.d.ts +9 -0
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +28 -0
- package/dist/storage/registry.js.map +1 -1
- package/dist/tools/astro-content-collections.d.ts.map +1 -1
- package/dist/tools/astro-content-collections.js +1 -141
- package/dist/tools/astro-content-collections.js.map +1 -1
- package/dist/tools/astro-db-audit.d.ts +30 -0
- package/dist/tools/astro-db-audit.d.ts.map +1 -0
- package/dist/tools/astro-db-audit.js +244 -0
- package/dist/tools/astro-db-audit.js.map +1 -0
- package/dist/tools/astro-db-parser.d.ts +24 -0
- package/dist/tools/astro-db-parser.d.ts.map +1 -0
- package/dist/tools/astro-db-parser.js +150 -0
- package/dist/tools/astro-db-parser.js.map +1 -0
- package/dist/tools/astro-helpers.d.ts +13 -0
- package/dist/tools/astro-helpers.d.ts.map +1 -0
- package/dist/tools/astro-helpers.js +116 -0
- package/dist/tools/astro-helpers.js.map +1 -0
- package/dist/tools/astro-middleware.d.ts +26 -0
- package/dist/tools/astro-middleware.d.ts.map +1 -0
- package/dist/tools/astro-middleware.js +139 -0
- package/dist/tools/astro-middleware.js.map +1 -0
- package/dist/tools/astro-sessions.d.ts +26 -0
- package/dist/tools/astro-sessions.d.ts.map +1 -0
- package/dist/tools/astro-sessions.js +140 -0
- package/dist/tools/astro-sessions.js.map +1 -0
- package/dist/tools/constant-resolution-tools.d.ts.map +1 -1
- package/dist/tools/constant-resolution-tools.js +8 -4
- package/dist/tools/constant-resolution-tools.js.map +1 -1
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +16 -40
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/pattern-tools.d.ts.map +1 -1
- package/dist/tools/pattern-tools.js +20 -25
- package/dist/tools/pattern-tools.js.map +1 -1
- package/dist/tools/python-constants-tools.d.ts +3 -1
- package/dist/tools/python-constants-tools.d.ts.map +1 -1
- package/dist/tools/python-constants-tools.js +3 -2
- package/dist/tools/python-constants-tools.js.map +1 -1
- package/dist/tools/react-tools.d.ts +7 -1
- package/dist/tools/react-tools.d.ts.map +1 -1
- package/dist/tools/react-tools.js.map +1 -1
- package/dist/tools/sql-tools.d.ts +26 -0
- package/dist/tools/sql-tools.d.ts.map +1 -1
- package/dist/tools/sql-tools.js +84 -9
- package/dist/tools/sql-tools.js.map +1 -1
- package/dist/tools/status-tools.js +12 -19
- package/dist/tools/status-tools.js.map +1 -1
- package/dist/tools/typescript-constants-tools.d.ts +3 -0
- package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
- package/dist/tools/typescript-constants-tools.js +53 -13
- package/dist/tools/typescript-constants-tools.js.map +1 -1
- package/dist/utils/constant-file-pattern.d.ts +6 -0
- package/dist/utils/constant-file-pattern.d.ts.map +1 -0
- package/dist/utils/constant-file-pattern.js +27 -0
- package/dist/utils/constant-file-pattern.js.map +1 -0
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +15 -9
- package/dist/utils/import-graph.js.map +1 -1
- package/dist/utils/ts-imports.d.ts +2 -1
- package/dist/utils/ts-imports.d.ts.map +1 -1
- package/dist/utils/ts-imports.js +8 -0
- package/dist/utils/ts-imports.js.map +1 -1
- package/dist/utils/tsconfig-paths.d.ts +5 -4
- package/dist/utils/tsconfig-paths.d.ts.map +1 -1
- package/dist/utils/tsconfig-paths.js +17 -14
- package/dist/utils/tsconfig-paths.js.map +1 -1
- package/hooks/hook-chain.sh +7 -0
- package/hooks/post-commit +8 -0
- package/hooks/post-commit-review-backlog.sh +107 -0
- package/package.json +2 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Astro middleware audit. Parses src/middleware.{ts,js,mjs} and reports:
|
|
3
|
+
* MW00 parse-failure — file present but tree-sitter cannot parse
|
|
4
|
+
* MW01 no-onRequest-export — file exists but does not export onRequest
|
|
5
|
+
* MW02 sequence-ambiguous — sequence(...) called but args are non-identifiers
|
|
6
|
+
* MW03 guard-without-effect — a guarding `if` body that does not redirect/throw/return Response
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { getParser } from "../parser/parser-manager.js";
|
|
11
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
12
|
+
const CANDIDATES = ["src/middleware.ts", "src/middleware.js", "src/middleware.mjs"];
|
|
13
|
+
function findMiddlewareFile(root) {
|
|
14
|
+
for (const rel of CANDIDATES) {
|
|
15
|
+
const abs = join(root, rel);
|
|
16
|
+
if (existsSync(abs))
|
|
17
|
+
return { abs, rel };
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
function parseMiddleware(parser, source) {
|
|
22
|
+
let tree;
|
|
23
|
+
try {
|
|
24
|
+
tree = parser.parse(source);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return { handlers: [], sequence: [], sequenceTied: false, guardsWithoutEffect: 0, parseOk: false };
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const root = tree.rootNode;
|
|
31
|
+
const handlers = [];
|
|
32
|
+
const sequence = [];
|
|
33
|
+
let sequenceTied = false;
|
|
34
|
+
let guardsWithoutEffect = 0;
|
|
35
|
+
// Direct children only — avoid matching nested local `onRequest`.
|
|
36
|
+
for (const decl of root.namedChildren) {
|
|
37
|
+
if (decl.type !== "export_statement")
|
|
38
|
+
continue;
|
|
39
|
+
// (a) export const onRequest = …
|
|
40
|
+
for (const lex of decl.namedChildren) {
|
|
41
|
+
if (lex.type !== "lexical_declaration")
|
|
42
|
+
continue;
|
|
43
|
+
for (const v of lex.namedChildren) {
|
|
44
|
+
if (v.type !== "variable_declarator")
|
|
45
|
+
continue;
|
|
46
|
+
const name = v.childForFieldName("name");
|
|
47
|
+
if (!name || name.text !== "onRequest")
|
|
48
|
+
continue;
|
|
49
|
+
handlers.push("onRequest");
|
|
50
|
+
const value = v.childForFieldName("value");
|
|
51
|
+
if (value && value.type === "call_expression") {
|
|
52
|
+
const fn = value.childForFieldName("function");
|
|
53
|
+
if (fn && fn.text === "sequence") {
|
|
54
|
+
sequenceTied = true;
|
|
55
|
+
const args = value.childForFieldName("arguments");
|
|
56
|
+
if (args)
|
|
57
|
+
for (const arg of args.namedChildren)
|
|
58
|
+
if (arg.type === "identifier")
|
|
59
|
+
sequence.push(arg.text);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// (b) export function onRequest / export async function onRequest
|
|
65
|
+
for (const fn of decl.namedChildren) {
|
|
66
|
+
if (fn.type !== "function_declaration")
|
|
67
|
+
continue;
|
|
68
|
+
const name = fn.childForFieldName("name");
|
|
69
|
+
if (name && name.text === "onRequest" && !handlers.includes("onRequest"))
|
|
70
|
+
handlers.push("onRequest");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Guard heuristic: only flag if-stmt with NO else branch AND consequence body has no effect.
|
|
74
|
+
const EFFECT_RE = /\b(return\s+(?:new\s+)?Response(?:\.\w+)?\(|return\s+(?:context|Astro)\.(?:redirect|rewrite)\(|return\s+next\(\)|throw\b|redirect\(|context\.rewrite)/;
|
|
75
|
+
const GUARD_RE = /\b(context\.|locals\.|user\b|auth|session|cookies\.)/i;
|
|
76
|
+
for (const ifStmt of root.descendantsOfType("if_statement")) {
|
|
77
|
+
if (ifStmt.childForFieldName("alternative"))
|
|
78
|
+
continue; // skip if/else
|
|
79
|
+
const consequence = ifStmt.childForFieldName("consequence");
|
|
80
|
+
if (!consequence)
|
|
81
|
+
continue;
|
|
82
|
+
const body = consequence.text;
|
|
83
|
+
if (!EFFECT_RE.test(body) && GUARD_RE.test(ifStmt.text))
|
|
84
|
+
guardsWithoutEffect++;
|
|
85
|
+
}
|
|
86
|
+
return { handlers, sequence, sequenceTied, guardsWithoutEffect, parseOk: !root.hasError };
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
tree.delete();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export async function auditAstroMiddlewareFromRoot(root) {
|
|
93
|
+
const found = findMiddlewareFile(root);
|
|
94
|
+
if (!found) {
|
|
95
|
+
return { middleware_file: null, handlers: [], sequence: [], routes_protected_count: 0, issues: [], summary: { handlers_total: 0, issues_total: 0 } };
|
|
96
|
+
}
|
|
97
|
+
let source;
|
|
98
|
+
try {
|
|
99
|
+
source = readFileSync(found.abs, "utf-8");
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return { middleware_file: found.rel, handlers: [], sequence: [], routes_protected_count: 0, issues: [{ code: "MW00", severity: "error", message: `Cannot read ${found.rel}`, file: found.rel, line: 1 }], summary: { handlers_total: 0, issues_total: 1 } };
|
|
103
|
+
}
|
|
104
|
+
const parser = await getParser("typescript");
|
|
105
|
+
if (!parser)
|
|
106
|
+
return { middleware_file: found.rel, handlers: [], sequence: [], routes_protected_count: 0, issues: [{ code: "MW00", severity: "error", message: "TypeScript parser unavailable", file: found.rel, line: 1 }], summary: { handlers_total: 0, issues_total: 1 } };
|
|
107
|
+
const parsed = parseMiddleware(parser, source);
|
|
108
|
+
const issues = [];
|
|
109
|
+
if (!parsed.parseOk)
|
|
110
|
+
issues.push({ code: "MW00", severity: "error", message: `Parse error in ${found.rel}`, file: found.rel, line: 1 });
|
|
111
|
+
if (parsed.handlers.length === 0)
|
|
112
|
+
issues.push({ code: "MW01", severity: "error", message: `${found.rel} does not export onRequest`, file: found.rel, line: 1 });
|
|
113
|
+
if (parsed.sequenceTied && parsed.sequence.length === 0) {
|
|
114
|
+
issues.push({ code: "MW02", severity: "warning", message: "onRequest = sequence(...) called with non-identifier args — order is ambiguous", file: found.rel, line: 1 });
|
|
115
|
+
}
|
|
116
|
+
for (let i = 0; i < parsed.guardsWithoutEffect; i++) {
|
|
117
|
+
issues.push({ code: "MW03", severity: "warning", message: "Guarding if-block without redirect/throw/return — falls through", file: found.rel, line: 1 });
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
middleware_file: found.rel,
|
|
121
|
+
handlers: parsed.handlers,
|
|
122
|
+
sequence: parsed.sequence,
|
|
123
|
+
routes_protected_count: parsed.handlers.length > 0 ? 1 : 0,
|
|
124
|
+
issues,
|
|
125
|
+
summary: { handlers_total: parsed.handlers.length, issues_total: issues.length },
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export async function auditAstroMiddlewareFromIndex(index) {
|
|
129
|
+
return auditAstroMiddlewareFromRoot(index.root);
|
|
130
|
+
}
|
|
131
|
+
export async function astroMiddlewareAudit(args) {
|
|
132
|
+
if (args.project_root)
|
|
133
|
+
return auditAstroMiddlewareFromRoot(args.project_root);
|
|
134
|
+
const index = await getCodeIndex(args.repo ?? "");
|
|
135
|
+
if (!index)
|
|
136
|
+
return { middleware_file: null, handlers: [], sequence: [], routes_protected_count: 0, issues: [], summary: { handlers_total: 0, issues_total: 0 } };
|
|
137
|
+
return auditAstroMiddlewareFromIndex(index);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=astro-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astro-middleware.js","sourceRoot":"","sources":["../../src/tools/astro-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface SessionsIssue {
|
|
2
|
+
code: "SE01" | "SE02" | "SE03" | "SE04";
|
|
3
|
+
severity: "error" | "warning" | "info";
|
|
4
|
+
message: string;
|
|
5
|
+
file: string;
|
|
6
|
+
line: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SessionsAuditResult {
|
|
9
|
+
config_found: boolean;
|
|
10
|
+
adapter: string | null;
|
|
11
|
+
sessions_enabled: boolean;
|
|
12
|
+
usage_count: number;
|
|
13
|
+
usage_files: string[];
|
|
14
|
+
adapter_compatibility: Record<string, boolean>;
|
|
15
|
+
issues: SessionsIssue[];
|
|
16
|
+
summary: {
|
|
17
|
+
usage_total: number;
|
|
18
|
+
issues_total: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare function auditSessionsFromRoot(root: string): Promise<SessionsAuditResult>;
|
|
22
|
+
export declare function astroSessionsAudit(args: {
|
|
23
|
+
project_root?: string;
|
|
24
|
+
repo?: string;
|
|
25
|
+
}): Promise<SessionsAuditResult>;
|
|
26
|
+
//# sourceMappingURL=astro-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astro-sessions.d.ts","sourceRoot":"","sources":["../../src/tools/astro-sessions.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,aAAa;IAC5B,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,mBAAmB;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAgDD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiDtF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACtC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAK/B"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Astro 5 Sessions API audit. Detects Astro.session.* / context.session.* usage,
|
|
3
|
+
* cross-checks against astro.config experimental.session flag and adapter compat.
|
|
4
|
+
* SE01 sessions-used-without-config — usage present but experimental.session is off
|
|
5
|
+
* SE02 unsupported-adapter — adapter unknown to compat table
|
|
6
|
+
* SE03 adapter-needs-extra-config — e.g., cloudflare requires kv binding (heuristic)
|
|
7
|
+
*/
|
|
8
|
+
import { readFile } from "node:fs/promises";
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
import { join, relative } from "node:path";
|
|
11
|
+
import { extractAstroConventions } from "./astro-config.js";
|
|
12
|
+
import { walkDirectory } from "../utils/walk.js";
|
|
13
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
14
|
+
import { getParser, initParser } from "../parser/parser-manager.js";
|
|
15
|
+
import { getProperty } from "./astro-helpers.js";
|
|
16
|
+
// Supported adapters (true = sessions work out of the box;
|
|
17
|
+
// "extra-config" = needs additional storage binding).
|
|
18
|
+
const ADAPTER_COMPAT = {
|
|
19
|
+
"@astrojs/node": true,
|
|
20
|
+
"@astrojs/vercel": true,
|
|
21
|
+
"@astrojs/netlify": true,
|
|
22
|
+
"@astrojs/deno": true,
|
|
23
|
+
"@astrojs/cloudflare": "extra-config",
|
|
24
|
+
};
|
|
25
|
+
// Match Astro.session.X(...) and `context.session.X(...)` only — avoids
|
|
26
|
+
// false positives like req.session, db.session from other libraries.
|
|
27
|
+
const SESSION_USAGE_RE = /\b(?:Astro|context)\.session\s*\.\s*(?:get|set|delete|destroy|regenerate)\s*\(/g;
|
|
28
|
+
/** AST-based detection — handles nested objects under `experimental`. */
|
|
29
|
+
async function detectExperimentalSession(configPath) {
|
|
30
|
+
if (!configPath)
|
|
31
|
+
return false;
|
|
32
|
+
let src;
|
|
33
|
+
try {
|
|
34
|
+
src = await readFile(configPath, "utf-8");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
await initParser();
|
|
40
|
+
const lang = configPath.endsWith(".ts") ? "typescript" : "javascript";
|
|
41
|
+
const parser = await getParser(lang);
|
|
42
|
+
if (!parser)
|
|
43
|
+
return false;
|
|
44
|
+
let tree;
|
|
45
|
+
try {
|
|
46
|
+
tree = parser.parse(src);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
for (const obj of tree.rootNode.descendantsOfType("object")) {
|
|
53
|
+
const expProp = getProperty(obj, "experimental");
|
|
54
|
+
if (!expProp || expProp.type !== "object")
|
|
55
|
+
continue;
|
|
56
|
+
const sessionProp = getProperty(expProp, "session");
|
|
57
|
+
// Astro 5: session can be `true` (basic) or an object config like
|
|
58
|
+
// `session: { cookie: { sameSite: "strict" } }`. Any non-`false` value enables it.
|
|
59
|
+
if (sessionProp && sessionProp.text !== "false")
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
tree.delete();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function findConfigFile(root) {
|
|
69
|
+
for (const name of ["astro.config.mjs", "astro.config.ts", "astro.config.cjs", "astro.config.js"]) {
|
|
70
|
+
const full = join(root, name);
|
|
71
|
+
if (existsSync(full))
|
|
72
|
+
return full;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
export async function auditSessionsFromRoot(root) {
|
|
77
|
+
const configPath = await findConfigFile(root);
|
|
78
|
+
const config_found = configPath !== null;
|
|
79
|
+
const conventions = config_found
|
|
80
|
+
? await extractAstroConventions([], root).catch(() => null)
|
|
81
|
+
: null;
|
|
82
|
+
const adapter = conventions?.conventions.adapter ?? null;
|
|
83
|
+
const sessions_enabled = await detectExperimentalSession(configPath);
|
|
84
|
+
const files = await walkDirectory(root, {
|
|
85
|
+
maxFiles: 5000,
|
|
86
|
+
relative: true,
|
|
87
|
+
fileFilter: (ext) => ext === ".astro" || ext === ".ts" || ext === ".tsx" || ext === ".js" || ext === ".jsx" || ext === ".mjs",
|
|
88
|
+
});
|
|
89
|
+
const usage_files = [];
|
|
90
|
+
let usage_count = 0;
|
|
91
|
+
for (const rel of files) {
|
|
92
|
+
const abs = join(root, rel);
|
|
93
|
+
let src;
|
|
94
|
+
try {
|
|
95
|
+
src = await readFile(abs, "utf-8");
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (!/\bsession\s*\./.test(src))
|
|
101
|
+
continue;
|
|
102
|
+
const matches = src.match(SESSION_USAGE_RE);
|
|
103
|
+
if (matches && matches.length > 0) {
|
|
104
|
+
usage_count += matches.length;
|
|
105
|
+
usage_files.push(rel);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const issues = [];
|
|
109
|
+
const cfgRel = relative(root, configPath ?? "") || "astro.config.mjs";
|
|
110
|
+
if (usage_count > 0 && !sessions_enabled)
|
|
111
|
+
issues.push({ code: "SE01", severity: "error", message: "Sessions API used but experimental.session is not enabled in astro.config", file: usage_files[0] ?? cfgRel, line: 1 });
|
|
112
|
+
if (usage_count > 0 && !adapter)
|
|
113
|
+
issues.push({ code: "SE04", severity: "error", message: "Sessions API used but no SSR adapter configured — Astro requires an adapter for sessions", file: cfgRel, line: 1 });
|
|
114
|
+
if (usage_count > 0 && adapter) {
|
|
115
|
+
const compat = ADAPTER_COMPAT[adapter];
|
|
116
|
+
if (compat === undefined)
|
|
117
|
+
issues.push({ code: "SE02", severity: "warning", message: `Adapter "${adapter}" is not in the known Sessions API compatibility list`, file: cfgRel, line: 1 });
|
|
118
|
+
else if (compat === "extra-config")
|
|
119
|
+
issues.push({ code: "SE03", severity: "info", message: `Adapter "${adapter}" supports Sessions but needs extra storage config (e.g. KV binding)`, file: cfgRel, line: 1 });
|
|
120
|
+
}
|
|
121
|
+
const adapter_compatibility = {};
|
|
122
|
+
for (const [k, v] of Object.entries(ADAPTER_COMPAT))
|
|
123
|
+
adapter_compatibility[k] = v === true;
|
|
124
|
+
if (adapter && !(adapter in adapter_compatibility))
|
|
125
|
+
adapter_compatibility[adapter] = false;
|
|
126
|
+
return {
|
|
127
|
+
config_found, adapter, sessions_enabled, usage_count, usage_files,
|
|
128
|
+
adapter_compatibility, issues,
|
|
129
|
+
summary: { usage_total: usage_count, issues_total: issues.length },
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
export async function astroSessionsAudit(args) {
|
|
133
|
+
if (args.project_root)
|
|
134
|
+
return auditSessionsFromRoot(args.project_root);
|
|
135
|
+
const index = await getCodeIndex(args.repo ?? "");
|
|
136
|
+
if (!index)
|
|
137
|
+
return { config_found: false, adapter: null, sessions_enabled: false, usage_count: 0, usage_files: [], adapter_compatibility: {}, issues: [], summary: { usage_total: 0, issues_total: 0 } };
|
|
138
|
+
return auditSessionsFromRoot(index.root);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=astro-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astro-sessions.js","sourceRoot":"","sources":["../../src/tools/astro-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAqBjD,2DAA2D;AAC3D,sDAAsD;AACtD,MAAM,cAAc,GAA0C;IAC5D,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,IAAI;IACvB,kBAAkB,EAAE,IAAI;IACxB,eAAe,EAAE,IAAI;IACrB,qBAAqB,EAAE,cAAc;CACtC,CAAC;AAEF,wEAAwE;AACxE,qEAAqE;AACrE,MAAM,gBAAgB,GAAG,iFAAiF,CAAC;AAE3G,yEAAyE;AACzE,KAAK,UAAU,yBAAyB,CAAC,UAAyB;IAChE,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QAAC,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IAC1E,MAAM,UAAU,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IACzD,IAAI,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACpD,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACpD,kEAAkE;YAClE,mFAAmF;YACnF,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;QAC/D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAAC,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,KAAK,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAClG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,UAAU,KAAK,IAAI,CAAC;IAEzC,MAAM,WAAW,GAAG,YAAY;QAC9B,CAAC,CAAC,MAAM,uBAAuB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,OAAO,GAAG,WAAW,EAAE,WAAW,CAAC,OAAO,IAAI,IAAI,CAAC;IACzD,MAAM,gBAAgB,GAAG,MAAM,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAErE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE;QACtC,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM;KAC9H,CAAC,CAAC;IAEH,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5B,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YAAC,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QAC/D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;YAC9B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC,IAAI,kBAAkB,CAAC;IACtE,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,gBAAgB;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,2EAA2E,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1N,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,0FAA0F,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9M,IAAI,WAAW,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,OAAO,uDAAuD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;aACpL,IAAI,MAAM,KAAK,cAAc;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,OAAO,sEAAsE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACjN,CAAC;IAED,MAAM,qBAAqB,GAA4B,EAAE,CAAC;IAC1D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;QAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAC3F,IAAI,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,qBAAqB,CAAC;QAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IAE3F,OAAO;QACL,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW;QACjE,qBAAqB,EAAE,MAAM;QAC7B,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;KACnE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAExC;IACC,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;IACzM,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant-resolution-tools.d.ts","sourceRoot":"","sources":["../../src/tools/constant-resolution-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAA2B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"constant-resolution-tools.d.ts","sourceRoot":"","sources":["../../src/tools/constant-resolution-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAA2B,MAAM,6BAA6B,CAAC;AAKrG,MAAM,MAAM,0BAA0B,GAAG,QAAQ,GAAG,YAAY,CAAC;AA+CjE,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,0BAA0B,CAAC;CACvC,GACA,OAAO,CAAC,wBAAwB,CAAC,CAoCnC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getCodeIndex } from "./index-tools.js";
|
|
2
2
|
import { resolveConstantValue as resolvePythonConstantValue } from "./python-constants-tools.js";
|
|
3
3
|
import { resolveTypeScriptConstantValue } from "./typescript-constants-tools.js";
|
|
4
|
+
import { matchesConstantFilePattern } from "../utils/constant-file-pattern.js";
|
|
4
5
|
function isTypeScriptFile(filePath) {
|
|
5
6
|
return filePath.endsWith(".ts") || filePath.endsWith(".tsx");
|
|
6
7
|
}
|
|
@@ -14,7 +15,7 @@ function inferLanguages(index, symbolName, options) {
|
|
|
14
15
|
return ["typescript"];
|
|
15
16
|
const candidates = index.symbols
|
|
16
17
|
.filter((symbol) => symbol.name === symbolName)
|
|
17
|
-
.filter((symbol) =>
|
|
18
|
+
.filter((symbol) => matchesConstantFilePattern(symbol.file, options?.file_pattern));
|
|
18
19
|
const hasPython = candidates.some((symbol) => symbol.file.endsWith(".py"));
|
|
19
20
|
const hasTypeScript = candidates.some((symbol) => isTypeScriptFile(symbol.file));
|
|
20
21
|
if (hasPython && hasTypeScript)
|
|
@@ -31,7 +32,7 @@ function inferLanguages(index, symbolName, options) {
|
|
|
31
32
|
return ["python"];
|
|
32
33
|
if (repoHasTypeScript)
|
|
33
34
|
return ["typescript"];
|
|
34
|
-
return [
|
|
35
|
+
return [];
|
|
35
36
|
}
|
|
36
37
|
function normalizeMatches(matches, language) {
|
|
37
38
|
return matches.map((match) => ({
|
|
@@ -45,15 +46,18 @@ export async function resolveConstantValue(repo, symbolName, options) {
|
|
|
45
46
|
throw new Error(`Repository "${repo}" not found.`);
|
|
46
47
|
}
|
|
47
48
|
const languages = inferLanguages(index, symbolName, options);
|
|
49
|
+
if (languages.length === 0) {
|
|
50
|
+
return { query: symbolName, matches: [] };
|
|
51
|
+
}
|
|
48
52
|
const matches = [];
|
|
49
53
|
for (const language of languages) {
|
|
50
54
|
if (language === "python") {
|
|
51
|
-
const result = await resolvePythonConstantValue(repo, symbolName, options);
|
|
55
|
+
const result = await resolvePythonConstantValue(repo, symbolName, { ...options, index });
|
|
52
56
|
matches.push(...normalizeMatches(result.matches, "python"));
|
|
53
57
|
continue;
|
|
54
58
|
}
|
|
55
59
|
if (language === "typescript") {
|
|
56
|
-
const result = await resolveTypeScriptConstantValue(repo, symbolName, options);
|
|
60
|
+
const result = await resolveTypeScriptConstantValue(repo, symbolName, { ...options, index });
|
|
57
61
|
matches.push(...normalizeMatches(result.matches, "typescript"));
|
|
58
62
|
}
|
|
59
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant-resolution-tools.js","sourceRoot":"","sources":["../../src/tools/constant-resolution-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,oBAAoB,IAAI,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"constant-resolution-tools.js","sourceRoot":"","sources":["../../src/tools/constant-resolution-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-tools.d.ts","sourceRoot":"","sources":["../../src/tools/index-tools.ts"],"names":[],"mappings":"AAcA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKnE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAa,QAAQ,EAAa,MAAM,aAAa,CAAC;AAmNzF;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,UAAU,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAuBf;AAmFD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,GACA,OAAO,CAAC,iBAAiB,CAAC,CA0N5B;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACtC,GACA,OAAO,CAAC,iBAAiB,CAAC,CAgE5B;AAyKD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC,CAa1I;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BxE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC,
|
|
1
|
+
{"version":3,"file":"index-tools.d.ts","sourceRoot":"","sources":["../../src/tools/index-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { extractSqlSymbols, stripJinjaTokens } from "../parser/extractors/sql.js
|
|
|
10
10
|
import { getLanguageForExtension, getLanguageForPath } from "../parser/parser-manager.js";
|
|
11
11
|
import { saveIndex, loadIndex, loadIndexOrStale, getIndexPath, saveIncremental, removeFileFromIndex } from "../storage/index-store.js";
|
|
12
12
|
import { clearTsconfigCache } from "../utils/tsconfig-paths.js";
|
|
13
|
-
import { registerRepo, listRepos as listRegistryRepos, getRepo, removeRepo, getRepoName, updateRepoMeta } from "../storage/registry.js";
|
|
13
|
+
import { registerRepo, listRepos as listRegistryRepos, getRepo, removeRepo, getRepoName, updateRepoMeta, resolveRegisteredRepoMeta } from "../storage/registry.js";
|
|
14
14
|
import { startWatcher, stopWatcher } from "../storage/watcher.js";
|
|
15
15
|
import { buildBM25Index } from "../search/bm25.js";
|
|
16
16
|
import { buildSymbolText, createEmbeddingProvider } from "../search/semantic.js";
|
|
@@ -759,12 +759,14 @@ export async function indexFile(filePath) {
|
|
|
759
759
|
}
|
|
760
760
|
const startTime = Date.now();
|
|
761
761
|
const relPath = relative(matchingRepo.root, absPath);
|
|
762
|
-
// If the changed file is a
|
|
763
|
-
//
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
762
|
+
// If the changed file is a TS/JS config that drives path resolution, drop
|
|
763
|
+
// caches so incremental indexing picks up new `paths` / `extends`.
|
|
764
|
+
{
|
|
765
|
+
const cfg = basename(absPath).toLowerCase();
|
|
766
|
+
if ((cfg.startsWith("tsconfig") || cfg.startsWith("jsconfig")) &&
|
|
767
|
+
cfg.endsWith(".json")) {
|
|
768
|
+
clearTsconfigCache();
|
|
769
|
+
}
|
|
768
770
|
}
|
|
769
771
|
// mtime check — skip if unchanged
|
|
770
772
|
const existing = await loadIndex(matchingRepo.index_path);
|
|
@@ -937,53 +939,27 @@ export async function getBM25Index(repoName) {
|
|
|
937
939
|
* Get the code index for a repo from disk. Auto-refreshes if git HEAD moved.
|
|
938
940
|
*/
|
|
939
941
|
export async function getCodeIndex(repoName, options) {
|
|
940
|
-
// Resolve empty/missing repo name: try CWD-based name, then single-repo fallback
|
|
941
|
-
let resolved = repoName;
|
|
942
|
-
if (!resolved) {
|
|
943
|
-
resolved = getRepoName(process.cwd());
|
|
944
|
-
}
|
|
945
942
|
const config = loadConfig();
|
|
946
|
-
|
|
947
|
-
if (!
|
|
948
|
-
// CWD-based name didn't match — search all repos by root path
|
|
949
|
-
const cwd = process.cwd();
|
|
950
|
-
const allRepos = await listRegistryRepos(config.registryPath);
|
|
951
|
-
const byRoot = allRepos.find((r) => r.root === cwd);
|
|
952
|
-
if (byRoot) {
|
|
953
|
-
resolved = byRoot.name;
|
|
954
|
-
meta = byRoot;
|
|
955
|
-
}
|
|
956
|
-
else if (allRepos.length === 1) {
|
|
957
|
-
// Single-repo fallback
|
|
958
|
-
resolved = allRepos[0].name;
|
|
959
|
-
meta = allRepos[0];
|
|
960
|
-
}
|
|
961
|
-
}
|
|
962
|
-
if (!meta)
|
|
943
|
+
const resolved = await resolveRegisteredRepoMeta(config.registryPath, repoName);
|
|
944
|
+
if (!resolved)
|
|
963
945
|
return null;
|
|
964
|
-
|
|
965
|
-
// Use only for read-only status/metadata queries where stale data is OK.
|
|
946
|
+
const { resolvedName, meta } = resolved;
|
|
966
947
|
if (!options?.skipFreshness) {
|
|
967
|
-
await ensureIndexFresh(
|
|
948
|
+
await ensureIndexFresh(resolvedName);
|
|
968
949
|
}
|
|
969
|
-
const cached = codeIndexes.get(
|
|
950
|
+
const cached = codeIndexes.get(resolvedName);
|
|
970
951
|
if (cached)
|
|
971
952
|
return cached;
|
|
972
|
-
// Use loadIndexOrStale so version mismatches surface a structured signal
|
|
973
|
-
// instead of being silently coerced to null. Tool wrappers can pattern-match
|
|
974
|
-
// on `result.status === "stale"` and route to staleToMcpError. Existing
|
|
975
|
-
// callers that still receive a plain CodeIndex|null get null on stale and
|
|
976
|
-
// a logged warning so the silent regression is observable.
|
|
977
953
|
const result = await loadIndexOrStale(meta.index_path, { ...EXTRACTOR_VERSIONS });
|
|
978
954
|
if (!result)
|
|
979
955
|
return null;
|
|
980
956
|
if (result.status === "stale") {
|
|
981
|
-
console.warn(`[codesift] stale index for ${
|
|
957
|
+
console.warn(`[codesift] stale index for ${resolvedName}: extractor_version_mismatch ` +
|
|
982
958
|
`(${result.language} expected ${result.expected_version}, got ${result.actual_version}). ` +
|
|
983
959
|
`Run index_folder to refresh.`);
|
|
984
960
|
return null;
|
|
985
961
|
}
|
|
986
|
-
codeIndexes.set(
|
|
962
|
+
codeIndexes.set(resolvedName, result.index);
|
|
987
963
|
return result.index;
|
|
988
964
|
}
|
|
989
965
|
/**
|