@codyswann/lisa 2.190.0 → 2.190.2
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.
- package/package.json +1 -1
- package/phaser/copy-overwrite/ast-grep/rule-tests/.gitkeep +0 -0
- package/phaser/copy-overwrite/ast-grep/rules/phaser/no-canvas-renderer.yml +12 -0
- package/phaser/copy-overwrite/ast-grep/rules/phaser/no-raw-webgl-context.yml +12 -0
- package/phaser/copy-overwrite/ast-grep/utils/.gitkeep +0 -0
- package/phaser/copy-overwrite/sgconfig.yml +11 -0
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/hooks/rubocop-on-edit.sh +2 -2
- package/plugins/lisa-rails/hooks/sg-scan-on-edit.sh +2 -2
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/hooks/rubocop-on-edit.sh +2 -2
- package/plugins/lisa-rails-copilot/hooks/sg-scan-on-edit.sh +2 -2
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/hooks/rubocop-on-edit.sh +2 -2
- package/plugins/lisa-rails-cursor/hooks/sg-scan-on-edit.sh +2 -2
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/hooks/sg-scan-on-edit.sh +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/hooks/sg-scan-on-edit.sh +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/hooks/sg-scan-on-edit.sh +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/rails/hooks/rubocop-on-edit.sh +2 -2
- package/plugins/src/rails/hooks/sg-scan-on-edit.sh +2 -2
- package/plugins/src/typescript/hooks/sg-scan-on-edit.sh +1 -1
- package/rails/copy-overwrite/ast-grep/rule-tests/.gitkeep +0 -0
- package/rails/copy-overwrite/ast-grep/rules/ruby/no-find-by-sql-without-params.yml +7 -0
- package/rails/copy-overwrite/ast-grep/rules/ruby/no-params-without-permit.yml +12 -0
- package/rails/copy-overwrite/ast-grep/rules/ruby/no-raw-sql-in-where.yml +7 -0
- package/rails/copy-overwrite/ast-grep/rules/ruby/no-skip-before-action-without-scope.yml +12 -0
- package/rails/copy-overwrite/ast-grep/rules/ruby/no-unsafe-send.yml +11 -0
- package/rails/copy-overwrite/ast-grep/rules/ruby/no-update-columns.yml +11 -0
- package/rails/copy-overwrite/ast-grep/utils/.gitkeep +0 -0
- package/rails/copy-overwrite/sgconfig.yml +11 -0
- package/typescript/copy-overwrite/ast-grep/rules/no-inline-component-in-container.yml +24 -0
- package/typescript/copy-overwrite/ast-grep/rules/no-inline-component-in-view.yml +24 -0
package/package.json
CHANGED
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"ws": ">=8.20.1"
|
|
96
96
|
},
|
|
97
97
|
"name": "@codyswann/lisa",
|
|
98
|
-
"version": "2.190.
|
|
98
|
+
"version": "2.190.2",
|
|
99
99
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
100
100
|
"main": "dist/index.js",
|
|
101
101
|
"exports": {
|
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# This file is managed by Lisa.
|
|
2
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
3
|
+
id: phaser-no-canvas-renderer
|
|
4
|
+
language: typescript
|
|
5
|
+
severity: error
|
|
6
|
+
message: |
|
|
7
|
+
Phaser 4 targets WebGL (the new "Beam" renderer); the Canvas renderer is
|
|
8
|
+
deprecated and loses WebGL-only features (filters, GPU layers, lighting).
|
|
9
|
+
Use Phaser.AUTO (WebGL with fallback) or Phaser.WEBGL in the game config.
|
|
10
|
+
Canvas is acceptable only as an explicit, documented fallback decision.
|
|
11
|
+
rule:
|
|
12
|
+
pattern: Phaser.CANVAS
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# This file is managed by Lisa.
|
|
2
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
3
|
+
id: phaser-no-raw-webgl-context
|
|
4
|
+
language: typescript
|
|
5
|
+
severity: error
|
|
6
|
+
message: |
|
|
7
|
+
Do not reach into the raw WebGL context (renderer.gl) in Phaser 4. Custom
|
|
8
|
+
rendering is a RenderNode (registered via render.renderNodes); external WebGL
|
|
9
|
+
work belongs in an Extern game object. Touching renderer.gl directly bypasses
|
|
10
|
+
the renderer's state tracking and breaks batching. See the phaser-rendering skill.
|
|
11
|
+
rule:
|
|
12
|
+
pattern: $OBJ.renderer.gl
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# This file is managed by Lisa.
|
|
2
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
3
|
+
|
|
4
|
+
# ast-grep configuration
|
|
5
|
+
# See: https://ast-grep.github.io/reference/sgconfig.html
|
|
6
|
+
ruleDirs:
|
|
7
|
+
- ast-grep/rules
|
|
8
|
+
testConfigs:
|
|
9
|
+
- testDir: ast-grep/rule-tests
|
|
10
|
+
utilDirs:
|
|
11
|
+
- ast-grep/utils
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.190.
|
|
3
|
+
"version": "2.190.2",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.190.
|
|
3
|
+
"version": "2.190.2",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.190.
|
|
3
|
+
"version": "2.190.2",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.190.
|
|
3
|
+
"version": "2.190.2",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.190.
|
|
3
|
+
"version": "2.190.2",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#
|
|
11
11
|
# Behavior:
|
|
12
12
|
# - Exit 0: RuboCop passes or auto-fix resolved all errors
|
|
13
|
-
# - Exit
|
|
13
|
+
# - Exit 2: unfixable errors remain — blocks Claude so it fixes them immediately
|
|
14
14
|
#
|
|
15
15
|
# @see .claude/rules/verification.md "Self-Correction Loop" section
|
|
16
16
|
# =============================================================================
|
|
@@ -75,4 +75,4 @@ fi
|
|
|
75
75
|
# Unfixable errors remain — block with feedback
|
|
76
76
|
echo "RuboCop found unfixable errors in: $FILE_PATH" >&2
|
|
77
77
|
echo "$OUTPUT" >&2
|
|
78
|
-
exit
|
|
78
|
+
exit 2
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
#
|
|
10
10
|
# Behavior:
|
|
11
11
|
# - Exit 0: no issues found or ast-grep not configured
|
|
12
|
-
# - Exit
|
|
12
|
+
# - Exit 2: issues found — blocks Claude so it fixes them immediately
|
|
13
13
|
#
|
|
14
14
|
# @see .claude/rules/verification.md "Self-Correction Loop" section
|
|
15
15
|
# =============================================================================
|
|
@@ -70,5 +70,5 @@ if OUTPUT=$($SG_CMD scan "$FILE_PATH" 2>&1); then
|
|
|
70
70
|
else
|
|
71
71
|
echo "ast-grep found issues in: $FILE_PATH" >&2
|
|
72
72
|
echo "$OUTPUT" >&2
|
|
73
|
-
exit
|
|
73
|
+
exit 2
|
|
74
74
|
fi
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#
|
|
11
11
|
# Behavior:
|
|
12
12
|
# - Exit 0: RuboCop passes or auto-fix resolved all errors
|
|
13
|
-
# - Exit
|
|
13
|
+
# - Exit 2: unfixable errors remain — blocks Claude so it fixes them immediately
|
|
14
14
|
#
|
|
15
15
|
# @see .claude/rules/verification.md "Self-Correction Loop" section
|
|
16
16
|
# =============================================================================
|
|
@@ -75,4 +75,4 @@ fi
|
|
|
75
75
|
# Unfixable errors remain — block with feedback
|
|
76
76
|
echo "RuboCop found unfixable errors in: $FILE_PATH" >&2
|
|
77
77
|
echo "$OUTPUT" >&2
|
|
78
|
-
exit
|
|
78
|
+
exit 2
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
#
|
|
10
10
|
# Behavior:
|
|
11
11
|
# - Exit 0: no issues found or ast-grep not configured
|
|
12
|
-
# - Exit
|
|
12
|
+
# - Exit 2: issues found — blocks Claude so it fixes them immediately
|
|
13
13
|
#
|
|
14
14
|
# @see .claude/rules/verification.md "Self-Correction Loop" section
|
|
15
15
|
# =============================================================================
|
|
@@ -70,5 +70,5 @@ if OUTPUT=$($SG_CMD scan "$FILE_PATH" 2>&1); then
|
|
|
70
70
|
else
|
|
71
71
|
echo "ast-grep found issues in: $FILE_PATH" >&2
|
|
72
72
|
echo "$OUTPUT" >&2
|
|
73
|
-
exit
|
|
73
|
+
exit 2
|
|
74
74
|
fi
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#
|
|
11
11
|
# Behavior:
|
|
12
12
|
# - Exit 0: RuboCop passes or auto-fix resolved all errors
|
|
13
|
-
# - Exit
|
|
13
|
+
# - Exit 2: unfixable errors remain — blocks Claude so it fixes them immediately
|
|
14
14
|
#
|
|
15
15
|
# @see .claude/rules/verification.md "Self-Correction Loop" section
|
|
16
16
|
# =============================================================================
|
|
@@ -75,4 +75,4 @@ fi
|
|
|
75
75
|
# Unfixable errors remain — block with feedback
|
|
76
76
|
echo "RuboCop found unfixable errors in: $FILE_PATH" >&2
|
|
77
77
|
echo "$OUTPUT" >&2
|
|
78
|
-
exit
|
|
78
|
+
exit 2
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
#
|
|
10
10
|
# Behavior:
|
|
11
11
|
# - Exit 0: no issues found or ast-grep not configured
|
|
12
|
-
# - Exit
|
|
12
|
+
# - Exit 2: issues found — blocks Claude so it fixes them immediately
|
|
13
13
|
#
|
|
14
14
|
# @see .claude/rules/verification.md "Self-Correction Loop" section
|
|
15
15
|
# =============================================================================
|
|
@@ -70,5 +70,5 @@ if OUTPUT=$($SG_CMD scan "$FILE_PATH" 2>&1); then
|
|
|
70
70
|
else
|
|
71
71
|
echo "ast-grep found issues in: $FILE_PATH" >&2
|
|
72
72
|
echo "$OUTPUT" >&2
|
|
73
|
-
exit
|
|
73
|
+
exit 2
|
|
74
74
|
fi
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#
|
|
11
11
|
# Behavior:
|
|
12
12
|
# - Exit 0: RuboCop passes or auto-fix resolved all errors
|
|
13
|
-
# - Exit
|
|
13
|
+
# - Exit 2: unfixable errors remain — blocks Claude so it fixes them immediately
|
|
14
14
|
#
|
|
15
15
|
# @see .claude/rules/verification.md "Self-Correction Loop" section
|
|
16
16
|
# =============================================================================
|
|
@@ -75,4 +75,4 @@ fi
|
|
|
75
75
|
# Unfixable errors remain — block with feedback
|
|
76
76
|
echo "RuboCop found unfixable errors in: $FILE_PATH" >&2
|
|
77
77
|
echo "$OUTPUT" >&2
|
|
78
|
-
exit
|
|
78
|
+
exit 2
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
#
|
|
10
10
|
# Behavior:
|
|
11
11
|
# - Exit 0: no issues found or ast-grep not configured
|
|
12
|
-
# - Exit
|
|
12
|
+
# - Exit 2: issues found — blocks Claude so it fixes them immediately
|
|
13
13
|
#
|
|
14
14
|
# @see .claude/rules/verification.md "Self-Correction Loop" section
|
|
15
15
|
# =============================================================================
|
|
@@ -70,5 +70,5 @@ if OUTPUT=$($SG_CMD scan "$FILE_PATH" 2>&1); then
|
|
|
70
70
|
else
|
|
71
71
|
echo "ast-grep found issues in: $FILE_PATH" >&2
|
|
72
72
|
echo "$OUTPUT" >&2
|
|
73
|
-
exit
|
|
73
|
+
exit 2
|
|
74
74
|
fi
|
|
File without changes
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
id: no-find-by-sql-without-params
|
|
2
|
+
language: ruby
|
|
3
|
+
severity: error
|
|
4
|
+
message: 'find_by_sql with string interpolation is a SQL injection risk. Use parameterized queries.'
|
|
5
|
+
rule:
|
|
6
|
+
pattern: find_by_sql("$$$")
|
|
7
|
+
note: 'Use `find_by_sql(["SELECT * FROM table WHERE id = ?", id])` with array syntax.'
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
id: no-params-without-permit
|
|
2
|
+
language: ruby
|
|
3
|
+
severity: warning
|
|
4
|
+
message: 'Direct params access without strong parameters. Use params.require(:model).permit(:attr1, :attr2) instead.'
|
|
5
|
+
rule:
|
|
6
|
+
pattern: params[$KEY]
|
|
7
|
+
not:
|
|
8
|
+
inside:
|
|
9
|
+
any:
|
|
10
|
+
- pattern: params.require($$$)
|
|
11
|
+
- pattern: 'def $NAME_params'
|
|
12
|
+
note: 'Define a private method like `def user_params; params.require(:user).permit(:name, :email); end`'
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
id: no-raw-sql-in-where
|
|
2
|
+
language: ruby
|
|
3
|
+
severity: error
|
|
4
|
+
message: 'Avoid string interpolation in where clauses — use parameterized queries to prevent SQL injection.'
|
|
5
|
+
rule:
|
|
6
|
+
pattern: where("$$$")
|
|
7
|
+
note: "Use `where('column = ?', value)` or `where(column: value)` instead."
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
id: no-skip-before-action-without-scope
|
|
2
|
+
language: ruby
|
|
3
|
+
severity: warning
|
|
4
|
+
message: 'skip_before_action without :only or :except skips the filter for all actions — scope it to specific actions.'
|
|
5
|
+
rule:
|
|
6
|
+
pattern: skip_before_action $NAME
|
|
7
|
+
not:
|
|
8
|
+
has:
|
|
9
|
+
any:
|
|
10
|
+
- pattern: 'only: $$$'
|
|
11
|
+
- pattern: 'except: $$$'
|
|
12
|
+
note: 'Use `skip_before_action :name, only: [:action1, :action2]` to limit scope.'
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
id: no-unsafe-send
|
|
2
|
+
language: ruby
|
|
3
|
+
severity: error
|
|
4
|
+
message: 'Avoid using send/public_send with dynamic input — this can execute arbitrary methods. Use a whitelist or case statement instead.'
|
|
5
|
+
rule:
|
|
6
|
+
any:
|
|
7
|
+
- pattern: send($ARG)
|
|
8
|
+
- pattern: public_send($ARG)
|
|
9
|
+
- pattern: $OBJ.send($ARG)
|
|
10
|
+
- pattern: $OBJ.public_send($ARG)
|
|
11
|
+
note: 'If intentional, extract the method name into a constant whitelist and validate before calling.'
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
id: no-update-columns
|
|
2
|
+
language: ruby
|
|
3
|
+
severity: warning
|
|
4
|
+
message: 'update_column/update_columns bypasses validations and callbacks. Use update or update! instead.'
|
|
5
|
+
rule:
|
|
6
|
+
any:
|
|
7
|
+
- pattern: $OBJ.update_column($$$)
|
|
8
|
+
- pattern: $OBJ.update_columns($$$)
|
|
9
|
+
- pattern: update_column($$$)
|
|
10
|
+
- pattern: update_columns($$$)
|
|
11
|
+
note: 'If bypassing validations is intentional, add a code comment explaining why.'
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# This file is managed by Lisa.
|
|
2
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
3
|
+
|
|
4
|
+
# ast-grep configuration
|
|
5
|
+
# See: https://ast-grep.github.io/reference/sgconfig.html
|
|
6
|
+
ruleDirs:
|
|
7
|
+
- ast-grep/rules
|
|
8
|
+
testConfigs:
|
|
9
|
+
- testDir: ast-grep/rule-tests
|
|
10
|
+
utilDirs:
|
|
11
|
+
- ast-grep/utils
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
id: no-inline-component-in-container
|
|
2
|
+
language: tsx
|
|
3
|
+
severity: error
|
|
4
|
+
message: |
|
|
5
|
+
Inline component detected in Container file. Extract to separate Container/View directory.
|
|
6
|
+
|
|
7
|
+
Create:
|
|
8
|
+
- features/.../components/ComponentName/ComponentNameView.tsx
|
|
9
|
+
- features/.../components/ComponentName/ComponentNameContainer.tsx
|
|
10
|
+
- features/.../components/ComponentName/index.tsx
|
|
11
|
+
|
|
12
|
+
See .claude/rules/PROJECT_RULES.md for the full pattern.
|
|
13
|
+
rule:
|
|
14
|
+
pattern: $NAME.displayName = $VALUE
|
|
15
|
+
inside:
|
|
16
|
+
kind: program
|
|
17
|
+
stopBy: end
|
|
18
|
+
constraints:
|
|
19
|
+
VALUE:
|
|
20
|
+
not:
|
|
21
|
+
regex: 'Container[''"]$'
|
|
22
|
+
files:
|
|
23
|
+
- '**/features/**/*Container.tsx'
|
|
24
|
+
- '**/components/**/*Container.tsx'
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
id: no-inline-component-in-view
|
|
2
|
+
language: tsx
|
|
3
|
+
severity: error
|
|
4
|
+
message: |
|
|
5
|
+
Inline component detected in View file. Extract to separate Container/View directory.
|
|
6
|
+
|
|
7
|
+
Create:
|
|
8
|
+
- features/.../components/ComponentName/ComponentNameView.tsx
|
|
9
|
+
- features/.../components/ComponentName/ComponentNameContainer.tsx
|
|
10
|
+
- features/.../components/ComponentName/index.tsx
|
|
11
|
+
|
|
12
|
+
See .claude/rules/PROJECT_RULES.md for the full pattern.
|
|
13
|
+
rule:
|
|
14
|
+
pattern: $NAME.displayName = $VALUE
|
|
15
|
+
inside:
|
|
16
|
+
kind: program
|
|
17
|
+
stopBy: end
|
|
18
|
+
constraints:
|
|
19
|
+
VALUE:
|
|
20
|
+
not:
|
|
21
|
+
regex: 'View[''"]$'
|
|
22
|
+
files:
|
|
23
|
+
- '**/features/**/*View.tsx'
|
|
24
|
+
- '**/components/**/*View.tsx'
|