vibe-and-thrive 1.0.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 (145) hide show
  1. package/.claude/commands/add-tests.md +240 -0
  2. package/.claude/commands/e2e-scaffold.md +212 -0
  3. package/.claude/commands/explain.md +110 -0
  4. package/.claude/commands/fix-types.md +238 -0
  5. package/.claude/commands/refactor.md +184 -0
  6. package/.claude/commands/review.md +136 -0
  7. package/.claude/commands/security-check.md +223 -0
  8. package/.claude/commands/styleguide.md +446 -0
  9. package/.claude/commands/tdd-feature.md +227 -0
  10. package/.claude/commands/vibe-check.md +112 -0
  11. package/.pre-commit-hooks.yaml +77 -0
  12. package/LICENSE +21 -0
  13. package/README.md +167 -0
  14. package/bin/vibe-check.js +19 -0
  15. package/dist/cli.d.ts +13 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +206 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/eslint-plugin/index.d.ts +66 -0
  20. package/dist/eslint-plugin/index.d.ts.map +1 -0
  21. package/dist/eslint-plugin/index.js +67 -0
  22. package/dist/eslint-plugin/index.js.map +1 -0
  23. package/dist/eslint-plugin/rules/max-function-length.d.ts +8 -0
  24. package/dist/eslint-plugin/rules/max-function-length.d.ts.map +1 -0
  25. package/dist/eslint-plugin/rules/max-function-length.js +69 -0
  26. package/dist/eslint-plugin/rules/max-function-length.js.map +1 -0
  27. package/dist/eslint-plugin/rules/no-any-type.d.ts +8 -0
  28. package/dist/eslint-plugin/rules/no-any-type.d.ts.map +1 -0
  29. package/dist/eslint-plugin/rules/no-any-type.js +29 -0
  30. package/dist/eslint-plugin/rules/no-any-type.js.map +1 -0
  31. package/dist/eslint-plugin/rules/no-debug-statements.d.ts +8 -0
  32. package/dist/eslint-plugin/rules/no-debug-statements.d.ts.map +1 -0
  33. package/dist/eslint-plugin/rules/no-debug-statements.js +59 -0
  34. package/dist/eslint-plugin/rules/no-debug-statements.js.map +1 -0
  35. package/dist/eslint-plugin/rules/no-deep-nesting.d.ts +8 -0
  36. package/dist/eslint-plugin/rules/no-deep-nesting.d.ts.map +1 -0
  37. package/dist/eslint-plugin/rules/no-deep-nesting.js +56 -0
  38. package/dist/eslint-plugin/rules/no-deep-nesting.js.map +1 -0
  39. package/dist/eslint-plugin/rules/no-empty-catch.d.ts +8 -0
  40. package/dist/eslint-plugin/rules/no-empty-catch.d.ts.map +1 -0
  41. package/dist/eslint-plugin/rules/no-empty-catch.js +31 -0
  42. package/dist/eslint-plugin/rules/no-empty-catch.js.map +1 -0
  43. package/dist/eslint-plugin/rules/no-magic-numbers.d.ts +8 -0
  44. package/dist/eslint-plugin/rules/no-magic-numbers.d.ts.map +1 -0
  45. package/dist/eslint-plugin/rules/no-magic-numbers.js +58 -0
  46. package/dist/eslint-plugin/rules/no-magic-numbers.js.map +1 -0
  47. package/dist/eslint-plugin/rules/no-snake-case-props.d.ts +8 -0
  48. package/dist/eslint-plugin/rules/no-snake-case-props.d.ts.map +1 -0
  49. package/dist/eslint-plugin/rules/no-snake-case-props.js +48 -0
  50. package/dist/eslint-plugin/rules/no-snake-case-props.js.map +1 -0
  51. package/dist/hooks/check-any-types.d.ts +6 -0
  52. package/dist/hooks/check-any-types.d.ts.map +1 -0
  53. package/dist/hooks/check-any-types.js +73 -0
  54. package/dist/hooks/check-any-types.js.map +1 -0
  55. package/dist/hooks/check-commented-code.d.ts +6 -0
  56. package/dist/hooks/check-commented-code.d.ts.map +1 -0
  57. package/dist/hooks/check-commented-code.js +81 -0
  58. package/dist/hooks/check-commented-code.js.map +1 -0
  59. package/dist/hooks/check-console-error.d.ts +6 -0
  60. package/dist/hooks/check-console-error.d.ts.map +1 -0
  61. package/dist/hooks/check-console-error.js +41 -0
  62. package/dist/hooks/check-console-error.js.map +1 -0
  63. package/dist/hooks/check-debug-statements.d.ts +6 -0
  64. package/dist/hooks/check-debug-statements.d.ts.map +1 -0
  65. package/dist/hooks/check-debug-statements.js +120 -0
  66. package/dist/hooks/check-debug-statements.js.map +1 -0
  67. package/dist/hooks/check-deep-nesting.d.ts +6 -0
  68. package/dist/hooks/check-deep-nesting.d.ts.map +1 -0
  69. package/dist/hooks/check-deep-nesting.js +116 -0
  70. package/dist/hooks/check-deep-nesting.js.map +1 -0
  71. package/dist/hooks/check-docker-platform.d.ts +6 -0
  72. package/dist/hooks/check-docker-platform.d.ts.map +1 -0
  73. package/dist/hooks/check-docker-platform.js +42 -0
  74. package/dist/hooks/check-docker-platform.js.map +1 -0
  75. package/dist/hooks/check-dry-violations.d.ts +6 -0
  76. package/dist/hooks/check-dry-violations.d.ts.map +1 -0
  77. package/dist/hooks/check-dry-violations.js +124 -0
  78. package/dist/hooks/check-dry-violations.js.map +1 -0
  79. package/dist/hooks/check-empty-catch.d.ts +6 -0
  80. package/dist/hooks/check-empty-catch.d.ts.map +1 -0
  81. package/dist/hooks/check-empty-catch.js +111 -0
  82. package/dist/hooks/check-empty-catch.js.map +1 -0
  83. package/dist/hooks/check-function-length.d.ts +6 -0
  84. package/dist/hooks/check-function-length.d.ts.map +1 -0
  85. package/dist/hooks/check-function-length.js +152 -0
  86. package/dist/hooks/check-function-length.js.map +1 -0
  87. package/dist/hooks/check-hardcoded-urls.d.ts +6 -0
  88. package/dist/hooks/check-hardcoded-urls.d.ts.map +1 -0
  89. package/dist/hooks/check-hardcoded-urls.js +124 -0
  90. package/dist/hooks/check-hardcoded-urls.js.map +1 -0
  91. package/dist/hooks/check-magic-numbers.d.ts +6 -0
  92. package/dist/hooks/check-magic-numbers.d.ts.map +1 -0
  93. package/dist/hooks/check-magic-numbers.js +116 -0
  94. package/dist/hooks/check-magic-numbers.js.map +1 -0
  95. package/dist/hooks/check-secrets.d.ts +6 -0
  96. package/dist/hooks/check-secrets.d.ts.map +1 -0
  97. package/dist/hooks/check-secrets.js +138 -0
  98. package/dist/hooks/check-secrets.js.map +1 -0
  99. package/dist/hooks/check-snake-case-ts.d.ts +6 -0
  100. package/dist/hooks/check-snake-case-ts.d.ts.map +1 -0
  101. package/dist/hooks/check-snake-case-ts.js +78 -0
  102. package/dist/hooks/check-snake-case-ts.js.map +1 -0
  103. package/dist/hooks/check-todo-fixme.d.ts +6 -0
  104. package/dist/hooks/check-todo-fixme.d.ts.map +1 -0
  105. package/dist/hooks/check-todo-fixme.js +41 -0
  106. package/dist/hooks/check-todo-fixme.js.map +1 -0
  107. package/dist/hooks/check-unsafe-html.d.ts +6 -0
  108. package/dist/hooks/check-unsafe-html.d.ts.map +1 -0
  109. package/dist/hooks/check-unsafe-html.js +101 -0
  110. package/dist/hooks/check-unsafe-html.js.map +1 -0
  111. package/dist/hooks/index.d.ts +29 -0
  112. package/dist/hooks/index.d.ts.map +1 -0
  113. package/dist/hooks/index.js +54 -0
  114. package/dist/hooks/index.js.map +1 -0
  115. package/dist/index.d.ts +9 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +10 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/lint-staged/config.d.ts +20 -0
  120. package/dist/lint-staged/config.d.ts.map +1 -0
  121. package/dist/lint-staged/config.js +27 -0
  122. package/dist/lint-staged/config.js.map +1 -0
  123. package/dist/utils/file-reader.d.ts +24 -0
  124. package/dist/utils/file-reader.d.ts.map +1 -0
  125. package/dist/utils/file-reader.js +140 -0
  126. package/dist/utils/file-reader.js.map +1 -0
  127. package/dist/utils/patterns.d.ts +27 -0
  128. package/dist/utils/patterns.d.ts.map +1 -0
  129. package/dist/utils/patterns.js +84 -0
  130. package/dist/utils/patterns.js.map +1 -0
  131. package/dist/utils/reporters.d.ts +21 -0
  132. package/dist/utils/reporters.d.ts.map +1 -0
  133. package/dist/utils/reporters.js +115 -0
  134. package/dist/utils/reporters.js.map +1 -0
  135. package/dist/utils/types.d.ts +71 -0
  136. package/dist/utils/types.d.ts.map +1 -0
  137. package/dist/utils/types.js +5 -0
  138. package/dist/utils/types.js.map +1 -0
  139. package/integrations/cursorrules.template +147 -0
  140. package/integrations/eslint.config.js +34 -0
  141. package/integrations/lint-staged.config.js +34 -0
  142. package/integrations/ruff.toml +125 -0
  143. package/integrations/vibe-check.yml +116 -0
  144. package/integrations/vscode-settings.json +127 -0
  145. package/package.json +81 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * ESLint rule: no-empty-catch
3
+ * Disallow empty catch blocks
4
+ */
5
+ const rule = {
6
+ meta: {
7
+ type: 'problem',
8
+ docs: {
9
+ description: 'Disallow empty catch blocks that silently swallow errors',
10
+ recommended: true,
11
+ },
12
+ messages: {
13
+ emptyCatch: 'Empty catch block - handle or rethrow the error',
14
+ },
15
+ schema: [],
16
+ },
17
+ create(context) {
18
+ return {
19
+ CatchClause(node) {
20
+ if (node.body?.body?.length === 0) {
21
+ context.report({
22
+ node,
23
+ messageId: 'emptyCatch',
24
+ });
25
+ }
26
+ },
27
+ };
28
+ },
29
+ };
30
+ export default rule;
31
+ //# sourceMappingURL=no-empty-catch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-empty-catch.js","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-empty-catch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,0DAA0D;YACvE,WAAW,EAAE,IAAI;SAClB;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,iDAAiD;SAC9D;QACD,MAAM,EAAE,EAAE;KACX;IAED,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,WAAW,CAAC,IAAiD;gBAC3D,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,YAAY;qBACxB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ESLint rule: no-magic-numbers
3
+ * Disallow magic numbers that should be named constants
4
+ */
5
+ import type { Rule } from 'eslint';
6
+ declare const rule: Rule.RuleModule;
7
+ export default rule;
8
+ //# sourceMappingURL=no-magic-numbers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-magic-numbers.d.ts","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-magic-numbers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAInC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAsDhB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * ESLint rule: no-magic-numbers
3
+ * Disallow magic numbers that should be named constants
4
+ */
5
+ const ACCEPTABLE_NUMBERS = new Set([-1, 0, 1, 2, 10, 100, 1000]);
6
+ const rule = {
7
+ meta: {
8
+ type: 'suggestion',
9
+ docs: {
10
+ description: 'Disallow magic numbers that should be named constants',
11
+ recommended: false,
12
+ },
13
+ messages: {
14
+ magicNumber: 'Magic number {{ value }} - consider using a named constant',
15
+ },
16
+ schema: [
17
+ {
18
+ type: 'object',
19
+ properties: {
20
+ ignore: {
21
+ type: 'array',
22
+ items: { type: 'number' },
23
+ },
24
+ },
25
+ additionalProperties: false,
26
+ },
27
+ ],
28
+ },
29
+ create(context) {
30
+ const options = context.options[0] || {};
31
+ const ignore = new Set([...ACCEPTABLE_NUMBERS, ...(options.ignore || [])]);
32
+ return {
33
+ Literal(node) {
34
+ if (typeof node.value !== 'number')
35
+ return;
36
+ if (ignore.has(node.value))
37
+ return;
38
+ // Skip array indices
39
+ if (node.parent?.type === 'MemberExpression')
40
+ return;
41
+ // Skip variable declarations with UPPER_CASE names
42
+ if (node.parent?.type === 'VariableDeclarator' &&
43
+ node.parent.id?.name?.match(/^[A-Z][A-Z0-9_]*$/)) {
44
+ return;
45
+ }
46
+ context.report({
47
+ node,
48
+ messageId: 'magicNumber',
49
+ data: {
50
+ value: String(node.value),
51
+ },
52
+ });
53
+ },
54
+ };
55
+ },
56
+ };
57
+ export default rule;
58
+ //# sourceMappingURL=no-magic-numbers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-magic-numbers.js","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-magic-numbers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjE,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,uDAAuD;YACpE,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,4DAA4D;SAC1E;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC1B;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3E,OAAO;YACL,OAAO,CAAC,IAAiE;gBACvE,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;oBAAE,OAAO;gBAC3C,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO;gBAEnC,qBAAqB;gBACrB,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,kBAAkB;oBAAE,OAAO;gBAErD,mDAAmD;gBACnD,IACE,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,oBAAoB;oBACzC,IAAI,CAAC,MAAqC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,mBAAmB,CAAC,EAChF,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,aAAa;oBACxB,IAAI,EAAE;wBACJ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;qBAC1B;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ESLint rule: no-snake-case-props
3
+ * Disallow snake_case property names in TypeScript interfaces
4
+ */
5
+ import type { Rule } from 'eslint';
6
+ declare const rule: Rule.RuleModule;
7
+ export default rule;
8
+ //# sourceMappingURL=no-snake-case-props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-snake-case-props.d.ts","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-snake-case-props.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAQnC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAsChB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * ESLint rule: no-snake-case-props
3
+ * Disallow snake_case property names in TypeScript interfaces
4
+ */
5
+ const SNAKE_CASE_PATTERN = /^[a-z][a-z0-9]*(?:_[a-z0-9]+)+$/;
6
+ function toCamelCase(snakeCase) {
7
+ return snakeCase.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
8
+ }
9
+ const rule = {
10
+ meta: {
11
+ type: 'suggestion',
12
+ docs: {
13
+ description: 'Disallow snake_case property names in TypeScript interfaces',
14
+ recommended: true,
15
+ },
16
+ fixable: 'code',
17
+ messages: {
18
+ snakeCase: 'Property "{{ name }}" uses snake_case - use camelCase "{{ suggested }}" instead',
19
+ },
20
+ schema: [],
21
+ },
22
+ create(context) {
23
+ return {
24
+ TSPropertySignature(node) {
25
+ const nodeAny = node;
26
+ if (nodeAny.key?.type === 'Identifier' && nodeAny.key.name) {
27
+ const name = nodeAny.key.name;
28
+ if (SNAKE_CASE_PATTERN.test(name)) {
29
+ const keyNode = nodeAny.key;
30
+ context.report({
31
+ node: keyNode,
32
+ messageId: 'snakeCase',
33
+ data: {
34
+ name,
35
+ suggested: toCamelCase(name),
36
+ },
37
+ fix(fixer) {
38
+ return fixer.replaceText(keyNode, toCamelCase(name));
39
+ },
40
+ });
41
+ }
42
+ }
43
+ },
44
+ };
45
+ },
46
+ };
47
+ export default rule;
48
+ //# sourceMappingURL=no-snake-case-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-snake-case-props.js","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-snake-case-props.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,kBAAkB,GAAG,iCAAiC,CAAC;AAE7D,SAAS,WAAW,CAAC,SAAiB;IACpC,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,6DAA6D;YAC1E,WAAW,EAAE,IAAI;SAClB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,SAAS,EAAE,iFAAiF;SAC7F;QACD,MAAM,EAAE,EAAE;KACX;IAED,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,mBAAmB,CAAC,IAAe;gBACjC,MAAM,OAAO,GAAG,IAAkD,CAAC;gBACnE,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC9B,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClC,MAAM,OAAO,GAAG,OAAO,CAAC,GAA2B,CAAC;wBACpD,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,OAAO;4BACb,SAAS,EAAE,WAAW;4BACtB,IAAI,EAAE;gCACJ,IAAI;gCACJ,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;6BAC7B;4BACD,GAAG,CAAC,KAAK;gCACP,OAAO,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;4BACvD,CAAC;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Check for 'any' type usage in TypeScript
3
+ */
4
+ import type { Hook } from '../utils/types.js';
5
+ export declare const checkAnyTypes: Hook;
6
+ //# sourceMappingURL=check-any-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-any-types.d.ts","sourceRoot":"","sources":["../../src/hooks/check-any-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAEvE,eAAO,MAAM,aAAa,EAAE,IA8E3B,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Check for 'any' type usage in TypeScript
3
+ */
4
+ export const checkAnyTypes = {
5
+ id: 'any-types',
6
+ name: 'Check Any Types',
7
+ description: 'Detect usage of "any" type in TypeScript',
8
+ severity: 'warning',
9
+ fileTypes: ['ts', 'tsx', 'mts', 'cts'],
10
+ check(context) {
11
+ const results = [];
12
+ const lines = context.content.split('\n');
13
+ // Track if we're in a block comment
14
+ let inBlockComment = false;
15
+ for (let i = 0; i < lines.length; i++) {
16
+ const line = lines[i];
17
+ const lineNum = i + 1;
18
+ // Handle block comments
19
+ if (line.includes('/*')) {
20
+ inBlockComment = true;
21
+ }
22
+ if (line.includes('*/')) {
23
+ inBlockComment = false;
24
+ continue;
25
+ }
26
+ if (inBlockComment) {
27
+ continue;
28
+ }
29
+ // Skip single-line comments
30
+ if (line.trim().startsWith('//')) {
31
+ continue;
32
+ }
33
+ // Remove string literals to avoid false positives
34
+ const lineWithoutStrings = line
35
+ .replace(/"[^"]*"/g, '""')
36
+ .replace(/'[^']*'/g, "''")
37
+ .replace(/`[^`]*`/g, '``');
38
+ // Look for 'any' type annotations
39
+ // Matches: : any, : any[], <any>, as any, etc.
40
+ const anyPatterns = [
41
+ /:\s*any\b/, // : any
42
+ /:\s*any\s*\[/, // : any[]
43
+ /:\s*any\s*\|/, // : any |
44
+ /\|\s*any\b/, // | any
45
+ /<\s*any\s*>/, // <any>
46
+ /<\s*any\s*,/, // <any,
47
+ /,\s*any\s*>/, // , any>
48
+ /as\s+any\b/, // as any
49
+ /:\s*Array\s*<\s*any\s*>/, // : Array<any>
50
+ /:\s*Record\s*<\s*[^,]+,\s*any\s*>/, // : Record<..., any>
51
+ ];
52
+ for (const pattern of anyPatterns) {
53
+ const match = lineWithoutStrings.match(pattern);
54
+ if (match) {
55
+ // Check if it's disabled via eslint comment
56
+ if (line.includes('eslint-disable') || line.includes('@ts-ignore')) {
57
+ continue;
58
+ }
59
+ results.push({
60
+ line: lineNum,
61
+ column: match.index || 0,
62
+ message: 'Avoid using "any" type - use "unknown" or a specific type instead',
63
+ severity: 'warning',
64
+ ruleId: 'any-types/no-any',
65
+ });
66
+ break; // Only report once per line
67
+ }
68
+ }
69
+ }
70
+ return results;
71
+ },
72
+ };
73
+ //# sourceMappingURL=check-any-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-any-types.js","sourceRoot":"","sources":["../../src/hooks/check-any-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,0CAA0C;IACvD,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAEtC,KAAK,CAAC,OAAoB;QACxB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,oCAAoC;QACpC,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,wBAAwB;YACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,cAAc,GAAG,KAAK,CAAC;gBACvB,SAAS;YACX,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YAED,kDAAkD;YAClD,MAAM,kBAAkB,GAAG,IAAI;iBAC5B,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;iBACzB,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;iBACzB,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAE7B,kCAAkC;YAClC,+CAA+C;YAC/C,MAAM,WAAW,GAAG;gBAClB,WAAW,EAAqB,QAAQ;gBACxC,cAAc,EAAkB,UAAU;gBAC1C,cAAc,EAAkB,UAAU;gBAC1C,YAAY,EAAoB,QAAQ;gBACxC,aAAa,EAAmB,QAAQ;gBACxC,aAAa,EAAmB,QAAQ;gBACxC,aAAa,EAAmB,SAAS;gBACzC,YAAY,EAAoB,SAAS;gBACzC,yBAAyB,EAAO,eAAe;gBAC/C,mCAAmC,EAAE,qBAAqB;aAC3D,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChD,IAAI,KAAK,EAAE,CAAC;oBACV,4CAA4C;oBAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;wBACnE,SAAS;oBACX,CAAC;oBAED,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;wBACxB,OAAO,EAAE,mEAAmE;wBAC5E,QAAQ,EAAE,SAAS;wBACnB,MAAM,EAAE,kBAAkB;qBAC3B,CAAC,CAAC;oBACH,MAAM,CAAC,4BAA4B;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Check for commented-out code blocks
3
+ */
4
+ import type { Hook } from '../utils/types.js';
5
+ export declare const checkCommentedCode: Hook;
6
+ //# sourceMappingURL=check-commented-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-commented-code.d.ts","sourceRoot":"","sources":["../../src/hooks/check-commented-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAsBvE,eAAO,MAAM,kBAAkB,EAAE,IAwDhC,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Check for commented-out code blocks
3
+ */
4
+ // Patterns that indicate commented-out code vs regular comments
5
+ const JS_CODE_PATTERNS = [
6
+ /^\s*\/\/\s*(?:const|let|var|function|class|import|export|return|if|else|for|while|try|catch|switch)\b/,
7
+ /^\s*\/\/\s*\w+\s*\([^)]*\)\s*[;{]?\s*$/, // function calls
8
+ /^\s*\/\/\s*\w+\s*=\s*.+[;,]?\s*$/, // assignments
9
+ /^\s*\/\/\s*}\s*(?:else|catch|finally)?\s*{?\s*$/, // closing braces
10
+ /^\s*\/\/\s*\w+\.\w+\s*\(/, // method calls
11
+ /^\s*\/\*\s*(?:const|let|var|function|class|import|export)\b/,
12
+ ];
13
+ const PY_CODE_PATTERNS = [
14
+ /^\s*#\s*(?:def|class|import|from|return|if|elif|else|for|while|try|except|with|async)\b/,
15
+ /^\s*#\s*\w+\s*=\s*.+$/, // assignments
16
+ /^\s*#\s*\w+\s*\([^)]*\)\s*$/, // function calls
17
+ /^\s*#\s*\w+\.\w+\s*\(/, // method calls
18
+ ];
19
+ // Minimum consecutive commented lines to report
20
+ const MIN_CONSECUTIVE_LINES = 3;
21
+ export const checkCommentedCode = {
22
+ id: 'commented-code',
23
+ name: 'Check Commented Code',
24
+ description: 'Detect commented-out code blocks that should be removed',
25
+ severity: 'info',
26
+ fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'py'],
27
+ check(context) {
28
+ const results = [];
29
+ const lines = context.content.split('\n');
30
+ const language = getLanguage(context.extension);
31
+ const patterns = language === 'python' ? PY_CODE_PATTERNS : JS_CODE_PATTERNS;
32
+ let consecutiveCodeComments = 0;
33
+ let blockStartLine = 0;
34
+ for (let i = 0; i < lines.length; i++) {
35
+ const line = lines[i];
36
+ const lineNum = i + 1;
37
+ // Check if this line looks like commented-out code
38
+ const looksLikeCode = patterns.some((pattern) => pattern.test(line));
39
+ if (looksLikeCode) {
40
+ if (consecutiveCodeComments === 0) {
41
+ blockStartLine = lineNum;
42
+ }
43
+ consecutiveCodeComments++;
44
+ }
45
+ else {
46
+ // End of potential block
47
+ if (consecutiveCodeComments >= MIN_CONSECUTIVE_LINES) {
48
+ results.push({
49
+ line: blockStartLine,
50
+ column: 0,
51
+ message: `${consecutiveCodeComments} lines of commented-out code - consider removing`,
52
+ severity: 'info',
53
+ ruleId: 'commented-code/block',
54
+ });
55
+ }
56
+ consecutiveCodeComments = 0;
57
+ }
58
+ }
59
+ // Check for block at end of file
60
+ if (consecutiveCodeComments >= MIN_CONSECUTIVE_LINES) {
61
+ results.push({
62
+ line: blockStartLine,
63
+ column: 0,
64
+ message: `${consecutiveCodeComments} lines of commented-out code - consider removing`,
65
+ severity: 'info',
66
+ ruleId: 'commented-code/block',
67
+ });
68
+ }
69
+ return results;
70
+ },
71
+ };
72
+ function getLanguage(ext) {
73
+ if (['js', 'jsx', 'mjs', 'cjs'].includes(ext))
74
+ return 'javascript';
75
+ if (['ts', 'tsx', 'mts', 'cts'].includes(ext))
76
+ return 'typescript';
77
+ if (['py', 'pyw'].includes(ext))
78
+ return 'python';
79
+ return 'unknown';
80
+ }
81
+ //# sourceMappingURL=check-commented-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-commented-code.js","sourceRoot":"","sources":["../../src/hooks/check-commented-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,gEAAgE;AAChE,MAAM,gBAAgB,GAAG;IACvB,uGAAuG;IACvG,wCAAwC,EAAG,iBAAiB;IAC5D,kCAAkC,EAAS,cAAc;IACzD,iDAAiD,EAAG,iBAAiB;IACrE,0BAA0B,EAAkB,eAAe;IAC3D,6DAA6D;CAC9D,CAAC;AAEF,MAAM,gBAAgB,GAAG;IACvB,yFAAyF;IACzF,uBAAuB,EAAqB,cAAc;IAC1D,6BAA6B,EAAe,iBAAiB;IAC7D,uBAAuB,EAAqB,eAAe;CAC5D,CAAC;AAEF,gDAAgD;AAChD,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,kBAAkB,GAAS;IACtC,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,yDAAyD;IACtE,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;IAEzD,KAAK,CAAC,OAAoB;QACxB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAE7E,IAAI,uBAAuB,GAAG,CAAC,CAAC;QAChC,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,mDAAmD;YACnD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAErE,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,uBAAuB,KAAK,CAAC,EAAE,CAAC;oBAClC,cAAc,GAAG,OAAO,CAAC;gBAC3B,CAAC;gBACD,uBAAuB,EAAE,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,yBAAyB;gBACzB,IAAI,uBAAuB,IAAI,qBAAqB,EAAE,CAAC;oBACrD,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,cAAc;wBACpB,MAAM,EAAE,CAAC;wBACT,OAAO,EAAE,GAAG,uBAAuB,kDAAkD;wBACrF,QAAQ,EAAE,MAAM;wBAChB,MAAM,EAAE,sBAAsB;qBAC/B,CAAC,CAAC;gBACL,CAAC;gBACD,uBAAuB,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,uBAAuB,IAAI,qBAAqB,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,GAAG,uBAAuB,kDAAkD;gBACrF,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,sBAAsB;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC;AAEF,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IACnE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IACnE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Check for console.error usage that might need proper error handling
3
+ */
4
+ import type { Hook } from '../utils/types.js';
5
+ export declare const checkConsoleError: Hook;
6
+ //# sourceMappingURL=check-console-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-console-error.d.ts","sourceRoot":"","sources":["../../src/hooks/check-console-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAEvE,eAAO,MAAM,iBAAiB,EAAE,IA0C/B,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Check for console.error usage that might need proper error handling
3
+ */
4
+ export const checkConsoleError = {
5
+ id: 'console-error',
6
+ name: 'Check Console Error',
7
+ description: 'Detect console.error that might need proper error handling',
8
+ severity: 'info',
9
+ fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs'],
10
+ check(context) {
11
+ const results = [];
12
+ const lines = context.content.split('\n');
13
+ for (let i = 0; i < lines.length; i++) {
14
+ const line = lines[i];
15
+ const lineNum = i + 1;
16
+ // Skip comment lines
17
+ if (line.trim().startsWith('//') || line.trim().startsWith('*')) {
18
+ continue;
19
+ }
20
+ // Look for console.error
21
+ const match = line.match(/console\.error\s*\(/);
22
+ if (match) {
23
+ // Check if it's in a catch block (look at nearby lines)
24
+ const nearbyLines = lines.slice(Math.max(0, i - 5), i + 1).join('\n');
25
+ const inCatchBlock = /catch\s*\([^)]*\)\s*\{/.test(nearbyLines);
26
+ if (inCatchBlock) {
27
+ // In a catch block - suggest proper error handling
28
+ results.push({
29
+ line: lineNum,
30
+ column: match.index || 0,
31
+ message: 'console.error in catch block - consider using a logging service or rethrowing',
32
+ severity: 'info',
33
+ ruleId: 'console-error/in-catch',
34
+ });
35
+ }
36
+ }
37
+ }
38
+ return results;
39
+ },
40
+ };
41
+ //# sourceMappingURL=check-console-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-console-error.js","sourceRoot":"","sources":["../../src/hooks/check-console-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAS;IACrC,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,4DAA4D;IACzE,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAEnD,KAAK,CAAC,OAAoB;QACxB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,qBAAqB;YACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChE,SAAS;YACX,CAAC;YAED,yBAAyB;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAI,KAAK,EAAE,CAAC;gBACV,wDAAwD;gBACxD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtE,MAAM,YAAY,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAEhE,IAAI,YAAY,EAAE,CAAC;oBACjB,mDAAmD;oBACnD,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;wBACxB,OAAO,EAAE,+EAA+E;wBACxF,QAAQ,EAAE,MAAM;wBAChB,MAAM,EAAE,wBAAwB;qBACjC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Check for debug statements that should be removed before commit
3
+ */
4
+ import type { Hook } from '../utils/types.js';
5
+ export declare const checkDebugStatements: Hook;
6
+ //# sourceMappingURL=check-debug-statements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-debug-statements.d.ts","sourceRoot":"","sources":["../../src/hooks/check-debug-statements.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAGvE,eAAO,MAAM,oBAAoB,EAAE,IA0ElC,CAAC"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Check for debug statements that should be removed before commit
3
+ */
4
+ import { DEBUG_PATTERNS } from '../utils/patterns.js';
5
+ export const checkDebugStatements = {
6
+ id: 'debug',
7
+ name: 'Check Debug Statements',
8
+ description: 'Detect console.log, print(), debugger, and other debug statements',
9
+ severity: 'warning',
10
+ fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'py'],
11
+ check(context) {
12
+ const results = [];
13
+ const lines = context.content.split('\n');
14
+ // Get patterns for this language
15
+ const language = getLanguageFromExtension(context.extension);
16
+ const patterns = DEBUG_PATTERNS[language] || [];
17
+ if (patterns.length === 0) {
18
+ return results;
19
+ }
20
+ // Track if we're inside a multi-line comment
21
+ let inBlockComment = false;
22
+ for (let i = 0; i < lines.length; i++) {
23
+ const line = lines[i];
24
+ const lineNum = i + 1;
25
+ // Handle block comments for JS/TS
26
+ if (['javascript', 'typescript'].includes(language)) {
27
+ if (line.includes('/*') && !line.includes('*/')) {
28
+ inBlockComment = true;
29
+ }
30
+ if (line.includes('*/')) {
31
+ inBlockComment = false;
32
+ continue;
33
+ }
34
+ if (inBlockComment) {
35
+ continue;
36
+ }
37
+ }
38
+ // Skip single-line comments
39
+ if (isCommentLine(line, language)) {
40
+ continue;
41
+ }
42
+ // Check each pattern
43
+ for (const pattern of patterns) {
44
+ const match = line.match(pattern);
45
+ if (match) {
46
+ const patternType = getPatternType(pattern.source, language);
47
+ // Skip console.error and console.warn - these are often intentional
48
+ if (patternType === 'console' && /console\.(error|warn)\s*\(/.test(line)) {
49
+ continue;
50
+ }
51
+ // Skip if explicitly marked to keep
52
+ if (line.includes('// eslint-disable') || line.includes('# noqa')) {
53
+ continue;
54
+ }
55
+ results.push({
56
+ line: lineNum,
57
+ column: match.index || 0,
58
+ message: getDebugMessage(patternType, language),
59
+ severity: 'warning',
60
+ ruleId: `debug/${patternType}`,
61
+ });
62
+ }
63
+ }
64
+ }
65
+ return results;
66
+ },
67
+ };
68
+ function getLanguageFromExtension(ext) {
69
+ if (['js', 'jsx', 'mjs', 'cjs'].includes(ext))
70
+ return 'javascript';
71
+ if (['ts', 'tsx', 'mts', 'cts'].includes(ext))
72
+ return 'typescript';
73
+ if (['py', 'pyw'].includes(ext))
74
+ return 'python';
75
+ return 'unknown';
76
+ }
77
+ function isCommentLine(line, language) {
78
+ const trimmed = line.trim();
79
+ if (['javascript', 'typescript'].includes(language)) {
80
+ return trimmed.startsWith('//') || trimmed.startsWith('*');
81
+ }
82
+ if (language === 'python') {
83
+ return trimmed.startsWith('#');
84
+ }
85
+ return false;
86
+ }
87
+ function getPatternType(patternSource, _language) {
88
+ if (patternSource.includes('console'))
89
+ return 'console';
90
+ if (patternSource.includes('debugger'))
91
+ return 'debugger';
92
+ if (patternSource.includes('alert'))
93
+ return 'alert';
94
+ if (patternSource.includes('print'))
95
+ return 'print';
96
+ if (patternSource.includes('breakpoint'))
97
+ return 'breakpoint';
98
+ if (patternSource.includes('pdb') || patternSource.includes('ipdb'))
99
+ return 'pdb';
100
+ return 'debug';
101
+ }
102
+ function getDebugMessage(patternType, _language) {
103
+ switch (patternType) {
104
+ case 'console':
105
+ return 'console.log() statement - remove before commit';
106
+ case 'debugger':
107
+ return 'debugger statement - remove before commit';
108
+ case 'alert':
109
+ return 'alert() statement - remove before commit';
110
+ case 'print':
111
+ return 'print() statement - use proper logging instead';
112
+ case 'breakpoint':
113
+ return 'breakpoint() - remove before commit';
114
+ case 'pdb':
115
+ return 'pdb debugger - remove before commit';
116
+ default:
117
+ return 'Debug statement - remove before commit';
118
+ }
119
+ }
120
+ //# sourceMappingURL=check-debug-statements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-debug-statements.js","sourceRoot":"","sources":["../../src/hooks/check-debug-statements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Check for deeply nested code blocks
3
+ */
4
+ import type { Hook } from '../utils/types.js';
5
+ export declare const checkDeepNesting: Hook;
6
+ //# sourceMappingURL=check-deep-nesting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-deep-nesting.d.ts","sourceRoot":"","sources":["../../src/hooks/check-deep-nesting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAIvE,eAAO,MAAM,gBAAgB,EAAE,IAmB9B,CAAC"}