codesift-mcp 0.4.0 → 0.5.3

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 (204) hide show
  1. package/README.md +94 -25
  2. package/dist/cli/help.d.ts.map +1 -1
  3. package/dist/cli/help.js +8 -6
  4. package/dist/cli/help.js.map +1 -1
  5. package/dist/cli/platform.d.ts.map +1 -1
  6. package/dist/cli/platform.js +12 -14
  7. package/dist/cli/platform.js.map +1 -1
  8. package/dist/cli/setup.d.ts +1 -1
  9. package/dist/cli/setup.d.ts.map +1 -1
  10. package/dist/cli/setup.js +30 -6
  11. package/dist/cli/setup.js.map +1 -1
  12. package/dist/formatters.d.ts +2 -2
  13. package/dist/formatters.d.ts.map +1 -1
  14. package/dist/formatters.js +23 -0
  15. package/dist/formatters.js.map +1 -1
  16. package/dist/instructions.d.ts +1 -1
  17. package/dist/instructions.d.ts.map +1 -1
  18. package/dist/instructions.js +21 -21
  19. package/dist/parser/extractors/php.d.ts.map +1 -1
  20. package/dist/parser/extractors/php.js +37 -29
  21. package/dist/parser/extractors/php.js.map +1 -1
  22. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  23. package/dist/parser/extractors/typescript.js +43 -0
  24. package/dist/parser/extractors/typescript.js.map +1 -1
  25. package/dist/parser/parse-cache.d.ts +39 -0
  26. package/dist/parser/parse-cache.d.ts.map +1 -0
  27. package/dist/parser/parse-cache.js +87 -0
  28. package/dist/parser/parse-cache.js.map +1 -0
  29. package/dist/parser/parser-manager.d.ts +1 -1
  30. package/dist/parser/parser-manager.d.ts.map +1 -1
  31. package/dist/parser/parser-manager.js +14 -5
  32. package/dist/parser/parser-manager.js.map +1 -1
  33. package/dist/parser/stub-languages.d.ts +2 -0
  34. package/dist/parser/stub-languages.d.ts.map +1 -0
  35. package/dist/parser/stub-languages.js +5 -0
  36. package/dist/parser/stub-languages.js.map +1 -0
  37. package/dist/register-tool-loaders.d.ts +130 -0
  38. package/dist/register-tool-loaders.d.ts.map +1 -0
  39. package/dist/register-tool-loaders.js +212 -0
  40. package/dist/register-tool-loaders.js.map +1 -0
  41. package/dist/register-tools.d.ts +2 -2
  42. package/dist/register-tools.d.ts.map +1 -1
  43. package/dist/register-tools.js +355 -634
  44. package/dist/register-tools.js.map +1 -1
  45. package/dist/search/tool-ranker.d.ts +90 -0
  46. package/dist/search/tool-ranker.d.ts.map +1 -0
  47. package/dist/search/tool-ranker.js +420 -0
  48. package/dist/search/tool-ranker.js.map +1 -0
  49. package/dist/server.d.ts.map +1 -1
  50. package/dist/server.js +23 -14
  51. package/dist/server.js.map +1 -1
  52. package/dist/storage/usage-tracker.d.ts.map +1 -1
  53. package/dist/storage/usage-tracker.js +4 -1
  54. package/dist/storage/usage-tracker.js.map +1 -1
  55. package/dist/tools/astro-actions.d.ts +54 -0
  56. package/dist/tools/astro-actions.d.ts.map +1 -0
  57. package/dist/tools/astro-actions.js +561 -0
  58. package/dist/tools/astro-actions.js.map +1 -0
  59. package/dist/tools/astro-audit.d.ts +87 -0
  60. package/dist/tools/astro-audit.d.ts.map +1 -0
  61. package/dist/tools/astro-audit.js +345 -0
  62. package/dist/tools/astro-audit.js.map +1 -0
  63. package/dist/tools/astro-content-collections.d.ts +44 -0
  64. package/dist/tools/astro-content-collections.d.ts.map +1 -0
  65. package/dist/tools/astro-content-collections.js +630 -0
  66. package/dist/tools/astro-content-collections.js.map +1 -0
  67. package/dist/tools/astro-islands.d.ts +3 -1
  68. package/dist/tools/astro-islands.d.ts.map +1 -1
  69. package/dist/tools/astro-islands.js +19 -4
  70. package/dist/tools/astro-islands.js.map +1 -1
  71. package/dist/tools/astro-migration.d.ts +31 -0
  72. package/dist/tools/astro-migration.d.ts.map +1 -0
  73. package/dist/tools/astro-migration.js +378 -0
  74. package/dist/tools/astro-migration.js.map +1 -0
  75. package/dist/tools/async-correctness.d.ts +26 -0
  76. package/dist/tools/async-correctness.d.ts.map +1 -0
  77. package/dist/tools/async-correctness.js +166 -0
  78. package/dist/tools/async-correctness.js.map +1 -0
  79. package/dist/tools/django-view-security-tools.d.ts +32 -0
  80. package/dist/tools/django-view-security-tools.d.ts.map +1 -0
  81. package/dist/tools/django-view-security-tools.js +184 -0
  82. package/dist/tools/django-view-security-tools.js.map +1 -0
  83. package/dist/tools/fastapi-depends.d.ts +63 -0
  84. package/dist/tools/fastapi-depends.d.ts.map +1 -0
  85. package/dist/tools/fastapi-depends.js +191 -0
  86. package/dist/tools/fastapi-depends.js.map +1 -0
  87. package/dist/tools/hono-analyze-app.js +1 -9
  88. package/dist/tools/hono-analyze-app.js.map +1 -1
  89. package/dist/tools/hono-api-contract.d.ts.map +1 -1
  90. package/dist/tools/hono-api-contract.js +41 -9
  91. package/dist/tools/hono-api-contract.js.map +1 -1
  92. package/dist/tools/hono-context-flow.js +1 -9
  93. package/dist/tools/hono-context-flow.js.map +1 -1
  94. package/dist/tools/hono-dead-routes.d.ts.map +1 -1
  95. package/dist/tools/hono-dead-routes.js +2 -9
  96. package/dist/tools/hono-dead-routes.js.map +1 -1
  97. package/dist/tools/hono-entry-resolver.d.ts +27 -0
  98. package/dist/tools/hono-entry-resolver.d.ts.map +1 -0
  99. package/dist/tools/hono-entry-resolver.js +31 -0
  100. package/dist/tools/hono-entry-resolver.js.map +1 -0
  101. package/dist/tools/hono-inline-analyze.js +1 -9
  102. package/dist/tools/hono-inline-analyze.js.map +1 -1
  103. package/dist/tools/hono-middleware-chain.d.ts +24 -6
  104. package/dist/tools/hono-middleware-chain.d.ts.map +1 -1
  105. package/dist/tools/hono-middleware-chain.js +77 -40
  106. package/dist/tools/hono-middleware-chain.js.map +1 -1
  107. package/dist/tools/hono-modules.js +1 -9
  108. package/dist/tools/hono-modules.js.map +1 -1
  109. package/dist/tools/hono-response-types.js +1 -9
  110. package/dist/tools/hono-response-types.js.map +1 -1
  111. package/dist/tools/hono-rpc-types.js +1 -9
  112. package/dist/tools/hono-rpc-types.js.map +1 -1
  113. package/dist/tools/hono-security.d.ts +14 -4
  114. package/dist/tools/hono-security.d.ts.map +1 -1
  115. package/dist/tools/hono-security.js +185 -14
  116. package/dist/tools/hono-security.js.map +1 -1
  117. package/dist/tools/hono-visualize.js +1 -9
  118. package/dist/tools/hono-visualize.js.map +1 -1
  119. package/dist/tools/nest-ext-tools.d.ts +115 -0
  120. package/dist/tools/nest-ext-tools.d.ts.map +1 -1
  121. package/dist/tools/nest-ext-tools.js +393 -0
  122. package/dist/tools/nest-ext-tools.js.map +1 -1
  123. package/dist/tools/nest-tools.d.ts +27 -0
  124. package/dist/tools/nest-tools.d.ts.map +1 -1
  125. package/dist/tools/nest-tools.js +137 -37
  126. package/dist/tools/nest-tools.js.map +1 -1
  127. package/dist/tools/nextjs-component-readers.d.ts +101 -0
  128. package/dist/tools/nextjs-component-readers.d.ts.map +1 -0
  129. package/dist/tools/nextjs-component-readers.js +287 -0
  130. package/dist/tools/nextjs-component-readers.js.map +1 -0
  131. package/dist/tools/nextjs-component-tools.d.ts +8 -78
  132. package/dist/tools/nextjs-component-tools.d.ts.map +1 -1
  133. package/dist/tools/nextjs-component-tools.js +9 -257
  134. package/dist/tools/nextjs-component-tools.js.map +1 -1
  135. package/dist/tools/nextjs-framework-audit-tools.d.ts +24 -1
  136. package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -1
  137. package/dist/tools/nextjs-framework-audit-tools.js +184 -1
  138. package/dist/tools/nextjs-framework-audit-tools.js.map +1 -1
  139. package/dist/tools/nextjs-route-readers.d.ts +81 -0
  140. package/dist/tools/nextjs-route-readers.d.ts.map +1 -0
  141. package/dist/tools/nextjs-route-readers.js +340 -0
  142. package/dist/tools/nextjs-route-readers.js.map +1 -0
  143. package/dist/tools/nextjs-route-tools.d.ts +7 -71
  144. package/dist/tools/nextjs-route-tools.d.ts.map +1 -1
  145. package/dist/tools/nextjs-route-tools.js +9 -327
  146. package/dist/tools/nextjs-route-tools.js.map +1 -1
  147. package/dist/tools/pattern-tools.d.ts.map +1 -1
  148. package/dist/tools/pattern-tools.js +92 -2
  149. package/dist/tools/pattern-tools.js.map +1 -1
  150. package/dist/tools/php-tools.d.ts +14 -5
  151. package/dist/tools/php-tools.d.ts.map +1 -1
  152. package/dist/tools/php-tools.js +166 -64
  153. package/dist/tools/php-tools.js.map +1 -1
  154. package/dist/tools/plan-turn-tools.d.ts +89 -0
  155. package/dist/tools/plan-turn-tools.d.ts.map +1 -0
  156. package/dist/tools/plan-turn-tools.js +508 -0
  157. package/dist/tools/plan-turn-tools.js.map +1 -0
  158. package/dist/tools/project-tools.d.ts +1 -1
  159. package/dist/tools/project-tools.js +1 -1
  160. package/dist/tools/project-tools.js.map +1 -1
  161. package/dist/tools/pydantic-models.d.ts +46 -0
  162. package/dist/tools/pydantic-models.d.ts.map +1 -0
  163. package/dist/tools/pydantic-models.js +249 -0
  164. package/dist/tools/pydantic-models.js.map +1 -0
  165. package/dist/tools/python-audit.d.ts +40 -0
  166. package/dist/tools/python-audit.d.ts.map +1 -0
  167. package/dist/tools/python-audit.js +244 -0
  168. package/dist/tools/python-audit.js.map +1 -0
  169. package/dist/tools/python-constants-tools.d.ts +44 -0
  170. package/dist/tools/python-constants-tools.d.ts.map +1 -0
  171. package/dist/tools/python-constants-tools.js +525 -0
  172. package/dist/tools/python-constants-tools.js.map +1 -0
  173. package/dist/tools/react-tools.d.ts +46 -1
  174. package/dist/tools/react-tools.d.ts.map +1 -1
  175. package/dist/tools/react-tools.js +126 -1
  176. package/dist/tools/react-tools.js.map +1 -1
  177. package/dist/tools/review-diff-tools.d.ts +5 -0
  178. package/dist/tools/review-diff-tools.d.ts.map +1 -1
  179. package/dist/tools/review-diff-tools.js +109 -3
  180. package/dist/tools/review-diff-tools.js.map +1 -1
  181. package/dist/tools/search-tools.d.ts +3 -2
  182. package/dist/tools/search-tools.d.ts.map +1 -1
  183. package/dist/tools/search-tools.js +16 -3
  184. package/dist/tools/search-tools.js.map +1 -1
  185. package/dist/tools/sql-tools.d.ts +40 -0
  186. package/dist/tools/sql-tools.d.ts.map +1 -1
  187. package/dist/tools/sql-tools.js +123 -0
  188. package/dist/tools/sql-tools.js.map +1 -1
  189. package/dist/tools/symbol-tools.d.ts.map +1 -1
  190. package/dist/tools/symbol-tools.js +7 -10
  191. package/dist/tools/symbol-tools.js.map +1 -1
  192. package/dist/tools/taint-tools.d.ts +43 -0
  193. package/dist/tools/taint-tools.d.ts.map +1 -0
  194. package/dist/tools/taint-tools.js +922 -0
  195. package/dist/tools/taint-tools.js.map +1 -0
  196. package/dist/utils/import-graph.d.ts +6 -0
  197. package/dist/utils/import-graph.d.ts.map +1 -1
  198. package/dist/utils/import-graph.js +43 -7
  199. package/dist/utils/import-graph.js.map +1 -1
  200. package/package.json +3 -3
  201. package/rules/codesift.md +51 -13
  202. package/rules/codesift.mdc +51 -13
  203. package/rules/codex.md +51 -13
  204. package/rules/gemini.md +51 -13
@@ -1 +1 @@
1
- {"version":3,"file":"usage-tracker.js","sourceRoot":"","sources":["../../src/storage/usage-tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage-tracker.js","sourceRoot":"","sources":["../../src/storage/usage-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Astro Actions audit (6 AA detectors with A/B/C/D scoring).
3
+ *
4
+ * Analyses `src/actions/index.{ts,js,mjs}` to extract the set of defined
5
+ * actions (via `defineAction({...})` calls) and cross-references how those
6
+ * actions are invoked throughout the project (.astro frontmatter + .tsx/.jsx
7
+ * client components).
8
+ *
9
+ * Detectors:
10
+ * AA01 missing-handler-return — error
11
+ * AA02 refine-on-top-level-schema — error (Astro issue #11641)
12
+ * AA03 passthrough-ignored — warning (Astro issue #11693)
13
+ * AA04 file-without-multipart — error
14
+ * AA05 action-called-from-server — warning
15
+ * AA06 client-calls-unknown-action — error
16
+ *
17
+ * Exports:
18
+ * - `auditAstroActionsFromIndex(index, severity?)` — testable core
19
+ * - `astroActionsAudit(args)` — MCP tool handler
20
+ */
21
+ import type { CodeIndex } from "../types.js";
22
+ export interface ActionDescriptor {
23
+ name: string;
24
+ file: string;
25
+ line: number;
26
+ accept?: "json" | "form";
27
+ has_input_schema: boolean;
28
+ input_fields: string[];
29
+ }
30
+ export interface ActionsAuditIssue {
31
+ code: string;
32
+ severity: "error" | "warning" | "info";
33
+ message: string;
34
+ file: string;
35
+ line: number;
36
+ action?: string;
37
+ fix: string;
38
+ }
39
+ export interface ActionsAuditResult {
40
+ actions: ActionDescriptor[];
41
+ issues: ActionsAuditIssue[];
42
+ anti_patterns_checked: string[];
43
+ summary: {
44
+ total_actions: number;
45
+ total_issues: number;
46
+ score: "A" | "B" | "C" | "D";
47
+ };
48
+ }
49
+ export declare function auditAstroActionsFromIndex(index: CodeIndex, severity?: "all" | "warnings" | "errors"): Promise<ActionsAuditResult>;
50
+ export declare function astroActionsAudit(args: {
51
+ repo?: string;
52
+ severity?: "all" | "warnings" | "errors";
53
+ }): Promise<ActionsAuditResult>;
54
+ //# sourceMappingURL=astro-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-actions.d.ts","sourceRoot":"","sources":["../../src/tools/astro-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;KAC9B,CAAC;CACH;AA8cD,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,SAAS,EAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,GACvC,OAAO,CAAC,kBAAkB,CAAC,CAyK7B;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;CAC1C,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW9B"}
@@ -0,0 +1,561 @@
1
+ /**
2
+ * Astro Actions audit (6 AA detectors with A/B/C/D scoring).
3
+ *
4
+ * Analyses `src/actions/index.{ts,js,mjs}` to extract the set of defined
5
+ * actions (via `defineAction({...})` calls) and cross-references how those
6
+ * actions are invoked throughout the project (.astro frontmatter + .tsx/.jsx
7
+ * client components).
8
+ *
9
+ * Detectors:
10
+ * AA01 missing-handler-return — error
11
+ * AA02 refine-on-top-level-schema — error (Astro issue #11641)
12
+ * AA03 passthrough-ignored — warning (Astro issue #11693)
13
+ * AA04 file-without-multipart — error
14
+ * AA05 action-called-from-server — warning
15
+ * AA06 client-calls-unknown-action — error
16
+ *
17
+ * Exports:
18
+ * - `auditAstroActionsFromIndex(index, severity?)` — testable core
19
+ * - `astroActionsAudit(args)` — MCP tool handler
20
+ */
21
+ import { readFileSync } from "node:fs";
22
+ import { join } from "node:path";
23
+ import { getParser, initParser } from "../parser/parser-manager.js";
24
+ import { getCodeIndex } from "./index-tools.js";
25
+ const ALL_CODES = ["AA01", "AA02", "AA03", "AA04", "AA05", "AA06"];
26
+ const ACTIONS_FILE_CANDIDATES = [
27
+ "src/actions/index.ts",
28
+ "src/actions/index.js",
29
+ "src/actions/index.mjs",
30
+ ];
31
+ const EXPECT_TS_EXTENSION = {
32
+ ".ts": "typescript",
33
+ ".tsx": "tsx",
34
+ ".js": "javascript",
35
+ ".mjs": "javascript",
36
+ ".jsx": "javascript",
37
+ };
38
+ function pickLang(filePath) {
39
+ for (const [ext, lang] of Object.entries(EXPECT_TS_EXTENSION)) {
40
+ if (filePath.endsWith(ext))
41
+ return lang;
42
+ }
43
+ return "typescript";
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // AST helpers (shared shapes with astro-config.ts)
47
+ // ---------------------------------------------------------------------------
48
+ function stripQuotes(s) {
49
+ return (s[0] === '"' || s[0] === "'") && s[s.length - 1] === s[0] ? s.slice(1, -1) : s;
50
+ }
51
+ function getProperty(obj, name) {
52
+ for (const p of obj.namedChildren) {
53
+ if (p.type !== "pair")
54
+ continue;
55
+ const k = p.childForFieldName("key");
56
+ if (!k)
57
+ continue;
58
+ const keyText = stripQuotes(k.text);
59
+ if (keyText === name)
60
+ return p.childForFieldName("value") ?? null;
61
+ }
62
+ return null;
63
+ }
64
+ /** Walk every descendant of `node` and run `visit`. Depth-capped to avoid runaways. */
65
+ function walkAll(node, visit, depth = 0) {
66
+ if (depth > 400)
67
+ return;
68
+ visit(node);
69
+ for (const child of node.namedChildren)
70
+ walkAll(child, visit, depth + 1);
71
+ }
72
+ /** Descend a chained call expression to find the innermost receiver.
73
+ * e.g. `z.object({...}).refine(...)` → returns the `z.object({...})` call. */
74
+ function receiverOfCall(call) {
75
+ const fn = call.childForFieldName("function");
76
+ if (!fn)
77
+ return null;
78
+ if (fn.type === "member_expression") {
79
+ const obj = fn.childForFieldName("object");
80
+ return obj;
81
+ }
82
+ return null;
83
+ }
84
+ /** Return the method name of a `foo.bar(...)` call, or null. */
85
+ function methodName(call) {
86
+ const fn = call.childForFieldName("function");
87
+ if (!fn || fn.type !== "member_expression")
88
+ return null;
89
+ const prop = fn.childForFieldName("property");
90
+ return prop?.text ?? null;
91
+ }
92
+ /** Strip a chain of `.refine(...)`, `.superRefine(...)`, `.passthrough(...)`,
93
+ * `.strict(...)`, `.strip(...)` calls to find the underlying z.object(...)
94
+ * call (or null if the chain does not end in one). */
95
+ function unwrapZodChain(node) {
96
+ let cur = node;
97
+ while (cur && cur.type === "call_expression") {
98
+ const name = methodName(cur);
99
+ if (name == null) {
100
+ // Not a member-call — could be the z.object(...) call itself.
101
+ const fn = cur.childForFieldName("function");
102
+ if (fn && fn.type === "member_expression") {
103
+ const prop = fn.childForFieldName("property");
104
+ if (prop?.text === "object")
105
+ return cur;
106
+ }
107
+ return null;
108
+ }
109
+ if (name === "object")
110
+ return cur;
111
+ // Chainable modifier — step into receiver
112
+ cur = receiverOfCall(cur);
113
+ }
114
+ return null;
115
+ }
116
+ /** Returns true if `call` is syntactically `z.object(...)`. */
117
+ function isZObjectCall(call) {
118
+ if (call.type !== "call_expression")
119
+ return false;
120
+ const fn = call.childForFieldName("function");
121
+ if (!fn || fn.type !== "member_expression")
122
+ return false;
123
+ const obj = fn.childForFieldName("object");
124
+ const prop = fn.childForFieldName("property");
125
+ return obj?.text === "z" && prop?.text === "object";
126
+ }
127
+ /** Extract the keys of the object literal passed to a z.object({...}) call. */
128
+ function extractZodObjectFields(zCall) {
129
+ const fields = [];
130
+ let fileFieldLine = null;
131
+ const args = zCall.childForFieldName("arguments");
132
+ if (!args)
133
+ return { fields, fileFieldLine };
134
+ const obj = args.namedChildren.find((n) => n.type === "object");
135
+ if (!obj)
136
+ return { fields, fileFieldLine };
137
+ for (const p of obj.namedChildren) {
138
+ if (p.type !== "pair")
139
+ continue;
140
+ const k = p.childForFieldName("key");
141
+ const v = p.childForFieldName("value");
142
+ if (!k)
143
+ continue;
144
+ const keyText = stripQuotes(k.text);
145
+ fields.push(keyText);
146
+ if (v) {
147
+ // Walk the value looking for z.instanceof(File)
148
+ let found = false;
149
+ walkAll(v, (n) => {
150
+ if (found)
151
+ return;
152
+ if (n.type !== "call_expression")
153
+ return;
154
+ const fn = n.childForFieldName("function");
155
+ if (!fn || fn.type !== "member_expression")
156
+ return;
157
+ const zid = fn.childForFieldName("object");
158
+ const prop = fn.childForFieldName("property");
159
+ if (zid?.text !== "z" || prop?.text !== "instanceof")
160
+ return;
161
+ const a = n.childForFieldName("arguments");
162
+ if (!a)
163
+ return;
164
+ const first = a.namedChildren[0];
165
+ if (first && first.text === "File") {
166
+ found = true;
167
+ fileFieldLine = p.startPosition.row + 1;
168
+ }
169
+ });
170
+ }
171
+ }
172
+ return { fields, fileFieldLine };
173
+ }
174
+ /** Walk a handler function body, returning true iff a `return` statement
175
+ * is found at the *direct* function level (not nested inside another
176
+ * function). This avoids flagging handlers whose only return lives inside
177
+ * a callback. */
178
+ function handlerHasTopLevelReturn(fn) {
179
+ const body = fn.childForFieldName("body");
180
+ if (!body)
181
+ return false;
182
+ let found = false;
183
+ function scan(n) {
184
+ if (found)
185
+ return;
186
+ if (n.type === "return_statement") {
187
+ found = true;
188
+ return;
189
+ }
190
+ // Do not descend into nested function/arrow/method definitions.
191
+ if (n.type === "function_declaration" ||
192
+ n.type === "function_expression" ||
193
+ n.type === "arrow_function" ||
194
+ n.type === "method_definition") {
195
+ return;
196
+ }
197
+ for (const c of n.namedChildren)
198
+ scan(c);
199
+ }
200
+ scan(body);
201
+ // Arrow functions with an expression body (no block) are implicit returns.
202
+ if (!found && body.type !== "statement_block")
203
+ return true;
204
+ return found;
205
+ }
206
+ async function parseActionsFile(root) {
207
+ let source = null;
208
+ let relPath = null;
209
+ for (const rel of ACTIONS_FILE_CANDIDATES) {
210
+ try {
211
+ source = readFileSync(join(root, rel), "utf-8");
212
+ relPath = rel;
213
+ break;
214
+ }
215
+ catch { /* next candidate */ }
216
+ }
217
+ if (source == null || relPath == null)
218
+ return null;
219
+ await initParser();
220
+ const parser = await getParser(pickLang(relPath));
221
+ if (!parser)
222
+ return { file: relPath, actions: [] };
223
+ let tree;
224
+ try {
225
+ tree = parser.parse(source);
226
+ }
227
+ catch {
228
+ return { file: relPath, actions: [] };
229
+ }
230
+ const actions = [];
231
+ /** Handle a single `defineAction({...})` call with the action name bound. */
232
+ function handleDefineAction(name, call) {
233
+ const args = call.childForFieldName("arguments");
234
+ const obj = args?.namedChildren.find((n) => n.type === "object");
235
+ const descriptor = {
236
+ name,
237
+ file: relPath,
238
+ line: call.startPosition.row + 1,
239
+ has_input_schema: false,
240
+ input_fields: [],
241
+ handler_missing_return: false,
242
+ refine_on_top_level: false,
243
+ has_passthrough: false,
244
+ has_file_field: false,
245
+ };
246
+ if (!obj) {
247
+ actions.push(descriptor);
248
+ return;
249
+ }
250
+ // --- accept ---
251
+ const acceptNode = getProperty(obj, "accept");
252
+ if (acceptNode && (acceptNode.type === "string")) {
253
+ const val = stripQuotes(acceptNode.text);
254
+ if (val === "json" || val === "form")
255
+ descriptor.accept = val;
256
+ }
257
+ // --- input schema ---
258
+ const inputNode = getProperty(obj, "input");
259
+ if (inputNode) {
260
+ descriptor.has_input_schema = true;
261
+ // Top-level refine? If the *outer* expression is a call to `.refine`
262
+ // on something whose innermost receiver is z.object({...}), flag it.
263
+ if (inputNode.type === "call_expression") {
264
+ const outerName = methodName(inputNode);
265
+ if (outerName === "refine" || outerName === "superRefine") {
266
+ const recv = receiverOfCall(inputNode);
267
+ if (recv && recv.type === "call_expression" && isZObjectCall(recv)) {
268
+ descriptor.refine_on_top_level = true;
269
+ descriptor.refine_line = inputNode.startPosition.row + 1;
270
+ }
271
+ }
272
+ }
273
+ // Passthrough anywhere in the chain.
274
+ walkAll(inputNode, (n) => {
275
+ if (n.type !== "call_expression")
276
+ return;
277
+ const mn = methodName(n);
278
+ if (mn === "passthrough") {
279
+ descriptor.has_passthrough = true;
280
+ descriptor.passthrough_line = n.startPosition.row + 1;
281
+ }
282
+ });
283
+ // Resolve to an underlying z.object({...}) call to extract fields.
284
+ const zObj = unwrapZodChain(inputNode);
285
+ if (zObj) {
286
+ const { fields, fileFieldLine } = extractZodObjectFields(zObj);
287
+ descriptor.input_fields = fields;
288
+ if (fileFieldLine != null) {
289
+ descriptor.has_file_field = true;
290
+ descriptor.file_field_line = fileFieldLine;
291
+ }
292
+ }
293
+ }
294
+ // --- handler ---
295
+ const handlerNode = getProperty(obj, "handler");
296
+ if (handlerNode && (handlerNode.type === "arrow_function" ||
297
+ handlerNode.type === "function_expression" ||
298
+ handlerNode.type === "function")) {
299
+ descriptor.handler_missing_return = !handlerHasTopLevelReturn(handlerNode);
300
+ }
301
+ actions.push(descriptor);
302
+ }
303
+ /** Recursively collect `defineAction({...})` calls under an assignment.
304
+ * Handles both `foo: defineAction({...})` in a server object literal and
305
+ * bare `defineAction({...})` calls bound to a named variable. */
306
+ function collectUnder(name, node) {
307
+ walkAll(node, (n) => {
308
+ if (n.type !== "call_expression")
309
+ return;
310
+ const fn = n.childForFieldName("function");
311
+ if (!fn || fn.text !== "defineAction")
312
+ return;
313
+ // Skip nested defineAction inside another defineAction — the outer
314
+ // traversal already produced its descriptor.
315
+ handleDefineAction(name, n);
316
+ });
317
+ }
318
+ // Walk top-level declarations. The canonical Astro shape is
319
+ // export const server = { foo: defineAction({...}), bar: defineAction({...}) }
320
+ // but we also support
321
+ // export const foo = defineAction({...})
322
+ walkAll(tree.rootNode, (node) => {
323
+ if (node.type !== "variable_declarator")
324
+ return;
325
+ const nameNode = node.childForFieldName("name");
326
+ const valueNode = node.childForFieldName("value");
327
+ if (!nameNode || !valueNode)
328
+ return;
329
+ // Case A: `const foo = defineAction({...})`
330
+ if (valueNode.type === "call_expression") {
331
+ const fn = valueNode.childForFieldName("function");
332
+ if (fn?.text === "defineAction") {
333
+ handleDefineAction(nameNode.text, valueNode);
334
+ return;
335
+ }
336
+ }
337
+ // Case B: `const server = { foo: defineAction({...}) }`
338
+ if (valueNode.type === "object") {
339
+ for (const p of valueNode.namedChildren) {
340
+ if (p.type !== "pair")
341
+ continue;
342
+ const k = p.childForFieldName("key");
343
+ const v = p.childForFieldName("value");
344
+ if (!k || !v)
345
+ continue;
346
+ const actionName = stripQuotes(k.text);
347
+ if (v.type === "call_expression") {
348
+ const fn = v.childForFieldName("function");
349
+ if (fn?.text === "defineAction") {
350
+ handleDefineAction(actionName, v);
351
+ }
352
+ }
353
+ else {
354
+ // Nested one level — e.g. wrapped in a helper; still scan descendants.
355
+ collectUnder(actionName, v);
356
+ }
357
+ }
358
+ }
359
+ });
360
+ return { file: relPath, actions };
361
+ }
362
+ const ACTIONS_CALL_RE = /actions\.([A-Za-z_$][\w$]*)\s*\(/g;
363
+ /** Locate calls to `actions.<name>(` in source, returning their line and
364
+ * whether the call lives in a server-side context (Astro frontmatter). */
365
+ function findActionCalls(file, source) {
366
+ const matches = [];
367
+ const isAstro = file.endsWith(".astro");
368
+ let frontmatterEnd = -1;
369
+ if (isAstro) {
370
+ const fm = source.match(/^---[ \t]*\n([\s\S]*?)\n---[ \t]*(?:\n|$)/);
371
+ if (fm)
372
+ frontmatterEnd = fm[0].length;
373
+ }
374
+ const lines = source.split("\n");
375
+ ACTIONS_CALL_RE.lastIndex = 0;
376
+ let m;
377
+ while ((m = ACTIONS_CALL_RE.exec(source)) !== null) {
378
+ const idx = m.index;
379
+ const lineNum = source.slice(0, idx).split("\n").length;
380
+ const lineText = lines[lineNum - 1] ?? "";
381
+ // Server-side if we are inside Astro frontmatter.
382
+ const isServerSide = isAstro && frontmatterEnd > 0 && idx < frontmatterEnd;
383
+ matches.push({
384
+ file,
385
+ line: lineNum,
386
+ action: m[1],
387
+ is_server_side: isServerSide,
388
+ enclosing_line_context: lineText.trim(),
389
+ });
390
+ }
391
+ return matches;
392
+ }
393
+ /** Return the `<form ...>` opening tag that (textually) encloses the given
394
+ * offset, or null if none. Regex-based — good enough for audit heuristics. */
395
+ function findEnclosingFormTag(source, offset) {
396
+ const upTo = source.slice(0, offset);
397
+ const lastOpen = upTo.lastIndexOf("<form");
398
+ if (lastOpen === -1)
399
+ return null;
400
+ const afterOpen = source.slice(lastOpen);
401
+ const firstClose = afterOpen.indexOf(">");
402
+ if (firstClose === -1)
403
+ return null;
404
+ // Make sure a matching </form> exists after our offset.
405
+ const closeTag = source.indexOf("</form>", offset);
406
+ if (closeTag === -1)
407
+ return null;
408
+ return afterOpen.slice(0, firstClose + 1);
409
+ }
410
+ // ---------------------------------------------------------------------------
411
+ // Detector application
412
+ // ---------------------------------------------------------------------------
413
+ function issue(code, severity, message, file, line, fix, action) {
414
+ const out = { code, severity, message, file, line, fix };
415
+ if (action)
416
+ out.action = action;
417
+ return out;
418
+ }
419
+ function computeScore(issues) {
420
+ const e = issues.filter((i) => i.severity === "error").length;
421
+ const w = issues.filter((i) => i.severity === "warning").length;
422
+ if (e >= 3)
423
+ return "D";
424
+ if (e >= 1 || w >= 6)
425
+ return "C";
426
+ if (w >= 3)
427
+ return "B";
428
+ return "A";
429
+ }
430
+ // ---------------------------------------------------------------------------
431
+ // Testable core + MCP handler
432
+ // ---------------------------------------------------------------------------
433
+ export async function auditAstroActionsFromIndex(index, severity) {
434
+ const parseResult = await parseActionsFile(index.root);
435
+ if (!parseResult) {
436
+ // No actions file: return empty result (still exposes the checked codes).
437
+ return {
438
+ actions: [],
439
+ issues: [],
440
+ anti_patterns_checked: ALL_CODES,
441
+ summary: { total_actions: 0, total_issues: 0, score: "A" },
442
+ };
443
+ }
444
+ const { file: actionsFile, actions: extracted } = parseResult;
445
+ const issues = [];
446
+ const actionNameSet = new Set(extracted.map((a) => a.name));
447
+ // --- AA01/AA02/AA03/AA04 pass (per-action) ---
448
+ for (const act of extracted) {
449
+ if (act.handler_missing_return) {
450
+ issues.push(issue("AA01", "error", `Action "${act.name}" handler never returns a value — callers will receive undefined`, actionsFile, act.line, "Return the handler result explicitly (e.g. `return { ok: true }`)", act.name));
451
+ }
452
+ if (act.refine_on_top_level) {
453
+ issues.push(issue("AA02", "error", `Action "${act.name}" input uses .refine() on top-level z.object() — Astro issue #11641 makes this silently fail`, actionsFile, act.refine_line ?? act.line, "Move .refine() inside a nested z.object() field, or validate inside the handler", act.name));
454
+ }
455
+ if (act.has_passthrough) {
456
+ issues.push(issue("AA03", "warning", `Action "${act.name}" uses .passthrough() — Astro strips extra fields regardless (issue #11693)`, actionsFile, act.passthrough_line ?? act.line, "Declare every expected field in the schema explicitly — .passthrough() is ignored by Astro Actions", act.name));
457
+ }
458
+ }
459
+ // --- Build caller map (scan .astro / .tsx / .jsx files) ---
460
+ const callerFiles = index.files.filter((f) => {
461
+ const p = f.path;
462
+ return p.endsWith(".astro") || p.endsWith(".tsx") || p.endsWith(".jsx");
463
+ });
464
+ const callersByAction = new Map();
465
+ for (const f of callerFiles) {
466
+ let source;
467
+ try {
468
+ source = readFileSync(join(index.root, f.path), "utf-8");
469
+ }
470
+ catch {
471
+ continue;
472
+ }
473
+ const calls = findActionCalls(f.path, source);
474
+ for (const call of calls) {
475
+ // AA06: client-side call to unknown action (errors only on client
476
+ // calls — server-side unknown refs are caught by AA05 anyway and we
477
+ // don't want to double-flag).
478
+ if (!actionNameSet.has(call.action)) {
479
+ if (!call.is_server_side) {
480
+ issues.push(issue("AA06", "error", `Client-side code calls unknown action "${call.action}"`, call.file, call.line, `Define "${call.action}" in src/actions/index.ts or remove the call`, call.action));
481
+ }
482
+ continue;
483
+ }
484
+ // AA05: calling `actions.xxx()` from an .astro frontmatter is a
485
+ // common mistake — on the server you should import the action
486
+ // function directly.
487
+ if (call.is_server_side) {
488
+ issues.push(issue("AA05", "warning", `Action "${call.action}" called from .astro frontmatter — prefer Astro.callAction() or a direct import`, call.file, call.line, `Use Astro.callAction(actions.${call.action}, input) in server code`, call.action));
489
+ }
490
+ // Track callers for AA04 follow-up (only client-side matters).
491
+ if (!call.is_server_side) {
492
+ // Locate byte offset of this call in source for form-tag lookup.
493
+ const lines = source.split("\n");
494
+ let offset = 0;
495
+ for (let i = 0; i < call.line - 1; i++)
496
+ offset += (lines[i]?.length ?? 0) + 1;
497
+ const formTag = findEnclosingFormTag(source, offset);
498
+ const bucket = callersByAction.get(call.action) ?? [];
499
+ bucket.push({ file: call.file, line: call.line, formTag, is_server_side: false });
500
+ callersByAction.set(call.action, bucket);
501
+ }
502
+ }
503
+ }
504
+ // --- AA04 pass (file schema + caller form enctype) ---
505
+ for (const act of extracted) {
506
+ if (!act.has_file_field)
507
+ continue;
508
+ const callers = callersByAction.get(act.name) ?? [];
509
+ for (const c of callers) {
510
+ // If the caller sits inside a <form> tag, that tag must have
511
+ // enctype="multipart/form-data". If there is no form tag at all, we
512
+ // cannot reason about the caller and stay silent.
513
+ if (c.formTag == null)
514
+ continue;
515
+ if (!/enctype\s*=\s*["']multipart\/form-data["']/i.test(c.formTag)) {
516
+ issues.push(issue("AA04", "error", `Action "${act.name}" expects a File but caller form lacks enctype="multipart/form-data"`, c.file, c.line, `Add enctype="multipart/form-data" to the <form> tag, or switch the schema off z.instanceof(File)`, act.name));
517
+ }
518
+ }
519
+ }
520
+ // --- Severity filter ---
521
+ let filtered = issues;
522
+ if (severity === "errors")
523
+ filtered = issues.filter((i) => i.severity === "error");
524
+ else if (severity === "warnings")
525
+ filtered = issues.filter((i) => i.severity !== "info");
526
+ const descriptors = extracted.map((a) => {
527
+ const d = {
528
+ name: a.name,
529
+ file: a.file,
530
+ line: a.line,
531
+ has_input_schema: a.has_input_schema,
532
+ input_fields: a.input_fields,
533
+ };
534
+ if (a.accept !== undefined)
535
+ d.accept = a.accept;
536
+ return d;
537
+ });
538
+ return {
539
+ actions: descriptors,
540
+ issues: filtered,
541
+ anti_patterns_checked: ALL_CODES,
542
+ summary: {
543
+ total_actions: descriptors.length,
544
+ total_issues: filtered.length,
545
+ score: computeScore(filtered),
546
+ },
547
+ };
548
+ }
549
+ export async function astroActionsAudit(args) {
550
+ const index = await getCodeIndex(args.repo ?? "");
551
+ if (!index) {
552
+ return {
553
+ actions: [],
554
+ issues: [],
555
+ anti_patterns_checked: ALL_CODES,
556
+ summary: { total_actions: 0, total_issues: 0, score: "A" },
557
+ };
558
+ }
559
+ return auditAstroActionsFromIndex(index, args.severity);
560
+ }
561
+ //# sourceMappingURL=astro-actions.js.map