@codyswann/lisa 2.178.2 → 2.178.3

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 (81) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa-agy/plugin.json +1 -1
  5. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  6. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  7. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  8. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  9. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  12. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa-expo/skills/atomic-design-gluestack/SKILL.md +8 -0
  15. package/plugins/lisa-expo/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
  16. package/plugins/lisa-expo/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +109 -0
  17. package/plugins/lisa-expo/skills/gluestack-nativewind/SKILL.md +8 -0
  18. package/plugins/lisa-expo/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
  19. package/plugins/lisa-expo/skills/gluestack-nativewind/scripts/validate_styling.py +109 -0
  20. package/plugins/lisa-expo-agy/plugin.json +1 -1
  21. package/plugins/lisa-expo-agy/skills/atomic-design-gluestack/SKILL.md +8 -0
  22. package/plugins/lisa-expo-agy/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
  23. package/plugins/lisa-expo-agy/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +109 -0
  24. package/plugins/lisa-expo-agy/skills/gluestack-nativewind/SKILL.md +8 -0
  25. package/plugins/lisa-expo-agy/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
  26. package/plugins/lisa-expo-agy/skills/gluestack-nativewind/scripts/validate_styling.py +109 -0
  27. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo-copilot/skills/atomic-design-gluestack/SKILL.md +8 -0
  29. package/plugins/lisa-expo-copilot/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
  30. package/plugins/lisa-expo-copilot/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +109 -0
  31. package/plugins/lisa-expo-copilot/skills/gluestack-nativewind/SKILL.md +8 -0
  32. package/plugins/lisa-expo-copilot/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
  33. package/plugins/lisa-expo-copilot/skills/gluestack-nativewind/scripts/validate_styling.py +109 -0
  34. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-expo-cursor/skills/atomic-design-gluestack/SKILL.md +8 -0
  36. package/plugins/lisa-expo-cursor/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
  37. package/plugins/lisa-expo-cursor/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +109 -0
  38. package/plugins/lisa-expo-cursor/skills/gluestack-nativewind/SKILL.md +8 -0
  39. package/plugins/lisa-expo-cursor/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
  40. package/plugins/lisa-expo-cursor/skills/gluestack-nativewind/scripts/validate_styling.py +109 -0
  41. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  44. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  48. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  49. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  54. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  59. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-rails-agy/plugin.json +1 -1
  64. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  69. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  74. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  76. package/plugins/src/expo/skills/atomic-design-gluestack/SKILL.md +8 -0
  77. package/plugins/src/expo/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
  78. package/plugins/src/expo/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +109 -0
  79. package/plugins/src/expo/skills/gluestack-nativewind/SKILL.md +8 -0
  80. package/plugins/src/expo/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
  81. package/plugins/src/expo/skills/gluestack-nativewind/scripts/validate_styling.py +109 -0
@@ -19,6 +19,7 @@ Arguments:
19
19
  Can be a file or directory.
20
20
  """
21
21
 
22
+ import json
22
23
  import os
23
24
  import re
24
25
  import sys
@@ -99,6 +100,109 @@ SKIP_PATTERNS = [
99
100
  ]
100
101
 
101
102
 
103
+ SEALED_DESIGN_SYSTEM_MARKERS = [
104
+ ".claude/rules/use-the-design-library.md",
105
+ ".claude/rules/figma-design-system.md",
106
+ "docs/design-system/tokens.md",
107
+ "docs/design-system-rfc.md",
108
+ ]
109
+
110
+ ATOM_BARREL_MARKERS = [
111
+ "components/atoms/index.ts",
112
+ "components/atoms/index.tsx",
113
+ "src/components/atoms/index.ts",
114
+ "src/components/atoms/index.tsx",
115
+ ]
116
+
117
+
118
+ def find_project_roots(path: str) -> list[Path]:
119
+ """Find candidate roots for marker detection, from nearest to farthest.
120
+
121
+ Returns all package boundaries (package.json or .git directories) found
122
+ when walking up from ``path``. In a monorepo this means both the inner
123
+ package root and the workspace root are returned, so seal markers stored at
124
+ the workspace level are not missed.
125
+ """
126
+ current = Path(path).resolve()
127
+ if current.is_file():
128
+ current = current.parent
129
+
130
+ return [
131
+ candidate
132
+ for candidate in [current, *current.parents]
133
+ if (candidate / "package.json").exists() or (candidate / ".git").exists()
134
+ ] or [current]
135
+
136
+
137
+ def has_design_system_eslint_rule(project_root: Path) -> bool:
138
+ """Detect project-owned design-system lint rules.
139
+
140
+ Only matches actual rule/plugin identifier syntax (``design-system/``) so
141
+ that comments, package names, or arbitrary strings containing
142
+ ``design-system`` as a substring do not trigger a false positive.
143
+ """
144
+ eslint_files = [
145
+ ".eslintrc",
146
+ ".eslintrc.js",
147
+ ".eslintrc.cjs",
148
+ ".eslintrc.yaml",
149
+ ".eslintrc.yml",
150
+ ".eslintrc.json",
151
+ "eslint.config.js",
152
+ "eslint.config.mjs",
153
+ "eslint.config.cjs",
154
+ "eslint.config.ts",
155
+ "eslint.config.mts",
156
+ "eslint.config.cts",
157
+ ]
158
+
159
+ for eslint_file in eslint_files:
160
+ path = project_root / eslint_file
161
+ if not path.exists() or not path.is_file():
162
+ continue
163
+ try:
164
+ content = path.read_text(encoding="utf-8")
165
+ except UnicodeDecodeError:
166
+ continue
167
+ if re.search(r"\bdesign-system/", content):
168
+ return True
169
+
170
+ # Check package.json eslintConfig field explicitly so that dependency
171
+ # names (e.g. "design-system" in dependencies) don't cause false positives.
172
+ package_json_path = project_root / "package.json"
173
+ if package_json_path.exists() and package_json_path.is_file():
174
+ try:
175
+ pkg = json.loads(package_json_path.read_text(encoding="utf-8"))
176
+ eslint_config = pkg.get("eslintConfig")
177
+ if eslint_config is not None:
178
+ eslint_config_str = json.dumps(eslint_config)
179
+ if re.search(r"\bdesign-system/", eslint_config_str):
180
+ return True
181
+ except (json.JSONDecodeError, UnicodeDecodeError):
182
+ pass
183
+
184
+ return False
185
+
186
+
187
+ def has_sealed_design_system(path: str) -> bool:
188
+ """Check whether this project has a closed local design-system seal."""
189
+ project_roots = find_project_roots(path)
190
+ has_seal_marker = any(
191
+ (root / marker).exists()
192
+ for root in project_roots
193
+ for marker in SEALED_DESIGN_SYSTEM_MARKERS
194
+ )
195
+ has_atom_barrel = any(
196
+ (root / marker).exists()
197
+ for root in project_roots
198
+ for marker in ATOM_BARREL_MARKERS
199
+ )
200
+
201
+ if has_seal_marker or has_atom_barrel:
202
+ return True
203
+ return any(has_design_system_eslint_rule(root) for root in project_roots)
204
+
205
+
102
206
  def should_skip_file(file_path: str) -> bool:
103
207
  """Check if file should be skipped."""
104
208
  for pattern in SKIP_PATTERNS:
@@ -270,6 +374,11 @@ def main():
270
374
  print(f"❌ Path not found: {path}")
271
375
  sys.exit(1)
272
376
 
377
+ if has_sealed_design_system(path):
378
+ print("Sealed design system detected; deferring to the project's design-library rules.")
379
+ print("Skipping generic Gluestack NativeWind validation.")
380
+ sys.exit(0)
381
+
273
382
  print(f"🔍 Validating styling patterns in: {path}\n")
274
383
 
275
384
  # Validate