code-auditor-mcp 3.0.6 → 3.1.0

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 (197) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +55 -1
  4. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +21 -0
  5. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +1 -0
  6. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +21 -0
  7. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +1 -0
  8. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +13 -0
  9. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +1 -0
  10. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +12 -0
  11. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +1 -0
  12. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +11 -0
  13. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +1 -0
  14. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +22 -0
  15. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +1 -0
  16. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +9 -0
  17. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +1 -0
  18. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +13 -0
  19. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +1 -0
  20. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +13 -0
  21. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +1 -0
  22. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +18 -0
  23. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +1 -0
  24. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +10 -0
  25. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +1 -0
  26. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +16 -0
  27. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +1 -0
  28. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +14 -0
  29. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +1 -0
  30. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +18 -0
  31. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +1 -0
  32. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +13 -0
  33. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +1 -0
  34. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +22 -0
  35. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +1 -0
  36. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +10 -0
  37. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +1 -0
  38. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +20 -0
  39. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +1 -0
  40. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +18 -0
  41. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +1 -0
  42. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +28 -0
  43. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +1 -0
  44. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +11 -0
  45. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +1 -0
  46. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +31 -0
  47. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +1 -0
  48. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +11 -0
  49. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +1 -0
  50. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +18 -0
  51. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +1 -0
  52. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +13 -0
  53. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +1 -0
  54. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +61 -0
  55. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +1 -0
  56. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +10 -0
  57. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +1 -0
  58. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +15 -0
  59. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +1 -0
  60. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +11 -0
  61. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +1 -0
  62. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +49 -0
  63. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +1 -0
  64. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +10 -0
  65. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +1 -0
  66. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +19 -0
  67. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +1 -0
  68. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +37 -0
  69. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +1 -0
  70. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +73 -0
  71. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +1 -0
  72. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +12 -0
  73. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +1 -0
  74. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +82 -0
  75. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +1 -0
  76. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +10 -0
  77. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +1 -0
  78. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +15 -0
  79. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +1 -0
  80. package/dist/analyzers/cross-language/APIContractAnalyzer.js +3 -3
  81. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
  82. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +1 -1
  83. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
  84. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +2 -2
  85. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  86. package/dist/analyzers/cross-language/SchemaValidator.js +2 -2
  87. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  88. package/dist/analyzers/reactAnalyzer.js +7 -22
  89. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  90. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +40 -2
  91. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  92. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +186 -29
  93. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  94. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +30 -0
  95. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  96. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +164 -11
  97. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  98. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +51 -7
  99. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  100. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +354 -48
  101. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  102. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +8 -4
  103. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  104. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +51 -38
  105. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  106. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +59 -39
  107. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  108. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +412 -153
  109. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  110. package/dist/auditRunner.d.ts.map +1 -1
  111. package/dist/auditRunner.js +26 -2
  112. package/dist/auditRunner.js.map +1 -1
  113. package/dist/cli.js +51 -0
  114. package/dist/cli.js.map +1 -1
  115. package/dist/config/defaults.d.ts +32 -0
  116. package/dist/config/defaults.d.ts.map +1 -1
  117. package/dist/config/defaults.js +62 -4
  118. package/dist/config/defaults.js.map +1 -1
  119. package/dist/generators/AWSQConfigGenerator.d.ts +20 -0
  120. package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -1
  121. package/dist/generators/AWSQConfigGenerator.js +48 -19
  122. package/dist/generators/AWSQConfigGenerator.js.map +1 -1
  123. package/dist/generators/AiderConfigGenerator.d.ts +18 -0
  124. package/dist/generators/AiderConfigGenerator.d.ts.map +1 -1
  125. package/dist/generators/AiderConfigGenerator.js +48 -10
  126. package/dist/generators/AiderConfigGenerator.js.map +1 -1
  127. package/dist/generators/ClaudeConfigGenerator.d.ts +9 -3
  128. package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -1
  129. package/dist/generators/ClaudeConfigGenerator.js +30 -42
  130. package/dist/generators/ClaudeConfigGenerator.js.map +1 -1
  131. package/dist/generators/ClineConfigGenerator.d.ts +13 -0
  132. package/dist/generators/ClineConfigGenerator.d.ts.map +1 -1
  133. package/dist/generators/ClineConfigGenerator.js +44 -11
  134. package/dist/generators/ClineConfigGenerator.js.map +1 -1
  135. package/dist/generators/CodeiumConfigGenerator.d.ts +15 -0
  136. package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -1
  137. package/dist/generators/CodeiumConfigGenerator.js +45 -15
  138. package/dist/generators/CodeiumConfigGenerator.js.map +1 -1
  139. package/dist/generators/CodexConfigGenerator.d.ts +29 -0
  140. package/dist/generators/CodexConfigGenerator.d.ts.map +1 -0
  141. package/dist/generators/CodexConfigGenerator.js +80 -0
  142. package/dist/generators/CodexConfigGenerator.js.map +1 -0
  143. package/dist/generators/ConfigGeneratorFactory.d.ts +10 -1
  144. package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -1
  145. package/dist/generators/ConfigGeneratorFactory.js +22 -8
  146. package/dist/generators/ConfigGeneratorFactory.js.map +1 -1
  147. package/dist/generators/ContinueConfigGenerator.d.ts +16 -1
  148. package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -1
  149. package/dist/generators/ContinueConfigGenerator.js +41 -73
  150. package/dist/generators/ContinueConfigGenerator.js.map +1 -1
  151. package/dist/generators/CopilotConfigGenerator.d.ts +13 -2
  152. package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -1
  153. package/dist/generators/CopilotConfigGenerator.js +31 -51
  154. package/dist/generators/CopilotConfigGenerator.js.map +1 -1
  155. package/dist/generators/CursorConfigGenerator.d.ts +8 -1
  156. package/dist/generators/CursorConfigGenerator.d.ts.map +1 -1
  157. package/dist/generators/CursorConfigGenerator.js +27 -51
  158. package/dist/generators/CursorConfigGenerator.js.map +1 -1
  159. package/dist/generators/GeminiConfigGenerator.d.ts +23 -0
  160. package/dist/generators/GeminiConfigGenerator.d.ts.map +1 -0
  161. package/dist/generators/GeminiConfigGenerator.js +59 -0
  162. package/dist/generators/GeminiConfigGenerator.js.map +1 -0
  163. package/dist/generators/JetBrainsConfigGenerator.d.ts +11 -0
  164. package/dist/generators/JetBrainsConfigGenerator.d.ts.map +1 -1
  165. package/dist/generators/JetBrainsConfigGenerator.js +39 -21
  166. package/dist/generators/JetBrainsConfigGenerator.js.map +1 -1
  167. package/dist/generators/VSCodeConfigGenerator.d.ts +14 -0
  168. package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -1
  169. package/dist/generators/VSCodeConfigGenerator.js +43 -15
  170. package/dist/generators/VSCodeConfigGenerator.js.map +1 -1
  171. package/dist/hooks/codex.d.ts +20 -0
  172. package/dist/hooks/codex.d.ts.map +1 -0
  173. package/dist/hooks/codex.js +91 -0
  174. package/dist/hooks/codex.js.map +1 -0
  175. package/dist/hooks/core.d.ts +62 -0
  176. package/dist/hooks/core.d.ts.map +1 -0
  177. package/dist/hooks/core.js +119 -0
  178. package/dist/hooks/core.js.map +1 -0
  179. package/dist/hooks/cursor.d.ts +72 -0
  180. package/dist/hooks/cursor.d.ts.map +1 -0
  181. package/dist/hooks/cursor.js +163 -0
  182. package/dist/hooks/cursor.js.map +1 -0
  183. package/dist/index.d.ts +0 -3
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +2 -4
  186. package/dist/index.js.map +1 -1
  187. package/dist/installer.d.ts +30 -0
  188. package/dist/installer.d.ts.map +1 -0
  189. package/dist/installer.js +355 -0
  190. package/dist/installer.js.map +1 -0
  191. package/dist/languages/UniversalAnalyzer.d.ts +7 -0
  192. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  193. package/dist/languages/UniversalAnalyzer.js +16 -1
  194. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  195. package/package.json +4 -2
  196. package/plugin/.claude-plugin/plugin.json +1 -1
  197. package/plugin/skills/code-auditor/SKILL.md +13 -5
@@ -1,36 +1,54 @@
1
+ /**
2
+ * JetBrains IDEs Configuration Generator — RETIRED
3
+ *
4
+ * Originally added Spec-16 R5.3 with path .idea/mcp.json.
5
+ *
6
+ * Retired 2026-07-20 (Task #17 — generator path audit):
7
+ * JetBrains MCP is configured through the IDE's Settings UI (MCP plugin),
8
+ * not a file-based path. No generator to write. This file is kept as a
9
+ * tombstone; the class is no longer registered in ConfigGeneratorFactory.
10
+ */
1
11
  import { BaseConfigGenerator } from './BaseConfigGenerator.js';
2
- import { resolve } from 'path';
3
12
  export class JetBrainsConfigGenerator extends BaseConfigGenerator {
4
- getToolName() { return 'JetBrains IDEs'; }
5
- getFilename() { return '.idea/mcp-config.json'; }
13
+ getToolName() {
14
+ return 'JetBrains IDEs';
15
+ }
16
+ getFilename() {
17
+ return '.idea/mcp.json';
18
+ }
6
19
  generateConfig() {
7
20
  const config = {
8
- mcp: {
9
- servers: [{
10
- name: 'Code Index',
11
- command: 'node',
12
- arguments: [resolve(process.cwd(), 'dist/mcp.js'), '--mcp-mode'],
13
- workingDirectory: process.cwd(),
14
- environment: { MCP_SERVER_URL: this.serverUrl }
15
- }]
21
+ mcpServers: {
22
+ 'code-auditor': {
23
+ command: 'npx',
24
+ args: ['-y', 'code-auditor-mcp', '--mcp-mode'],
25
+ },
16
26
  },
17
- ai: {
18
- customProviders: [{
19
- id: 'code-index',
20
- name: 'Code Index',
21
- endpoint: `${this.serverUrl}/api/jetbrains`,
22
- apiKey: this.getDefaultApiKey()
23
- }]
24
- }
25
27
  };
26
28
  return {
27
29
  filename: this.getFilename(),
28
30
  content: this.formatJson(config),
29
- instructions: 'Open Settings > Tools > AI Assistant > MCP, import configuration'
31
+ instructions: this.getInstructions(),
30
32
  };
31
33
  }
32
34
  getInstructions() {
33
- return 'JetBrains configuration instructions...';
35
+ return `
36
+ JetBrains IDEs MCP Configuration Instructions:
37
+
38
+ 1. Install the "MCP" plugin for JetBrains IDEs
39
+ 2. Place this file at .idea/mcp.json in your project root
40
+ 3. Restart your IDE
41
+ 4. The code-auditor MCP tools will be available
42
+
43
+ Skill install (separate step):
44
+ code-audit install --agent agents --scope project
45
+
46
+ Note: JetBrains IDEs support SKILL.md via the agents standard.
47
+ For blocking hooks, use Claude Code or Codex.
48
+ `;
49
+ }
50
+ requiresAuth() {
51
+ return false;
34
52
  }
35
53
  }
36
54
  //# sourceMappingURL=JetBrainsConfigGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JetBrainsConfigGenerator.js","sourceRoot":"","sources":["../../src/generators/JetBrainsConfigGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAgB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,OAAO,wBAAyB,SAAQ,mBAAmB;IAC/D,WAAW,KAAa,OAAO,gBAAgB,CAAC,CAAC,CAAC;IAClD,WAAW,KAAa,OAAO,uBAAuB,CAAC,CAAC,CAAC;IAEzD,cAAc;QACZ,MAAM,MAAM,GAAG;YACb,GAAG,EAAE;gBACH,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,YAAY;wBAClB,OAAO,EAAE,MAAM;wBACf,SAAS,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC;wBAChE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE;wBAC/B,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE;qBAChD,CAAC;aACH;YACD,EAAE,EAAE;gBACF,eAAe,EAAE,CAAC;wBAChB,EAAE,EAAE,YAAY;wBAChB,IAAI,EAAE,YAAY;wBAClB,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,gBAAgB;wBAC3C,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE;qBAChC,CAAC;aACH;SACF,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;YAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAChC,YAAY,EAAE,kEAAkE;SACjF,CAAC;IACJ,CAAC;IAED,eAAe;QACb,OAAO,yCAAyC,CAAC;IACnD,CAAC;CACF"}
1
+ {"version":3,"file":"JetBrainsConfigGenerator.js","sourceRoot":"","sources":["../../src/generators/JetBrainsConfigGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,mBAAmB,EAAgB,MAAM,0BAA0B,CAAC;AAE7E,MAAM,OAAO,wBAAyB,SAAQ,mBAAmB;IAC/D,WAAW;QACT,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,WAAW;QACT,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,cAAc;QACZ,MAAM,MAAM,GAAG;YACb,UAAU,EAAE;gBACV,cAAc,EAAE;oBACd,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,YAAY,CAAC;iBAC/C;aACF;SACF,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;YAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;SACrC,CAAC;IACJ,CAAC;IAED,eAAe;QACb,OAAO;;;;;;;;;;;;;CAaV,CAAC;IACA,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -1,8 +1,22 @@
1
+ /**
2
+ * VS Code MCP Configuration Generator
3
+ * Generates MCP configuration for VS Code (standalone, without Copilot).
4
+ *
5
+ * Updated 2026-07-19 (Spec-16 R5.3):
6
+ * Standardized to npx-based stdio MCP transport. Uses the standard
7
+ * mcpServers object format.
8
+ * Skills: agents-standard, installed via code-audit install --agent agents.
9
+ *
10
+ * ✅ VERIFIED (2026-07-20):
11
+ * .vscode/mcp.json confirmed against code.visualstudio.com/docs/agents/reference/mcp-configuration.
12
+ * Also confirmed via VS Code command "MCP: Open Workspace Folder MCP Configuration".
13
+ */
1
14
  import { BaseConfigGenerator, ConfigOutput } from './BaseConfigGenerator.js';
2
15
  export declare class VSCodeConfigGenerator extends BaseConfigGenerator {
3
16
  getToolName(): string;
4
17
  getFilename(): string;
5
18
  generateConfig(): ConfigOutput;
6
19
  getInstructions(): string;
20
+ requiresAuth(): boolean;
7
21
  }
8
22
  //# sourceMappingURL=VSCodeConfigGenerator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VSCodeConfigGenerator.d.ts","sourceRoot":"","sources":["../../src/generators/VSCodeConfigGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7E,qBAAa,qBAAsB,SAAQ,mBAAmB;IAC5D,WAAW,IAAI,MAAM,CAA0B;IAC/C,WAAW,IAAI,MAAM,CAA+B;IAEpD,cAAc,IAAI,YAAY,CAmB7B;IAED,eAAe,IAAI,MAAM,CAExB;CACF"}
1
+ {"version":3,"file":"VSCodeConfigGenerator.d.ts","sourceRoot":"","sources":["../../src/generators/VSCodeConfigGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7E,qBAAa,qBAAsB,SAAQ,mBAAmB;IAC5D,WAAW,IAAI,MAAM,CAEpB;IAED,WAAW,IAAI,MAAM,CAEpB;IAED,cAAc,IAAI,YAAY,CAe7B;IAED,eAAe,IAAI,MAAM,CAexB;IAED,YAAY,IAAI,OAAO,CAEtB;CACF"}
@@ -1,29 +1,57 @@
1
+ /**
2
+ * VS Code MCP Configuration Generator
3
+ * Generates MCP configuration for VS Code (standalone, without Copilot).
4
+ *
5
+ * Updated 2026-07-19 (Spec-16 R5.3):
6
+ * Standardized to npx-based stdio MCP transport. Uses the standard
7
+ * mcpServers object format.
8
+ * Skills: agents-standard, installed via code-audit install --agent agents.
9
+ *
10
+ * ✅ VERIFIED (2026-07-20):
11
+ * .vscode/mcp.json confirmed against code.visualstudio.com/docs/agents/reference/mcp-configuration.
12
+ * Also confirmed via VS Code command "MCP: Open Workspace Folder MCP Configuration".
13
+ */
1
14
  import { BaseConfigGenerator } from './BaseConfigGenerator.js';
2
- import { resolve } from 'path';
3
15
  export class VSCodeConfigGenerator extends BaseConfigGenerator {
4
- getToolName() { return 'VS Code MCP'; }
5
- getFilename() { return '.vscode/mcp.json'; }
16
+ getToolName() {
17
+ return 'VS Code MCP';
18
+ }
19
+ getFilename() {
20
+ return '.vscode/mcp.json';
21
+ }
6
22
  generateConfig() {
7
23
  const config = {
8
- 'mcp.servers': [{
9
- name: 'code-index',
10
- enabled: true,
11
- transport: 'stdio',
12
- command: 'node',
13
- args: [resolve(process.cwd(), 'dist/mcp.js'), '--mcp-mode'],
14
- env: { NODE_ENV: 'production' }
15
- }],
16
- 'mcp.autoStart': true,
17
- 'mcp.showInStatusBar': true
24
+ mcpServers: {
25
+ 'code-auditor': {
26
+ command: 'npx',
27
+ args: ['-y', 'code-auditor-mcp', '--mcp-mode'],
28
+ },
29
+ },
18
30
  };
19
31
  return {
20
32
  filename: this.getFilename(),
21
33
  content: this.formatJson(config),
22
- instructions: 'Install MCP extension for VS Code, place in .vscode/mcp.json'
34
+ instructions: this.getInstructions(),
23
35
  };
24
36
  }
25
37
  getInstructions() {
26
- return 'VS Code MCP configuration instructions...';
38
+ return `
39
+ VS Code MCP Configuration Instructions:
40
+
41
+ 1. Install the "MCP" extension for VS Code
42
+ 2. Place this file at .vscode/mcp.json in your project root
43
+ 3. Reload VS Code window
44
+ 4. The code-auditor MCP tools will be available
45
+
46
+ Skill install (separate step):
47
+ code-audit install --agent agents --scope project
48
+
49
+ Note: VS Code/Copilot has no edit hooks. Use MCP tools interactively for
50
+ auditing. For blocking hooks, use Claude Code or Codex.
51
+ `;
52
+ }
53
+ requiresAuth() {
54
+ return false;
27
55
  }
28
56
  }
29
57
  //# sourceMappingURL=VSCodeConfigGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VSCodeConfigGenerator.js","sourceRoot":"","sources":["../../src/generators/VSCodeConfigGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAgB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IAC5D,WAAW,KAAa,OAAO,aAAa,CAAC,CAAC,CAAC;IAC/C,WAAW,KAAa,OAAO,kBAAkB,CAAC,CAAC,CAAC;IAEpD,cAAc;QACZ,MAAM,MAAM,GAAG;YACb,aAAa,EAAE,CAAC;oBACd,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,OAAO;oBAClB,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC;oBAC3D,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE;iBAChC,CAAC;YACF,eAAe,EAAE,IAAI;YACrB,qBAAqB,EAAE,IAAI;SAC5B,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;YAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAChC,YAAY,EAAE,8DAA8D;SAC7E,CAAC;IACJ,CAAC;IAED,eAAe;QACb,OAAO,2CAA2C,CAAC;IACrD,CAAC;CACF"}
1
+ {"version":3,"file":"VSCodeConfigGenerator.js","sourceRoot":"","sources":["../../src/generators/VSCodeConfigGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,mBAAmB,EAAgB,MAAM,0BAA0B,CAAC;AAE7E,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IAC5D,WAAW;QACT,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,WAAW;QACT,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,cAAc;QACZ,MAAM,MAAM,GAAG;YACb,UAAU,EAAE;gBACV,cAAc,EAAE;oBACd,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,YAAY,CAAC;iBAC/C;aACF;SACF,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;YAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;SACrC,CAAC;IACJ,CAAC;IAED,eAAe;QACb,OAAO;;;;;;;;;;;;;CAaV,CAAC;IACA,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Codex hook adapter — `code-audit codex-hook`.
4
+ *
5
+ * Reads Codex's PostToolUse stdin JSON and runs a diff-scoped audit.
6
+ *
7
+ * Phase 0 verification (2026-07-19):
8
+ * - Source: learn.chatgpt.com/docs/hooks
9
+ * - PostToolUse is BLOCKING: exit 2 replaces the tool result with feedback
10
+ * - Matcher in hooks.json: "apply_patch" (Codex's file-editing tool)
11
+ * - stdin shape: { session_id, tool_name, tool_use_id, tool_input, tool_response }
12
+ * - tool_input.file_path contains the edited file
13
+ *
14
+ * Exit codes:
15
+ * 0 — no critical violations found
16
+ * 2 — critical violations found (blocking feedback loop)
17
+ * 1 — internal error (adapter crash, not violation-related)
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/hooks/codex.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Codex hook adapter — `code-audit codex-hook`.
4
+ *
5
+ * Reads Codex's PostToolUse stdin JSON and runs a diff-scoped audit.
6
+ *
7
+ * Phase 0 verification (2026-07-19):
8
+ * - Source: learn.chatgpt.com/docs/hooks
9
+ * - PostToolUse is BLOCKING: exit 2 replaces the tool result with feedback
10
+ * - Matcher in hooks.json: "apply_patch" (Codex's file-editing tool)
11
+ * - stdin shape: { session_id, tool_name, tool_use_id, tool_input, tool_response }
12
+ * - tool_input.file_path contains the edited file
13
+ *
14
+ * Exit codes:
15
+ * 0 — no critical violations found
16
+ * 2 — critical violations found (blocking feedback loop)
17
+ * 1 — internal error (adapter crash, not violation-related)
18
+ */
19
+ import { readStdin, runHookAudit } from './core.js';
20
+ import chalk from 'chalk';
21
+ async function main() {
22
+ const raw = await readStdin();
23
+ if (!raw) {
24
+ // No stdin data — nothing to audit
25
+ process.exit(0);
26
+ }
27
+ let event;
28
+ try {
29
+ event = JSON.parse(raw);
30
+ }
31
+ catch {
32
+ console.error(chalk.red('[code-auditor codex-hook] Failed to parse stdin JSON'));
33
+ process.exit(0); // Degrade gracefully
34
+ }
35
+ const filePath = event.tool_input?.file_path || event.tool_input?.path;
36
+ if (!filePath) {
37
+ // No file path — nothing to audit
38
+ process.exit(0);
39
+ }
40
+ const projectRoot = process.cwd();
41
+ try {
42
+ const output = await runHookAudit({
43
+ filePaths: [filePath],
44
+ projectRoot,
45
+ failOn: 'critical',
46
+ });
47
+ if (output.violations.length > 0) {
48
+ // Codex PostToolUse: exit 2 replaces tool result with feedback
49
+ // Write violations as JSON to stdout — Codex feeds this back to the agent
50
+ const criticals = output.violations.filter((v) => v.severity === 'critical');
51
+ if (criticals.length > 0) {
52
+ const feedback = {
53
+ decision: 'block',
54
+ reason: `code-auditor found ${criticals.length} critical violation(s)`,
55
+ violations: output.violations.map((v) => ({
56
+ severity: v.severity,
57
+ message: v.message,
58
+ file: v.file,
59
+ line: v.line,
60
+ rule: v.rule,
61
+ suggestion: v.suggestion || null,
62
+ })),
63
+ };
64
+ process.stdout.write(JSON.stringify(feedback, null, 2) + '\n');
65
+ process.exit(2);
66
+ }
67
+ // Non-critical violations: report but don't block
68
+ const warnings = output.violations.filter((v) => v.severity === 'warning');
69
+ if (warnings.length > 0) {
70
+ const advisory = {
71
+ decision: 'allow',
72
+ warnings: warnings.map((v) => ({
73
+ message: v.message,
74
+ file: v.file,
75
+ line: v.line,
76
+ suggestion: v.suggestion || null,
77
+ })),
78
+ };
79
+ process.stdout.write(JSON.stringify(advisory, null, 2) + '\n');
80
+ }
81
+ }
82
+ process.exit(0);
83
+ }
84
+ catch (error) {
85
+ // Internal error — report and exit 0 (never wedge the agent loop on errors)
86
+ console.error(chalk.red(`[code-auditor codex-hook] Error: ${error instanceof Error ? error.message : String(error)}`));
87
+ process.exit(0);
88
+ }
89
+ }
90
+ main();
91
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/hooks/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Shared hook adapter core — reads stdin, runs a diff-scoped audit, writes stdout.
3
+ *
4
+ * Each tool's hook adapter (cursor.ts, codex.ts) is a thin payload mapper that:
5
+ * 1. Reads the tool-specific stdin JSON
6
+ * 2. Extracts edited file paths
7
+ * 3. Calls runHookAudit() with those paths
8
+ * 4. Maps audit results back to the tool's stdout contract
9
+ *
10
+ * Phase 0 live-docs verification (2026-07-20):
11
+ * - Cursor postToolUse (Write matcher): BLOCKING (exit 2, additional_context)
12
+ * Verified: cursor.com/docs/hooks + cursor.com/docs/reference/third-party-hooks
13
+ * - Cursor afterFileEdit: EXISTS but observation-only — NOT used for blocking
14
+ * - Codex PostToolUse: blocking (exit 2 replaces tool result with feedback)
15
+ * Verified: learn.chatgpt.com/docs/extend/hooks
16
+ * - Claude Code PostToolUse: blocking (exit 2 blocks the edit)
17
+ * Cursor reads .claude/settings.json natively via third-party hooks compat
18
+ */
19
+ import type { Severity } from '../types.js';
20
+ export interface HookAuditInput {
21
+ filePaths: string[];
22
+ projectRoot: string;
23
+ failOn: Severity;
24
+ }
25
+ export interface HookViolation {
26
+ analyzer: string;
27
+ rule: string;
28
+ severity: Severity;
29
+ message: string;
30
+ file: string;
31
+ line?: number;
32
+ column?: number;
33
+ endLine?: number;
34
+ endColumn?: number;
35
+ enclosingSymbol?: string;
36
+ suggestion?: string;
37
+ details?: string;
38
+ }
39
+ export interface HookAuditOutput {
40
+ violations: HookViolation[];
41
+ summary: {
42
+ total: number;
43
+ critical: number;
44
+ warning: number;
45
+ suggestion: number;
46
+ };
47
+ filesAnalyzed: number;
48
+ }
49
+ /**
50
+ * Read all of stdin as a string. Returns empty string on EOF/error.
51
+ */
52
+ export declare function readStdin(): Promise<string>;
53
+ /**
54
+ * Run a diff-scoped audit on the given file paths.
55
+ * This is the shared core — all hook adapters call this.
56
+ */
57
+ export declare function runHookAudit(input: HookAuditInput): Promise<HookAuditOutput>;
58
+ /**
59
+ * Check if violations at or above failOn severity exist.
60
+ */
61
+ export declare function hasViolationsAtOrAbove(violations: HookViolation[], failOn: Severity): boolean;
62
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/hooks/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CA+BjD;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CA4DlF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,aAAa,EAAE,EAC3B,MAAM,EAAE,QAAQ,GACf,OAAO,CAOT"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Shared hook adapter core — reads stdin, runs a diff-scoped audit, writes stdout.
3
+ *
4
+ * Each tool's hook adapter (cursor.ts, codex.ts) is a thin payload mapper that:
5
+ * 1. Reads the tool-specific stdin JSON
6
+ * 2. Extracts edited file paths
7
+ * 3. Calls runHookAudit() with those paths
8
+ * 4. Maps audit results back to the tool's stdout contract
9
+ *
10
+ * Phase 0 live-docs verification (2026-07-20):
11
+ * - Cursor postToolUse (Write matcher): BLOCKING (exit 2, additional_context)
12
+ * Verified: cursor.com/docs/hooks + cursor.com/docs/reference/third-party-hooks
13
+ * - Cursor afterFileEdit: EXISTS but observation-only — NOT used for blocking
14
+ * - Codex PostToolUse: blocking (exit 2 replaces tool result with feedback)
15
+ * Verified: learn.chatgpt.com/docs/extend/hooks
16
+ * - Claude Code PostToolUse: blocking (exit 2 blocks the edit)
17
+ * Cursor reads .claude/settings.json natively via third-party hooks compat
18
+ */
19
+ import { createInterface } from 'node:readline';
20
+ import { resolve } from 'node:path';
21
+ import { createAuditRunner } from '../auditRunner.js';
22
+ import { initParsers } from '../languages/index.js';
23
+ /**
24
+ * Read all of stdin as a string. Returns empty string on EOF/error.
25
+ */
26
+ export async function readStdin() {
27
+ return new Promise((resolve) => {
28
+ // If stdin is a TTY, there's nothing to read
29
+ if (process.stdin.isTTY) {
30
+ resolve('');
31
+ return;
32
+ }
33
+ const rl = createInterface({
34
+ input: process.stdin,
35
+ output: undefined,
36
+ terminal: false,
37
+ });
38
+ const lines = [];
39
+ rl.on('line', (line) => {
40
+ lines.push(line);
41
+ });
42
+ rl.on('close', () => {
43
+ resolve(lines.join('\n'));
44
+ });
45
+ rl.on('error', () => {
46
+ resolve(lines.join('\n'));
47
+ });
48
+ // Timeout: if nothing arrives in 5s, assume no input
49
+ setTimeout(() => {
50
+ rl.close();
51
+ resolve(lines.join('\n'));
52
+ }, 5000).unref();
53
+ });
54
+ }
55
+ /**
56
+ * Run a diff-scoped audit on the given file paths.
57
+ * This is the shared core — all hook adapters call this.
58
+ */
59
+ export async function runHookAudit(input) {
60
+ // Initialize parsers (idempotent once loaded)
61
+ await initParsers();
62
+ if (input.filePaths.length === 0) {
63
+ return {
64
+ violations: [],
65
+ summary: { total: 0, critical: 0, warning: 0, suggestion: 0 },
66
+ filesAnalyzed: 0,
67
+ };
68
+ }
69
+ // Convert to absolute paths
70
+ const resolvedPaths = [...new Set(input.filePaths.map((f) => resolve(input.projectRoot, f)))];
71
+ // Create runner with the resolved scope
72
+ const runner = createAuditRunner({
73
+ projectRoot: input.projectRoot,
74
+ scope: resolvedPaths,
75
+ analyzerConcurrency: 4,
76
+ });
77
+ const result = await runner.run();
78
+ // Collect all violations
79
+ const allViolations = Object.values(result.analyzerResults).flatMap((r) => r.violations || []);
80
+ const violations = allViolations.map((v) => ({
81
+ analyzer: v.analyzer || '',
82
+ rule: v.rule || v.type || '',
83
+ severity: v.severity,
84
+ message: v.message,
85
+ file: v.file || '',
86
+ line: v.line ?? v.start?.line,
87
+ column: v.column ?? v.start?.column ?? 1,
88
+ endLine: v.end?.line,
89
+ endColumn: v.end?.column,
90
+ enclosingSymbol: v.symbol || v.enclosingFunction || '',
91
+ suggestion: v.suggestion || '',
92
+ details: v.details || '',
93
+ }));
94
+ const criticalCount = violations.filter((v) => v.severity === 'critical').length;
95
+ const warningCount = violations.filter((v) => v.severity === 'warning').length;
96
+ const suggestionCount = violations.filter((v) => v.severity === 'suggestion').length;
97
+ return {
98
+ violations,
99
+ summary: {
100
+ total: violations.length,
101
+ critical: criticalCount,
102
+ warning: warningCount,
103
+ suggestion: suggestionCount,
104
+ },
105
+ filesAnalyzed: result.metadata.filesAnalyzed,
106
+ };
107
+ }
108
+ /**
109
+ * Check if violations at or above failOn severity exist.
110
+ */
111
+ export function hasViolationsAtOrAbove(violations, failOn) {
112
+ const severityOrder = ['critical', 'warning', 'suggestion'];
113
+ const failIndex = severityOrder.indexOf(failOn);
114
+ return violations.some((v) => {
115
+ const vIndex = severityOrder.indexOf(v.severity);
116
+ return vIndex >= 0 && vIndex <= failIndex;
117
+ });
118
+ }
119
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/hooks/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cursor hook adapter — `code-audit cursor-hook`.
4
+ *
5
+ * Reads Cursor's postToolUse stdin JSON (native or Claude Code compat) and
6
+ * runs a scoped audit on edited files. Blocks edits with critical violations.
7
+ *
8
+ * Phase 0 verification (2026-07-20):
9
+ * - Source: cursor.com/docs/hooks + cursor.com/docs/reference/third-party-hooks
10
+ * - postToolUse with Write matcher IS BLOCKING: exit 2 blocks the action
11
+ * - additional_context is injected into the conversation after the tool result
12
+ * - afterFileEdit EXISTS but is observation-only ("No output fields defined")
13
+ * - Cursor natively reads .claude/settings.json hooks (PostToolUse→postToolUse)
14
+ * - Tool name mapping: Edit→Write, Bash→Shell
15
+ * - Dual response format support: both Claude nested format and Cursor flat format
16
+ *
17
+ * Input formats (both accepted):
18
+ * Cursor native: { tool_name, tool_input, tool_output, tool_use_id, cwd, ... }
19
+ * Claude Code compat: { tool_name, tool_input, tool_output, session_id, cwd, ... }
20
+ * (CLAUDE_PROJECT_DIR env var set in Claude Code compat mode)
21
+ *
22
+ * Exit codes:
23
+ * 0 — no critical violations found
24
+ * 2 — critical violations found (blocks the action, additional_context injected)
25
+ * 1 — internal error (adapter crash, not violation-related)
26
+ */
27
+ import type { HookAuditOutput } from './core.js';
28
+ export interface CursorPostToolUse {
29
+ tool_name?: string;
30
+ tool_input?: Record<string, unknown>;
31
+ tool_output?: unknown;
32
+ tool_use_id?: string;
33
+ toolName?: string;
34
+ toolInput?: Record<string, unknown>;
35
+ toolOutput?: unknown;
36
+ session_id?: string;
37
+ transcript_path?: string;
38
+ cwd?: string;
39
+ }
40
+ export interface CursorHookResult {
41
+ exitCode: number;
42
+ stdout: string;
43
+ stderr: string;
44
+ }
45
+ /**
46
+ * Detect whether this is a Write/Edit tool invocation we should audit.
47
+ */
48
+ export declare function isWriteOrEdit(event: CursorPostToolUse): boolean;
49
+ /**
50
+ * Extract the edited file path from tool_input.
51
+ * Cursor Write: tool_input.file_path
52
+ * Claude Code Edit: tool_input.file_path
53
+ */
54
+ export declare function extractFilePath(event: CursorPostToolUse): string | null;
55
+ /**
56
+ * Build the additional_context string for violations.
57
+ */
58
+ export declare function formatViolationContext(output: HookAuditOutput): {
59
+ context: string;
60
+ isBlocking: boolean;
61
+ };
62
+ /**
63
+ * Process a Cursor postToolUse event and return the hook result.
64
+ * Extracted from main() for testability — tests inject a mock audit function.
65
+ */
66
+ export declare function processCursorEvent(rawStdin: string, auditFn?: (filePaths: string[], projectRoot: string) => Promise<HookAuditOutput>): Promise<CursorHookResult>;
67
+ /**
68
+ * CLI entry point — reads stdin, processes, writes result, exits.
69
+ * Exported so the CLI can call it explicitly after importing.
70
+ */
71
+ export declare function main(): Promise<void>;
72
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/hooks/cursor.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGjD,MAAM,WAAW,iBAAiB;IAEhC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAK/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAQvE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB,CAgDA;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAChB,GAC7D,OAAO,CAAC,gBAAgB,CAAC,CAyD3B;AAED;;;GAGG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAW1C"}