@aicqtools/guardrail 1.0.0-alpha.10

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 (297) hide show
  1. package/LICENSE +21 -0
  2. package/dist/docs/build.d.ts +12 -0
  3. package/dist/docs/build.d.ts.map +1 -0
  4. package/dist/docs/build.js +23 -0
  5. package/dist/docs/build.js.map +1 -0
  6. package/dist/docs/index.d.ts +4 -0
  7. package/dist/docs/index.d.ts.map +1 -0
  8. package/dist/docs/index.js +3 -0
  9. package/dist/docs/index.js.map +1 -0
  10. package/dist/docs/render-rule-md.d.ts +4 -0
  11. package/dist/docs/render-rule-md.d.ts.map +1 -0
  12. package/dist/docs/render-rule-md.js +117 -0
  13. package/dist/docs/render-rule-md.js.map +1 -0
  14. package/dist/index.d.ts +14 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +8 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/matcher/index.d.ts +4 -0
  19. package/dist/matcher/index.d.ts.map +1 -0
  20. package/dist/matcher/index.js +3 -0
  21. package/dist/matcher/index.js.map +1 -0
  22. package/dist/matcher/traverse.d.ts +3 -0
  23. package/dist/matcher/traverse.d.ts.map +1 -0
  24. package/dist/matcher/traverse.js +9 -0
  25. package/dist/matcher/traverse.js.map +1 -0
  26. package/dist/matcher/yaml-rule.d.ts +34 -0
  27. package/dist/matcher/yaml-rule.d.ts.map +1 -0
  28. package/dist/matcher/yaml-rule.js +32 -0
  29. package/dist/matcher/yaml-rule.js.map +1 -0
  30. package/dist/mcp/handlers.d.ts +36 -0
  31. package/dist/mcp/handlers.d.ts.map +1 -0
  32. package/dist/mcp/handlers.js +32 -0
  33. package/dist/mcp/handlers.js.map +1 -0
  34. package/dist/mcp/index.d.ts +6 -0
  35. package/dist/mcp/index.d.ts.map +1 -0
  36. package/dist/mcp/index.js +4 -0
  37. package/dist/mcp/index.js.map +1 -0
  38. package/dist/mcp/server.d.ts +9 -0
  39. package/dist/mcp/server.d.ts.map +1 -0
  40. package/dist/mcp/server.js +53 -0
  41. package/dist/mcp/server.js.map +1 -0
  42. package/dist/mcp/stdio.d.ts +3 -0
  43. package/dist/mcp/stdio.d.ts.map +1 -0
  44. package/dist/mcp/stdio.js +8 -0
  45. package/dist/mcp/stdio.js.map +1 -0
  46. package/dist/rules-default/ai-explainability-metadata.d.ts +3 -0
  47. package/dist/rules-default/ai-explainability-metadata.d.ts.map +1 -0
  48. package/dist/rules-default/ai-explainability-metadata.js +41 -0
  49. package/dist/rules-default/ai-explainability-metadata.js.map +1 -0
  50. package/dist/rules-default/api-response-shape.d.ts +3 -0
  51. package/dist/rules-default/api-response-shape.d.ts.map +1 -0
  52. package/dist/rules-default/api-response-shape.js +52 -0
  53. package/dist/rules-default/api-response-shape.js.map +1 -0
  54. package/dist/rules-default/async-await-consistency.d.ts +3 -0
  55. package/dist/rules-default/async-await-consistency.d.ts.map +1 -0
  56. package/dist/rules-default/async-await-consistency.js +38 -0
  57. package/dist/rules-default/async-await-consistency.js.map +1 -0
  58. package/dist/rules-default/audit-log-ai-decision.d.ts +3 -0
  59. package/dist/rules-default/audit-log-ai-decision.d.ts.map +1 -0
  60. package/dist/rules-default/audit-log-ai-decision.js +33 -0
  61. package/dist/rules-default/audit-log-ai-decision.js.map +1 -0
  62. package/dist/rules-default/camelcase-migration-column.d.ts +3 -0
  63. package/dist/rules-default/camelcase-migration-column.d.ts.map +1 -0
  64. package/dist/rules-default/camelcase-migration-column.js +56 -0
  65. package/dist/rules-default/camelcase-migration-column.js.map +1 -0
  66. package/dist/rules-default/controller-needs-async-wrapper.d.ts +3 -0
  67. package/dist/rules-default/controller-needs-async-wrapper.d.ts.map +1 -0
  68. package/dist/rules-default/controller-needs-async-wrapper.js +56 -0
  69. package/dist/rules-default/controller-needs-async-wrapper.js.map +1 -0
  70. package/dist/rules-default/enforce-utf8-encoding.d.ts +10 -0
  71. package/dist/rules-default/enforce-utf8-encoding.d.ts.map +1 -0
  72. package/dist/rules-default/enforce-utf8-encoding.js +28 -0
  73. package/dist/rules-default/enforce-utf8-encoding.js.map +1 -0
  74. package/dist/rules-default/explicit-kst-timezone.d.ts +3 -0
  75. package/dist/rules-default/explicit-kst-timezone.d.ts.map +1 -0
  76. package/dist/rules-default/explicit-kst-timezone.js +49 -0
  77. package/dist/rules-default/explicit-kst-timezone.js.map +1 -0
  78. package/dist/rules-default/fk-needs-on-delete.d.ts +3 -0
  79. package/dist/rules-default/fk-needs-on-delete.d.ts.map +1 -0
  80. package/dist/rules-default/fk-needs-on-delete.js +54 -0
  81. package/dist/rules-default/fk-needs-on-delete.js.map +1 -0
  82. package/dist/rules-default/human-oversight-checkpoint.d.ts +3 -0
  83. package/dist/rules-default/human-oversight-checkpoint.d.ts.map +1 -0
  84. package/dist/rules-default/human-oversight-checkpoint.js +37 -0
  85. package/dist/rules-default/human-oversight-checkpoint.js.map +1 -0
  86. package/dist/rules-default/index.d.ts +6 -0
  87. package/dist/rules-default/index.d.ts.map +1 -0
  88. package/dist/rules-default/index.js +138 -0
  89. package/dist/rules-default/index.js.map +1 -0
  90. package/dist/rules-default/korean-comment-encoding.d.ts +3 -0
  91. package/dist/rules-default/korean-comment-encoding.d.ts.map +1 -0
  92. package/dist/rules-default/korean-comment-encoding.js +28 -0
  93. package/dist/rules-default/korean-comment-encoding.js.map +1 -0
  94. package/dist/rules-default/mask-card-number.d.ts +3 -0
  95. package/dist/rules-default/mask-card-number.d.ts.map +1 -0
  96. package/dist/rules-default/mask-card-number.js +45 -0
  97. package/dist/rules-default/mask-card-number.js.map +1 -0
  98. package/dist/rules-default/mask-pii-in-ai-prompt.d.ts +3 -0
  99. package/dist/rules-default/mask-pii-in-ai-prompt.d.ts.map +1 -0
  100. package/dist/rules-default/mask-pii-in-ai-prompt.js +41 -0
  101. package/dist/rules-default/mask-pii-in-ai-prompt.js.map +1 -0
  102. package/dist/rules-default/naver-kakao-oauth-webview.d.ts +3 -0
  103. package/dist/rules-default/naver-kakao-oauth-webview.d.ts.map +1 -0
  104. package/dist/rules-default/naver-kakao-oauth-webview.js +40 -0
  105. package/dist/rules-default/naver-kakao-oauth-webview.js.map +1 -0
  106. package/dist/rules-default/no-bare-except.d.ts +7 -0
  107. package/dist/rules-default/no-bare-except.d.ts.map +1 -0
  108. package/dist/rules-default/no-bare-except.js +23 -0
  109. package/dist/rules-default/no-bare-except.js.map +1 -0
  110. package/dist/rules-default/no-bare-throw.d.ts +7 -0
  111. package/dist/rules-default/no-bare-throw.d.ts.map +1 -0
  112. package/dist/rules-default/no-bare-throw.js +32 -0
  113. package/dist/rules-default/no-bare-throw.js.map +1 -0
  114. package/dist/rules-default/no-boolean-trap.d.ts +8 -0
  115. package/dist/rules-default/no-boolean-trap.d.ts.map +1 -0
  116. package/dist/rules-default/no-boolean-trap.js +33 -0
  117. package/dist/rules-default/no-boolean-trap.js.map +1 -0
  118. package/dist/rules-default/no-console-log.d.ts +3 -0
  119. package/dist/rules-default/no-console-log.d.ts.map +1 -0
  120. package/dist/rules-default/no-console-log.js +27 -0
  121. package/dist/rules-default/no-console-log.js.map +1 -0
  122. package/dist/rules-default/no-cvv-logging.d.ts +3 -0
  123. package/dist/rules-default/no-cvv-logging.d.ts.map +1 -0
  124. package/dist/rules-default/no-cvv-logging.js +36 -0
  125. package/dist/rules-default/no-cvv-logging.js.map +1 -0
  126. package/dist/rules-default/no-default-export-from-libs.d.ts +7 -0
  127. package/dist/rules-default/no-default-export-from-libs.d.ts.map +1 -0
  128. package/dist/rules-default/no-default-export-from-libs.js +24 -0
  129. package/dist/rules-default/no-default-export-from-libs.js.map +1 -0
  130. package/dist/rules-default/no-direct-anthropic.yaml +15 -0
  131. package/dist/rules-default/no-direct-openai.yaml +17 -0
  132. package/dist/rules-default/no-empty-catch.d.ts +3 -0
  133. package/dist/rules-default/no-empty-catch.d.ts.map +1 -0
  134. package/dist/rules-default/no-empty-catch.js +37 -0
  135. package/dist/rules-default/no-empty-catch.js.map +1 -0
  136. package/dist/rules-default/no-fstring-sql.d.ts +3 -0
  137. package/dist/rules-default/no-fstring-sql.d.ts.map +1 -0
  138. package/dist/rules-default/no-fstring-sql.js +24 -0
  139. package/dist/rules-default/no-fstring-sql.js.map +1 -0
  140. package/dist/rules-default/no-id-overwrite.d.ts +8 -0
  141. package/dist/rules-default/no-id-overwrite.d.ts.map +1 -0
  142. package/dist/rules-default/no-id-overwrite.js +27 -0
  143. package/dist/rules-default/no-id-overwrite.js.map +1 -0
  144. package/dist/rules-default/no-inline-date.yaml +9 -0
  145. package/dist/rules-default/no-inline-math-round.yaml +12 -0
  146. package/dist/rules-default/no-jsonb-circular.d.ts +3 -0
  147. package/dist/rules-default/no-jsonb-circular.d.ts.map +1 -0
  148. package/dist/rules-default/no-jsonb-circular.js +33 -0
  149. package/dist/rules-default/no-jsonb-circular.js.map +1 -0
  150. package/dist/rules-default/no-magic-number.d.ts +3 -0
  151. package/dist/rules-default/no-magic-number.d.ts.map +1 -0
  152. package/dist/rules-default/no-magic-number.js +145 -0
  153. package/dist/rules-default/no-magic-number.js.map +1 -0
  154. package/dist/rules-default/no-mutable-default-arg.d.ts +3 -0
  155. package/dist/rules-default/no-mutable-default-arg.d.ts.map +1 -0
  156. package/dist/rules-default/no-mutable-default-arg.js +30 -0
  157. package/dist/rules-default/no-mutable-default-arg.js.map +1 -0
  158. package/dist/rules-default/no-pickle.yaml +12 -0
  159. package/dist/rules-default/no-plain-card-number.d.ts +3 -0
  160. package/dist/rules-default/no-plain-card-number.d.ts.map +1 -0
  161. package/dist/rules-default/no-plain-card-number.js +51 -0
  162. package/dist/rules-default/no-plain-card-number.js.map +1 -0
  163. package/dist/rules-default/no-print-in-prod.yaml +9 -0
  164. package/dist/rules-default/no-process-env-leak.d.ts +7 -0
  165. package/dist/rules-default/no-process-env-leak.d.ts.map +1 -0
  166. package/dist/rules-default/no-process-env-leak.js +37 -0
  167. package/dist/rules-default/no-process-env-leak.js.map +1 -0
  168. package/dist/rules-default/no-shell-true.d.ts +3 -0
  169. package/dist/rules-default/no-shell-true.d.ts.map +1 -0
  170. package/dist/rules-default/no-shell-true.js +42 -0
  171. package/dist/rules-default/no-shell-true.js.map +1 -0
  172. package/dist/rules-default/prefer-const-array.d.ts +9 -0
  173. package/dist/rules-default/prefer-const-array.d.ts.map +1 -0
  174. package/dist/rules-default/prefer-const-array.js +34 -0
  175. package/dist/rules-default/prefer-const-array.js.map +1 -0
  176. package/dist/rules-default/prefer-named-imports.d.ts +8 -0
  177. package/dist/rules-default/prefer-named-imports.d.ts.map +1 -0
  178. package/dist/rules-default/prefer-named-imports.js +25 -0
  179. package/dist/rules-default/prefer-named-imports.js.map +1 -0
  180. package/dist/rules-default/preserve-transaction-log.d.ts +3 -0
  181. package/dist/rules-default/preserve-transaction-log.d.ts.map +1 -0
  182. package/dist/rules-default/preserve-transaction-log.js +33 -0
  183. package/dist/rules-default/preserve-transaction-log.js.map +1 -0
  184. package/dist/rules-default/pytest-fixture-naming.d.ts +3 -0
  185. package/dist/rules-default/pytest-fixture-naming.d.ts.map +1 -0
  186. package/dist/rules-default/pytest-fixture-naming.js +36 -0
  187. package/dist/rules-default/pytest-fixture-naming.js.map +1 -0
  188. package/dist/rules-default/requests-needs-timeout.d.ts +3 -0
  189. package/dist/rules-default/requests-needs-timeout.d.ts.map +1 -0
  190. package/dist/rules-default/requests-needs-timeout.js +43 -0
  191. package/dist/rules-default/requests-needs-timeout.js.map +1 -0
  192. package/dist/rules-default/require-idempotency-key.d.ts +3 -0
  193. package/dist/rules-default/require-idempotency-key.d.ts.map +1 -0
  194. package/dist/rules-default/require-idempotency-key.js +47 -0
  195. package/dist/rules-default/require-idempotency-key.js.map +1 -0
  196. package/dist/rules-default/require-tls-1-2-plus.d.ts +3 -0
  197. package/dist/rules-default/require-tls-1-2-plus.d.ts.map +1 -0
  198. package/dist/rules-default/require-tls-1-2-plus.js +30 -0
  199. package/dist/rules-default/require-tls-1-2-plus.js.map +1 -0
  200. package/dist/rules-default/rfc5987-korean-filename.d.ts +3 -0
  201. package/dist/rules-default/rfc5987-korean-filename.d.ts.map +1 -0
  202. package/dist/rules-default/rfc5987-korean-filename.js +32 -0
  203. package/dist/rules-default/rfc5987-korean-filename.js.map +1 -0
  204. package/dist/rules-default/route-needs-auth.d.ts +3 -0
  205. package/dist/rules-default/route-needs-auth.d.ts.map +1 -0
  206. package/dist/rules-default/route-needs-auth.js +48 -0
  207. package/dist/rules-default/route-needs-auth.js.map +1 -0
  208. package/dist/rules-default/route-needs-rate-limit.d.ts +3 -0
  209. package/dist/rules-default/route-needs-rate-limit.d.ts.map +1 -0
  210. package/dist/rules-default/route-needs-rate-limit.js +47 -0
  211. package/dist/rules-default/route-needs-rate-limit.js.map +1 -0
  212. package/dist/rules-default/separate-refund-permission.d.ts +3 -0
  213. package/dist/rules-default/separate-refund-permission.d.ts.map +1 -0
  214. package/dist/rules-default/separate-refund-permission.js +33 -0
  215. package/dist/rules-default/separate-refund-permission.js.map +1 -0
  216. package/dist/rules-default/track-ai-model-version.d.ts +3 -0
  217. package/dist/rules-default/track-ai-model-version.d.ts.map +1 -0
  218. package/dist/rules-default/track-ai-model-version.js +37 -0
  219. package/dist/rules-default/track-ai-model-version.js.map +1 -0
  220. package/dist/rules-default/type-hint-required-public.d.ts +10 -0
  221. package/dist/rules-default/type-hint-required-public.d.ts.map +1 -0
  222. package/dist/rules-default/type-hint-required-public.js +29 -0
  223. package/dist/rules-default/type-hint-required-public.js.map +1 -0
  224. package/dist/rules-default/verify-pg-response.d.ts +3 -0
  225. package/dist/rules-default/verify-pg-response.d.ts.map +1 -0
  226. package/dist/rules-default/verify-pg-response.js +37 -0
  227. package/dist/rules-default/verify-pg-response.js.map +1 -0
  228. package/dist/rules-default/won-format-thousands.d.ts +3 -0
  229. package/dist/rules-default/won-format-thousands.d.ts.map +1 -0
  230. package/dist/rules-default/won-format-thousands.js +24 -0
  231. package/dist/rules-default/won-format-thousands.js.map +1 -0
  232. package/dist/runner/apply-rule-config.d.ts +69 -0
  233. package/dist/runner/apply-rule-config.d.ts.map +1 -0
  234. package/dist/runner/apply-rule-config.js +164 -0
  235. package/dist/runner/apply-rule-config.js.map +1 -0
  236. package/dist/runner/context.d.ts +12 -0
  237. package/dist/runner/context.d.ts.map +1 -0
  238. package/dist/runner/context.js +34 -0
  239. package/dist/runner/context.js.map +1 -0
  240. package/dist/runner/index.d.ts +9 -0
  241. package/dist/runner/index.d.ts.map +1 -0
  242. package/dist/runner/index.js +6 -0
  243. package/dist/runner/index.js.map +1 -0
  244. package/dist/runner/ruleset-signature.d.ts +4 -0
  245. package/dist/runner/ruleset-signature.d.ts.map +1 -0
  246. package/dist/runner/ruleset-signature.js +11 -0
  247. package/dist/runner/ruleset-signature.js.map +1 -0
  248. package/dist/runner/run-file.d.ts +10 -0
  249. package/dist/runner/run-file.d.ts.map +1 -0
  250. package/dist/runner/run-file.js +48 -0
  251. package/dist/runner/run-file.js.map +1 -0
  252. package/dist/runner/run-project.d.ts +30 -0
  253. package/dist/runner/run-project.d.ts.map +1 -0
  254. package/dist/runner/run-project.js +118 -0
  255. package/dist/runner/run-project.js.map +1 -0
  256. package/dist/runner/run-rule.d.ts +5 -0
  257. package/dist/runner/run-rule.d.ts.map +1 -0
  258. package/dist/runner/run-rule.js +53 -0
  259. package/dist/runner/run-rule.js.map +1 -0
  260. package/dist/runner/suppressions.d.ts +37 -0
  261. package/dist/runner/suppressions.d.ts.map +1 -0
  262. package/dist/runner/suppressions.js +127 -0
  263. package/dist/runner/suppressions.js.map +1 -0
  264. package/dist/suggest/analyze.d.ts +10 -0
  265. package/dist/suggest/analyze.d.ts.map +1 -0
  266. package/dist/suggest/analyze.js +193 -0
  267. package/dist/suggest/analyze.js.map +1 -0
  268. package/dist/suggest/format.d.ts +13 -0
  269. package/dist/suggest/format.d.ts.map +1 -0
  270. package/dist/suggest/format.js +120 -0
  271. package/dist/suggest/format.js.map +1 -0
  272. package/dist/suggest/index.d.ts +5 -0
  273. package/dist/suggest/index.d.ts.map +1 -0
  274. package/dist/suggest/index.js +4 -0
  275. package/dist/suggest/index.js.map +1 -0
  276. package/dist/suggest/mine.d.ts +11 -0
  277. package/dist/suggest/mine.d.ts.map +1 -0
  278. package/dist/suggest/mine.js +207 -0
  279. package/dist/suggest/mine.js.map +1 -0
  280. package/dist/suggest/types.d.ts +74 -0
  281. package/dist/suggest/types.d.ts.map +1 -0
  282. package/dist/suggest/types.js +2 -0
  283. package/dist/suggest/types.js.map +1 -0
  284. package/dist/sync/index.d.ts +5 -0
  285. package/dist/sync/index.d.ts.map +1 -0
  286. package/dist/sync/index.js +3 -0
  287. package/dist/sync/index.js.map +1 -0
  288. package/dist/sync/render.d.ts +9 -0
  289. package/dist/sync/render.d.ts.map +1 -0
  290. package/dist/sync/render.js +70 -0
  291. package/dist/sync/render.js.map +1 -0
  292. package/dist/sync/sync-files.d.ts +12 -0
  293. package/dist/sync/sync-files.d.ts.map +1 -0
  294. package/dist/sync/sync-files.js +29 -0
  295. package/dist/sync/sync-files.js.map +1 -0
  296. package/package.json +71 -0
  297. package/scripts/copy-yaml-rules.mjs +19 -0
@@ -0,0 +1,33 @@
1
+ import { defineRule } from '@aicqtools/rule-sdk';
2
+ /**
3
+ * Refund operations are highly privileged — separation of duties requires
4
+ * a permission check before invoking any refund logic. Detect functions
5
+ * named `refund*` whose body lacks a permission/role check.
6
+ */
7
+ const REFUND_NAME = /^(refund|cancelRefund|issueRefund|refund\w*)$/;
8
+ const PERMISSION_CHECK = /\b(req\.user\.role|hasPermission|checkPermission|isAdmin|requireRole|allowedRoles|authGuard|RBAC|canRefund|verifyPermission)\b/i;
9
+ function check(node, ctx) {
10
+ const name = node.childForFieldName('name');
11
+ if (!name)
12
+ return;
13
+ const fnName = ctx.textOf(name);
14
+ if (!REFUND_NAME.test(fnName))
15
+ return;
16
+ const text = ctx.textOf(node);
17
+ if (PERMISSION_CHECK.test(text))
18
+ return;
19
+ ctx.report({ node });
20
+ }
21
+ export default defineRule({
22
+ id: 'separate-refund-permission',
23
+ language: ['typescript', 'tsx'],
24
+ severity: 'error',
25
+ message: 'Refund function lacks a permission/role check (PCI DSS § 7.2 — restrict access by business need-to-know; separation of duties).',
26
+ messageKo: '환불 함수에 권한 체크가 없습니다 (PCI DSS § 7.2 — 업무 필요에 따른 접근 제한; 직무 분리 원칙).',
27
+ docs: 'https://github.com/aicqtools/aicqtools/blob/main/docs/rules/separate-refund-permission.md',
28
+ visitors: {
29
+ function_declaration: check,
30
+ method_definition: check,
31
+ },
32
+ });
33
+ //# sourceMappingURL=separate-refund-permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"separate-refund-permission.js","sourceRoot":"","sources":["../../src/rules-default/separate-refund-permission.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD;;;;GAIG;AACH,MAAM,WAAW,GAAG,+CAA+C,CAAC;AACpE,MAAM,gBAAgB,GAAG,iIAAiI,CAAC;AAE3J,SAAS,KAAK,CAAC,IAAuB,EAAE,GAAgB;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IACxC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,4BAA4B;IAChC,QAAQ,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;IAC/B,QAAQ,EAAE,OAAO;IACjB,OAAO,EAAE,iIAAiI;IAC1I,SAAS,EAAE,iEAAiE;IAC5E,IAAI,EAAE,2FAA2F;IACjG,QAAQ,EAAE;QACR,oBAAoB,EAAE,KAAK;QAC3B,iBAAiB,EAAE,KAAK;KACzB;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@aicqtools/rule-sdk").FunctionRule;
2
+ export default _default;
3
+ //# sourceMappingURL=track-ai-model-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-ai-model-version.d.ts","sourceRoot":"","sources":["../../src/rules-default/track-ai-model-version.ts"],"names":[],"mappings":";AAeA,wBAoBG"}
@@ -0,0 +1,37 @@
1
+ import { defineRule } from '@aicqtools/rule-sdk';
2
+ /**
3
+ * FSC AI guideline: AI inference calls must specify the model name explicitly
4
+ * so audits can trace which model produced a given decision. Detect calls to
5
+ * `openai.chat.completions.create()` / `anthropic.messages.create()` whose
6
+ * argument object lacks a `model:` property.
7
+ *
8
+ * Limitation: false negatives when the options object is built elsewhere and
9
+ * passed in as a variable.
10
+ */
11
+ const TARGET_FN = /\b(openai\.chat\.completions\.create|anthropic\.messages\.create|openai\.completions\.create)$/;
12
+ export default defineRule({
13
+ id: 'track-ai-model-version',
14
+ language: ['typescript', 'tsx'],
15
+ severity: 'warning',
16
+ message: 'AI inference call missing explicit `model:` parameter (FSC AI guideline — model governance).',
17
+ messageKo: 'AI 추론 호출에 `model:` 파라미터가 명시되지 않았습니다 (금감원 AI 가이드라인 — 모델 거버넌스).',
18
+ docs: 'https://github.com/aicqtools/aicqtools/blob/main/docs/rules/track-ai-model-version.md',
19
+ visitors: {
20
+ call_expression(node, ctx) {
21
+ const fnNode = node.childForFieldName('function');
22
+ if (!fnNode)
23
+ return;
24
+ const fnText = ctx.textOf(fnNode);
25
+ if (!TARGET_FN.test(fnText))
26
+ return;
27
+ const args = node.childForFieldName('arguments');
28
+ if (!args)
29
+ return;
30
+ const argsText = ctx.textOf(args);
31
+ if (/\bmodel\s*:/.test(argsText))
32
+ return;
33
+ ctx.report({ node });
34
+ },
35
+ },
36
+ });
37
+ //# sourceMappingURL=track-ai-model-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-ai-model-version.js","sourceRoot":"","sources":["../../src/rules-default/track-ai-model-version.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD;;;;;;;;GAQG;AACH,MAAM,SAAS,GAAG,gGAAgG,CAAC;AAEnH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,wBAAwB;IAC5B,QAAQ,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;IAC/B,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,8FAA8F;IACvG,SAAS,EAAE,+DAA+D;IAC1E,IAAI,EAAE,uFAAuF;IAC7F,QAAQ,EAAE;QACR,eAAe,CAAC,IAAuB,EAAE,GAAgB;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAO;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,OAAO;YACzC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACvB,CAAC;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Public functions (not starting with `_`) should have a return type annotation.
3
+ * Helps catch type errors and serves as inline documentation.
4
+ *
5
+ * Heuristic: looks for `-> Type:` after parameter list. False positives possible
6
+ * for functions that genuinely have no useful return type, but that's rare.
7
+ */
8
+ declare const _default: import("@aicqtools/rule-sdk").FunctionRule;
9
+ export default _default;
10
+ //# sourceMappingURL=type-hint-required-public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-hint-required-public.d.ts","sourceRoot":"","sources":["../../src/rules-default/type-hint-required-public.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;;AACH,wBAgBG"}
@@ -0,0 +1,29 @@
1
+ import { defineRule } from '@aicqtools/rule-sdk';
2
+ /**
3
+ * Public functions (not starting with `_`) should have a return type annotation.
4
+ * Helps catch type errors and serves as inline documentation.
5
+ *
6
+ * Heuristic: looks for `-> Type:` after parameter list. False positives possible
7
+ * for functions that genuinely have no useful return type, but that's rare.
8
+ */
9
+ export default defineRule({
10
+ id: 'type-hint-required-public',
11
+ language: 'python',
12
+ severity: 'info',
13
+ message: 'Public function is missing a return type annotation (`-> Type:`).',
14
+ messageKo: 'public 함수에 반환 타입 어노테이션 누락 (`-> Type:`).',
15
+ visitors: {
16
+ function_definition(node, ctx) {
17
+ const name = node.childForFieldName('name');
18
+ if (!name)
19
+ return;
20
+ const nameText = ctx.textOf(name);
21
+ if (nameText.startsWith('_'))
22
+ return;
23
+ const returnType = node.childForFieldName('return_type');
24
+ if (!returnType)
25
+ ctx.report({ node: name });
26
+ },
27
+ },
28
+ });
29
+ //# sourceMappingURL=type-hint-required-public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-hint-required-public.js","sourceRoot":"","sources":["../../src/rules-default/type-hint-required-public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;GAMG;AACH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,2BAA2B;IAC/B,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,mEAAmE;IAC5E,SAAS,EAAE,yCAAyC;IACpD,QAAQ,EAAE;QACR,mBAAmB,CAAC,IAAI,EAAE,GAAG;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU;gBAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@aicqtools/rule-sdk").FunctionRule;
2
+ export default _default;
3
+ //# sourceMappingURL=verify-pg-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-pg-response.d.ts","sourceRoot":"","sources":["../../src/rules-default/verify-pg-response.ts"],"names":[],"mappings":";AA0BA,wBAYG"}
@@ -0,0 +1,37 @@
1
+ import { defineRule } from '@aicqtools/rule-sdk';
2
+ /**
3
+ * PCI DSS / payment-domain best practice: external PG (payment gateway)
4
+ * responses must be verified (signature/hash/checksum) before being
5
+ * trusted for downstream state changes.
6
+ *
7
+ * Heuristic: function bodies that contain a PG-domain HTTP call
8
+ * (`/payments`, `/pay`, `pg.`) and proceed without invoking
9
+ * `signature` / `hash` / `checksum` / `verify`.
10
+ *
11
+ * Limitation: false negatives if verification is delegated to a wrapper
12
+ * function. Severity is `warning` to limit noise.
13
+ */
14
+ const PG_CALL = /\b(axios|fetch|got|http\.(get|post)|httpClient)\b.*\b(payments?|pg|inicis|toss|kakao|naver)\b/i;
15
+ const VERIFICATION = /\b(signature|hash|checksum|verify|hmac|hmacSha)\b/i;
16
+ function check(node, ctx) {
17
+ const text = ctx.textOf(node);
18
+ if (!PG_CALL.test(text))
19
+ return;
20
+ if (VERIFICATION.test(text))
21
+ return;
22
+ ctx.report({ node });
23
+ }
24
+ export default defineRule({
25
+ id: 'verify-pg-response',
26
+ language: ['typescript', 'tsx'],
27
+ severity: 'warning',
28
+ message: 'Payment gateway response is consumed without signature/hash verification (PCI DSS § 6.2.4 — input validation; payment-domain best practice).',
29
+ messageKo: '결제 게이트웨이 응답을 서명/해시 검증 없이 사용합니다 (PCI DSS § 6.2.4 — 입력 검증; 결제 도메인 권장 사항).',
30
+ docs: 'https://github.com/aicqtools/aicqtools/blob/main/docs/rules/verify-pg-response.md',
31
+ visitors: {
32
+ function_declaration: check,
33
+ arrow_function: check,
34
+ method_definition: check,
35
+ },
36
+ });
37
+ //# sourceMappingURL=verify-pg-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-pg-response.js","sourceRoot":"","sources":["../../src/rules-default/verify-pg-response.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,GAAG,gGAAgG,CAAC;AACjH,MAAM,YAAY,GAAG,oDAAoD,CAAC;AAE1E,SAAS,KAAK,CAAC,IAAuB,EAAE,GAAgB;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IAChC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IACpC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,oBAAoB;IACxB,QAAQ,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;IAC/B,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,8IAA8I;IACvJ,SAAS,EAAE,yEAAyE;IACpF,IAAI,EAAE,mFAAmF;IACzF,QAAQ,EAAE;QACR,oBAAoB,EAAE,KAAK;QAC3B,cAAc,EAAE,KAAK;QACrB,iBAAiB,EAAE,KAAK;KACzB;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@aicqtools/rule-sdk").FunctionRule;
2
+ export default _default;
3
+ //# sourceMappingURL=won-format-thousands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"won-format-thousands.d.ts","sourceRoot":"","sources":["../../src/rules-default/won-format-thousands.ts"],"names":[],"mappings":";AAWA,wBAYG"}
@@ -0,0 +1,24 @@
1
+ import { defineRule } from '@aicqtools/rule-sdk';
2
+ /**
3
+ * Detect string literals like `"5000원"` or `"50000원"` (≥4 digits) without a thousands
4
+ * separator. UX best practice in Korea: always show ₩ amounts as `5,000원`.
5
+ *
6
+ * Known limitation: doesn't catch programmatically-formatted amounts (template literals
7
+ * with computed values are intentionally skipped to avoid false positives).
8
+ */
9
+ const WON_NUMBER_PATTERN = /["'`](\d{4,})원["'`]/;
10
+ export default defineRule({
11
+ id: 'won-format-thousands',
12
+ language: ['typescript', 'javascript', 'tsx'],
13
+ severity: 'info',
14
+ message: 'Won amount should use thousands separator: `5,000원` instead of `5000원`.',
15
+ messageKo: '원화 금액은 천단위 콤마 권장: `5000원` → `5,000원`.',
16
+ visitors: {
17
+ string(node, ctx) {
18
+ const text = ctx.textOf(node);
19
+ if (WON_NUMBER_PATTERN.test(text))
20
+ ctx.report({ node });
21
+ },
22
+ },
23
+ });
24
+ //# sourceMappingURL=won-format-thousands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"won-format-thousands.js","sourceRoot":"","sources":["../../src/rules-default/won-format-thousands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAEjD,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,sBAAsB;IAC1B,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC;IAC7C,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,yEAAyE;IAClF,SAAS,EAAE,uCAAuC;IAClD,QAAQ,EAAE;QACR,MAAM,CAAC,IAAI,EAAE,GAAG;YACd,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,69 @@
1
+ import type { RuleOverride } from '@aicqtools/core';
2
+ import type { Rule } from '@aicqtools/rule-sdk';
3
+ /**
4
+ * Resolution of `config.modules.guardrail.rules` (the `{ ruleId: 'off' | 'warn' | 'error' }` map)
5
+ * against the loaded rule set. Filters out `off`'d rules, overrides severity for `warn`/`error`
6
+ * entries, and reports unknown rule ids back to the caller so the CLI can warn the user once.
7
+ */
8
+ export interface ApplyRuleConfigResult {
9
+ readonly rules: readonly Rule[];
10
+ /** rule ids that appeared in the config map but matched no loaded rule */
11
+ readonly unknownIds: readonly string[];
12
+ }
13
+ type RuleLevel = 'off' | 'warn' | 'error';
14
+ /**
15
+ * Apply the user-supplied `rules:` map to a loaded rule list.
16
+ *
17
+ * - `off` → drop the rule from the returned list
18
+ * - `warn`/`error` → return a copy of the rule with `severity` overridden
19
+ * - missing entry → rule passes through unchanged
20
+ *
21
+ * Map keys that don't correspond to any loaded rule are collected in `unknownIds`. The function
22
+ * never throws; an invalid level value (should already be rejected by zod) is treated as "no
23
+ * override" rather than crashing the run.
24
+ */
25
+ export declare function applyRuleConfig(rules: readonly Rule[], cfgMap: Readonly<Record<string, RuleLevel>> | undefined): ApplyRuleConfigResult;
26
+ /**
27
+ * Auto-anchor a single `overrides.paths` glob (alpha.10).
28
+ *
29
+ * `fast-glob` returns absolute file paths, so a user-written `scripts/**` would silently never
30
+ * match. We prepend `**\/` unless the glob already carries an anchor token, mirroring the
31
+ * ESLint mental model where `paths: ['scripts/**']` means "any `scripts/` in the project":
32
+ *
33
+ * - leading `**` (with or without `/`) — already anchored, leave alone
34
+ * - leading `/` — Unix absolute path, user opted out of auto-anchor
35
+ * - leading `<letter>:/` — Windows drive path, same
36
+ * - leading `!` — negation; preserve the marker, normalize the body
37
+ *
38
+ * The function is pure and never throws. Empty input returns empty.
39
+ */
40
+ export declare function normalizeOverridePath(glob: string): string;
41
+ /**
42
+ * Apply per-path `overrides` (alpha.8) on top of an already-globally-resolved rule list.
43
+ *
44
+ * For each override entry whose `paths` globs match `filePath`, merge its `rules` map into a
45
+ * per-file effective level map. Later matching entries win for the same rule id (ESLint semantics).
46
+ * `off` drops the rule for this file; `warn`/`error` copies the rule with overridden severity.
47
+ *
48
+ * Fast path: if no overrides are configured, returns the input list unchanged so the file loop
49
+ * stays cheap when this feature is unused.
50
+ *
51
+ * Alpha.10: `paths` globs are auto-anchored via `normalizeOverridePath` so users can write
52
+ * `scripts/**` instead of `**\/scripts/**` and get the expected ESLint semantics. When the
53
+ * optional `matchCounts` array is provided, each matched override entry's slot is incremented;
54
+ * the caller (CLI) reads zero-valued slots to emit "matched no files — ignored." warnings.
55
+ */
56
+ export declare function applyOverridesForFile(baselineRules: readonly Rule[], overrides: readonly RuleOverride[], filePath: string, matchCounts?: number[]): readonly Rule[];
57
+ /**
58
+ * Collect rule ids referenced by `overrides` entries that don't match any loaded rule, paired
59
+ * with the index of the offending override entry. The caller (CLI) uses these to emit one
60
+ * stderr warning per typo so configuration mistakes surface early rather than silently no-op'ing.
61
+ */
62
+ export interface UnknownOverrideId {
63
+ readonly index: number;
64
+ readonly id: string;
65
+ readonly paths: readonly string[];
66
+ }
67
+ export declare function collectUnknownOverrideIds(baselineRules: readonly Rule[], overrides: readonly RuleOverride[]): readonly UnknownOverrideId[];
68
+ export {};
69
+ //# sourceMappingURL=apply-rule-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-rule-config.d.ts","sourceRoot":"","sources":["../../src/runner/apply-rule-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,KAAK,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAM1C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,GACtD,qBAAqB,CAgCvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAa1D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,SAAS,IAAI,EAAE,EAC9B,SAAS,EAAE,SAAS,YAAY,EAAE,EAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,SAAS,IAAI,EAAE,CAwCjB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,SAAS,IAAI,EAAE,EAC9B,SAAS,EAAE,SAAS,YAAY,EAAE,GACjC,SAAS,iBAAiB,EAAE,CAY9B"}
@@ -0,0 +1,164 @@
1
+ import micromatch from 'micromatch';
2
+ const LEVEL_TO_SEVERITY = {
3
+ warn: 'warning',
4
+ error: 'error',
5
+ };
6
+ /**
7
+ * Apply the user-supplied `rules:` map to a loaded rule list.
8
+ *
9
+ * - `off` → drop the rule from the returned list
10
+ * - `warn`/`error` → return a copy of the rule with `severity` overridden
11
+ * - missing entry → rule passes through unchanged
12
+ *
13
+ * Map keys that don't correspond to any loaded rule are collected in `unknownIds`. The function
14
+ * never throws; an invalid level value (should already be rejected by zod) is treated as "no
15
+ * override" rather than crashing the run.
16
+ */
17
+ export function applyRuleConfig(rules, cfgMap) {
18
+ if (!cfgMap || Object.keys(cfgMap).length === 0) {
19
+ return { rules, unknownIds: [] };
20
+ }
21
+ const knownIds = new Set(rules.map((r) => r.id));
22
+ const unknownIds = [];
23
+ for (const id of Object.keys(cfgMap)) {
24
+ if (!knownIds.has(id))
25
+ unknownIds.push(id);
26
+ }
27
+ const out = [];
28
+ for (const rule of rules) {
29
+ const level = cfgMap[rule.id];
30
+ if (level === undefined) {
31
+ out.push(rule);
32
+ continue;
33
+ }
34
+ if (level === 'off')
35
+ continue;
36
+ const severity = LEVEL_TO_SEVERITY[level];
37
+ if (!severity) {
38
+ // Unrecognized level — treat as no override, never crash.
39
+ out.push(rule);
40
+ continue;
41
+ }
42
+ // Copy with overridden severity. `Rule` is a discriminated union; preserve the union
43
+ // by re-spreading per branch.
44
+ if (rule.kind === 'function') {
45
+ out.push({ ...rule, severity });
46
+ }
47
+ else {
48
+ out.push({ ...rule, severity });
49
+ }
50
+ }
51
+ return { rules: out, unknownIds };
52
+ }
53
+ /**
54
+ * Auto-anchor a single `overrides.paths` glob (alpha.10).
55
+ *
56
+ * `fast-glob` returns absolute file paths, so a user-written `scripts/**` would silently never
57
+ * match. We prepend `**\/` unless the glob already carries an anchor token, mirroring the
58
+ * ESLint mental model where `paths: ['scripts/**']` means "any `scripts/` in the project":
59
+ *
60
+ * - leading `**` (with or without `/`) — already anchored, leave alone
61
+ * - leading `/` — Unix absolute path, user opted out of auto-anchor
62
+ * - leading `<letter>:/` — Windows drive path, same
63
+ * - leading `!` — negation; preserve the marker, normalize the body
64
+ *
65
+ * The function is pure and never throws. Empty input returns empty.
66
+ */
67
+ export function normalizeOverridePath(glob) {
68
+ if (!glob)
69
+ return glob;
70
+ let negation = '';
71
+ let body = glob;
72
+ if (body.startsWith('!')) {
73
+ negation = '!';
74
+ body = body.slice(1);
75
+ }
76
+ if (!body)
77
+ return negation;
78
+ if (body.startsWith('**'))
79
+ return negation + body;
80
+ if (body.startsWith('/'))
81
+ return negation + body;
82
+ if (/^[A-Za-z]:\//.test(body))
83
+ return negation + body;
84
+ return negation + '**/' + body;
85
+ }
86
+ /**
87
+ * Apply per-path `overrides` (alpha.8) on top of an already-globally-resolved rule list.
88
+ *
89
+ * For each override entry whose `paths` globs match `filePath`, merge its `rules` map into a
90
+ * per-file effective level map. Later matching entries win for the same rule id (ESLint semantics).
91
+ * `off` drops the rule for this file; `warn`/`error` copies the rule with overridden severity.
92
+ *
93
+ * Fast path: if no overrides are configured, returns the input list unchanged so the file loop
94
+ * stays cheap when this feature is unused.
95
+ *
96
+ * Alpha.10: `paths` globs are auto-anchored via `normalizeOverridePath` so users can write
97
+ * `scripts/**` instead of `**\/scripts/**` and get the expected ESLint semantics. When the
98
+ * optional `matchCounts` array is provided, each matched override entry's slot is incremented;
99
+ * the caller (CLI) reads zero-valued slots to emit "matched no files — ignored." warnings.
100
+ */
101
+ export function applyOverridesForFile(baselineRules, overrides, filePath, matchCounts) {
102
+ if (overrides.length === 0)
103
+ return baselineRules;
104
+ const normalized = filePath.replace(/\\/g, '/');
105
+ const effective = new Map();
106
+ let anyMatch = false;
107
+ for (let i = 0; i < overrides.length; i++) {
108
+ const ov = overrides[i];
109
+ if (!ov)
110
+ continue;
111
+ const paths = ov.paths.map(normalizeOverridePath);
112
+ const matched = micromatch.isMatch(normalized, paths, { dot: true }) ||
113
+ micromatch.isMatch(filePath, paths, { dot: true });
114
+ if (!matched)
115
+ continue;
116
+ anyMatch = true;
117
+ if (matchCounts)
118
+ matchCounts[i] = (matchCounts[i] ?? 0) + 1;
119
+ for (const [id, level] of Object.entries(ov.rules)) {
120
+ effective.set(id, level);
121
+ }
122
+ }
123
+ if (!anyMatch)
124
+ return baselineRules;
125
+ const out = [];
126
+ for (const rule of baselineRules) {
127
+ const level = effective.get(rule.id);
128
+ if (level === undefined) {
129
+ out.push(rule);
130
+ continue;
131
+ }
132
+ if (level === 'off')
133
+ continue;
134
+ const severity = LEVEL_TO_SEVERITY[level];
135
+ if (!severity) {
136
+ out.push(rule);
137
+ continue;
138
+ }
139
+ if (rule.kind === 'function') {
140
+ out.push({ ...rule, severity });
141
+ }
142
+ else {
143
+ out.push({ ...rule, severity });
144
+ }
145
+ }
146
+ return out;
147
+ }
148
+ export function collectUnknownOverrideIds(baselineRules, overrides) {
149
+ if (overrides.length === 0)
150
+ return [];
151
+ const knownIds = new Set(baselineRules.map((r) => r.id));
152
+ const out = [];
153
+ for (let i = 0; i < overrides.length; i++) {
154
+ const ov = overrides[i];
155
+ if (!ov)
156
+ continue;
157
+ for (const id of Object.keys(ov.rules)) {
158
+ if (!knownIds.has(id))
159
+ out.push({ index: i, id, paths: ov.paths });
160
+ }
161
+ }
162
+ return out;
163
+ }
164
+ //# sourceMappingURL=apply-rule-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-rule-config.js","sourceRoot":"","sources":["../../src/runner/apply-rule-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type Parser from 'tree-sitter';
2
+ import type { Diagnostic, Language, Range } from '@aicqtools/core';
3
+ import type { RuleContext, RuleMeta } from '@aicqtools/rule-sdk';
4
+ export declare function rangeOfNode(node: Parser.SyntaxNode): Range;
5
+ export interface RunContext {
6
+ readonly filePath: string;
7
+ readonly source: string;
8
+ readonly language: Language;
9
+ readonly diagnostics: Diagnostic[];
10
+ }
11
+ export declare function makeRuleContext(run: RunContext, meta: RuleMeta): RuleContext;
12
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/runner/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAY,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAc,MAAM,qBAAqB,CAAC;AAE7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAK1D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;CACpC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,WAAW,CA0B5E"}
@@ -0,0 +1,34 @@
1
+ export function rangeOfNode(node) {
2
+ return {
3
+ start: { line: node.startPosition.row + 1, column: node.startPosition.column + 1 },
4
+ end: { line: node.endPosition.row + 1, column: node.endPosition.column + 1 },
5
+ };
6
+ }
7
+ export function makeRuleContext(run, meta) {
8
+ return {
9
+ filePath: run.filePath,
10
+ source: run.source,
11
+ language: run.language,
12
+ textOf(node) {
13
+ return run.source.slice(node.startIndex, node.endIndex);
14
+ },
15
+ rangeOf(node) {
16
+ return rangeOfNode(node);
17
+ },
18
+ report(args) {
19
+ const diagnostic = {
20
+ ruleId: meta.id,
21
+ severity: meta.severity,
22
+ message: args.message ?? meta.message,
23
+ ...(args.messageKo ?? meta.messageKo
24
+ ? { messageKo: args.messageKo ?? meta.messageKo }
25
+ : {}),
26
+ file: run.filePath,
27
+ range: rangeOfNode(args.node),
28
+ ...(meta.docs ? { docs: meta.docs } : {}),
29
+ };
30
+ run.diagnostics.push(diagnostic);
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/runner/context.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,OAAO;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAClF,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;KAC7E,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,eAAe,CAAC,GAAe,EAAE,IAAc;IAC7D,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,CAAC,IAAI;YACT,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,IAAI;YACV,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,IAAgB;YACrB,MAAM,UAAU,GAAe;gBAC7B,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAoB;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;gBACrC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;oBAClC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;oBACjD,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,EAAE,GAAG,CAAC,QAAQ;gBAClB,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5B,CAAC;YAChB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { runFile, runFileWithSource } from './run-file.js';
2
+ export { runProject, resolveIgnores } from './run-project.js';
3
+ export { runRule } from './run-rule.js';
4
+ export { ruleSignature, rulesetSignature } from './ruleset-signature.js';
5
+ export { applyRuleConfig, applyOverridesForFile, collectUnknownOverrideIds, normalizeOverridePath } from './apply-rule-config.js';
6
+ export type { ApplyRuleConfigResult, UnknownOverrideId } from './apply-rule-config.js';
7
+ export type { RunFileResult } from './run-file.js';
8
+ export type { RunProjectOptions } from './run-project.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAClI,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACvF,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { runFile, runFileWithSource } from './run-file.js';
2
+ export { runProject, resolveIgnores } from './run-project.js';
3
+ export { runRule } from './run-rule.js';
4
+ export { ruleSignature, rulesetSignature } from './ruleset-signature.js';
5
+ export { applyRuleConfig, applyOverridesForFile, collectUnknownOverrideIds, normalizeOverridePath } from './apply-rule-config.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Rule } from '@aicqtools/rule-sdk';
2
+ export declare function ruleSignature(rule: Rule): string;
3
+ export declare function rulesetSignature(rules: readonly Rule[]): string[];
4
+ //# sourceMappingURL=ruleset-signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleset-signature.d.ts","sourceRoot":"","sources":["../../src/runner/ruleset-signature.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAMhD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,CAEjE"}
@@ -0,0 +1,11 @@
1
+ export function ruleSignature(rule) {
2
+ if (rule.kind === 'pattern') {
3
+ return `pattern:${rule.id}:${rule.severity}:${rule.query}`;
4
+ }
5
+ const visitorKeys = Object.keys(rule.visitors).sort().join(',');
6
+ return `function:${rule.id}:${rule.severity}:${visitorKeys}`;
7
+ }
8
+ export function rulesetSignature(rules) {
9
+ return rules.map(ruleSignature);
10
+ }
11
+ //# sourceMappingURL=ruleset-signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleset-signature.js","sourceRoot":"","sources":["../../src/runner/ruleset-signature.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,IAAU;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,WAAW,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7D,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,YAAY,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Diagnostic, Language } from '@aicqtools/core';
2
+ import type { Rule } from '@aicqtools/rule-sdk';
3
+ export interface RunFileResult {
4
+ readonly filePath: string;
5
+ readonly language: Language | null;
6
+ readonly diagnostics: readonly Diagnostic[];
7
+ }
8
+ export declare function runFile(filePath: string, rules: readonly Rule[]): Promise<RunFileResult>;
9
+ export declare function runFileWithSource(filePath: string, source: string, language: Language, rules: readonly Rule[]): RunFileResult;
10
+ //# sourceMappingURL=run-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-file.d.ts","sourceRoot":"","sources":["../../src/runner/run-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAIhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAM9F;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,SAAS,IAAI,EAAE,GACrB,aAAa,CAsBf"}