claude-dev-env 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 (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +219 -0
  3. package/agents/agent-writer.md +157 -0
  4. package/agents/clasp-deployment-orchestrator.md +609 -0
  5. package/agents/clean-coder.md +295 -0
  6. package/agents/code-quality-agent.md +40 -0
  7. package/agents/code-standards-agent.md +93 -0
  8. package/agents/config-centralizer.md +686 -0
  9. package/agents/config-extraction-agent.md +225 -0
  10. package/agents/doc-orchestrator.md +47 -0
  11. package/agents/docs-agent.md +112 -0
  12. package/agents/docx-agent.md +211 -0
  13. package/agents/git-commit-crafter.md +100 -0
  14. package/agents/magic-value-eliminator-agent.md +72 -0
  15. package/agents/mandatory-agent-workflow-agent.md +88 -0
  16. package/agents/parallel-workflow-coordinator.md +779 -0
  17. package/agents/pdf-agent.md +302 -0
  18. package/agents/plan-executor.md +226 -0
  19. package/agents/pr-description-writer.md +87 -0
  20. package/agents/project-context-loader.md +238 -0
  21. package/agents/project-docs-analyzer.md +54 -0
  22. package/agents/project-structure-organizer-agent.md +72 -0
  23. package/agents/readability-review-agent.md +76 -0
  24. package/agents/refactoring-specialist.md +69 -0
  25. package/agents/right-sized-engineer.md +129 -0
  26. package/agents/session-continuity-manager.md +53 -0
  27. package/agents/skill-to-agent-converter.md +371 -0
  28. package/agents/skill-writer-agent.md +470 -0
  29. package/agents/stub-detector-agent.md +140 -0
  30. package/agents/tdd-test-writer.md +62 -0
  31. package/agents/test-data-builder.md +68 -0
  32. package/agents/tooling-builder.md +78 -0
  33. package/agents/user-docs-writer.md +67 -0
  34. package/agents/validation-expert.md +71 -0
  35. package/agents/workflow-visual-documenter.md +82 -0
  36. package/agents/xlsx-agent.md +169 -0
  37. package/bin/install.mjs +256 -0
  38. package/commands/commit.md +28 -0
  39. package/commands/docupdate.md +322 -0
  40. package/commands/implement.md +102 -0
  41. package/commands/initialize.md +91 -0
  42. package/commands/plan.md +63 -0
  43. package/commands/pr-comments.md +47 -0
  44. package/commands/readability-review.md +20 -0
  45. package/commands/review-plan.md +7 -0
  46. package/commands/right-size.md +15 -0
  47. package/commands/stubcheck.md +89 -0
  48. package/commands/sum.md +30 -0
  49. package/docs/CODE_RULES.md +186 -0
  50. package/docs/DJANGO_PATTERNS.md +80 -0
  51. package/docs/REACT_PATTERNS.md +185 -0
  52. package/docs/TEST_QUALITY.md +104 -0
  53. package/hooks/advisory/migration-safety-advisor.py +49 -0
  54. package/hooks/advisory/refactor-guard.py +205 -0
  55. package/hooks/blocking/block-main-commit.py +168 -0
  56. package/hooks/blocking/code-rules-enforcer.py +549 -0
  57. package/hooks/blocking/destructive-command-blocker.py +107 -0
  58. package/hooks/blocking/docker-settings-guard.py +44 -0
  59. package/hooks/blocking/hedging-language-blocker.py +130 -0
  60. package/hooks/blocking/parallel-task-blocker.py +69 -0
  61. package/hooks/blocking/pr-description-enforcer.py +87 -0
  62. package/hooks/blocking/pyautogui-scroll-blocker.py +74 -0
  63. package/hooks/blocking/sensitive-file-protector.py +70 -0
  64. package/hooks/blocking/tdd-enforcer.py +62 -0
  65. package/hooks/blocking/test-preflight-check.py +343 -0
  66. package/hooks/blocking/write-existing-file-blocker.py +63 -0
  67. package/hooks/git-hooks/post-commit.py +103 -0
  68. package/hooks/github-action/test_workflow.py +33 -0
  69. package/hooks/hooks.json +246 -0
  70. package/hooks/lifecycle/config-change-guard.py +84 -0
  71. package/hooks/lifecycle/session-end-cleanup.py +59 -0
  72. package/hooks/notification/attention-needed-notify.py +63 -0
  73. package/hooks/notification/claude-notification-handler.py +59 -0
  74. package/hooks/notification/notification_utils.py +206 -0
  75. package/hooks/rewrite-plugin-paths.py +116 -0
  76. package/hooks/session/bulk-edit-reminder.py +30 -0
  77. package/hooks/session/code-rules-reminder.py +97 -0
  78. package/hooks/session/compact-context-reinject.py +39 -0
  79. package/hooks/session/hook-structure-context.py +140 -0
  80. package/hooks/session/plugin-data-dir-cleanup.py +39 -0
  81. package/hooks/validation/code-style-validator.py +145 -0
  82. package/hooks/validation/e2e-test-validator.py +142 -0
  83. package/hooks/validation/hook-format-validator.py +66 -0
  84. package/hooks/validation/mypy_validator.py +180 -0
  85. package/hooks/validators/README.md +125 -0
  86. package/hooks/validators/VALIDATION_REPORT.md +287 -0
  87. package/hooks/validators/__init__.py +19 -0
  88. package/hooks/validators/abbreviation_checks.py +82 -0
  89. package/hooks/validators/code_quality_checks.py +133 -0
  90. package/hooks/validators/comment_checks.py +188 -0
  91. package/hooks/validators/file_structure_checks.py +182 -0
  92. package/hooks/validators/git_checks.py +107 -0
  93. package/hooks/validators/health_check.py +214 -0
  94. package/hooks/validators/magic_value_checks.py +81 -0
  95. package/hooks/validators/mypy_integration.py +52 -0
  96. package/hooks/validators/output_formatter.py +266 -0
  97. package/hooks/validators/pr_reference_checks.py +72 -0
  98. package/hooks/validators/python_antipattern_checks.py +110 -0
  99. package/hooks/validators/python_style_checks.py +364 -0
  100. package/hooks/validators/react_checks.py +90 -0
  101. package/hooks/validators/ruff_integration.py +80 -0
  102. package/hooks/validators/run_all_validators.py +772 -0
  103. package/hooks/validators/security_checks.py +135 -0
  104. package/hooks/validators/test_abbreviation_checks.py +76 -0
  105. package/hooks/validators/test_bad.tsx +7 -0
  106. package/hooks/validators/test_code_quality_checks.py +129 -0
  107. package/hooks/validators/test_file_structure_checks.py +307 -0
  108. package/hooks/validators/test_files/01_basic_component.tsx +10 -0
  109. package/hooks/validators/test_files/02_component_without_react.tsx +10 -0
  110. package/hooks/validators/test_files/03_pure_component.tsx +10 -0
  111. package/hooks/validators/test_files/04_pure_component_import.tsx +10 -0
  112. package/hooks/validators/test_files/05_typescript_generics.tsx +14 -0
  113. package/hooks/validators/test_files/06_typescript_two_generics.tsx +18 -0
  114. package/hooks/validators/test_files/07_multiline_declaration.tsx +11 -0
  115. package/hooks/validators/test_files/08_error_boundary_valid.tsx +14 -0
  116. package/hooks/validators/test_files/09_error_boundary_with_other_class.tsx +20 -0
  117. package/hooks/validators/test_files/10_inheritance_chain.tsx +16 -0
  118. package/hooks/validators/test_files/11_ts_file.ts +10 -0
  119. package/hooks/validators/test_files/12_non_react_class.tsx +14 -0
  120. package/hooks/validators/test_files/13_functional_component.tsx +8 -0
  121. package/hooks/validators/test_files/14_indented_class.tsx +13 -0
  122. package/hooks/validators/test_files/15_getDerivedStateFromError.tsx +14 -0
  123. package/hooks/validators/test_files/16_mixed_components.tsx +20 -0
  124. package/hooks/validators/test_files/EXECUTIVE_SUMMARY.md +175 -0
  125. package/hooks/validators/test_files/TEST_RESULTS_TABLE.txt +60 -0
  126. package/hooks/validators/test_files/VALIDATION_REPORT.md +201 -0
  127. package/hooks/validators/test_files/async_views.py +23 -0
  128. package/hooks/validators/test_files/async_with_imports.py +14 -0
  129. package/hooks/validators/test_files/bad_inline_imports.py +37 -0
  130. package/hooks/validators/test_files/management/commands/cmd_01_no_debug_check.py +10 -0
  131. package/hooks/validators/test_files/management/commands/cmd_02_proper_debug_check.py +14 -0
  132. package/hooks/validators/test_files/management/commands/cmd_03_debug_check_with_return.py +14 -0
  133. package/hooks/validators/test_files/management/commands/cmd_04_imported_DEBUG.py +14 -0
  134. package/hooks/validators/test_files/management/commands/cmd_05_debug_check_in_helper.py +16 -0
  135. package/hooks/validators/test_files/management/commands/cmd_06_debug_check_late.py +22 -0
  136. package/hooks/validators/test_files/management/commands/cmd_07_positive_debug_check.py +15 -0
  137. package/hooks/validators/test_files/management/commands/cmd_08_debug_with_and.py +14 -0
  138. package/hooks/validators/test_files/not_management_command.py +10 -0
  139. package/hooks/validators/test_files/skip_decorators/test_01_simple_skip.py +8 -0
  140. package/hooks/validators/test_files/skip_decorators/test_02_pytest_skipif.py +8 -0
  141. package/hooks/validators/test_files/skip_decorators/test_03_unittest_skipIf.py +8 -0
  142. package/hooks/validators/test_files/skip_decorators/test_04_skip_with_parens.py +8 -0
  143. package/hooks/validators/test_files/skip_decorators/test_05_xfail.py +7 -0
  144. package/hooks/validators/test_files/skip_decorators/test_06_custom_skip.py +11 -0
  145. package/hooks/validators/test_files/skip_decorators/test_07_capital_Skip.py +8 -0
  146. package/hooks/validators/test_files/skip_decorators/test_08_skipUnless.py +7 -0
  147. package/hooks/validators/test_files/skip_decorators/test_09_pytest_mark_skip_simple.py +7 -0
  148. package/hooks/validators/test_files/test_async_functions.py +45 -0
  149. package/hooks/validators/test_files/test_purecomponent/PureComponentExample.tsx +7 -0
  150. package/hooks/validators/test_files/test_purecomponent/ReactPureComponentExample.tsx +7 -0
  151. package/hooks/validators/test_git_checks.py +295 -0
  152. package/hooks/validators/test_good.tsx +5 -0
  153. package/hooks/validators/test_health_check.py +57 -0
  154. package/hooks/validators/test_magic_value_checks.py +63 -0
  155. package/hooks/validators/test_mypy_integration.py +27 -0
  156. package/hooks/validators/test_output_formatter.py +150 -0
  157. package/hooks/validators/test_pr_reference_checks.py +41 -0
  158. package/hooks/validators/test_python_antipattern_checks.py +113 -0
  159. package/hooks/validators/test_python_style_checks.py +439 -0
  160. package/hooks/validators/test_react_checks.py +213 -0
  161. package/hooks/validators/test_results.txt +25 -0
  162. package/hooks/validators/test_ruff_integration.py +27 -0
  163. package/hooks/validators/test_run_all_validators.py +228 -0
  164. package/hooks/validators/test_run_all_validators_integration.py +48 -0
  165. package/hooks/validators/test_safety_checks.py +243 -0
  166. package/hooks/validators/test_security_checks.py +105 -0
  167. package/hooks/validators/test_test_safety_checks.py +321 -0
  168. package/hooks/validators/test_todo_checks.py +39 -0
  169. package/hooks/validators/test_type_safety_checks.py +85 -0
  170. package/hooks/validators/test_useless_test_checks.py +55 -0
  171. package/hooks/validators/test_validator_base.py +26 -0
  172. package/hooks/validators/test_verify_paths.py +34 -0
  173. package/hooks/validators/todo_checks.py +59 -0
  174. package/hooks/validators/type_safety_checks.py +101 -0
  175. package/hooks/validators/useless_test_checks.py +92 -0
  176. package/hooks/validators/validator_base.py +19 -0
  177. package/hooks/validators/verify_paths.py +57 -0
  178. package/hooks/workflow/auto-formatter.py +114 -0
  179. package/hooks/workflow/investigation-tracker-reset.py +46 -0
  180. package/package.json +30 -0
  181. package/rules/agent-spawn-protocol.md +47 -0
  182. package/rules/cleanup-temp-files.md +27 -0
  183. package/rules/code-reviews.md +11 -0
  184. package/rules/code-standards.md +43 -0
  185. package/rules/conservative-action.md +20 -0
  186. package/rules/context7.md +12 -0
  187. package/rules/explore-thoroughly.md +27 -0
  188. package/rules/git-workflow.md +42 -0
  189. package/rules/parallel-tools.md +23 -0
  190. package/rules/research-mode.md +23 -0
  191. package/rules/right-sized-engineering.md +28 -0
  192. package/rules/tdd.md +7 -0
  193. package/rules/testing.md +12 -0
  194. package/skills/agent-prompt/SKILL.md +102 -0
  195. package/skills/anthropic-plan/SKILL.md +107 -0
  196. package/skills/everything-search/SKILL.md +144 -0
  197. package/skills/ingest/SKILL.md +40 -0
  198. package/skills/npm-creator/SKILL.md +183 -0
  199. package/skills/pr-review-responder/EXAMPLES.md +590 -0
  200. package/skills/pr-review-responder/PRINCIPLES.md +539 -0
  201. package/skills/pr-review-responder/README.md +209 -0
  202. package/skills/pr-review-responder/SKILL.md +202 -0
  203. package/skills/pr-review-responder/TESTING.md +407 -0
  204. package/skills/pr-review-responder/scripts/respond_to_reviews.py +376 -0
  205. package/skills/pr-review-responder/update_skill.py +297 -0
  206. package/skills/prompt-generator/REFERENCE.md +150 -0
  207. package/skills/prompt-generator/SKILL.md +154 -0
  208. package/skills/readability-review/SKILL.md +127 -0
  209. package/skills/recall/SKILL.md +27 -0
  210. package/skills/remember/SKILL.md +63 -0
  211. package/skills/rule-audit/SKILL.md +307 -0
  212. package/skills/rule-creator/SKILL.md +150 -0
  213. package/skills/skill-writer/REFERENCE.md +246 -0
  214. package/skills/skill-writer/SKILL.md +270 -0
  215. package/skills/tdd-team/SKILL.md +128 -0
@@ -0,0 +1,10 @@
1
+ // TEST: PureComponent without React prefix (SHOULD BE CAUGHT but might not be)
2
+ import { PureComponent } from 'react';
3
+
4
+ class MyComponent extends PureComponent {
5
+ render() {
6
+ return <div>Hello</div>;
7
+ }
8
+ }
9
+
10
+ export default MyComponent;
@@ -0,0 +1,14 @@
1
+ // TEST: Class component with TypeScript generics (SHOULD BE CAUGHT but might not be)
2
+ import React from 'react';
3
+
4
+ interface Props {
5
+ name: string;
6
+ }
7
+
8
+ class MyComponent extends React.Component<Props> {
9
+ render() {
10
+ return <div>{this.props.name}</div>;
11
+ }
12
+ }
13
+
14
+ export default MyComponent;
@@ -0,0 +1,18 @@
1
+ // TEST: Class component with Props and State generics (SHOULD BE CAUGHT but might not be)
2
+ import React from 'react';
3
+
4
+ interface Props {
5
+ name: string;
6
+ }
7
+
8
+ interface State {
9
+ count: number;
10
+ }
11
+
12
+ class MyComponent extends React.Component<Props, State> {
13
+ render() {
14
+ return <div>{this.props.name}</div>;
15
+ }
16
+ }
17
+
18
+ export default MyComponent;
@@ -0,0 +1,11 @@
1
+ // TEST: Multi-line class declaration (SHOULD BE CAUGHT but might not be)
2
+ import React from 'react';
3
+
4
+ class MyComponent
5
+ extends React.Component {
6
+ render() {
7
+ return <div>Hello</div>;
8
+ }
9
+ }
10
+
11
+ export default MyComponent;
@@ -0,0 +1,14 @@
1
+ // TEST: Valid error boundary (SHOULD BE ALLOWED)
2
+ import React from 'react';
3
+
4
+ class ErrorBoundary extends React.Component {
5
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
6
+ console.error(error, errorInfo);
7
+ }
8
+
9
+ render() {
10
+ return this.props.children;
11
+ }
12
+ }
13
+
14
+ export default ErrorBoundary;
@@ -0,0 +1,20 @@
1
+ // TEST: Error boundary + another class component in same file (OTHER CLASS SHOULD BE CAUGHT)
2
+ import React from 'react';
3
+
4
+ class ErrorBoundary extends React.Component {
5
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
6
+ console.error(error, errorInfo);
7
+ }
8
+
9
+ render() {
10
+ return this.props.children;
11
+ }
12
+ }
13
+
14
+ class RegularComponent extends React.Component {
15
+ render() {
16
+ return <div>This should be flagged!</div>;
17
+ }
18
+ }
19
+
20
+ export default ErrorBoundary;
@@ -0,0 +1,16 @@
1
+ // TEST: Inheritance chain (SHOULD BE CAUGHT but won't be)
2
+ import React from 'react';
3
+
4
+ class BaseComponent extends React.Component {
5
+ commonMethod() {
6
+ return 'base';
7
+ }
8
+ }
9
+
10
+ class MyComponent extends BaseComponent {
11
+ render() {
12
+ return <div>{this.commonMethod()}</div>;
13
+ }
14
+ }
15
+
16
+ export default MyComponent;
@@ -0,0 +1,10 @@
1
+ // TEST: Class component in .ts file (SHOULD BE IGNORED - correct behavior)
2
+ import React from 'react';
3
+
4
+ class MyComponent extends React.Component {
5
+ render() {
6
+ return React.createElement('div', null, 'Hello');
7
+ }
8
+ }
9
+
10
+ export default MyComponent;
@@ -0,0 +1,14 @@
1
+ // TEST: Class that extends non-React component (SHOULD BE ALLOWED)
2
+ class CustomBase {
3
+ doSomething() {
4
+ return 'custom';
5
+ }
6
+ }
7
+
8
+ class MyClass extends CustomBase {
9
+ render() {
10
+ return this.doSomething();
11
+ }
12
+ }
13
+
14
+ export default MyClass;
@@ -0,0 +1,8 @@
1
+ // TEST: Functional component (SHOULD BE ALLOWED)
2
+ import React from 'react';
3
+
4
+ const MyComponent: React.FC = () => {
5
+ return <div>Hello</div>;
6
+ };
7
+
8
+ export default MyComponent;
@@ -0,0 +1,13 @@
1
+ // TEST: Heavily indented class component (SHOULD BE CAUGHT)
2
+ import React from 'react';
3
+
4
+ function createComponent() {
5
+ class MyComponent extends React.Component {
6
+ render() {
7
+ return <div>Hello</div>;
8
+ }
9
+ }
10
+ return MyComponent;
11
+ }
12
+
13
+ export default createComponent();
@@ -0,0 +1,14 @@
1
+ // TEST: Error boundary with getDerivedStateFromError (SHOULD BE ALLOWED)
2
+ import React from 'react';
3
+
4
+ class ErrorBoundary extends React.Component {
5
+ static getDerivedStateFromError(error: Error) {
6
+ return { hasError: true };
7
+ }
8
+
9
+ render() {
10
+ return this.props.children;
11
+ }
12
+ }
13
+
14
+ export default ErrorBoundary;
@@ -0,0 +1,20 @@
1
+ // TEST: Mixed Component, PureComponent, and functional (should catch first two)
2
+ import React, { Component, PureComponent } from 'react';
3
+
4
+ class RegularComponent extends Component {
5
+ render() {
6
+ return <div>Regular</div>;
7
+ }
8
+ }
9
+
10
+ class OptimizedComponent extends PureComponent {
11
+ render() {
12
+ return <div>Optimized</div>;
13
+ }
14
+ }
15
+
16
+ const FunctionalComponent: React.FC = () => {
17
+ return <div>Functional</div>;
18
+ };
19
+
20
+ export { RegularComponent, OptimizedComponent, FunctionalComponent };
@@ -0,0 +1,175 @@
1
+ # React Validator Audit - Executive Summary
2
+
3
+ ## Validation Status: FUNCTIONAL WITH CRITICAL GAPS
4
+
5
+ ---
6
+
7
+ ## Critical Findings
8
+
9
+ ### GAP 1: PureComponent Not Detected (CRITICAL - MUST FIX)
10
+
11
+ **Pattern:** `React.PureComponent` and `PureComponent` are NOT caught
12
+
13
+ **Test Evidence:**
14
+ ```bash
15
+ $ python react_checks.py test_files/16_mixed_components.tsx
16
+ test_files/16_mixed_components.tsx:4: Use functional components...
17
+ # Only caught Component, missed PureComponent on line 9
18
+ ```
19
+
20
+ **File Content:**
21
+ ```tsx
22
+ class RegularComponent extends Component { } // Line 4 - CAUGHT ✓
23
+ class OptimizedComponent extends PureComponent { } // Line 9 - MISSED ✗
24
+ ```
25
+
26
+ **Impact:** HIGH - PureComponent is commonly used for performance optimization. Developers will bypass the check by using PureComponent instead of Component.
27
+
28
+ **Fix:** Add to regex pattern:
29
+ ```python
30
+ CLASS_COMPONENT_PATTERN = re.compile(
31
+ r'^\s*class\s+\w+\s+extends\s+(Component|React\.Component|PureComponent|React\.PureComponent)\b',
32
+ re.MULTILINE
33
+ )
34
+ ```
35
+
36
+ ---
37
+
38
+ ### GAP 2: File-Level Error Boundary Exception (MEDIUM - SHOULD FIX)
39
+
40
+ **Pattern:** If file contains error boundary methods, ENTIRE file is skipped
41
+
42
+ **Test Evidence:**
43
+ ```tsx
44
+ // File: 09_error_boundary_with_other_class.tsx
45
+ class ErrorBoundary extends React.Component {
46
+ componentDidCatch() { /* ... */ } // This makes entire file skip
47
+ }
48
+
49
+ class RegularComponent extends React.Component {
50
+ render() { return <div>Should be flagged!</div>; } // NOT CAUGHT ✗
51
+ }
52
+ ```
53
+
54
+ **Impact:** MEDIUM - Rare to have multiple classes in one file, but it's a logic flaw. The exception should be class-level, not file-level.
55
+
56
+ **Fix:** More complex - requires checking each class individually:
57
+ 1. Find all class components
58
+ 2. For each class, check if IT implements error boundary methods
59
+ 3. Skip only specific error boundary classes
60
+ 4. Flag other classes
61
+
62
+ ---
63
+
64
+ ### GAP 3: Inheritance Chain Detection (LOW - DOCUMENT)
65
+
66
+ **Pattern:** Only direct inheritance from React.Component is caught
67
+
68
+ **Test Evidence:**
69
+ ```tsx
70
+ class BaseComponent extends React.Component { } // CAUGHT ✓
71
+ class MyComponent extends BaseComponent { } // NOT CAUGHT ✗
72
+ ```
73
+
74
+ **Impact:** LOW - Base class is caught, which forces refactoring anyway. Detecting full inheritance chains requires complex static analysis.
75
+
76
+ **Fix:** Document limitation in docstring. Not worth the complexity to fix.
77
+
78
+ ---
79
+
80
+ ## Test Results Summary
81
+
82
+ | Category | Count | Tests |
83
+ |----------|-------|-------|
84
+ | **Correctly Caught** | 7 | 01, 02, 05, 06, 07, 10 (base only), 14 |
85
+ | **Missed Violations (GAPS)** | 3 | 03, 04, 09 |
86
+ | **Correctly Allowed** | 5 | 08, 11, 12, 13, 15 |
87
+ | **Total Tests** | 15 | |
88
+
89
+ ---
90
+
91
+ ## What Works Well
92
+
93
+ 1. **TypeScript Generics** - Handles `Component<Props>` and `Component<Props, State>` ✓
94
+ 2. **Multi-line Declarations** - Catches `class Foo\n extends Component` ✓
95
+ 3. **Indentation** - Works regardless of indentation level ✓
96
+ 4. **Import Variations** - Catches both `React.Component` and `Component` ✓
97
+ 5. **File Filtering** - Correctly ignores `.ts` files, only checks `.tsx`/`.jsx` ✓
98
+ 6. **Error Boundaries** - Allows `componentDidCatch` and `getDerivedStateFromError` ✓
99
+
100
+ ---
101
+
102
+ ## Recommended Actions
103
+
104
+ ### Priority 1: Fix PureComponent Gap (CRITICAL)
105
+
106
+ **Time:** 5 minutes
107
+ **Risk:** Very low - simple regex update
108
+ **Impact:** Closes critical bypass route
109
+
110
+ ```python
111
+ CLASS_COMPONENT_PATTERN = re.compile(
112
+ r'^\s*class\s+\w+\s+extends\s+(Component|React\.Component|PureComponent|React\.PureComponent)\b',
113
+ re.MULTILINE
114
+ )
115
+ ```
116
+
117
+ ### Priority 2: Document Limitations (LOW EFFORT)
118
+
119
+ **Time:** 2 minutes
120
+ **Risk:** None
121
+
122
+ Add to docstring:
123
+ ```python
124
+ """Check that no class components exist (except error boundaries).
125
+
126
+ Detects:
127
+ - class X extends Component
128
+ - class X extends React.Component
129
+ - class X extends PureComponent
130
+ - class X extends React.PureComponent
131
+
132
+ Limitations:
133
+ - Only detects direct inheritance (not inheritance chains)
134
+ - File-level error boundary exception (skips entire file if error boundary found)
135
+ """
136
+ ```
137
+
138
+ ### Priority 3: Class-Level Error Boundary Check (FUTURE)
139
+
140
+ **Time:** 1-2 hours
141
+ **Risk:** Medium - complex logic change
142
+ **Impact:** Fixes logic flaw for edge case
143
+
144
+ Consider for future iteration if multi-class files become common.
145
+
146
+ ---
147
+
148
+ ## Test Files Available
149
+
150
+ All test files in `test_files/` directory:
151
+ - `01-16_*.tsx` - Individual test cases
152
+ - `VALIDATION_REPORT.md` - Detailed test results
153
+ - `EXECUTIVE_SUMMARY.md` - This file
154
+
155
+ Run all tests:
156
+ ```bash
157
+ cd hooks/validators
158
+ for file in test_files/*.tsx; do
159
+ echo "=== $file ==="
160
+ python react_checks.py "$file"
161
+ echo
162
+ done
163
+ ```
164
+
165
+ ---
166
+
167
+ ## Conclusion
168
+
169
+ The validator is **production-ready with one critical fix needed**:
170
+
171
+ 1. **MUST FIX NOW:** Add PureComponent to pattern (5 min)
172
+ 2. **SHOULD DOCUMENT:** Add limitations to docstring (2 min)
173
+ 3. **CONSIDER LATER:** Class-level error boundary check (future iteration)
174
+
175
+ After fixing PureComponent gap, the validator will catch 90%+ of real-world class component violations.
@@ -0,0 +1,60 @@
1
+ ================================================================================
2
+ REACT CLASS COMPONENT VALIDATOR - COMPREHENSIVE TEST RESULTS
3
+ ================================================================================
4
+
5
+ TEST | FILE | EXPECTED | ACTUAL | STATUS
6
+ -----|-----------------------------------|-------------|-------------|--------
7
+ 01 | 01_basic_component.tsx | CAUGHT | CAUGHT | PASS ✓
8
+ 02 | 02_component_without_react.tsx | CAUGHT | CAUGHT | PASS ✓
9
+ 03 | 03_pure_component.tsx | CAUGHT | NOT CAUGHT | FAIL ✗ GAP1
10
+ 04 | 04_pure_component_import.tsx | CAUGHT | NOT CAUGHT | FAIL ✗ GAP1
11
+ 05 | 05_typescript_generics.tsx | CAUGHT | CAUGHT | PASS ✓
12
+ 06 | 06_typescript_two_generics.tsx | CAUGHT | CAUGHT | PASS ✓
13
+ 07 | 07_multiline_declaration.tsx | CAUGHT | CAUGHT | PASS ✓
14
+ 08 | 08_error_boundary_valid.tsx | ALLOWED | ALLOWED | PASS ✓
15
+ 09 | 09_error_boundary_with_other.tsx | CAUGHT(2nd) | NOT CAUGHT | FAIL ✗ GAP2
16
+ 10 | 10_inheritance_chain.tsx | CAUGHT(1st) | CAUGHT(1st) | PASS ✓*
17
+ 11 | 11_ts_file.ts | IGNORED | IGNORED | PASS ✓
18
+ 12 | 12_non_react_class.tsx | ALLOWED | ALLOWED | PASS ✓
19
+ 13 | 13_functional_component.tsx | ALLOWED | ALLOWED | PASS ✓
20
+ 14 | 14_indented_class.tsx | CAUGHT | CAUGHT | PASS ✓
21
+ 15 | 15_getDerivedStateFromError.tsx | ALLOWED | ALLOWED | PASS ✓
22
+ 16 | 16_mixed_components.tsx | CAUGHT(2) | CAUGHT(1) | FAIL ✗ GAP1
23
+
24
+ SUMMARY:
25
+ --------
26
+ Total Tests: 16
27
+ Passes: 11 (69%)
28
+ Failures: 5 (31%)
29
+ Critical Gaps: 2 (GAP1, GAP2)
30
+
31
+ * Test 10: Only catches base class, not child (documented limitation - GAP3)
32
+
33
+ ================================================================================
34
+ GAPS IDENTIFIED:
35
+ ================================================================================
36
+
37
+ GAP 1: PureComponent Not Detected (CRITICAL)
38
+ ---------------------------------------------
39
+ Affected Tests: 03, 04, 16
40
+ Pattern Missing: React.PureComponent, PureComponent
41
+ Fix: Add to regex pattern
42
+ Impact: HIGH - Common bypass route
43
+
44
+ GAP 2: File-Level Error Boundary Exception (MEDIUM)
45
+ ----------------------------------------------------
46
+ Affected Tests: 09
47
+ Issue: Entire file skipped if error boundary found
48
+ Fix: Class-level detection (complex)
49
+ Impact: MEDIUM - Rare edge case
50
+
51
+ GAP 3: Inheritance Chain Detection (LOW)
52
+ -----------------------------------------
53
+ Affected Tests: 10 (partial)
54
+ Issue: Only direct inheritance caught
55
+ Fix: Document limitation
56
+ Impact: LOW - Base class caught anyway
57
+
58
+ ================================================================================
59
+ RECOMMENDATION: Fix GAP 1 immediately (5-minute regex update)
60
+ ================================================================================
@@ -0,0 +1,201 @@
1
+ # React Class Component Validator - Test Results
2
+
3
+ ## Summary
4
+
5
+ **Total Tests:** 15
6
+ **Correctly Caught:** 7
7
+ **Missed Violations (GAPS):** 3
8
+ **Correctly Allowed:** 5
9
+
10
+ ---
11
+
12
+ ## CRITICAL GAPS FOUND
13
+
14
+ ### GAP 1: PureComponent Not Detected
15
+
16
+ **Files:**
17
+ - `03_pure_component.tsx` - `class X extends React.PureComponent`
18
+ - `04_pure_component_import.tsx` - `class X extends PureComponent`
19
+
20
+ **Issue:** The regex pattern only matches `Component` and `React.Component`, but misses `PureComponent` and `React.PureComponent`.
21
+
22
+ **Current Pattern:**
23
+ ```python
24
+ r'^\s*class\s+\w+\s+extends\s+(Component|React\.Component)\b'
25
+ ```
26
+
27
+ **Should Be:**
28
+ ```python
29
+ r'^\s*class\s+\w+\s+extends\s+(Component|React\.Component|PureComponent|React\.PureComponent)\b'
30
+ ```
31
+
32
+ **Impact:** HIGH - PureComponent is a common class component pattern that will bypass the check.
33
+
34
+ ---
35
+
36
+ ### GAP 2: Error Boundary File-Level Exception Too Broad
37
+
38
+ **File:**
39
+ - `09_error_boundary_with_other_class.tsx` - Contains valid error boundary + regular class component
40
+
41
+ **Issue:** The check skips the ENTIRE file if it finds `componentDidCatch` or `getDerivedStateFromError` anywhere. This means:
42
+ - If you have an error boundary AND a regular class component in the same file, the regular component won't be flagged
43
+ - The exception should be class-level, not file-level
44
+
45
+ **Current Logic:**
46
+ ```python
47
+ if ERROR_BOUNDARY_PATTERN.search(content):
48
+ continue # Skips entire file
49
+ ```
50
+
51
+ **Should Be:**
52
+ - Check each class individually
53
+ - Only skip classes that implement error boundary methods
54
+ - Flag other classes in the same file
55
+
56
+ **Impact:** MEDIUM - Uncommon to have multiple classes in same file, but it's a logic flaw.
57
+
58
+ ---
59
+
60
+ ### GAP 3: Inheritance Chain Detection
61
+
62
+ **File:**
63
+ - `10_inheritance_chain.tsx` - `class MyComponent extends BaseComponent` (where BaseComponent extends React.Component)
64
+
65
+ **Issue:** Only the base class is caught, not the child class. The child class `MyComponent extends BaseComponent` is NOT flagged because it doesn't directly extend React.Component.
66
+
67
+ **Current Behavior:** Catches base class only
68
+ **Expected Behavior:** Should catch both (or at least warn about inheritance chain)
69
+
70
+ **Impact:** LOW - This is a complex edge case. The base class is caught, which would force refactoring anyway.
71
+
72
+ ---
73
+
74
+ ## Test Results by Category
75
+
76
+ ### ✓ Correctly Caught (7 tests)
77
+
78
+ | Test | File | Line | Status |
79
+ |------|------|------|--------|
80
+ | 01 | `01_basic_component.tsx` | 4 | CAUGHT ✓ |
81
+ | 02 | `02_component_without_react.tsx` | 4 | CAUGHT ✓ |
82
+ | 05 | `05_typescript_generics.tsx` | 8 | CAUGHT ✓ |
83
+ | 06 | `06_typescript_two_generics.tsx` | 12 | CAUGHT ✓ |
84
+ | 07 | `07_multiline_declaration.tsx` | 4 | CAUGHT ✓ |
85
+ | 10 | `10_inheritance_chain.tsx` | 4 | CAUGHT ✓ (base class only) |
86
+ | 14 | `14_indented_class.tsx` | 5 | CAUGHT ✓ |
87
+
88
+ **Notes:**
89
+ - TypeScript generics work correctly (both single and multiple type params)
90
+ - Multi-line declarations work (even with newline between `class` and `extends`)
91
+ - Indentation level doesn't matter
92
+ - Inheritance base classes are caught
93
+
94
+ ---
95
+
96
+ ### ✗ Missed Violations - GAPS (3 tests)
97
+
98
+ | Test | File | Expected | Actual | GAP |
99
+ |------|------|----------|--------|-----|
100
+ | 03 | `03_pure_component.tsx` | CAUGHT | NOT CAUGHT | GAP 1 |
101
+ | 04 | `04_pure_component_import.tsx` | CAUGHT | NOT CAUGHT | GAP 1 |
102
+ | 09 | `09_error_boundary_with_other_class.tsx` | CAUGHT (RegularComponent) | NOT CAUGHT | GAP 2 |
103
+
104
+ ---
105
+
106
+ ### ✓ Correctly Allowed (5 tests)
107
+
108
+ | Test | File | Reason | Status |
109
+ |------|------|--------|--------|
110
+ | 08 | `08_error_boundary_valid.tsx` | Error boundary with componentDidCatch | ALLOWED ✓ |
111
+ | 11 | `11_ts_file.ts` | .ts file (not .tsx/.jsx) | IGNORED ✓ |
112
+ | 12 | `12_non_react_class.tsx` | Non-React class | ALLOWED ✓ |
113
+ | 13 | `13_functional_component.tsx` | Functional component | ALLOWED ✓ |
114
+ | 15 | `15_getDerivedStateFromError.tsx` | Error boundary with getDerivedStateFromError | ALLOWED ✓ |
115
+
116
+ ---
117
+
118
+ ## Recommended Fixes
119
+
120
+ ### Fix 1: Add PureComponent to Pattern (CRITICAL)
121
+
122
+ ```python
123
+ CLASS_COMPONENT_PATTERN = re.compile(
124
+ r'^\s*class\s+\w+\s+extends\s+(Component|React\.Component|PureComponent|React\.PureComponent)\b',
125
+ re.MULTILINE
126
+ )
127
+ ```
128
+
129
+ ### Fix 2: Class-Level Error Boundary Detection (MEDIUM)
130
+
131
+ Instead of file-level skip, check each class:
132
+ 1. Find all class components in file
133
+ 2. For each class, check if IT implements error boundary methods
134
+ 3. Skip only those specific classes
135
+ 4. Flag other classes
136
+
137
+ This requires more complex logic:
138
+ - Extract class definition including its body
139
+ - Search for error boundary methods within that specific class
140
+ - Not trivial with regex alone
141
+
142
+ ### Fix 3: Document Inheritance Chain Limitation (LOW)
143
+
144
+ Add to docstring:
145
+ ```python
146
+ """Check that no class components exist (except error boundaries).
147
+
148
+ Note: Only detects direct inheritance from React.Component/PureComponent.
149
+ Indirect inheritance chains (class A extends B where B extends Component)
150
+ will only flag the base class.
151
+ """
152
+ ```
153
+
154
+ ---
155
+
156
+ ## Additional Edge Cases to Consider
157
+
158
+ ### Not Tested (Future Tests)
159
+
160
+ 1. **Default exports:**
161
+ ```tsx
162
+ export default class MyComponent extends React.Component {}
163
+ ```
164
+
165
+ 2. **Named class expressions:**
166
+ ```tsx
167
+ const MyComponent = class extends React.Component {};
168
+ ```
169
+
170
+ 3. **Anonymous class expressions:**
171
+ ```tsx
172
+ const MyComponent = class extends React.Component {};
173
+ ```
174
+
175
+ 4. **Class with decorators:**
176
+ ```tsx
177
+ @observer
178
+ class MyComponent extends React.Component {}
179
+ ```
180
+
181
+ 5. **Class inside namespace:**
182
+ ```tsx
183
+ namespace Components {
184
+ class MyComponent extends React.Component {}
185
+ }
186
+ ```
187
+
188
+ ---
189
+
190
+ ## Conclusion
191
+
192
+ The validator is **functional but has critical gaps**:
193
+
194
+ 1. **MUST FIX:** PureComponent detection (GAP 1) - This is a common pattern
195
+ 2. **SHOULD FIX:** File-level error boundary exception (GAP 2) - Logic flaw
196
+ 3. **DOCUMENT:** Inheritance chain limitation (GAP 3) - Edge case
197
+
198
+ **Priority:**
199
+ 1. Add PureComponent to regex pattern (5-minute fix)
200
+ 2. Document inheritance limitation in docstring
201
+ 3. Consider class-level error boundary detection for future iteration
@@ -0,0 +1,23 @@
1
+ """Test file with async Django views to verify AsyncFunctionDef support."""
2
+
3
+ from django.http import HttpRequest, HttpResponse
4
+
5
+
6
+ async def async_home_view(request: HttpRequest) -> HttpResponse:
7
+ """Async view with correct naming - should pass."""
8
+ return HttpResponse("Home")
9
+
10
+
11
+ async def async_about(request: HttpRequest) -> HttpResponse:
12
+ """Async view without _view suffix - should fail."""
13
+ return HttpResponse("About")
14
+
15
+
16
+ async def async_helper(data: str) -> str:
17
+ """Async function not a view - should be ignored."""
18
+ return data.upper()
19
+
20
+
21
+ async def async_profile_view(request: HttpRequest) -> HttpResponse:
22
+ """Another async view with correct naming - should pass."""
23
+ return HttpResponse("Profile")
@@ -0,0 +1,14 @@
1
+ """Test file with async functions and inline imports."""
2
+
3
+ import asyncio
4
+
5
+
6
+ async def async_func_with_inline_import():
7
+ """Async function with inline import - should fail."""
8
+ import json
9
+ return json.dumps({"status": "ok"})
10
+
11
+
12
+ async def regular_async_func():
13
+ """Regular async function - should pass."""
14
+ await asyncio.sleep(0)