@opensip-cli/checks-universal 0.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 (620) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/all-checks-execute.test.d.ts +17 -0
  5. package/dist/__tests__/all-checks-execute.test.d.ts.map +1 -0
  6. package/dist/__tests__/all-checks-execute.test.js +452 -0
  7. package/dist/__tests__/all-checks-execute.test.js.map +1 -0
  8. package/dist/__tests__/behavior-fixtures-10.test.d.ts +8 -0
  9. package/dist/__tests__/behavior-fixtures-10.test.d.ts.map +1 -0
  10. package/dist/__tests__/behavior-fixtures-10.test.js +200 -0
  11. package/dist/__tests__/behavior-fixtures-10.test.js.map +1 -0
  12. package/dist/__tests__/behavior-fixtures-11.test.d.ts +8 -0
  13. package/dist/__tests__/behavior-fixtures-11.test.d.ts.map +1 -0
  14. package/dist/__tests__/behavior-fixtures-11.test.js +120 -0
  15. package/dist/__tests__/behavior-fixtures-11.test.js.map +1 -0
  16. package/dist/__tests__/behavior-fixtures-12.test.d.ts +8 -0
  17. package/dist/__tests__/behavior-fixtures-12.test.d.ts.map +1 -0
  18. package/dist/__tests__/behavior-fixtures-12.test.js +157 -0
  19. package/dist/__tests__/behavior-fixtures-12.test.js.map +1 -0
  20. package/dist/__tests__/behavior-fixtures-2.test.d.ts +8 -0
  21. package/dist/__tests__/behavior-fixtures-2.test.d.ts.map +1 -0
  22. package/dist/__tests__/behavior-fixtures-2.test.js +785 -0
  23. package/dist/__tests__/behavior-fixtures-2.test.js.map +1 -0
  24. package/dist/__tests__/behavior-fixtures-3.test.d.ts +6 -0
  25. package/dist/__tests__/behavior-fixtures-3.test.d.ts.map +1 -0
  26. package/dist/__tests__/behavior-fixtures-3.test.js +663 -0
  27. package/dist/__tests__/behavior-fixtures-3.test.js.map +1 -0
  28. package/dist/__tests__/behavior-fixtures-4.test.d.ts +5 -0
  29. package/dist/__tests__/behavior-fixtures-4.test.d.ts.map +1 -0
  30. package/dist/__tests__/behavior-fixtures-4.test.js +612 -0
  31. package/dist/__tests__/behavior-fixtures-4.test.js.map +1 -0
  32. package/dist/__tests__/behavior-fixtures-5.test.d.ts +5 -0
  33. package/dist/__tests__/behavior-fixtures-5.test.d.ts.map +1 -0
  34. package/dist/__tests__/behavior-fixtures-5.test.js +469 -0
  35. package/dist/__tests__/behavior-fixtures-5.test.js.map +1 -0
  36. package/dist/__tests__/behavior-fixtures-6.test.d.ts +8 -0
  37. package/dist/__tests__/behavior-fixtures-6.test.d.ts.map +1 -0
  38. package/dist/__tests__/behavior-fixtures-6.test.js +591 -0
  39. package/dist/__tests__/behavior-fixtures-6.test.js.map +1 -0
  40. package/dist/__tests__/behavior-fixtures-7.test.d.ts +5 -0
  41. package/dist/__tests__/behavior-fixtures-7.test.d.ts.map +1 -0
  42. package/dist/__tests__/behavior-fixtures-7.test.js +662 -0
  43. package/dist/__tests__/behavior-fixtures-7.test.js.map +1 -0
  44. package/dist/__tests__/behavior-fixtures-8.test.d.ts +11 -0
  45. package/dist/__tests__/behavior-fixtures-8.test.d.ts.map +1 -0
  46. package/dist/__tests__/behavior-fixtures-8.test.js +634 -0
  47. package/dist/__tests__/behavior-fixtures-8.test.js.map +1 -0
  48. package/dist/__tests__/behavior-fixtures-9.test.d.ts +11 -0
  49. package/dist/__tests__/behavior-fixtures-9.test.d.ts.map +1 -0
  50. package/dist/__tests__/behavior-fixtures-9.test.js +271 -0
  51. package/dist/__tests__/behavior-fixtures-9.test.js.map +1 -0
  52. package/dist/__tests__/behavior-fixtures.test.d.ts +14 -0
  53. package/dist/__tests__/behavior-fixtures.test.d.ts.map +1 -0
  54. package/dist/__tests__/behavior-fixtures.test.js +1423 -0
  55. package/dist/__tests__/behavior-fixtures.test.js.map +1 -0
  56. package/dist/__tests__/checks.test.d.ts +2 -0
  57. package/dist/__tests__/checks.test.d.ts.map +1 -0
  58. package/dist/__tests__/checks.test.js +61 -0
  59. package/dist/__tests__/checks.test.js.map +1 -0
  60. package/dist/__tests__/env-var-validation.test.d.ts +14 -0
  61. package/dist/__tests__/env-var-validation.test.d.ts.map +1 -0
  62. package/dist/__tests__/env-var-validation.test.js +53 -0
  63. package/dist/__tests__/env-var-validation.test.js.map +1 -0
  64. package/dist/__tests__/file-length-limit.test.d.ts +2 -0
  65. package/dist/__tests__/file-length-limit.test.d.ts.map +1 -0
  66. package/dist/__tests__/file-length-limit.test.js +29 -0
  67. package/dist/__tests__/file-length-limit.test.js.map +1 -0
  68. package/dist/__tests__/fixture-coverage.allowlist.d.ts +18 -0
  69. package/dist/__tests__/fixture-coverage.allowlist.d.ts.map +1 -0
  70. package/dist/__tests__/fixture-coverage.allowlist.js +35 -0
  71. package/dist/__tests__/fixture-coverage.allowlist.js.map +1 -0
  72. package/dist/__tests__/fixture-coverage.test.d.ts +13 -0
  73. package/dist/__tests__/fixture-coverage.test.d.ts.map +1 -0
  74. package/dist/__tests__/fixture-coverage.test.js +57 -0
  75. package/dist/__tests__/fixture-coverage.test.js.map +1 -0
  76. package/dist/__tests__/iic.test.d.ts +15 -0
  77. package/dist/__tests__/iic.test.d.ts.map +1 -0
  78. package/dist/__tests__/iic.test.js +316 -0
  79. package/dist/__tests__/iic.test.js.map +1 -0
  80. package/dist/__tests__/no-skipped-tests.test.d.ts +14 -0
  81. package/dist/__tests__/no-skipped-tests.test.d.ts.map +1 -0
  82. package/dist/__tests__/no-skipped-tests.test.js +144 -0
  83. package/dist/__tests__/no-skipped-tests.test.js.map +1 -0
  84. package/dist/__tests__/no-todo-comments.test.d.ts +2 -0
  85. package/dist/__tests__/no-todo-comments.test.d.ts.map +1 -0
  86. package/dist/__tests__/no-todo-comments.test.js +31 -0
  87. package/dist/__tests__/no-todo-comments.test.js.map +1 -0
  88. package/dist/__tests__/no-unimplemented-markers.test.d.ts +2 -0
  89. package/dist/__tests__/no-unimplemented-markers.test.d.ts.map +1 -0
  90. package/dist/__tests__/no-unimplemented-markers.test.js +140 -0
  91. package/dist/__tests__/no-unimplemented-markers.test.js.map +1 -0
  92. package/dist/__tests__/public-api-jsdoc-scope.test.d.ts +10 -0
  93. package/dist/__tests__/public-api-jsdoc-scope.test.d.ts.map +1 -0
  94. package/dist/__tests__/public-api-jsdoc-scope.test.js +176 -0
  95. package/dist/__tests__/public-api-jsdoc-scope.test.js.map +1 -0
  96. package/dist/__tests__/resilience-fp.test.d.ts +14 -0
  97. package/dist/__tests__/resilience-fp.test.d.ts.map +1 -0
  98. package/dist/__tests__/resilience-fp.test.js +110 -0
  99. package/dist/__tests__/resilience-fp.test.js.map +1 -0
  100. package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.d.ts +2 -0
  101. package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.d.ts.map +1 -0
  102. package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.js +32 -0
  103. package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.js.map +1 -0
  104. package/dist/checks/architecture/__tests__/tool-has-manifest.test.d.ts +2 -0
  105. package/dist/checks/architecture/__tests__/tool-has-manifest.test.d.ts.map +1 -0
  106. package/dist/checks/architecture/__tests__/tool-has-manifest.test.js +152 -0
  107. package/dist/checks/architecture/__tests__/tool-has-manifest.test.js.map +1 -0
  108. package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.d.ts +2 -0
  109. package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.d.ts.map +1 -0
  110. package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.js +129 -0
  111. package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.js.map +1 -0
  112. package/dist/checks/architecture/_yaml-doc-bindings.d.ts +23 -0
  113. package/dist/checks/architecture/_yaml-doc-bindings.d.ts.map +1 -0
  114. package/dist/checks/architecture/_yaml-doc-bindings.js +29 -0
  115. package/dist/checks/architecture/_yaml-doc-bindings.js.map +1 -0
  116. package/dist/checks/architecture/dependencies/index.d.ts +2 -0
  117. package/dist/checks/architecture/dependencies/index.d.ts.map +1 -0
  118. package/dist/checks/architecture/dependencies/index.js +2 -0
  119. package/dist/checks/architecture/dependencies/index.js.map +1 -0
  120. package/dist/checks/architecture/dependencies/no-duplicate-packages.d.ts +11 -0
  121. package/dist/checks/architecture/dependencies/no-duplicate-packages.d.ts.map +1 -0
  122. package/dist/checks/architecture/dependencies/no-duplicate-packages.js +171 -0
  123. package/dist/checks/architecture/dependencies/no-duplicate-packages.js.map +1 -0
  124. package/dist/checks/architecture/docker-best-practices.d.ts +23 -0
  125. package/dist/checks/architecture/docker-best-practices.d.ts.map +1 -0
  126. package/dist/checks/architecture/docker-best-practices.js +427 -0
  127. package/dist/checks/architecture/docker-best-practices.js.map +1 -0
  128. package/dist/checks/architecture/docker-ignore-validation.d.ts +18 -0
  129. package/dist/checks/architecture/docker-ignore-validation.d.ts.map +1 -0
  130. package/dist/checks/architecture/docker-ignore-validation.js +117 -0
  131. package/dist/checks/architecture/docker-ignore-validation.js.map +1 -0
  132. package/dist/checks/architecture/docker-version-sync.d.ts +16 -0
  133. package/dist/checks/architecture/docker-version-sync.d.ts.map +1 -0
  134. package/dist/checks/architecture/docker-version-sync.js +193 -0
  135. package/dist/checks/architecture/docker-version-sync.js.map +1 -0
  136. package/dist/checks/architecture/env-var-validation.d.ts +14 -0
  137. package/dist/checks/architecture/env-var-validation.d.ts.map +1 -0
  138. package/dist/checks/architecture/env-var-validation.js +289 -0
  139. package/dist/checks/architecture/env-var-validation.js.map +1 -0
  140. package/dist/checks/architecture/heavy-import-detection.d.ts +11 -0
  141. package/dist/checks/architecture/heavy-import-detection.d.ts.map +1 -0
  142. package/dist/checks/architecture/heavy-import-detection.js +91 -0
  143. package/dist/checks/architecture/heavy-import-detection.js.map +1 -0
  144. package/dist/checks/architecture/index.d.ts +16 -0
  145. package/dist/checks/architecture/index.d.ts.map +1 -0
  146. package/dist/checks/architecture/index.js +16 -0
  147. package/dist/checks/architecture/index.js.map +1 -0
  148. package/dist/checks/architecture/modules/empty-package-detection.d.ts +11 -0
  149. package/dist/checks/architecture/modules/empty-package-detection.d.ts.map +1 -0
  150. package/dist/checks/architecture/modules/empty-package-detection.js +277 -0
  151. package/dist/checks/architecture/modules/empty-package-detection.js.map +1 -0
  152. package/dist/checks/architecture/modules/index.d.ts +3 -0
  153. package/dist/checks/architecture/modules/index.d.ts.map +1 -0
  154. package/dist/checks/architecture/modules/index.js +3 -0
  155. package/dist/checks/architecture/modules/index.js.map +1 -0
  156. package/dist/checks/architecture/modules/interface-implementation-consistency.d.ts +12 -0
  157. package/dist/checks/architecture/modules/interface-implementation-consistency.d.ts.map +1 -0
  158. package/dist/checks/architecture/modules/interface-implementation-consistency.js +555 -0
  159. package/dist/checks/architecture/modules/interface-implementation-consistency.js.map +1 -0
  160. package/dist/checks/architecture/no-custom-event-emitter.d.ts +11 -0
  161. package/dist/checks/architecture/no-custom-event-emitter.d.ts.map +1 -0
  162. package/dist/checks/architecture/no-custom-event-emitter.js +123 -0
  163. package/dist/checks/architecture/no-custom-event-emitter.js.map +1 -0
  164. package/dist/checks/architecture/no-kebab-option-indexing.d.ts +33 -0
  165. package/dist/checks/architecture/no-kebab-option-indexing.d.ts.map +1 -0
  166. package/dist/checks/architecture/no-kebab-option-indexing.js +81 -0
  167. package/dist/checks/architecture/no-kebab-option-indexing.js.map +1 -0
  168. package/dist/checks/architecture/node-version-consistency.d.ts +22 -0
  169. package/dist/checks/architecture/node-version-consistency.d.ts.map +1 -0
  170. package/dist/checks/architecture/node-version-consistency.js +225 -0
  171. package/dist/checks/architecture/node-version-consistency.js.map +1 -0
  172. package/dist/checks/architecture/project-readme-existence.d.ts +13 -0
  173. package/dist/checks/architecture/project-readme-existence.d.ts.map +1 -0
  174. package/dist/checks/architecture/project-readme-existence.js +55 -0
  175. package/dist/checks/architecture/project-readme-existence.js.map +1 -0
  176. package/dist/checks/architecture/stale-build-artifacts.d.ts +10 -0
  177. package/dist/checks/architecture/stale-build-artifacts.d.ts.map +1 -0
  178. package/dist/checks/architecture/stale-build-artifacts.js +55 -0
  179. package/dist/checks/architecture/stale-build-artifacts.js.map +1 -0
  180. package/dist/checks/architecture/tool-has-manifest.d.ts +27 -0
  181. package/dist/checks/architecture/tool-has-manifest.d.ts.map +1 -0
  182. package/dist/checks/architecture/tool-has-manifest.js +135 -0
  183. package/dist/checks/architecture/tool-has-manifest.js.map +1 -0
  184. package/dist/checks/architecture/vitest-config-extends-base.d.ts +15 -0
  185. package/dist/checks/architecture/vitest-config-extends-base.d.ts.map +1 -0
  186. package/dist/checks/architecture/vitest-config-extends-base.js +104 -0
  187. package/dist/checks/architecture/vitest-config-extends-base.js.map +1 -0
  188. package/dist/checks/architecture/vitest-config-required-with-tests.d.ts +49 -0
  189. package/dist/checks/architecture/vitest-config-required-with-tests.d.ts.map +1 -0
  190. package/dist/checks/architecture/vitest-config-required-with-tests.js +199 -0
  191. package/dist/checks/architecture/vitest-config-required-with-tests.js.map +1 -0
  192. package/dist/checks/documentation/_directives/eslint.d.ts +9 -0
  193. package/dist/checks/documentation/_directives/eslint.d.ts.map +1 -0
  194. package/dist/checks/documentation/_directives/eslint.js +168 -0
  195. package/dist/checks/documentation/_directives/eslint.js.map +1 -0
  196. package/dist/checks/documentation/_directives/fitness.d.ts +9 -0
  197. package/dist/checks/documentation/_directives/fitness.d.ts.map +1 -0
  198. package/dist/checks/documentation/_directives/fitness.js +64 -0
  199. package/dist/checks/documentation/_directives/fitness.js.map +1 -0
  200. package/dist/checks/documentation/_directives/graph.d.ts +10 -0
  201. package/dist/checks/documentation/_directives/graph.d.ts.map +1 -0
  202. package/dist/checks/documentation/_directives/graph.js +65 -0
  203. package/dist/checks/documentation/_directives/graph.js.map +1 -0
  204. package/dist/checks/documentation/_directives/graph.test.d.ts +2 -0
  205. package/dist/checks/documentation/_directives/graph.test.d.ts.map +1 -0
  206. package/dist/checks/documentation/_directives/graph.test.js +54 -0
  207. package/dist/checks/documentation/_directives/graph.test.js.map +1 -0
  208. package/dist/checks/documentation/_directives/semgrep.d.ts +8 -0
  209. package/dist/checks/documentation/_directives/semgrep.d.ts.map +1 -0
  210. package/dist/checks/documentation/_directives/semgrep.js +72 -0
  211. package/dist/checks/documentation/_directives/semgrep.js.map +1 -0
  212. package/dist/checks/documentation/_directives/types.d.ts +21 -0
  213. package/dist/checks/documentation/_directives/types.d.ts.map +1 -0
  214. package/dist/checks/documentation/_directives/types.js +9 -0
  215. package/dist/checks/documentation/_directives/types.js.map +1 -0
  216. package/dist/checks/documentation/_directives/typescript.d.ts +10 -0
  217. package/dist/checks/documentation/_directives/typescript.d.ts.map +1 -0
  218. package/dist/checks/documentation/_directives/typescript.js +54 -0
  219. package/dist/checks/documentation/_directives/typescript.js.map +1 -0
  220. package/dist/checks/documentation/_public-api-graph.d.ts +30 -0
  221. package/dist/checks/documentation/_public-api-graph.d.ts.map +1 -0
  222. package/dist/checks/documentation/_public-api-graph.js +304 -0
  223. package/dist/checks/documentation/_public-api-graph.js.map +1 -0
  224. package/dist/checks/documentation/directive-audit.d.ts +26 -0
  225. package/dist/checks/documentation/directive-audit.d.ts.map +1 -0
  226. package/dist/checks/documentation/directive-audit.js +144 -0
  227. package/dist/checks/documentation/directive-audit.js.map +1 -0
  228. package/dist/checks/documentation/index.d.ts +3 -0
  229. package/dist/checks/documentation/index.d.ts.map +1 -0
  230. package/dist/checks/documentation/index.js +3 -0
  231. package/dist/checks/documentation/index.js.map +1 -0
  232. package/dist/checks/documentation/public-api-jsdoc.d.ts +10 -0
  233. package/dist/checks/documentation/public-api-jsdoc.d.ts.map +1 -0
  234. package/dist/checks/documentation/public-api-jsdoc.js +131 -0
  235. package/dist/checks/documentation/public-api-jsdoc.js.map +1 -0
  236. package/dist/checks/file-length-limit.d.ts +16 -0
  237. package/dist/checks/file-length-limit.d.ts.map +1 -0
  238. package/dist/checks/file-length-limit.js +47 -0
  239. package/dist/checks/file-length-limit.js.map +1 -0
  240. package/dist/checks/index.d.ts +16 -0
  241. package/dist/checks/index.d.ts.map +1 -0
  242. package/dist/checks/index.js +16 -0
  243. package/dist/checks/index.js.map +1 -0
  244. package/dist/checks/no-todo-comments.d.ts +18 -0
  245. package/dist/checks/no-todo-comments.d.ts.map +1 -0
  246. package/dist/checks/no-todo-comments.js +79 -0
  247. package/dist/checks/no-todo-comments.js.map +1 -0
  248. package/dist/checks/no-unimplemented-markers.d.ts +24 -0
  249. package/dist/checks/no-unimplemented-markers.d.ts.map +1 -0
  250. package/dist/checks/no-unimplemented-markers.js +198 -0
  251. package/dist/checks/no-unimplemented-markers.js.map +1 -0
  252. package/dist/checks/quality/api/graphql-offset-pagination.d.ts +9 -0
  253. package/dist/checks/quality/api/graphql-offset-pagination.d.ts.map +1 -0
  254. package/dist/checks/quality/api/graphql-offset-pagination.js +63 -0
  255. package/dist/checks/quality/api/graphql-offset-pagination.js.map +1 -0
  256. package/dist/checks/quality/api/index.d.ts +3 -0
  257. package/dist/checks/quality/api/index.d.ts.map +1 -0
  258. package/dist/checks/quality/api/index.js +3 -0
  259. package/dist/checks/quality/api/index.js.map +1 -0
  260. package/dist/checks/quality/api/zod-openapi-sync.d.ts +13 -0
  261. package/dist/checks/quality/api/zod-openapi-sync.d.ts.map +1 -0
  262. package/dist/checks/quality/api/zod-openapi-sync.js +88 -0
  263. package/dist/checks/quality/api/zod-openapi-sync.js.map +1 -0
  264. package/dist/checks/quality/code-structure/dead-code.d.ts +12 -0
  265. package/dist/checks/quality/code-structure/dead-code.d.ts.map +1 -0
  266. package/dist/checks/quality/code-structure/dead-code.js +238 -0
  267. package/dist/checks/quality/code-structure/dead-code.js.map +1 -0
  268. package/dist/checks/quality/code-structure/index.d.ts +5 -0
  269. package/dist/checks/quality/code-structure/index.d.ts.map +1 -0
  270. package/dist/checks/quality/code-structure/index.js +5 -0
  271. package/dist/checks/quality/code-structure/index.js.map +1 -0
  272. package/dist/checks/quality/code-structure/no-ai-attribution.d.ts +25 -0
  273. package/dist/checks/quality/code-structure/no-ai-attribution.d.ts.map +1 -0
  274. package/dist/checks/quality/code-structure/no-ai-attribution.js +76 -0
  275. package/dist/checks/quality/code-structure/no-ai-attribution.js.map +1 -0
  276. package/dist/checks/quality/code-structure/no-console-log.d.ts +17 -0
  277. package/dist/checks/quality/code-structure/no-console-log.d.ts.map +1 -0
  278. package/dist/checks/quality/code-structure/no-console-log.js +106 -0
  279. package/dist/checks/quality/code-structure/no-console-log.js.map +1 -0
  280. package/dist/checks/quality/code-structure/no-process-artifacts.d.ts +25 -0
  281. package/dist/checks/quality/code-structure/no-process-artifacts.d.ts.map +1 -0
  282. package/dist/checks/quality/code-structure/no-process-artifacts.js +104 -0
  283. package/dist/checks/quality/code-structure/no-process-artifacts.js.map +1 -0
  284. package/dist/checks/quality/dependency-version-consistency.d.ts +20 -0
  285. package/dist/checks/quality/dependency-version-consistency.d.ts.map +1 -0
  286. package/dist/checks/quality/dependency-version-consistency.js +266 -0
  287. package/dist/checks/quality/dependency-version-consistency.js.map +1 -0
  288. package/dist/checks/quality/fitness-ignore-hygiene.d.ts +10 -0
  289. package/dist/checks/quality/fitness-ignore-hygiene.d.ts.map +1 -0
  290. package/dist/checks/quality/fitness-ignore-hygiene.js +93 -0
  291. package/dist/checks/quality/fitness-ignore-hygiene.js.map +1 -0
  292. package/dist/checks/quality/frontend/expo-vector-icons.d.ts +13 -0
  293. package/dist/checks/quality/frontend/expo-vector-icons.d.ts.map +1 -0
  294. package/dist/checks/quality/frontend/expo-vector-icons.js +80 -0
  295. package/dist/checks/quality/frontend/expo-vector-icons.js.map +1 -0
  296. package/dist/checks/quality/frontend/image-optimization.d.ts +13 -0
  297. package/dist/checks/quality/frontend/image-optimization.d.ts.map +1 -0
  298. package/dist/checks/quality/frontend/image-optimization.js +166 -0
  299. package/dist/checks/quality/frontend/image-optimization.js.map +1 -0
  300. package/dist/checks/quality/frontend/index.d.ts +4 -0
  301. package/dist/checks/quality/frontend/index.d.ts.map +1 -0
  302. package/dist/checks/quality/frontend/index.js +4 -0
  303. package/dist/checks/quality/frontend/index.js.map +1 -0
  304. package/dist/checks/quality/frontend/navigation-typing.d.ts +12 -0
  305. package/dist/checks/quality/frontend/navigation-typing.d.ts.map +1 -0
  306. package/dist/checks/quality/frontend/navigation-typing.js +77 -0
  307. package/dist/checks/quality/frontend/navigation-typing.js.map +1 -0
  308. package/dist/checks/quality/graph-ignore-hygiene.d.ts +10 -0
  309. package/dist/checks/quality/graph-ignore-hygiene.d.ts.map +1 -0
  310. package/dist/checks/quality/graph-ignore-hygiene.js +95 -0
  311. package/dist/checks/quality/graph-ignore-hygiene.js.map +1 -0
  312. package/dist/checks/quality/graph-ignore-hygiene.test.d.ts +14 -0
  313. package/dist/checks/quality/graph-ignore-hygiene.test.d.ts.map +1 -0
  314. package/dist/checks/quality/graph-ignore-hygiene.test.js +58 -0
  315. package/dist/checks/quality/graph-ignore-hygiene.test.js.map +1 -0
  316. package/dist/checks/quality/index.d.ts +16 -0
  317. package/dist/checks/quality/index.d.ts.map +1 -0
  318. package/dist/checks/quality/index.js +16 -0
  319. package/dist/checks/quality/index.js.map +1 -0
  320. package/dist/checks/quality/linting/eslint-justifications.d.ts +12 -0
  321. package/dist/checks/quality/linting/eslint-justifications.d.ts.map +1 -0
  322. package/dist/checks/quality/linting/eslint-justifications.js +328 -0
  323. package/dist/checks/quality/linting/eslint-justifications.js.map +1 -0
  324. package/dist/checks/quality/linting/index.d.ts +4 -0
  325. package/dist/checks/quality/linting/index.d.ts.map +1 -0
  326. package/dist/checks/quality/linting/index.js +4 -0
  327. package/dist/checks/quality/linting/index.js.map +1 -0
  328. package/dist/checks/quality/linting/semgrep-justifications.d.ts +16 -0
  329. package/dist/checks/quality/linting/semgrep-justifications.d.ts.map +1 -0
  330. package/dist/checks/quality/linting/semgrep-justifications.js +229 -0
  331. package/dist/checks/quality/linting/semgrep-justifications.js.map +1 -0
  332. package/dist/checks/quality/linting/typescript-directive-hygiene.d.ts +12 -0
  333. package/dist/checks/quality/linting/typescript-directive-hygiene.d.ts.map +1 -0
  334. package/dist/checks/quality/linting/typescript-directive-hygiene.js +142 -0
  335. package/dist/checks/quality/linting/typescript-directive-hygiene.js.map +1 -0
  336. package/dist/checks/quality/no-compatibility-layer-names.d.ts +13 -0
  337. package/dist/checks/quality/no-compatibility-layer-names.d.ts.map +1 -0
  338. package/dist/checks/quality/no-compatibility-layer-names.js +100 -0
  339. package/dist/checks/quality/no-compatibility-layer-names.js.map +1 -0
  340. package/dist/checks/quality/no-deprecated-tags.d.ts +11 -0
  341. package/dist/checks/quality/no-deprecated-tags.d.ts.map +1 -0
  342. package/dist/checks/quality/no-deprecated-tags.js +76 -0
  343. package/dist/checks/quality/no-deprecated-tags.js.map +1 -0
  344. package/dist/checks/quality/no-markdown-references.d.ts +16 -0
  345. package/dist/checks/quality/no-markdown-references.d.ts.map +1 -0
  346. package/dist/checks/quality/no-markdown-references.js +145 -0
  347. package/dist/checks/quality/no-markdown-references.js.map +1 -0
  348. package/dist/checks/quality/no-raw-regex-on-code.d.ts +9 -0
  349. package/dist/checks/quality/no-raw-regex-on-code.d.ts.map +1 -0
  350. package/dist/checks/quality/no-raw-regex-on-code.js +61 -0
  351. package/dist/checks/quality/no-raw-regex-on-code.js.map +1 -0
  352. package/dist/checks/quality/no-temporary-workarounds.d.ts +11 -0
  353. package/dist/checks/quality/no-temporary-workarounds.d.ts.map +1 -0
  354. package/dist/checks/quality/no-temporary-workarounds.js +69 -0
  355. package/dist/checks/quality/no-temporary-workarounds.js.map +1 -0
  356. package/dist/checks/quality/no-window-alert.d.ts +19 -0
  357. package/dist/checks/quality/no-window-alert.d.ts.map +1 -0
  358. package/dist/checks/quality/no-window-alert.js +74 -0
  359. package/dist/checks/quality/no-window-alert.js.map +1 -0
  360. package/dist/checks/quality/observability/index.d.ts +2 -0
  361. package/dist/checks/quality/observability/index.d.ts.map +1 -0
  362. package/dist/checks/quality/observability/index.js +2 -0
  363. package/dist/checks/quality/observability/index.js.map +1 -0
  364. package/dist/checks/quality/observability/pino-serializer-coverage.d.ts +15 -0
  365. package/dist/checks/quality/observability/pino-serializer-coverage.d.ts.map +1 -0
  366. package/dist/checks/quality/observability/pino-serializer-coverage.js +209 -0
  367. package/dist/checks/quality/observability/pino-serializer-coverage.js.map +1 -0
  368. package/dist/checks/quality/patterns/async-state-pattern.d.ts +14 -0
  369. package/dist/checks/quality/patterns/async-state-pattern.d.ts.map +1 -0
  370. package/dist/checks/quality/patterns/async-state-pattern.js +80 -0
  371. package/dist/checks/quality/patterns/async-state-pattern.js.map +1 -0
  372. package/dist/checks/quality/patterns/index.d.ts +4 -0
  373. package/dist/checks/quality/patterns/index.d.ts.map +1 -0
  374. package/dist/checks/quality/patterns/index.js +4 -0
  375. package/dist/checks/quality/patterns/index.js.map +1 -0
  376. package/dist/checks/quality/patterns/no-non-null-assertions.d.ts +10 -0
  377. package/dist/checks/quality/patterns/no-non-null-assertions.d.ts.map +1 -0
  378. package/dist/checks/quality/patterns/no-non-null-assertions.js +97 -0
  379. package/dist/checks/quality/patterns/no-non-null-assertions.js.map +1 -0
  380. package/dist/checks/quality/patterns/performance-anti-patterns.d.ts +16 -0
  381. package/dist/checks/quality/patterns/performance-anti-patterns.d.ts.map +1 -0
  382. package/dist/checks/quality/patterns/performance-anti-patterns.js +239 -0
  383. package/dist/checks/quality/patterns/performance-anti-patterns.js.map +1 -0
  384. package/dist/checks/resilience/_helpers/config-validation.d.ts +27 -0
  385. package/dist/checks/resilience/_helpers/config-validation.d.ts.map +1 -0
  386. package/dist/checks/resilience/_helpers/config-validation.js +61 -0
  387. package/dist/checks/resilience/_helpers/config-validation.js.map +1 -0
  388. package/dist/checks/resilience/batch-operations.d.ts +22 -0
  389. package/dist/checks/resilience/batch-operations.d.ts.map +1 -0
  390. package/dist/checks/resilience/batch-operations.js +422 -0
  391. package/dist/checks/resilience/batch-operations.js.map +1 -0
  392. package/dist/checks/resilience/cache-ttl-validation.d.ts +13 -0
  393. package/dist/checks/resilience/cache-ttl-validation.d.ts.map +1 -0
  394. package/dist/checks/resilience/cache-ttl-validation.js +222 -0
  395. package/dist/checks/resilience/cache-ttl-validation.js.map +1 -0
  396. package/dist/checks/resilience/catch-clause-safety.d.ts +12 -0
  397. package/dist/checks/resilience/catch-clause-safety.d.ts.map +1 -0
  398. package/dist/checks/resilience/catch-clause-safety.js +110 -0
  399. package/dist/checks/resilience/catch-clause-safety.js.map +1 -0
  400. package/dist/checks/resilience/dangerous-config-defaults.d.ts +11 -0
  401. package/dist/checks/resilience/dangerous-config-defaults.d.ts.map +1 -0
  402. package/dist/checks/resilience/dangerous-config-defaults.js +304 -0
  403. package/dist/checks/resilience/dangerous-config-defaults.js.map +1 -0
  404. package/dist/checks/resilience/error-code-registration.d.ts +11 -0
  405. package/dist/checks/resilience/error-code-registration.d.ts.map +1 -0
  406. package/dist/checks/resilience/error-code-registration.js +88 -0
  407. package/dist/checks/resilience/error-code-registration.js.map +1 -0
  408. package/dist/checks/resilience/event-patterns.d.ts +21 -0
  409. package/dist/checks/resilience/event-patterns.d.ts.map +1 -0
  410. package/dist/checks/resilience/event-patterns.js +232 -0
  411. package/dist/checks/resilience/event-patterns.js.map +1 -0
  412. package/dist/checks/resilience/exit-code-correctness.d.ts +12 -0
  413. package/dist/checks/resilience/exit-code-correctness.d.ts.map +1 -0
  414. package/dist/checks/resilience/exit-code-correctness.js +107 -0
  415. package/dist/checks/resilience/exit-code-correctness.js.map +1 -0
  416. package/dist/checks/resilience/index.d.ts +18 -0
  417. package/dist/checks/resilience/index.d.ts.map +1 -0
  418. package/dist/checks/resilience/index.js +18 -0
  419. package/dist/checks/resilience/index.js.map +1 -0
  420. package/dist/checks/resilience/no-hardcoded-timeouts.d.ts +10 -0
  421. package/dist/checks/resilience/no-hardcoded-timeouts.d.ts.map +1 -0
  422. package/dist/checks/resilience/no-hardcoded-timeouts.js +291 -0
  423. package/dist/checks/resilience/no-hardcoded-timeouts.js.map +1 -0
  424. package/dist/checks/resilience/no-process-exit-in-finally.d.ts +11 -0
  425. package/dist/checks/resilience/no-process-exit-in-finally.d.ts.map +1 -0
  426. package/dist/checks/resilience/no-process-exit-in-finally.js +89 -0
  427. package/dist/checks/resilience/no-process-exit-in-finally.js.map +1 -0
  428. package/dist/checks/resilience/readline-cleanup.d.ts +11 -0
  429. package/dist/checks/resilience/readline-cleanup.d.ts.map +1 -0
  430. package/dist/checks/resilience/readline-cleanup.js +107 -0
  431. package/dist/checks/resilience/readline-cleanup.js.map +1 -0
  432. package/dist/checks/resilience/recovery-patterns.d.ts +25 -0
  433. package/dist/checks/resilience/recovery-patterns.d.ts.map +1 -0
  434. package/dist/checks/resilience/recovery-patterns.js +273 -0
  435. package/dist/checks/resilience/recovery-patterns.js.map +1 -0
  436. package/dist/checks/resilience/reentrancy-guard.d.ts +12 -0
  437. package/dist/checks/resilience/reentrancy-guard.d.ts.map +1 -0
  438. package/dist/checks/resilience/reentrancy-guard.js +86 -0
  439. package/dist/checks/resilience/reentrancy-guard.js.map +1 -0
  440. package/dist/checks/resilience/retry-config-validation.d.ts +13 -0
  441. package/dist/checks/resilience/retry-config-validation.d.ts.map +1 -0
  442. package/dist/checks/resilience/retry-config-validation.js +159 -0
  443. package/dist/checks/resilience/retry-config-validation.js.map +1 -0
  444. package/dist/checks/resilience/sentry/_helpers/sentry.d.ts +25 -0
  445. package/dist/checks/resilience/sentry/_helpers/sentry.d.ts.map +1 -0
  446. package/dist/checks/resilience/sentry/_helpers/sentry.js +68 -0
  447. package/dist/checks/resilience/sentry/_helpers/sentry.js.map +1 -0
  448. package/dist/checks/resilience/sentry/index.d.ts +8 -0
  449. package/dist/checks/resilience/sentry/index.d.ts.map +1 -0
  450. package/dist/checks/resilience/sentry/index.js +8 -0
  451. package/dist/checks/resilience/sentry/index.js.map +1 -0
  452. package/dist/checks/resilience/sentry/sentry-dsn-configured.d.ts +12 -0
  453. package/dist/checks/resilience/sentry/sentry-dsn-configured.d.ts.map +1 -0
  454. package/dist/checks/resilience/sentry/sentry-dsn-configured.js +55 -0
  455. package/dist/checks/resilience/sentry/sentry-dsn-configured.js.map +1 -0
  456. package/dist/checks/resilience/sentry/sentry-environment-set.d.ts +12 -0
  457. package/dist/checks/resilience/sentry/sentry-environment-set.d.ts.map +1 -0
  458. package/dist/checks/resilience/sentry/sentry-environment-set.js +51 -0
  459. package/dist/checks/resilience/sentry/sentry-environment-set.js.map +1 -0
  460. package/dist/checks/resilience/sentry/sentry-error-boundary.d.ts +12 -0
  461. package/dist/checks/resilience/sentry/sentry-error-boundary.d.ts.map +1 -0
  462. package/dist/checks/resilience/sentry/sentry-error-boundary.js +75 -0
  463. package/dist/checks/resilience/sentry/sentry-error-boundary.js.map +1 -0
  464. package/dist/checks/resilience/sentry/sentry-pii-scrubbing.d.ts +13 -0
  465. package/dist/checks/resilience/sentry/sentry-pii-scrubbing.d.ts.map +1 -0
  466. package/dist/checks/resilience/sentry/sentry-pii-scrubbing.js +125 -0
  467. package/dist/checks/resilience/sentry/sentry-pii-scrubbing.js.map +1 -0
  468. package/dist/checks/resilience/sentry/sentry-release-set.d.ts +12 -0
  469. package/dist/checks/resilience/sentry/sentry-release-set.d.ts.map +1 -0
  470. package/dist/checks/resilience/sentry/sentry-release-set.js +51 -0
  471. package/dist/checks/resilience/sentry/sentry-release-set.js.map +1 -0
  472. package/dist/checks/resilience/sentry/sentry-sample-rate.d.ts +12 -0
  473. package/dist/checks/resilience/sentry/sentry-sample-rate.d.ts.map +1 -0
  474. package/dist/checks/resilience/sentry/sentry-sample-rate.js +78 -0
  475. package/dist/checks/resilience/sentry/sentry-sample-rate.js.map +1 -0
  476. package/dist/checks/resilience/sentry/sentry-source-maps.d.ts +12 -0
  477. package/dist/checks/resilience/sentry/sentry-source-maps.d.ts.map +1 -0
  478. package/dist/checks/resilience/sentry/sentry-source-maps.js +83 -0
  479. package/dist/checks/resilience/sentry/sentry-source-maps.js.map +1 -0
  480. package/dist/checks/resilience/service-patterns.d.ts +18 -0
  481. package/dist/checks/resilience/service-patterns.d.ts.map +1 -0
  482. package/dist/checks/resilience/service-patterns.js +230 -0
  483. package/dist/checks/resilience/service-patterns.js.map +1 -0
  484. package/dist/checks/resilience/timer-lifecycle.d.ts +10 -0
  485. package/dist/checks/resilience/timer-lifecycle.d.ts.map +1 -0
  486. package/dist/checks/resilience/timer-lifecycle.js +78 -0
  487. package/dist/checks/resilience/timer-lifecycle.js.map +1 -0
  488. package/dist/checks/resilience/transaction-patterns.d.ts +21 -0
  489. package/dist/checks/resilience/transaction-patterns.d.ts.map +1 -0
  490. package/dist/checks/resilience/transaction-patterns.js +258 -0
  491. package/dist/checks/resilience/transaction-patterns.js.map +1 -0
  492. package/dist/checks/security/__tests__/no-hardcoded-secrets.test.d.ts +9 -0
  493. package/dist/checks/security/__tests__/no-hardcoded-secrets.test.d.ts.map +1 -0
  494. package/dist/checks/security/__tests__/no-hardcoded-secrets.test.js +37 -0
  495. package/dist/checks/security/__tests__/no-hardcoded-secrets.test.js.map +1 -0
  496. package/dist/checks/security/__tests__/package-supply-chain-policy.test.d.ts +2 -0
  497. package/dist/checks/security/__tests__/package-supply-chain-policy.test.d.ts.map +1 -0
  498. package/dist/checks/security/__tests__/package-supply-chain-policy.test.js +128 -0
  499. package/dist/checks/security/__tests__/package-supply-chain-policy.test.js.map +1 -0
  500. package/dist/checks/security/api-key-rotation.d.ts +10 -0
  501. package/dist/checks/security/api-key-rotation.d.ts.map +1 -0
  502. package/dist/checks/security/api-key-rotation.js +186 -0
  503. package/dist/checks/security/api-key-rotation.js.map +1 -0
  504. package/dist/checks/security/auth-middleware-coverage.d.ts +11 -0
  505. package/dist/checks/security/auth-middleware-coverage.d.ts.map +1 -0
  506. package/dist/checks/security/auth-middleware-coverage.js +210 -0
  507. package/dist/checks/security/auth-middleware-coverage.js.map +1 -0
  508. package/dist/checks/security/auth-route-guard.d.ts +12 -0
  509. package/dist/checks/security/auth-route-guard.d.ts.map +1 -0
  510. package/dist/checks/security/auth-route-guard.js +70 -0
  511. package/dist/checks/security/auth-route-guard.js.map +1 -0
  512. package/dist/checks/security/cors-configuration.d.ts +11 -0
  513. package/dist/checks/security/cors-configuration.d.ts.map +1 -0
  514. package/dist/checks/security/cors-configuration.js +126 -0
  515. package/dist/checks/security/cors-configuration.js.map +1 -0
  516. package/dist/checks/security/csp-headers.d.ts +11 -0
  517. package/dist/checks/security/csp-headers.d.ts.map +1 -0
  518. package/dist/checks/security/csp-headers.js +192 -0
  519. package/dist/checks/security/csp-headers.js.map +1 -0
  520. package/dist/checks/security/dependency-vulnerability-audit.d.ts +15 -0
  521. package/dist/checks/security/dependency-vulnerability-audit.d.ts.map +1 -0
  522. package/dist/checks/security/dependency-vulnerability-audit.js +184 -0
  523. package/dist/checks/security/dependency-vulnerability-audit.js.map +1 -0
  524. package/dist/checks/security/env-secret-exposure.d.ts +11 -0
  525. package/dist/checks/security/env-secret-exposure.d.ts.map +1 -0
  526. package/dist/checks/security/env-secret-exposure.js +127 -0
  527. package/dist/checks/security/env-secret-exposure.js.map +1 -0
  528. package/dist/checks/security/hasura-production-config.d.ts +11 -0
  529. package/dist/checks/security/hasura-production-config.d.ts.map +1 -0
  530. package/dist/checks/security/hasura-production-config.js +122 -0
  531. package/dist/checks/security/hasura-production-config.js.map +1 -0
  532. package/dist/checks/security/index.d.ts +17 -0
  533. package/dist/checks/security/index.d.ts.map +1 -0
  534. package/dist/checks/security/index.js +17 -0
  535. package/dist/checks/security/index.js.map +1 -0
  536. package/dist/checks/security/jwt-validation.d.ts +11 -0
  537. package/dist/checks/security/jwt-validation.d.ts.map +1 -0
  538. package/dist/checks/security/jwt-validation.js +294 -0
  539. package/dist/checks/security/jwt-validation.js.map +1 -0
  540. package/dist/checks/security/no-eval.d.ts +16 -0
  541. package/dist/checks/security/no-eval.d.ts.map +1 -0
  542. package/dist/checks/security/no-eval.js +83 -0
  543. package/dist/checks/security/no-eval.js.map +1 -0
  544. package/dist/checks/security/no-hardcoded-secrets.d.ts +28 -0
  545. package/dist/checks/security/no-hardcoded-secrets.d.ts.map +1 -0
  546. package/dist/checks/security/no-hardcoded-secrets.js +209 -0
  547. package/dist/checks/security/no-hardcoded-secrets.js.map +1 -0
  548. package/dist/checks/security/package-supply-chain-policy.d.ts +12 -0
  549. package/dist/checks/security/package-supply-chain-policy.d.ts.map +1 -0
  550. package/dist/checks/security/package-supply-chain-policy.js +534 -0
  551. package/dist/checks/security/package-supply-chain-policy.js.map +1 -0
  552. package/dist/checks/security/rate-limit-coverage.d.ts +10 -0
  553. package/dist/checks/security/rate-limit-coverage.d.ts.map +1 -0
  554. package/dist/checks/security/rate-limit-coverage.js +143 -0
  555. package/dist/checks/security/rate-limit-coverage.js.map +1 -0
  556. package/dist/checks/security/semgrep-scan.d.ts +13 -0
  557. package/dist/checks/security/semgrep-scan.d.ts.map +1 -0
  558. package/dist/checks/security/semgrep-scan.js +86 -0
  559. package/dist/checks/security/semgrep-scan.js.map +1 -0
  560. package/dist/checks/security/use-centralized-crypto.d.ts +11 -0
  561. package/dist/checks/security/use-centralized-crypto.d.ts.map +1 -0
  562. package/dist/checks/security/use-centralized-crypto.js +129 -0
  563. package/dist/checks/security/use-centralized-crypto.js.map +1 -0
  564. package/dist/checks/security/webhook-signature-verification.d.ts +10 -0
  565. package/dist/checks/security/webhook-signature-verification.d.ts.map +1 -0
  566. package/dist/checks/security/webhook-signature-verification.js +183 -0
  567. package/dist/checks/security/webhook-signature-verification.js.map +1 -0
  568. package/dist/checks/testing/index.d.ts +6 -0
  569. package/dist/checks/testing/index.d.ts.map +1 -0
  570. package/dist/checks/testing/index.js +6 -0
  571. package/dist/checks/testing/index.js.map +1 -0
  572. package/dist/checks/testing/no-skipped-tests.d.ts +40 -0
  573. package/dist/checks/testing/no-skipped-tests.d.ts.map +1 -0
  574. package/dist/checks/testing/no-skipped-tests.js +174 -0
  575. package/dist/checks/testing/no-skipped-tests.js.map +1 -0
  576. package/dist/checks/testing/no-stub-tests.d.ts +11 -0
  577. package/dist/checks/testing/no-stub-tests.d.ts.map +1 -0
  578. package/dist/checks/testing/no-stub-tests.js +103 -0
  579. package/dist/checks/testing/no-stub-tests.js.map +1 -0
  580. package/dist/checks/testing/test-convention-consistency.d.ts +14 -0
  581. package/dist/checks/testing/test-convention-consistency.d.ts.map +1 -0
  582. package/dist/checks/testing/test-convention-consistency.js +93 -0
  583. package/dist/checks/testing/test-convention-consistency.js.map +1 -0
  584. package/dist/checks/testing/test-file-naming.d.ts +13 -0
  585. package/dist/checks/testing/test-file-naming.d.ts.map +1 -0
  586. package/dist/checks/testing/test-file-naming.js +218 -0
  587. package/dist/checks/testing/test-file-naming.js.map +1 -0
  588. package/dist/checks/testing/test-file-pairing.d.ts +13 -0
  589. package/dist/checks/testing/test-file-pairing.d.ts.map +1 -0
  590. package/dist/checks/testing/test-file-pairing.js +274 -0
  591. package/dist/checks/testing/test-file-pairing.js.map +1 -0
  592. package/dist/display/architecture.d.ts +9 -0
  593. package/dist/display/architecture.d.ts.map +1 -0
  594. package/dist/display/architecture.js +29 -0
  595. package/dist/display/architecture.js.map +1 -0
  596. package/dist/display/index.d.ts +20 -0
  597. package/dist/display/index.d.ts.map +1 -0
  598. package/dist/display/index.js +30 -0
  599. package/dist/display/index.js.map +1 -0
  600. package/dist/display/quality.d.ts +7 -0
  601. package/dist/display/quality.d.ts.map +1 -0
  602. package/dist/display/quality.js +34 -0
  603. package/dist/display/quality.js.map +1 -0
  604. package/dist/display/resilience.d.ts +7 -0
  605. package/dist/display/resilience.d.ts.map +1 -0
  606. package/dist/display/resilience.js +36 -0
  607. package/dist/display/resilience.js.map +1 -0
  608. package/dist/display/security-testing.d.ts +9 -0
  609. package/dist/display/security-testing.d.ts.map +1 -0
  610. package/dist/display/security-testing.js +31 -0
  611. package/dist/display/security-testing.js.map +1 -0
  612. package/dist/display/types.d.ts +6 -0
  613. package/dist/display/types.d.ts.map +1 -0
  614. package/dist/display/types.js +6 -0
  615. package/dist/display/types.js.map +1 -0
  616. package/dist/index.d.ts +19 -0
  617. package/dist/index.d.ts.map +1 -0
  618. package/dist/index.js +21 -0
  619. package/dist/index.js.map +1 -0
  620. package/package.json +52 -0
@@ -0,0 +1,131 @@
1
+ // @fitness-ignore-file duplicate-implementation-detection -- similar patterns across diagnostic modules
2
+ /**
3
+ * @fileoverview Public API JSDoc check
4
+ */
5
+ import { defineCheck } from '@opensip-cli/fitness';
6
+ import { isInPublicApiSurface } from './_public-api-graph.js';
7
+ /**
8
+ * Patterns for exported declarations that should have JSDoc
9
+ */
10
+ const EXPORT_PATTERNS = [
11
+ /^export\s+(?:async\s+)?function\s+(\w+)/,
12
+ /^export\s+class\s+(\w+)/,
13
+ /^export\s+interface\s+(\w+)/,
14
+ /^export\s+type\s+(\w+)\s*=\s*(?!z\.infer)/,
15
+ /^export\s+const\s+(\w+)\s*=\s*(?:async\s*)?\(/,
16
+ ];
17
+ /** Re-export barrels don't need JSDoc */
18
+ const REEXPORT_PATTERN = /^export\s+(?:\{|\*\s+from|type\s+\{)/;
19
+ /**
20
+ * Determine the kind of export for messaging
21
+ */
22
+ function getExportKind(line) {
23
+ if (line.includes('function '))
24
+ return 'function';
25
+ if (line.includes('class '))
26
+ return 'class';
27
+ if (line.includes('interface '))
28
+ return 'interface';
29
+ if (line.includes('type '))
30
+ return 'type';
31
+ if (line.includes('const '))
32
+ return 'const';
33
+ return 'declaration';
34
+ }
35
+ /**
36
+ * Analyze a file for missing JSDoc on public API exports.
37
+ *
38
+ * Only fires on files that are part of the containing package's
39
+ * published API surface — files reachable from the package's
40
+ * `package.json#exports` entries via `export ... from` re-export
41
+ * chains. Internal helper files (not re-exported from the package
42
+ * barrel) are skipped: their `export` keyword is a TypeScript
43
+ * intra-package visibility marker, not part of the npm-published
44
+ * public API.
45
+ *
46
+ * When the package surface cannot be determined (no `package.json`,
47
+ * no `exports` field), the check falls back to its historical broad
48
+ * behavior — every `export` is treated as public.
49
+ */
50
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- Inherent complexity: line-by-line export pattern matching with preceding JSDoc detection and re-export filtering
51
+ function analyzeJsdoc(content, filePath) {
52
+ if (!isInPublicApiSurface(filePath))
53
+ return [];
54
+ const violations = [];
55
+ const lines = content.split('\n');
56
+ for (let i = 0; i < lines.length; i++) {
57
+ const line = lines[i] ?? '';
58
+ const trimmed = line.trim();
59
+ // Skip re-exports (they inherit docs from the source)
60
+ if (REEXPORT_PATTERN.test(trimmed))
61
+ continue;
62
+ // Check if this line is an export declaration
63
+ for (const pattern of EXPORT_PATTERNS) {
64
+ const match = pattern.exec(trimmed);
65
+ if (!match?.[1])
66
+ continue;
67
+ const exportName = match[1];
68
+ // Look backward for JSDoc comment (/** ... */)
69
+ let hasJsdoc = false;
70
+ for (let j = i - 1; j >= Math.max(0, i - 15); j--) {
71
+ const prevLine = (lines[j] ?? '').trim();
72
+ if (prevLine === '')
73
+ continue; // skip blank lines
74
+ if (prevLine.endsWith('*/')) {
75
+ hasJsdoc = true;
76
+ break;
77
+ }
78
+ if (prevLine.startsWith('//'))
79
+ continue; // skip single-line comments
80
+ if (prevLine.startsWith('*'))
81
+ continue; // inside JSDoc block
82
+ break; // non-comment, non-blank line means no JSDoc
83
+ }
84
+ if (!hasJsdoc) {
85
+ violations.push({
86
+ line: i + 1,
87
+ message: `Exported ${getExportKind(trimmed)} '${exportName}' is missing JSDoc documentation`,
88
+ severity: 'warning',
89
+ suggestion: `Add a /** ... */ JSDoc comment describing the purpose of '${exportName}'`,
90
+ type: 'missing-jsdoc',
91
+ match: trimmed.slice(0, 120),
92
+ });
93
+ }
94
+ break; // Only match first pattern per line
95
+ }
96
+ }
97
+ return violations;
98
+ }
99
+ /**
100
+ * Check: documentation/public-api-jsdoc
101
+ *
102
+ * Requires JSDoc documentation on all public API exports in shared packages.
103
+ */
104
+ export const publicApiJsdoc = defineCheck({
105
+ id: '48d891e3-0be3-49bf-9448-723b4664b714',
106
+ slug: 'public-api-jsdoc',
107
+ scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
108
+ contentFilter: 'raw',
109
+ confidence: 'medium',
110
+ description: 'Requires JSDoc documentation on all public API exports in shared packages',
111
+ longDescription: `**Purpose:** Ensures all public API exports in shared packages have JSDoc documentation, since these form the platform's published API surface.
112
+
113
+ **Detects:**
114
+ - Exported functions, classes, interfaces, types, and function-like constants without \`/** ... */\` JSDoc comments
115
+ - Excludes re-exports (\`export { ... } from\`, \`export * from\`) since they inherit docs from the source
116
+ - Excludes \`z.infer\` type aliases since they are self-documenting
117
+
118
+ **Why it matters:** Shared packages are consumed by the entire platform. Undocumented public APIs force consumers to read source code to understand behavior.
119
+
120
+ **Scope:** Files reachable from the package's \`package.json#exports\` entry barrels via \`export ... from\` re-export chains. Internal helper files (not re-exported from the package barrel) are skipped — their \`export\` keyword is an intra-package visibility marker, not part of the npm-published public API.
121
+
122
+ **Package shape handling:**
123
+ - Packages with an \`exports\` field — surface is the closure of those entries.
124
+ - Packages with only \`main\` / \`module\` — surface is that entry's closure.
125
+ - Binary-only packages (\`bin\` set, no \`exports\` / \`main\` / \`module\`) — empty surface; nothing is flagged.
126
+ - No containing \`package.json\` — falls back to flagging every \`export\` (historical broad behavior, used by ad-hoc fixtures).`,
127
+ tags: ['documentation', 'api', 'quality'],
128
+ fileTypes: ['ts'],
129
+ analyze: analyzeJsdoc,
130
+ });
131
+ //# sourceMappingURL=public-api-jsdoc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api-jsdoc.js","sourceRoot":"","sources":["../../../src/checks/documentation/public-api-jsdoc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Flag files that exceed a recommended line count.
3
+ *
4
+ * Operates on raw content — file length is identical regardless of
5
+ * language. Counts only non-empty lines so massive whitespace-padded
6
+ * files don't slip through and trivial generated boilerplate isn't
7
+ * over-counted (configurable later if needed).
8
+ */
9
+ import { type CheckViolation } from '@opensip-cli/fitness';
10
+ /**
11
+ * Pure analysis function. Exported so unit tests can exercise the
12
+ * line-counting logic without spinning up an ExecutionContext.
13
+ */
14
+ export declare function analyzeFileLength(content: string): CheckViolation[];
15
+ export declare const fileLengthLimit: import("@opensip-cli/fitness").Check;
16
+ //# sourceMappingURL=file-length-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-length-limit.d.ts","sourceRoot":"","sources":["../../src/checks/file-length-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKxE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAqBnE;AAED,eAAO,MAAM,eAAe,sCAO1B,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview Flag files that exceed a recommended line count.
3
+ *
4
+ * Operates on raw content — file length is identical regardless of
5
+ * language. Counts only non-empty lines so massive whitespace-padded
6
+ * files don't slip through and trivial generated boilerplate isn't
7
+ * over-counted (configurable later if needed).
8
+ */
9
+ import { defineCheck } from '@opensip-cli/fitness';
10
+ const SOFT_LIMIT = 400;
11
+ const HARD_LIMIT = 800;
12
+ /**
13
+ * Pure analysis function. Exported so unit tests can exercise the
14
+ * line-counting logic without spinning up an ExecutionContext.
15
+ */
16
+ export function analyzeFileLength(content) {
17
+ const lines = content.split('\n').filter((l) => l.trim().length > 0);
18
+ if (lines.length <= SOFT_LIMIT)
19
+ return [];
20
+ const violations = [];
21
+ if (lines.length > HARD_LIMIT) {
22
+ violations.push({
23
+ message: `File has ${lines.length} non-empty lines (hard limit ${HARD_LIMIT})`,
24
+ severity: 'error',
25
+ line: 1,
26
+ suggestion: 'Split this file into focused modules organized by responsibility',
27
+ });
28
+ }
29
+ else {
30
+ violations.push({
31
+ message: `File has ${lines.length} non-empty lines (soft limit ${SOFT_LIMIT})`,
32
+ severity: 'warning',
33
+ line: 1,
34
+ suggestion: 'Consider splitting before this exceeds the hard limit',
35
+ });
36
+ }
37
+ return violations;
38
+ }
39
+ export const fileLengthLimit = defineCheck({
40
+ id: 'fc8b5ec9-d020-4e76-b16f-f5f73ce9d21e',
41
+ slug: 'file-length-limit',
42
+ description: `Files longer than ${HARD_LIMIT} lines hint at insufficient module decomposition`,
43
+ scope: { languages: [], concerns: [] },
44
+ tags: ['quality', 'modularity'],
45
+ analyze: (content) => analyzeFileLength(content),
46
+ });
47
+ //# sourceMappingURL=file-length-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-length-limit.js","sourceRoot":"","sources":["../../src/checks/file-length-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAuB,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,YAAY,KAAK,CAAC,MAAM,gCAAgC,UAAU,GAAG;YAC9E,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,kEAAkE;SAC/E,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,YAAY,KAAK,CAAC,MAAM,gCAAgC,UAAU,GAAG;YAC9E,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,uDAAuD;SACpE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;IACzC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,qBAAqB,UAAU,kDAAkD;IAC9F,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IACtC,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC;CACjD,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Top-level barrel for cross-language fitness checks
3
+ *
4
+ * Re-exports every category in this package, plus the existing
5
+ * single-file checks (`file-length-limit`, `no-todo-comments`).
6
+ */
7
+ export * from './architecture/index.js';
8
+ export * from './documentation/index.js';
9
+ export * from './quality/index.js';
10
+ export * from './resilience/index.js';
11
+ export * from './security/index.js';
12
+ export * from './testing/index.js';
13
+ export * from './file-length-limit.js';
14
+ export * from './no-todo-comments.js';
15
+ export * from './no-unimplemented-markers.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Top-level barrel for cross-language fitness checks
3
+ *
4
+ * Re-exports every category in this package, plus the existing
5
+ * single-file checks (`file-length-limit`, `no-todo-comments`).
6
+ */
7
+ export * from './architecture/index.js';
8
+ export * from './documentation/index.js';
9
+ export * from './quality/index.js';
10
+ export * from './resilience/index.js';
11
+ export * from './security/index.js';
12
+ export * from './testing/index.js';
13
+ export * from './file-length-limit.js';
14
+ export * from './no-todo-comments.js';
15
+ export * from './no-unimplemented-markers.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @fileoverview Cross-language TODO/FIXME comment detection.
3
+ *
4
+ * Uses the language adapter's `strip-strings` filter so TODO markers
5
+ * appearing inside string literals don't false-fire. The filter
6
+ * dispatches through the registered LanguageAdapter, so this check
7
+ * works for any language whose adapter implements stripStrings.
8
+ */
9
+ import { type CheckViolation } from '@opensip-cli/fitness';
10
+ /**
11
+ * Pure analysis function. Exported so unit tests can exercise the
12
+ * detection logic without standing up the full Check framework
13
+ * (defineCheck wraps `analyze` into an `execute` closure that
14
+ * requires an ExecutionContext to invoke).
15
+ */
16
+ export declare function analyzeTodoComments(content: string): CheckViolation[];
17
+ export declare const noTodoComments: import("@opensip-cli/fitness").Check;
18
+ //# sourceMappingURL=no-todo-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-todo-comments.d.ts","sourceRoot":"","sources":["../../src/checks/no-todo-comments.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQpF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAiBrE;AAED,eAAO,MAAM,cAAc,sCAoCzB,CAAC"}
@@ -0,0 +1,79 @@
1
+ /* eslint-disable sonarjs/fixme-tag -- this file's job is to detect TODO/FIXME markers; the words appear in identifiers and JSDoc by necessity */
2
+ // @fitness-ignore-file no-todo-comments -- this file's job is to detect TODO/FIXME/XXX/OPTIMIZE markers; the words appear in regex and JSDoc by design
3
+ /**
4
+ * @fileoverview Cross-language TODO/FIXME comment detection.
5
+ *
6
+ * Uses the language adapter's `strip-strings` filter so TODO markers
7
+ * appearing inside string literals don't false-fire. The filter
8
+ * dispatches through the registered LanguageAdapter, so this check
9
+ * works for any language whose adapter implements stripStrings.
10
+ */
11
+ import { defineCheck, isTestFile } from '@opensip-cli/fitness';
12
+ // HACK is intentionally excluded — `no-temporary-workarounds` owns HACK
13
+ // (with qualifier needles like "temporary"/"workaround"). Including HACK
14
+ // here as well caused duplicate findings on the same line; see the
15
+ // 2026-05-23 checks-universal architecture audit, NF1.
16
+ const TODO_PATTERN = /\b(TODO|FIXME|XXX|OPTIMIZE)\b/g;
17
+ /**
18
+ * Pure analysis function. Exported so unit tests can exercise the
19
+ * detection logic without standing up the full Check framework
20
+ * (defineCheck wraps `analyze` into an `execute` closure that
21
+ * requires an ExecutionContext to invoke).
22
+ */
23
+ export function analyzeTodoComments(content) {
24
+ const violations = [];
25
+ const lines = content.split('\n');
26
+ for (const [i, line_] of lines.entries()) {
27
+ const line = line_;
28
+ let match;
29
+ TODO_PATTERN.lastIndex = 0;
30
+ while ((match = TODO_PATTERN.exec(line)) !== null) {
31
+ violations.push({
32
+ message: `${match[1]} marker should be tracked in an issue, not left in source`,
33
+ severity: 'warning',
34
+ line: i + 1,
35
+ suggestion: 'File an issue and remove the marker, or convert to a tracked work item',
36
+ });
37
+ }
38
+ }
39
+ return violations;
40
+ }
41
+ export const noTodoComments = defineCheck({
42
+ id: '842e7d00-c8e8-4a57-873a-c03caec7e603',
43
+ slug: 'no-todo-comments',
44
+ description: 'TODO/FIXME/XXX/OPTIMIZE markers should not ship to production',
45
+ scope: { languages: [], concerns: [] },
46
+ tags: ['quality', 'documentation'],
47
+ // Restrict to source files. Markdown files legitimately discuss TODO
48
+ // markers (CONTRIBUTING examples, docs about the check itself); the
49
+ // marker hygiene rule only applies to executable code.
50
+ fileTypes: [
51
+ 'ts',
52
+ 'tsx',
53
+ 'js',
54
+ 'jsx',
55
+ 'mjs',
56
+ 'cjs',
57
+ 'py',
58
+ 'go',
59
+ 'java',
60
+ 'rs',
61
+ 'c',
62
+ 'cc',
63
+ 'cpp',
64
+ 'h',
65
+ 'hpp',
66
+ ],
67
+ // Use 'strip-strings' so the check sees comments but not string-literal
68
+ // text. A literal value containing the word "TODO" is not a comment.
69
+ contentFilter: 'strip-strings',
70
+ analyze: (content, filePath) => {
71
+ // Test files routinely contain TODO/FIXME markers as fixture content
72
+ // or pedagogical examples (e.g. test cases for this very check).
73
+ // The production-code hygiene rule does not apply to tests.
74
+ if (isTestFile(filePath))
75
+ return [];
76
+ return analyzeTodoComments(content);
77
+ },
78
+ });
79
+ //# sourceMappingURL=no-todo-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-todo-comments.js","sourceRoot":"","sources":["../../src/checks/no-todo-comments.ts"],"names":[],"mappings":"AAAA,iJAAiJ;AACjJ,uJAAuJ;AACvJ;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAuB,MAAM,sBAAsB,CAAC;AAEpF,wEAAwE;AACxE,yEAAyE;AACzE,mEAAmE;AACnE,uDAAuD;AACvD,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC;QACnB,IAAI,KAA6B,CAAC;QAClC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,UAAU,CAAC,IAAI,CAAC;gBACd,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,2DAA2D;gBAC/E,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,UAAU,EAAE,wEAAwE;aACrF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;IACxC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,+DAA+D;IAC5E,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IACtC,IAAI,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;IAClC,qEAAqE;IACrE,oEAAoE;IACpE,uDAAuD;IACvD,SAAS,EAAE;QACT,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,KAAK;QACL,KAAK;QACL,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,KAAK;QACL,GAAG;QACH,KAAK;KACN;IACD,wEAAwE;IACxE,qEAAqE;IACrE,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC7B,qEAAqE;QACrE,iEAAiE;QACjE,4DAA4D;QAC5D,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @fileoverview Cross-language "not implemented yet" stub-marker detection.
3
+ *
4
+ * Detects the highest-signal indicator of unfinished work: explicit
5
+ * THROW/MACRO idioms that announce the code is not implemented
6
+ * (`throw new Error('not implemented')`, `raise NotImplementedError`,
7
+ * `todo!()`, `unimplemented!()`, `panic("not implemented")`,
8
+ * `throw new UnsupportedOperationException`, `throw std::logic_error("not implemented")`).
9
+ *
10
+ * Uses the `raw` content filter (NOT `strip-strings`): the markers live
11
+ * inside string ARGUMENTS (e.g. `throw new Error('not implemented')`), so
12
+ * stripping string literals would erase the very text we match on.
13
+ *
14
+ * Patterns are dispatched by file extension and tuned for low false
15
+ * positives — each requires an unambiguous construct, not a bare word.
16
+ */
17
+ import { type CheckViolation } from '@opensip-cli/fitness';
18
+ /**
19
+ * Pure analysis function. Exported so unit tests can exercise the detection
20
+ * logic per-language without standing up the full Check framework.
21
+ */
22
+ export declare function analyzeUnimplementedMarkers(content: string, filePath: string): CheckViolation[];
23
+ export declare const noUnimplementedMarkers: import("@opensip-cli/fitness").Check;
24
+ //# sourceMappingURL=no-unimplemented-markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unimplemented-markers.d.ts","sourceRoot":"","sources":["../../src/checks/no-unimplemented-markers.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAyHpF;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CA0B/F;AAED,eAAO,MAAM,sBAAsB,sCA+CjC,CAAC"}
@@ -0,0 +1,198 @@
1
+ // @fitness-ignore-file no-unimplemented-markers -- this file's job is to detect "not implemented" stub idioms; the trigger patterns appear here in regex and prose by design
2
+ /**
3
+ * @fileoverview Cross-language "not implemented yet" stub-marker detection.
4
+ *
5
+ * Detects the highest-signal indicator of unfinished work: explicit
6
+ * THROW/MACRO idioms that announce the code is not implemented
7
+ * (`throw new Error('not implemented')`, `raise NotImplementedError`,
8
+ * `todo!()`, `unimplemented!()`, `panic("not implemented")`,
9
+ * `throw new UnsupportedOperationException`, `throw std::logic_error("not implemented")`).
10
+ *
11
+ * Uses the `raw` content filter (NOT `strip-strings`): the markers live
12
+ * inside string ARGUMENTS (e.g. `throw new Error('not implemented')`), so
13
+ * stripping string literals would erase the very text we match on.
14
+ *
15
+ * Patterns are dispatched by file extension and tuned for low false
16
+ * positives — each requires an unambiguous construct, not a bare word.
17
+ */
18
+ import { defineCheck, isTestFile } from '@opensip-cli/fitness';
19
+ /** Unfinished-work phrasing shared by the message-bearing language patterns. */
20
+ const UNIMPLEMENTED_MESSAGE = /not\s*implemented|unimplemented/i;
21
+ /**
22
+ * True when the idiom at `idx` is opened inside a markdown inline-code span — a
23
+ * backtick precedes it on the same line. A real `throw`/`raise`/`panic`/macro
24
+ * statement is never *introduced* by a backtick; but check `longDescription`
25
+ * strings and docs routinely write `` `throw new Error('not implemented')` `` as
26
+ * prose. We test the prefix only (not the whole line) so a genuine statement
27
+ * that happens to use a template-literal message — `throw new Error(\`not
28
+ * implemented: ${x}\`)` — is still flagged. Zero false positives, no real stub
29
+ * suppressed.
30
+ */
31
+ function isMarkdownQuoted(line, idx) {
32
+ return line.slice(0, idx).includes('`');
33
+ }
34
+ /**
35
+ * Build a `MarkerPattern.test` from a line regex. The construct matches when the
36
+ * regex hits AND (optionally) its captured argument satisfies `messageTest` AND
37
+ * the hit is not markdown-quoted prose. Centralising the `isMarkdownQuoted`
38
+ * guard here keeps every language consistent: a real statement is flagged, a
39
+ * doc-string quoting the idiom is not.
40
+ */
41
+ function lineMatcher(re, messageTest) {
42
+ return (line) => {
43
+ const match = re.exec(line);
44
+ if (match === null)
45
+ return false;
46
+ if (messageTest && !messageTest(match[1] ?? ''))
47
+ return false;
48
+ return !isMarkdownQuoted(line, match.index);
49
+ };
50
+ }
51
+ const isUnimplementedArg = (arg) => UNIMPLEMENTED_MESSAGE.test(arg);
52
+ /** A Go panic whose argument reads as unfinished work (not every panic). */
53
+ function isGoPanicArg(arg) {
54
+ return UNIMPLEMENTED_MESSAGE.test(arg) || /(^|["'`])\s*TODO|:\s*TODO/.test(arg);
55
+ }
56
+ const TS_JS_PATTERNS = [
57
+ {
58
+ marker: "throw new Error('not implemented')",
59
+ test: lineMatcher(/throw\s+new\s+Error\s*\(([^)]*)\)/i, isUnimplementedArg),
60
+ },
61
+ // `throw new NotImplementedError(...)` and a bare `NotImplementedError(` call.
62
+ { marker: 'NotImplementedError', test: lineMatcher(/\bNotImplementedError\s*\(/) },
63
+ ];
64
+ const PYTHON_PATTERNS = [
65
+ // `raise NotImplementedError` with or without parens/message.
66
+ { marker: 'raise NotImplementedError', test: lineMatcher(/\braise\s+NotImplementedError\b/) },
67
+ ];
68
+ const RUST_PATTERNS = [
69
+ { marker: 'todo!()', test: lineMatcher(/\btodo!\s*\(/) },
70
+ { marker: 'unimplemented!()', test: lineMatcher(/\bunimplemented!\s*\(/) },
71
+ ];
72
+ const GO_PATTERNS = [
73
+ { marker: 'panic("not implemented")', test: lineMatcher(/\bpanic\s*\(([^)]*)\)/, isGoPanicArg) },
74
+ ];
75
+ const JAVA_PATTERNS = [
76
+ // Covers the IDE-generated "Not supported yet." stub.
77
+ {
78
+ marker: 'throw new UnsupportedOperationException',
79
+ test: lineMatcher(/throw\s+new\s+UnsupportedOperationException\b/),
80
+ },
81
+ ];
82
+ const CPP_PATTERNS = [
83
+ {
84
+ marker: 'throw std::logic_error("not implemented")',
85
+ test: lineMatcher(/throw\s+std::logic_error\s*\(([^)]*)\)/, isUnimplementedArg),
86
+ },
87
+ // `assert(... && "not implemented")` — the common C/C++ stub idiom.
88
+ {
89
+ marker: 'assert(... && "not implemented")',
90
+ test: lineMatcher(/\bassert\s*\((.*)\)/, isUnimplementedArg),
91
+ },
92
+ ];
93
+ /** Extension → language patterns. Extensions absent here are unsupported. */
94
+ const PATTERNS_BY_EXTENSION = {
95
+ ts: TS_JS_PATTERNS,
96
+ tsx: TS_JS_PATTERNS,
97
+ js: TS_JS_PATTERNS,
98
+ jsx: TS_JS_PATTERNS,
99
+ mjs: TS_JS_PATTERNS,
100
+ cjs: TS_JS_PATTERNS,
101
+ py: PYTHON_PATTERNS,
102
+ rs: RUST_PATTERNS,
103
+ go: GO_PATTERNS,
104
+ java: JAVA_PATTERNS,
105
+ c: CPP_PATTERNS,
106
+ cc: CPP_PATTERNS,
107
+ cpp: CPP_PATTERNS,
108
+ h: CPP_PATTERNS,
109
+ hpp: CPP_PATTERNS,
110
+ };
111
+ /** Map a file extension to the language's marker patterns (null = unsupported). */
112
+ function patternsForExtension(filePath) {
113
+ const dot = filePath.lastIndexOf('.');
114
+ if (dot === -1)
115
+ return null;
116
+ const ext = filePath.slice(dot + 1).toLowerCase();
117
+ return PATTERNS_BY_EXTENSION[ext] ?? null;
118
+ }
119
+ /**
120
+ * Pure analysis function. Exported so unit tests can exercise the detection
121
+ * logic per-language without standing up the full Check framework.
122
+ */
123
+ export function analyzeUnimplementedMarkers(content, filePath) {
124
+ const patterns = patternsForExtension(filePath);
125
+ if (patterns === null)
126
+ return [];
127
+ const violations = [];
128
+ const lines = content.split('\n');
129
+ for (const [i, line] of lines.entries()) {
130
+ for (const { marker, test } of patterns) {
131
+ if (test(line)) {
132
+ violations.push({
133
+ message: `Unimplemented-work marker found (\`${marker}\` idiom): code announces it is not implemented`,
134
+ // Soft shipped default; repos wanting a hard gate set `failOnWarnings`
135
+ // (this repo does — see opensip-cli.config.yml).
136
+ severity: 'warning',
137
+ line: i + 1,
138
+ suggestion: 'Implement before shipping, or track the work in an issue and remove the placeholder',
139
+ match: line.trim(),
140
+ });
141
+ // One violation per line is enough; avoid double-counting overlapping
142
+ // idioms (e.g. a NotImplementedError throw matching two TS patterns).
143
+ break;
144
+ }
145
+ }
146
+ }
147
+ return violations;
148
+ }
149
+ export const noUnimplementedMarkers = defineCheck({
150
+ id: 'b8ec0d20-e5b5-487d-8d02-955b0f960cf6',
151
+ slug: 'no-unimplemented-markers',
152
+ description: 'Code must not announce it is unimplemented (throw/macro "not implemented" idioms)',
153
+ longDescription: `**Purpose:** Flags explicit "not implemented yet" stub idioms — the highest-signal indicator of unfinished work — across all six supported languages. Goal: never ship code that announces it isn't implemented.
154
+
155
+ **Detects (per language):**
156
+ - **TS/JS:** \`throw new Error(...)\` whose message matches not-implemented; \`throw new NotImplementedError\`; \`NotImplementedError(\`
157
+ - **Python:** \`raise NotImplementedError\`
158
+ - **Rust:** \`todo!(\` and \`unimplemented!(\` macros
159
+ - **Go:** \`panic(...)\` whose message reads as unfinished work (not every panic)
160
+ - **Java:** \`throw new UnsupportedOperationException\` (the IDE "Not supported yet" stub)
161
+ - **C/C++:** \`throw std::logic_error(...)\` or \`assert(... && "...")\` mentioning not-implemented
162
+
163
+ **Why it matters:** These markers are unambiguous declarations that a code path is a placeholder. Surfacing them on every fitness run prevents stubs from reaching production.
164
+
165
+ **Scope:** Source files only; test files are skipped.`,
166
+ scope: { languages: [], concerns: [] },
167
+ tags: ['quality', 'best-practices'],
168
+ confidence: 'high',
169
+ // Restrict to source files across all six supported languages.
170
+ fileTypes: [
171
+ 'ts',
172
+ 'tsx',
173
+ 'js',
174
+ 'jsx',
175
+ 'mjs',
176
+ 'cjs',
177
+ 'py',
178
+ 'go',
179
+ 'java',
180
+ 'rs',
181
+ 'c',
182
+ 'cc',
183
+ 'cpp',
184
+ 'h',
185
+ 'hpp',
186
+ ],
187
+ // Use 'raw': the markers live inside string ARGUMENTS, so 'strip-strings'
188
+ // would erase them before this check ever sees them.
189
+ contentFilter: 'raw',
190
+ analyze: (content, filePath) => {
191
+ // Test files routinely contain these idioms as fixture content or
192
+ // pedagogical examples (e.g. test cases for this very check).
193
+ if (isTestFile(filePath))
194
+ return [];
195
+ return analyzeUnimplementedMarkers(content, filePath);
196
+ },
197
+ });
198
+ //# sourceMappingURL=no-unimplemented-markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unimplemented-markers.js","sourceRoot":"","sources":["../../src/checks/no-unimplemented-markers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview Detect offset-based pagination in GraphQL queries
3
+ *
4
+ * Offset pagination produces unstable results when data changes between page
5
+ * fetches (the "shifting page" problem). Cursor-based pagination (keyset via
6
+ * where clause) provides stable results.
7
+ */
8
+ export declare const graphqlOffsetPagination: import("@opensip-cli/fitness").Check;
9
+ //# sourceMappingURL=graphql-offset-pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-offset-pagination.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/api/graphql-offset-pagination.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAMH,eAAO,MAAM,uBAAuB,sCA8DlC,CAAC"}