@codyswann/lisa 2.121.1 → 2.123.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.
- package/.claude-plugin/marketplace.json +144 -0
- package/dist/agy/agents-md-installer.d.ts +6 -3
- package/dist/agy/agents-md-installer.d.ts.map +1 -1
- package/dist/agy/agents-md-installer.js +9 -4
- package/dist/agy/agents-md-installer.js.map +1 -1
- package/dist/agy/plugin-installer.d.ts +6 -4
- package/dist/agy/plugin-installer.d.ts.map +1 -1
- package/dist/agy/plugin-installer.js +7 -5
- package/dist/agy/plugin-installer.js.map +1 -1
- package/dist/configs/eslint/expo.d.ts +10 -1
- package/dist/configs/eslint/expo.d.ts.map +1 -1
- package/dist/configs/eslint/expo.js +19 -18
- package/dist/configs/eslint/expo.js.map +1 -1
- package/dist/configs/jest/expo.d.ts +10 -1
- package/dist/configs/jest/expo.d.ts.map +1 -1
- package/dist/configs/jest/expo.js +18 -13
- package/dist/configs/jest/expo.js.map +1 -1
- package/dist/copilot/plugin-installer.d.ts +6 -3
- package/dist/copilot/plugin-installer.d.ts.map +1 -1
- package/dist/copilot/plugin-installer.js +7 -4
- package/dist/copilot/plugin-installer.js.map +1 -1
- package/dist/core/lisa.d.ts +16 -0
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +61 -18
- package/dist/core/lisa.js.map +1 -1
- package/expo/copy-overwrite/eslint.config.ts +6 -0
- package/expo/copy-overwrite/jest.config.ts +10 -0
- package/expo/copy-overwrite/knip.json +24 -2
- package/expo/create-only/jest.config.react-native-mock.js +22 -0
- package/expo/package-lisa/package.lisa.json +37 -36
- package/package.json +1 -1
- 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 +11 -0
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +11 -0
- 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/skills/directory-structure/SKILL.md +32 -20
- package/plugins/lisa-expo/skills/directory-structure/scripts/validate_structure.py +15 -6
- package/plugins/lisa-expo-agy/.mcp.json +8 -0
- package/plugins/lisa-expo-agy/THIRD-PARTY-NOTICES.md +57 -0
- package/plugins/lisa-expo-agy/agents/ops-specialist.md +124 -0
- package/plugins/lisa-expo-agy/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-expo-agy/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-expo-agy/plugin.json +11 -0
- package/plugins/lisa-expo-agy/skills/add-app-clip/SKILL.md +280 -0
- package/plugins/lisa-expo-agy/skills/add-app-clip/references/native-module.md +96 -0
- package/plugins/lisa-expo-agy/skills/apollo-client/SKILL.md +238 -0
- package/plugins/lisa-expo-agy/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/plugins/lisa-expo-agy/skills/atomic-design-gluestack/SKILL.md +360 -0
- package/plugins/lisa-expo-agy/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/plugins/lisa-expo-agy/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/plugins/lisa-expo-agy/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/plugins/lisa-expo-agy/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +329 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/SKILL.md +321 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/animations.md +220 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/controls.md +272 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/form-sheet.md +253 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/gradients.md +106 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/icons.md +213 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/media.md +198 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/route-structure.md +229 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/search.md +248 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/storage.md +121 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/tabs.md +433 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/visual-effects.md +197 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/webgpu-three.md +605 -0
- package/plugins/lisa-expo-agy/skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/plugins/lisa-expo-agy/skills/container-view-pattern/SKILL.md +299 -0
- package/plugins/lisa-expo-agy/skills/container-view-pattern/references/examples.md +749 -0
- package/plugins/lisa-expo-agy/skills/container-view-pattern/references/patterns.md +318 -0
- package/plugins/lisa-expo-agy/skills/container-view-pattern/scripts/create_component.py +200 -0
- package/plugins/lisa-expo-agy/skills/container-view-pattern/scripts/validate_component.py +209 -0
- package/plugins/lisa-expo-agy/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/plugins/lisa-expo-agy/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/plugins/lisa-expo-agy/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/plugins/lisa-expo-agy/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/plugins/lisa-expo-agy/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +416 -0
- package/plugins/lisa-expo-agy/skills/directory-structure/SKILL.md +214 -0
- package/plugins/lisa-expo-agy/skills/directory-structure/scripts/validate_structure.py +454 -0
- package/plugins/lisa-expo-agy/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-expo-agy/skills/eas-update-insights/SKILL.md +228 -0
- package/plugins/lisa-expo-agy/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/plugins/lisa-expo-agy/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/plugins/lisa-expo-agy/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-expo-agy/skills/expo-api-routes/SKILL.md +369 -0
- package/plugins/lisa-expo-agy/skills/expo-brownfield/SKILL.md +54 -0
- package/plugins/lisa-expo-agy/skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/plugins/lisa-expo-agy/skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/plugins/lisa-expo-agy/skills/expo-brownfield/references/comparison.md +63 -0
- package/plugins/lisa-expo-agy/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/plugins/lisa-expo-agy/skills/expo-cicd-workflows/SKILL.md +92 -0
- package/plugins/lisa-expo-agy/skills/expo-cicd-workflows/scripts/fetch.js +113 -0
- package/plugins/lisa-expo-agy/skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/plugins/lisa-expo-agy/skills/expo-cicd-workflows/scripts/validate.js +85 -0
- package/plugins/lisa-expo-agy/skills/expo-deployment/SKILL.md +190 -0
- package/plugins/lisa-expo-agy/skills/expo-deployment/references/app-store-metadata.md +479 -0
- package/plugins/lisa-expo-agy/skills/expo-deployment/references/ios-app-store.md +355 -0
- package/plugins/lisa-expo-agy/skills/expo-deployment/references/play-store.md +246 -0
- package/plugins/lisa-expo-agy/skills/expo-deployment/references/testflight.md +58 -0
- package/plugins/lisa-expo-agy/skills/expo-deployment/references/workflows.md +200 -0
- package/plugins/lisa-expo-agy/skills/expo-dev-client/SKILL.md +164 -0
- package/plugins/lisa-expo-agy/skills/expo-env-config/SKILL.md +309 -0
- package/plugins/lisa-expo-agy/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/plugins/lisa-expo-agy/skills/expo-module/SKILL.md +141 -0
- package/plugins/lisa-expo-agy/skills/expo-module/references/config-plugin.md +90 -0
- package/plugins/lisa-expo-agy/skills/expo-module/references/create-expo-module.md +206 -0
- package/plugins/lisa-expo-agy/skills/expo-module/references/lifecycle.md +127 -0
- package/plugins/lisa-expo-agy/skills/expo-module/references/module-config.md +48 -0
- package/plugins/lisa-expo-agy/skills/expo-module/references/native-module.md +286 -0
- package/plugins/lisa-expo-agy/skills/expo-module/references/native-view.md +171 -0
- package/plugins/lisa-expo-agy/skills/expo-router-best-practices/SKILL.md +431 -0
- package/plugins/lisa-expo-agy/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/plugins/lisa-expo-agy/skills/expo-router-best-practices/scripts/generate-route.py +171 -0
- package/plugins/lisa-expo-agy/skills/expo-tailwind-setup/SKILL.md +480 -0
- package/plugins/lisa-expo-agy/skills/expo-ui-jetpack-compose/SKILL.md +40 -0
- package/plugins/lisa-expo-agy/skills/expo-ui-swift-ui/SKILL.md +39 -0
- package/plugins/lisa-expo-agy/skills/gluestack-nativewind/SKILL.md +411 -0
- package/plugins/lisa-expo-agy/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/plugins/lisa-expo-agy/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/plugins/lisa-expo-agy/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/plugins/lisa-expo-agy/skills/gluestack-nativewind/scripts/validate_styling.py +315 -0
- package/plugins/lisa-expo-agy/skills/jira-add-journey/SKILL.md +126 -0
- package/plugins/lisa-expo-agy/skills/jira-create/SKILL.md +161 -0
- package/plugins/lisa-expo-agy/skills/jira-evidence/SKILL.md +78 -0
- package/plugins/lisa-expo-agy/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-expo-agy/skills/jira-journey/SKILL.md +190 -0
- package/plugins/lisa-expo-agy/skills/jira-journey/scripts/generate-templates.py +281 -0
- package/plugins/lisa-expo-agy/skills/jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa-expo-agy/skills/jira-verify/SKILL.md +27 -0
- package/plugins/lisa-expo-agy/skills/local-state/SKILL.md +362 -0
- package/plugins/lisa-expo-agy/skills/local-state/references/async-storage.md +505 -0
- package/plugins/lisa-expo-agy/skills/local-state/references/persistence-patterns.md +711 -0
- package/plugins/lisa-expo-agy/skills/local-state/references/reactive-variables.md +446 -0
- package/plugins/lisa-expo-agy/skills/native-data-fetching/SKILL.md +507 -0
- package/plugins/lisa-expo-agy/skills/native-data-fetching/references/expo-router-loaders.md +344 -0
- package/plugins/lisa-expo-agy/skills/ops-browser-uat/SKILL.md +124 -0
- package/plugins/lisa-expo-agy/skills/ops-check-logs/SKILL.md +211 -0
- package/plugins/lisa-expo-agy/skills/ops-db-ops/SKILL.md +119 -0
- package/plugins/lisa-expo-agy/skills/ops-deploy/SKILL.md +119 -0
- package/plugins/lisa-expo-agy/skills/ops-monitor-errors/SKILL.md +99 -0
- package/plugins/lisa-expo-agy/skills/ops-performance/SKILL.md +165 -0
- package/plugins/lisa-expo-agy/skills/ops-run-local/SKILL.md +166 -0
- package/plugins/lisa-expo-agy/skills/ops-verify-health/SKILL.md +101 -0
- package/plugins/lisa-expo-agy/skills/owasp-zap/SKILL.md +56 -0
- package/plugins/lisa-expo-agy/skills/playwright-ci-debugging/SKILL.md +140 -0
- package/plugins/lisa-expo-agy/skills/playwright-selectors/SKILL.md +455 -0
- package/plugins/lisa-expo-agy/skills/reduce-complexity/SKILL.md +251 -0
- package/plugins/lisa-expo-agy/skills/reduce-complexity/references/extraction-strategies.md +456 -0
- package/plugins/lisa-expo-agy/skills/reduce-complexity/references/refactoring-patterns.md +557 -0
- package/plugins/lisa-expo-agy/skills/testing-library/SKILL.md +314 -0
- package/plugins/lisa-expo-agy/skills/testing-library/references/async-patterns.md +420 -0
- package/plugins/lisa-expo-agy/skills/testing-library/references/expo-router-testing.md +556 -0
- package/plugins/lisa-expo-agy/skills/testing-library/references/mocking-patterns.md +590 -0
- package/plugins/lisa-expo-agy/skills/testing-library/references/query-priority.md +291 -0
- package/plugins/lisa-expo-agy/skills/upgrading-expo/SKILL.md +134 -0
- package/plugins/lisa-expo-agy/skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/plugins/lisa-expo-agy/skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/plugins/lisa-expo-agy/skills/upgrading-expo/references/native-tabs.md +124 -0
- package/plugins/lisa-expo-agy/skills/upgrading-expo/references/new-architecture.md +79 -0
- package/plugins/lisa-expo-agy/skills/upgrading-expo/references/react-19.md +79 -0
- package/plugins/lisa-expo-agy/skills/upgrading-expo/references/react-compiler.md +59 -0
- package/plugins/lisa-expo-agy/skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/plugins/lisa-expo-agy/skills/use-dom/SKILL.md +417 -0
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-expo-copilot/.mcp.json +8 -0
- package/plugins/lisa-expo-copilot/THIRD-PARTY-NOTICES.md +57 -0
- package/plugins/lisa-expo-copilot/agents/ops-specialist.agent.md +124 -0
- package/plugins/lisa-expo-copilot/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-expo-copilot/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-expo-copilot/skills/add-app-clip/SKILL.md +280 -0
- package/plugins/lisa-expo-copilot/skills/add-app-clip/references/native-module.md +96 -0
- package/plugins/lisa-expo-copilot/skills/apollo-client/SKILL.md +238 -0
- package/plugins/lisa-expo-copilot/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/plugins/lisa-expo-copilot/skills/atomic-design-gluestack/SKILL.md +360 -0
- package/plugins/lisa-expo-copilot/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/plugins/lisa-expo-copilot/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/plugins/lisa-expo-copilot/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/plugins/lisa-expo-copilot/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +329 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/SKILL.md +321 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/animations.md +220 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/controls.md +272 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/form-sheet.md +253 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/gradients.md +106 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/icons.md +213 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/media.md +198 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/route-structure.md +229 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/search.md +248 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/storage.md +121 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/tabs.md +433 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/visual-effects.md +197 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/webgpu-three.md +605 -0
- package/plugins/lisa-expo-copilot/skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/plugins/lisa-expo-copilot/skills/container-view-pattern/SKILL.md +299 -0
- package/plugins/lisa-expo-copilot/skills/container-view-pattern/references/examples.md +749 -0
- package/plugins/lisa-expo-copilot/skills/container-view-pattern/references/patterns.md +318 -0
- package/plugins/lisa-expo-copilot/skills/container-view-pattern/scripts/create_component.py +200 -0
- package/plugins/lisa-expo-copilot/skills/container-view-pattern/scripts/validate_component.py +209 -0
- package/plugins/lisa-expo-copilot/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/plugins/lisa-expo-copilot/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/plugins/lisa-expo-copilot/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/plugins/lisa-expo-copilot/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/plugins/lisa-expo-copilot/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +416 -0
- package/plugins/lisa-expo-copilot/skills/directory-structure/SKILL.md +214 -0
- package/plugins/lisa-expo-copilot/skills/directory-structure/scripts/validate_structure.py +454 -0
- package/plugins/lisa-expo-copilot/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-expo-copilot/skills/eas-update-insights/SKILL.md +228 -0
- package/plugins/lisa-expo-copilot/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/plugins/lisa-expo-copilot/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/plugins/lisa-expo-copilot/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-expo-copilot/skills/expo-api-routes/SKILL.md +369 -0
- package/plugins/lisa-expo-copilot/skills/expo-brownfield/SKILL.md +54 -0
- package/plugins/lisa-expo-copilot/skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/plugins/lisa-expo-copilot/skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/plugins/lisa-expo-copilot/skills/expo-brownfield/references/comparison.md +63 -0
- package/plugins/lisa-expo-copilot/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/plugins/lisa-expo-copilot/skills/expo-cicd-workflows/SKILL.md +92 -0
- package/plugins/lisa-expo-copilot/skills/expo-cicd-workflows/scripts/fetch.js +113 -0
- package/plugins/lisa-expo-copilot/skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/plugins/lisa-expo-copilot/skills/expo-cicd-workflows/scripts/validate.js +85 -0
- package/plugins/lisa-expo-copilot/skills/expo-deployment/SKILL.md +190 -0
- package/plugins/lisa-expo-copilot/skills/expo-deployment/references/app-store-metadata.md +479 -0
- package/plugins/lisa-expo-copilot/skills/expo-deployment/references/ios-app-store.md +355 -0
- package/plugins/lisa-expo-copilot/skills/expo-deployment/references/play-store.md +246 -0
- package/plugins/lisa-expo-copilot/skills/expo-deployment/references/testflight.md +58 -0
- package/plugins/lisa-expo-copilot/skills/expo-deployment/references/workflows.md +200 -0
- package/plugins/lisa-expo-copilot/skills/expo-dev-client/SKILL.md +164 -0
- package/plugins/lisa-expo-copilot/skills/expo-env-config/SKILL.md +309 -0
- package/plugins/lisa-expo-copilot/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/plugins/lisa-expo-copilot/skills/expo-module/SKILL.md +141 -0
- package/plugins/lisa-expo-copilot/skills/expo-module/references/config-plugin.md +90 -0
- package/plugins/lisa-expo-copilot/skills/expo-module/references/create-expo-module.md +206 -0
- package/plugins/lisa-expo-copilot/skills/expo-module/references/lifecycle.md +127 -0
- package/plugins/lisa-expo-copilot/skills/expo-module/references/module-config.md +48 -0
- package/plugins/lisa-expo-copilot/skills/expo-module/references/native-module.md +286 -0
- package/plugins/lisa-expo-copilot/skills/expo-module/references/native-view.md +171 -0
- package/plugins/lisa-expo-copilot/skills/expo-router-best-practices/SKILL.md +431 -0
- package/plugins/lisa-expo-copilot/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/plugins/lisa-expo-copilot/skills/expo-router-best-practices/scripts/generate-route.py +171 -0
- package/plugins/lisa-expo-copilot/skills/expo-tailwind-setup/SKILL.md +480 -0
- package/plugins/lisa-expo-copilot/skills/expo-ui-jetpack-compose/SKILL.md +40 -0
- package/plugins/lisa-expo-copilot/skills/expo-ui-swift-ui/SKILL.md +39 -0
- package/plugins/lisa-expo-copilot/skills/gluestack-nativewind/SKILL.md +411 -0
- package/plugins/lisa-expo-copilot/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/plugins/lisa-expo-copilot/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/plugins/lisa-expo-copilot/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/plugins/lisa-expo-copilot/skills/gluestack-nativewind/scripts/validate_styling.py +315 -0
- package/plugins/lisa-expo-copilot/skills/jira-add-journey/SKILL.md +126 -0
- package/plugins/lisa-expo-copilot/skills/jira-create/SKILL.md +161 -0
- package/plugins/lisa-expo-copilot/skills/jira-evidence/SKILL.md +78 -0
- package/plugins/lisa-expo-copilot/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-expo-copilot/skills/jira-journey/SKILL.md +190 -0
- package/plugins/lisa-expo-copilot/skills/jira-journey/scripts/generate-templates.py +281 -0
- package/plugins/lisa-expo-copilot/skills/jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa-expo-copilot/skills/jira-verify/SKILL.md +27 -0
- package/plugins/lisa-expo-copilot/skills/local-state/SKILL.md +362 -0
- package/plugins/lisa-expo-copilot/skills/local-state/references/async-storage.md +505 -0
- package/plugins/lisa-expo-copilot/skills/local-state/references/persistence-patterns.md +711 -0
- package/plugins/lisa-expo-copilot/skills/local-state/references/reactive-variables.md +446 -0
- package/plugins/lisa-expo-copilot/skills/native-data-fetching/SKILL.md +507 -0
- package/plugins/lisa-expo-copilot/skills/native-data-fetching/references/expo-router-loaders.md +344 -0
- package/plugins/lisa-expo-copilot/skills/ops-browser-uat/SKILL.md +124 -0
- package/plugins/lisa-expo-copilot/skills/ops-check-logs/SKILL.md +211 -0
- package/plugins/lisa-expo-copilot/skills/ops-db-ops/SKILL.md +119 -0
- package/plugins/lisa-expo-copilot/skills/ops-deploy/SKILL.md +119 -0
- package/plugins/lisa-expo-copilot/skills/ops-monitor-errors/SKILL.md +99 -0
- package/plugins/lisa-expo-copilot/skills/ops-performance/SKILL.md +165 -0
- package/plugins/lisa-expo-copilot/skills/ops-run-local/SKILL.md +166 -0
- package/plugins/lisa-expo-copilot/skills/ops-verify-health/SKILL.md +101 -0
- package/plugins/lisa-expo-copilot/skills/owasp-zap/SKILL.md +56 -0
- package/plugins/lisa-expo-copilot/skills/playwright-ci-debugging/SKILL.md +140 -0
- package/plugins/lisa-expo-copilot/skills/playwright-selectors/SKILL.md +455 -0
- package/plugins/lisa-expo-copilot/skills/reduce-complexity/SKILL.md +251 -0
- package/plugins/lisa-expo-copilot/skills/reduce-complexity/references/extraction-strategies.md +456 -0
- package/plugins/lisa-expo-copilot/skills/reduce-complexity/references/refactoring-patterns.md +557 -0
- package/plugins/lisa-expo-copilot/skills/testing-library/SKILL.md +314 -0
- package/plugins/lisa-expo-copilot/skills/testing-library/references/async-patterns.md +420 -0
- package/plugins/lisa-expo-copilot/skills/testing-library/references/expo-router-testing.md +556 -0
- package/plugins/lisa-expo-copilot/skills/testing-library/references/mocking-patterns.md +590 -0
- package/plugins/lisa-expo-copilot/skills/testing-library/references/query-priority.md +291 -0
- package/plugins/lisa-expo-copilot/skills/upgrading-expo/SKILL.md +134 -0
- package/plugins/lisa-expo-copilot/skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/plugins/lisa-expo-copilot/skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/plugins/lisa-expo-copilot/skills/upgrading-expo/references/native-tabs.md +124 -0
- package/plugins/lisa-expo-copilot/skills/upgrading-expo/references/new-architecture.md +79 -0
- package/plugins/lisa-expo-copilot/skills/upgrading-expo/references/react-19.md +79 -0
- package/plugins/lisa-expo-copilot/skills/upgrading-expo/references/react-compiler.md +59 -0
- package/plugins/lisa-expo-copilot/skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/plugins/lisa-expo-copilot/skills/use-dom/SKILL.md +417 -0
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-expo-cursor/.mcp.json +8 -0
- package/plugins/lisa-expo-cursor/THIRD-PARTY-NOTICES.md +57 -0
- package/plugins/lisa-expo-cursor/agents/ops-specialist.md +124 -0
- package/plugins/lisa-expo-cursor/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-expo-cursor/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-expo-cursor/skills/add-app-clip/SKILL.md +280 -0
- package/plugins/lisa-expo-cursor/skills/add-app-clip/references/native-module.md +96 -0
- package/plugins/lisa-expo-cursor/skills/apollo-client/SKILL.md +238 -0
- package/plugins/lisa-expo-cursor/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/plugins/lisa-expo-cursor/skills/atomic-design-gluestack/SKILL.md +360 -0
- package/plugins/lisa-expo-cursor/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/plugins/lisa-expo-cursor/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/plugins/lisa-expo-cursor/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/plugins/lisa-expo-cursor/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +329 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/SKILL.md +321 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/animations.md +220 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/controls.md +272 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/form-sheet.md +253 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/gradients.md +106 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/icons.md +213 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/media.md +198 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/route-structure.md +229 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/search.md +248 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/storage.md +121 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/tabs.md +433 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/visual-effects.md +197 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/webgpu-three.md +605 -0
- package/plugins/lisa-expo-cursor/skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/plugins/lisa-expo-cursor/skills/container-view-pattern/SKILL.md +299 -0
- package/plugins/lisa-expo-cursor/skills/container-view-pattern/references/examples.md +749 -0
- package/plugins/lisa-expo-cursor/skills/container-view-pattern/references/patterns.md +318 -0
- package/plugins/lisa-expo-cursor/skills/container-view-pattern/scripts/create_component.py +200 -0
- package/plugins/lisa-expo-cursor/skills/container-view-pattern/scripts/validate_component.py +209 -0
- package/plugins/lisa-expo-cursor/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/plugins/lisa-expo-cursor/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/plugins/lisa-expo-cursor/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/plugins/lisa-expo-cursor/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/plugins/lisa-expo-cursor/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +416 -0
- package/plugins/lisa-expo-cursor/skills/directory-structure/SKILL.md +214 -0
- package/plugins/lisa-expo-cursor/skills/directory-structure/scripts/validate_structure.py +454 -0
- package/plugins/lisa-expo-cursor/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-expo-cursor/skills/eas-update-insights/SKILL.md +228 -0
- package/plugins/lisa-expo-cursor/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/plugins/lisa-expo-cursor/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/plugins/lisa-expo-cursor/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-expo-cursor/skills/expo-api-routes/SKILL.md +369 -0
- package/plugins/lisa-expo-cursor/skills/expo-brownfield/SKILL.md +54 -0
- package/plugins/lisa-expo-cursor/skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/plugins/lisa-expo-cursor/skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/plugins/lisa-expo-cursor/skills/expo-brownfield/references/comparison.md +63 -0
- package/plugins/lisa-expo-cursor/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/plugins/lisa-expo-cursor/skills/expo-cicd-workflows/SKILL.md +92 -0
- package/plugins/lisa-expo-cursor/skills/expo-cicd-workflows/scripts/fetch.js +113 -0
- package/plugins/lisa-expo-cursor/skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/plugins/lisa-expo-cursor/skills/expo-cicd-workflows/scripts/validate.js +85 -0
- package/plugins/lisa-expo-cursor/skills/expo-deployment/SKILL.md +190 -0
- package/plugins/lisa-expo-cursor/skills/expo-deployment/references/app-store-metadata.md +479 -0
- package/plugins/lisa-expo-cursor/skills/expo-deployment/references/ios-app-store.md +355 -0
- package/plugins/lisa-expo-cursor/skills/expo-deployment/references/play-store.md +246 -0
- package/plugins/lisa-expo-cursor/skills/expo-deployment/references/testflight.md +58 -0
- package/plugins/lisa-expo-cursor/skills/expo-deployment/references/workflows.md +200 -0
- package/plugins/lisa-expo-cursor/skills/expo-dev-client/SKILL.md +164 -0
- package/plugins/lisa-expo-cursor/skills/expo-env-config/SKILL.md +309 -0
- package/plugins/lisa-expo-cursor/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/plugins/lisa-expo-cursor/skills/expo-module/SKILL.md +141 -0
- package/plugins/lisa-expo-cursor/skills/expo-module/references/config-plugin.md +90 -0
- package/plugins/lisa-expo-cursor/skills/expo-module/references/create-expo-module.md +206 -0
- package/plugins/lisa-expo-cursor/skills/expo-module/references/lifecycle.md +127 -0
- package/plugins/lisa-expo-cursor/skills/expo-module/references/module-config.md +48 -0
- package/plugins/lisa-expo-cursor/skills/expo-module/references/native-module.md +286 -0
- package/plugins/lisa-expo-cursor/skills/expo-module/references/native-view.md +171 -0
- package/plugins/lisa-expo-cursor/skills/expo-router-best-practices/SKILL.md +431 -0
- package/plugins/lisa-expo-cursor/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/plugins/lisa-expo-cursor/skills/expo-router-best-practices/scripts/generate-route.py +171 -0
- package/plugins/lisa-expo-cursor/skills/expo-tailwind-setup/SKILL.md +480 -0
- package/plugins/lisa-expo-cursor/skills/expo-ui-jetpack-compose/SKILL.md +40 -0
- package/plugins/lisa-expo-cursor/skills/expo-ui-swift-ui/SKILL.md +39 -0
- package/plugins/lisa-expo-cursor/skills/gluestack-nativewind/SKILL.md +411 -0
- package/plugins/lisa-expo-cursor/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/plugins/lisa-expo-cursor/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/plugins/lisa-expo-cursor/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/plugins/lisa-expo-cursor/skills/gluestack-nativewind/scripts/validate_styling.py +315 -0
- package/plugins/lisa-expo-cursor/skills/jira-add-journey/SKILL.md +126 -0
- package/plugins/lisa-expo-cursor/skills/jira-create/SKILL.md +161 -0
- package/plugins/lisa-expo-cursor/skills/jira-evidence/SKILL.md +78 -0
- package/plugins/lisa-expo-cursor/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-expo-cursor/skills/jira-journey/SKILL.md +190 -0
- package/plugins/lisa-expo-cursor/skills/jira-journey/scripts/generate-templates.py +281 -0
- package/plugins/lisa-expo-cursor/skills/jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa-expo-cursor/skills/jira-verify/SKILL.md +27 -0
- package/plugins/lisa-expo-cursor/skills/local-state/SKILL.md +362 -0
- package/plugins/lisa-expo-cursor/skills/local-state/references/async-storage.md +505 -0
- package/plugins/lisa-expo-cursor/skills/local-state/references/persistence-patterns.md +711 -0
- package/plugins/lisa-expo-cursor/skills/local-state/references/reactive-variables.md +446 -0
- package/plugins/lisa-expo-cursor/skills/native-data-fetching/SKILL.md +507 -0
- package/plugins/lisa-expo-cursor/skills/native-data-fetching/references/expo-router-loaders.md +344 -0
- package/plugins/lisa-expo-cursor/skills/ops-browser-uat/SKILL.md +124 -0
- package/plugins/lisa-expo-cursor/skills/ops-check-logs/SKILL.md +211 -0
- package/plugins/lisa-expo-cursor/skills/ops-db-ops/SKILL.md +119 -0
- package/plugins/lisa-expo-cursor/skills/ops-deploy/SKILL.md +119 -0
- package/plugins/lisa-expo-cursor/skills/ops-monitor-errors/SKILL.md +99 -0
- package/plugins/lisa-expo-cursor/skills/ops-performance/SKILL.md +165 -0
- package/plugins/lisa-expo-cursor/skills/ops-run-local/SKILL.md +166 -0
- package/plugins/lisa-expo-cursor/skills/ops-verify-health/SKILL.md +101 -0
- package/plugins/lisa-expo-cursor/skills/owasp-zap/SKILL.md +56 -0
- package/plugins/lisa-expo-cursor/skills/playwright-ci-debugging/SKILL.md +140 -0
- package/plugins/lisa-expo-cursor/skills/playwright-selectors/SKILL.md +455 -0
- package/plugins/lisa-expo-cursor/skills/reduce-complexity/SKILL.md +251 -0
- package/plugins/lisa-expo-cursor/skills/reduce-complexity/references/extraction-strategies.md +456 -0
- package/plugins/lisa-expo-cursor/skills/reduce-complexity/references/refactoring-patterns.md +557 -0
- package/plugins/lisa-expo-cursor/skills/testing-library/SKILL.md +314 -0
- package/plugins/lisa-expo-cursor/skills/testing-library/references/async-patterns.md +420 -0
- package/plugins/lisa-expo-cursor/skills/testing-library/references/expo-router-testing.md +556 -0
- package/plugins/lisa-expo-cursor/skills/testing-library/references/mocking-patterns.md +590 -0
- package/plugins/lisa-expo-cursor/skills/testing-library/references/query-priority.md +291 -0
- package/plugins/lisa-expo-cursor/skills/upgrading-expo/SKILL.md +134 -0
- package/plugins/lisa-expo-cursor/skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/plugins/lisa-expo-cursor/skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/plugins/lisa-expo-cursor/skills/upgrading-expo/references/native-tabs.md +124 -0
- package/plugins/lisa-expo-cursor/skills/upgrading-expo/references/new-architecture.md +79 -0
- package/plugins/lisa-expo-cursor/skills/upgrading-expo/references/react-19.md +79 -0
- package/plugins/lisa-expo-cursor/skills/upgrading-expo/references/react-compiler.md +59 -0
- package/plugins/lisa-expo-cursor/skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/plugins/lisa-expo-cursor/skills/use-dom/SKILL.md +417 -0
- 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/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-harper-fabric-agy/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-harper-fabric-agy/plugin.json +11 -0
- package/plugins/lisa-harper-fabric-agy/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-harper-fabric-agy/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-harper-fabric-agy/skills/harper-build-and-deploy/SKILL.md +101 -0
- package/plugins/lisa-harper-fabric-agy/skills/harper-component-model/SKILL.md +87 -0
- package/plugins/lisa-harper-fabric-agy/skills/harper-config-yaml/SKILL.md +107 -0
- package/plugins/lisa-harper-fabric-agy/skills/harper-resources/SKILL.md +106 -0
- package/plugins/lisa-harper-fabric-agy/skills/harper-schema-graphql/SKILL.md +72 -0
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +35 -0
- package/plugins/lisa-harper-fabric-copilot/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-harper-fabric-copilot/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-harper-fabric-copilot/hooks/inject-rules.sh +16 -0
- package/plugins/lisa-harper-fabric-copilot/rules/harper-fabric.md +51 -0
- package/plugins/lisa-harper-fabric-copilot/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-harper-fabric-copilot/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-harper-fabric-copilot/skills/harper-build-and-deploy/SKILL.md +101 -0
- package/plugins/lisa-harper-fabric-copilot/skills/harper-component-model/SKILL.md +87 -0
- package/plugins/lisa-harper-fabric-copilot/skills/harper-config-yaml/SKILL.md +107 -0
- package/plugins/lisa-harper-fabric-copilot/skills/harper-resources/SKILL.md +106 -0
- package/plugins/lisa-harper-fabric-copilot/skills/harper-schema-graphql/SKILL.md +72 -0
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-harper-fabric-cursor/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-harper-fabric-cursor/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-harper-fabric-cursor/rules/harper-fabric.md +51 -0
- package/plugins/lisa-harper-fabric-cursor/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-harper-fabric-cursor/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-harper-fabric-cursor/skills/harper-build-and-deploy/SKILL.md +101 -0
- package/plugins/lisa-harper-fabric-cursor/skills/harper-component-model/SKILL.md +87 -0
- package/plugins/lisa-harper-fabric-cursor/skills/harper-config-yaml/SKILL.md +107 -0
- package/plugins/lisa-harper-fabric-cursor/skills/harper-resources/SKILL.md +106 -0
- package/plugins/lisa-harper-fabric-cursor/skills/harper-schema-graphql/SKILL.md +72 -0
- 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 +11 -0
- package/plugins/lisa-nestjs-agy/skills/nestjs-graphql/SKILL.md +176 -0
- package/plugins/lisa-nestjs-agy/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/plugins/lisa-nestjs-agy/skills/nestjs-graphql/references/project-patterns.md +531 -0
- package/plugins/lisa-nestjs-agy/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/plugins/lisa-nestjs-agy/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/plugins/lisa-nestjs-agy/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/plugins/lisa-nestjs-agy/skills/nestjs-rules/SKILL.md +565 -0
- package/plugins/lisa-nestjs-agy/skills/typeorm-patterns/SKILL.md +275 -0
- package/plugins/lisa-nestjs-agy/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/plugins/lisa-nestjs-agy/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/plugins/lisa-nestjs-agy/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +24 -0
- package/plugins/lisa-nestjs-copilot/hooks/block-migration-edits.sh +60 -0
- package/plugins/lisa-nestjs-copilot/skills/nestjs-graphql/SKILL.md +176 -0
- package/plugins/lisa-nestjs-copilot/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/plugins/lisa-nestjs-copilot/skills/nestjs-graphql/references/project-patterns.md +531 -0
- package/plugins/lisa-nestjs-copilot/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/plugins/lisa-nestjs-copilot/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/plugins/lisa-nestjs-copilot/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/plugins/lisa-nestjs-copilot/skills/nestjs-rules/SKILL.md +565 -0
- package/plugins/lisa-nestjs-copilot/skills/typeorm-patterns/SKILL.md +275 -0
- package/plugins/lisa-nestjs-copilot/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/plugins/lisa-nestjs-copilot/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/plugins/lisa-nestjs-copilot/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +24 -0
- package/plugins/lisa-nestjs-cursor/hooks/block-migration-edits.sh +60 -0
- package/plugins/lisa-nestjs-cursor/skills/nestjs-graphql/SKILL.md +176 -0
- package/plugins/lisa-nestjs-cursor/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/plugins/lisa-nestjs-cursor/skills/nestjs-graphql/references/project-patterns.md +531 -0
- package/plugins/lisa-nestjs-cursor/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/plugins/lisa-nestjs-cursor/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/plugins/lisa-nestjs-cursor/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/plugins/lisa-nestjs-cursor/skills/nestjs-rules/SKILL.md +565 -0
- package/plugins/lisa-nestjs-cursor/skills/typeorm-patterns/SKILL.md +275 -0
- package/plugins/lisa-nestjs-cursor/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/plugins/lisa-nestjs-cursor/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/plugins/lisa-nestjs-cursor/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- 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/commands/connect-repo-topic.md +7 -0
- package/plugins/lisa-openclaw-agy/commands/connect-staff-slack.md +7 -0
- package/plugins/lisa-openclaw-agy/commands/connect-staff-telegram.md +7 -0
- package/plugins/lisa-openclaw-agy/commands/setup-openclaw.md +7 -0
- package/plugins/lisa-openclaw-agy/plugin.json +8 -0
- package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-repo-topic/SKILL.md +137 -0
- package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +109 -0
- package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-staff/SKILL.md +175 -0
- package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-staff/references/platform-routing.md +83 -0
- package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-staff/references/prompts.md +78 -0
- package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-setup/SKILL.md +138 -0
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-openclaw-copilot/commands/connect-repo-topic.md +7 -0
- package/plugins/lisa-openclaw-copilot/commands/connect-staff-slack.md +7 -0
- package/plugins/lisa-openclaw-copilot/commands/connect-staff-telegram.md +7 -0
- package/plugins/lisa-openclaw-copilot/commands/setup-openclaw.md +7 -0
- package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-repo-topic/SKILL.md +137 -0
- package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +109 -0
- package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-staff/SKILL.md +175 -0
- package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-staff/references/platform-routing.md +83 -0
- package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-staff/references/prompts.md +78 -0
- package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-setup/SKILL.md +138 -0
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-openclaw-cursor/commands/connect-repo-topic.md +7 -0
- package/plugins/lisa-openclaw-cursor/commands/connect-staff-slack.md +7 -0
- package/plugins/lisa-openclaw-cursor/commands/connect-staff-telegram.md +7 -0
- package/plugins/lisa-openclaw-cursor/commands/setup-openclaw.md +7 -0
- package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-repo-topic/SKILL.md +137 -0
- package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +109 -0
- package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-staff/SKILL.md +175 -0
- package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-staff/references/platform-routing.md +83 -0
- package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-staff/references/prompts.md +78 -0
- package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-setup/SKILL.md +138 -0
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/agents/ops-specialist.md +226 -0
- package/plugins/lisa-rails-agy/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-rails-agy/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-rails-agy/commands/fix/linter-error.md +7 -0
- package/plugins/lisa-rails-agy/commands/improve/code-complexity.md +6 -0
- package/plugins/lisa-rails-agy/commands/improve/max-lines-per-function.md +7 -0
- package/plugins/lisa-rails-agy/commands/improve/max-lines.md +7 -0
- package/plugins/lisa-rails-agy/commands/improve/test-coverage.md +7 -0
- package/plugins/lisa-rails-agy/plugin.json +11 -0
- package/plugins/lisa-rails-agy/skills/action-controller-best-practices/SKILL.md +374 -0
- package/plugins/lisa-rails-agy/skills/action-view-best-practices/SKILL.md +335 -0
- package/plugins/lisa-rails-agy/skills/active-record-model-best-practices/SKILL.md +166 -0
- package/plugins/lisa-rails-agy/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-rails-agy/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-rails-agy/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-rails-agy/skills/improve-code-complexity/SKILL.md +48 -0
- package/plugins/lisa-rails-agy/skills/improve-max-lines/SKILL.md +46 -0
- package/plugins/lisa-rails-agy/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-rails-agy/skills/improve-test-coverage/SKILL.md +45 -0
- package/plugins/lisa-rails-agy/skills/jira-add-journey/SKILL.md +65 -0
- package/plugins/lisa-rails-agy/skills/jira-create/SKILL.md +100 -0
- package/plugins/lisa-rails-agy/skills/jira-evidence/SKILL.md +70 -0
- package/plugins/lisa-rails-agy/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-rails-agy/skills/jira-journey/SKILL.md +64 -0
- package/plugins/lisa-rails-agy/skills/jira-verify/SKILL.md +26 -0
- package/plugins/lisa-rails-agy/skills/ops-check-logs/SKILL.md +191 -0
- package/plugins/lisa-rails-agy/skills/ops-deploy/SKILL.md +153 -0
- package/plugins/lisa-rails-agy/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-rails-agy/skills/ops-verify-jobs/SKILL.md +157 -0
- package/plugins/lisa-rails-agy/skills/ops-verify-telemetry/SKILL.md +197 -0
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +50 -0
- package/plugins/lisa-rails-copilot/agents/ops-specialist.agent.md +226 -0
- package/plugins/lisa-rails-copilot/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-rails-copilot/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-rails-copilot/commands/fix/linter-error.md +7 -0
- package/plugins/lisa-rails-copilot/commands/improve/code-complexity.md +6 -0
- package/plugins/lisa-rails-copilot/commands/improve/max-lines-per-function.md +7 -0
- package/plugins/lisa-rails-copilot/commands/improve/max-lines.md +7 -0
- package/plugins/lisa-rails-copilot/commands/improve/test-coverage.md +7 -0
- package/plugins/lisa-rails-copilot/hooks/inject-rules.sh +22 -0
- package/plugins/lisa-rails-copilot/hooks/rubocop-on-edit.sh +78 -0
- package/plugins/lisa-rails-copilot/hooks/sg-scan-on-edit.sh +74 -0
- package/plugins/lisa-rails-copilot/rules/rails-conventions.md +176 -0
- package/plugins/lisa-rails-copilot/skills/action-controller-best-practices/SKILL.md +374 -0
- package/plugins/lisa-rails-copilot/skills/action-view-best-practices/SKILL.md +335 -0
- package/plugins/lisa-rails-copilot/skills/active-record-model-best-practices/SKILL.md +166 -0
- package/plugins/lisa-rails-copilot/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-rails-copilot/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-rails-copilot/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-rails-copilot/skills/improve-code-complexity/SKILL.md +48 -0
- package/plugins/lisa-rails-copilot/skills/improve-max-lines/SKILL.md +46 -0
- package/plugins/lisa-rails-copilot/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-rails-copilot/skills/improve-test-coverage/SKILL.md +45 -0
- package/plugins/lisa-rails-copilot/skills/jira-add-journey/SKILL.md +65 -0
- package/plugins/lisa-rails-copilot/skills/jira-create/SKILL.md +100 -0
- package/plugins/lisa-rails-copilot/skills/jira-evidence/SKILL.md +70 -0
- package/plugins/lisa-rails-copilot/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-rails-copilot/skills/jira-journey/SKILL.md +64 -0
- package/plugins/lisa-rails-copilot/skills/jira-verify/SKILL.md +26 -0
- package/plugins/lisa-rails-copilot/skills/ops-check-logs/SKILL.md +191 -0
- package/plugins/lisa-rails-copilot/skills/ops-deploy/SKILL.md +153 -0
- package/plugins/lisa-rails-copilot/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-rails-copilot/skills/ops-verify-jobs/SKILL.md +157 -0
- package/plugins/lisa-rails-copilot/skills/ops-verify-telemetry/SKILL.md +197 -0
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +28 -0
- package/plugins/lisa-rails-cursor/agents/ops-specialist.md +226 -0
- package/plugins/lisa-rails-cursor/commands/e2e-coverage-gaps.md +7 -0
- package/plugins/lisa-rails-cursor/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-rails-cursor/commands/fix/linter-error.md +7 -0
- package/plugins/lisa-rails-cursor/commands/improve/code-complexity.md +6 -0
- package/plugins/lisa-rails-cursor/commands/improve/max-lines-per-function.md +7 -0
- package/plugins/lisa-rails-cursor/commands/improve/max-lines.md +7 -0
- package/plugins/lisa-rails-cursor/commands/improve/test-coverage.md +7 -0
- package/plugins/lisa-rails-cursor/hooks/rubocop-on-edit.sh +78 -0
- package/plugins/lisa-rails-cursor/hooks/sg-scan-on-edit.sh +74 -0
- package/plugins/lisa-rails-cursor/rules/rails-conventions.md +176 -0
- package/plugins/lisa-rails-cursor/skills/action-controller-best-practices/SKILL.md +374 -0
- package/plugins/lisa-rails-cursor/skills/action-view-best-practices/SKILL.md +335 -0
- package/plugins/lisa-rails-cursor/skills/active-record-model-best-practices/SKILL.md +166 -0
- package/plugins/lisa-rails-cursor/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-rails-cursor/skills/exploratory-qa/SKILL.md +145 -0
- package/plugins/lisa-rails-cursor/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-rails-cursor/skills/improve-code-complexity/SKILL.md +48 -0
- package/plugins/lisa-rails-cursor/skills/improve-max-lines/SKILL.md +46 -0
- package/plugins/lisa-rails-cursor/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-rails-cursor/skills/improve-test-coverage/SKILL.md +45 -0
- package/plugins/lisa-rails-cursor/skills/jira-add-journey/SKILL.md +65 -0
- package/plugins/lisa-rails-cursor/skills/jira-create/SKILL.md +100 -0
- package/plugins/lisa-rails-cursor/skills/jira-evidence/SKILL.md +70 -0
- package/plugins/lisa-rails-cursor/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-rails-cursor/skills/jira-journey/SKILL.md +64 -0
- package/plugins/lisa-rails-cursor/skills/jira-verify/SKILL.md +26 -0
- package/plugins/lisa-rails-cursor/skills/ops-check-logs/SKILL.md +191 -0
- package/plugins/lisa-rails-cursor/skills/ops-deploy/SKILL.md +153 -0
- package/plugins/lisa-rails-cursor/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-rails-cursor/skills/ops-verify-jobs/SKILL.md +157 -0
- package/plugins/lisa-rails-cursor/skills/ops-verify-telemetry/SKILL.md +197 -0
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +11 -0
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +43 -0
- package/plugins/lisa-typescript-copilot/hooks/block-suppress-directives.sh +73 -0
- package/plugins/lisa-typescript-copilot/hooks/format-on-edit.sh +79 -0
- package/plugins/lisa-typescript-copilot/hooks/lint-on-edit.sh +134 -0
- package/plugins/lisa-typescript-copilot/hooks/sg-scan-on-edit.sh +71 -0
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +43 -0
- package/plugins/lisa-typescript-cursor/hooks/block-suppress-directives.sh +73 -0
- package/plugins/lisa-typescript-cursor/hooks/format-on-edit.sh +79 -0
- package/plugins/lisa-typescript-cursor/hooks/lint-on-edit.sh +134 -0
- package/plugins/lisa-typescript-cursor/hooks/sg-scan-on-edit.sh +71 -0
- 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/ci/lisa-wiki-validate.yml +33 -0
- package/plugins/lisa-wiki-agy/commands/add-ingest.md +6 -0
- package/plugins/lisa-wiki-agy/commands/add-role.md +6 -0
- package/plugins/lisa-wiki-agy/commands/doctor.md +6 -0
- package/plugins/lisa-wiki-agy/commands/ingest.md +6 -0
- package/plugins/lisa-wiki-agy/commands/lint.md +6 -0
- package/plugins/lisa-wiki-agy/commands/migrate.md +6 -0
- package/plugins/lisa-wiki-agy/commands/onboard-me.md +6 -0
- package/plugins/lisa-wiki-agy/commands/query.md +6 -0
- package/plugins/lisa-wiki-agy/commands/setup/wiki.md +6 -0
- package/plugins/lisa-wiki-agy/commands/setup-automations.md +6 -0
- package/plugins/lisa-wiki-agy/commands/setup.md +6 -0
- package/plugins/lisa-wiki-agy/commands/status.md +6 -0
- package/plugins/lisa-wiki-agy/commands/tear-down-automations.md +6 -0
- package/plugins/lisa-wiki-agy/plugin.json +8 -0
- package/plugins/lisa-wiki-agy/schema/lisa-wiki-config.schema.json +118 -0
- package/plugins/lisa-wiki-agy/schema/wiki-structure.schema.json +51 -0
- package/plugins/lisa-wiki-agy/scripts/_wiki-lib.mjs +185 -0
- package/plugins/lisa-wiki-agy/scripts/diff-guard.mjs +116 -0
- package/plugins/lisa-wiki-agy/scripts/ensure-gitignore.mjs +131 -0
- package/plugins/lisa-wiki-agy/scripts/ingest-git.mjs +189 -0
- package/plugins/lisa-wiki-agy/scripts/ingest-memory.mjs +130 -0
- package/plugins/lisa-wiki-agy/scripts/ingest-roles.mjs +85 -0
- package/plugins/lisa-wiki-agy/scripts/ingest_slack_channel.py +329 -0
- package/plugins/lisa-wiki-agy/scripts/lint-wiki.mjs +324 -0
- package/plugins/lisa-wiki-agy/scripts/mcp-doctor.mjs +72 -0
- package/plugins/lisa-wiki-agy/scripts/render-contract.mjs +107 -0
- package/plugins/lisa-wiki-agy/scripts/rewrite-refs.mjs +144 -0
- package/plugins/lisa-wiki-agy/scripts/slack_oauth_user.py +179 -0
- package/plugins/lisa-wiki-agy/scripts/validate-config.mjs +232 -0
- package/plugins/lisa-wiki-agy/scripts/verify-migration.mjs +199 -0
- package/plugins/lisa-wiki-agy/scripts/wiki-status.mjs +345 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-add-ingest/SKILL.md +34 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-add-role/SKILL.md +30 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-confluence/SKILL.md +25 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-docs/SKILL.md +30 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-git/SKILL.md +25 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-jira/SKILL.md +28 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-memory/SKILL.md +28 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-notion/SKILL.md +25 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-roles/SKILL.md +22 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-slack/SKILL.md +30 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-connector-web/SKILL.md +23 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-doctor/SKILL.md +47 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-ingest/SKILL.md +72 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-lint/SKILL.md +32 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-migrate/SKILL.md +43 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-onboard-me/SKILL.md +33 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-query/SKILL.md +30 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-setup/SKILL.md +75 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-setup-automations/SKILL.md +80 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-status/SKILL.md +47 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-wiki-agy/skills/lisa-wiki-usage/SKILL.md +50 -0
- package/plugins/lisa-wiki-agy/templates/agents/role-agent.claude.md +16 -0
- package/plugins/lisa-wiki-agy/templates/agents/role-agent.codex.toml +15 -0
- package/plugins/lisa-wiki-agy/templates/index.md +17 -0
- package/plugins/lisa-wiki-agy/templates/llm-wiki-contract.md +72 -0
- package/plugins/lisa-wiki-agy/templates/log.md +8 -0
- package/plugins/lisa-wiki-agy/templates/page-types/architecture.md +18 -0
- package/plugins/lisa-wiki-agy/templates/page-types/concept.md +18 -0
- package/plugins/lisa-wiki-agy/templates/page-types/decision.md +18 -0
- package/plugins/lisa-wiki-agy/templates/page-types/entity.md +19 -0
- package/plugins/lisa-wiki-agy/templates/page-types/open-question.md +18 -0
- package/plugins/lisa-wiki-agy/templates/page-types/playbook.md +18 -0
- package/plugins/lisa-wiki-agy/templates/page-types/project.md +19 -0
- package/plugins/lisa-wiki-agy/templates/page-types/requirement.md +19 -0
- package/plugins/lisa-wiki-agy/templates/page-types/staff.md +26 -0
- package/plugins/lisa-wiki-agy/templates/start-here.md +24 -0
- package/plugins/lisa-wiki-agy/templates/state-readme.md +20 -0
- package/plugins/lisa-wiki-agy/templates/wrapper-gitignore.txt +19 -0
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-wiki-copilot/ci/lisa-wiki-validate.yml +33 -0
- package/plugins/lisa-wiki-copilot/commands/add-ingest.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/add-role.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/doctor.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/ingest.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/lint.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/migrate.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/onboard-me.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/query.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/setup/wiki.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/setup-automations.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/setup.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/status.md +6 -0
- package/plugins/lisa-wiki-copilot/commands/tear-down-automations.md +6 -0
- package/plugins/lisa-wiki-copilot/schema/lisa-wiki-config.schema.json +118 -0
- package/plugins/lisa-wiki-copilot/schema/wiki-structure.schema.json +51 -0
- package/plugins/lisa-wiki-copilot/scripts/_wiki-lib.mjs +185 -0
- package/plugins/lisa-wiki-copilot/scripts/diff-guard.mjs +116 -0
- package/plugins/lisa-wiki-copilot/scripts/ensure-gitignore.mjs +131 -0
- package/plugins/lisa-wiki-copilot/scripts/ingest-git.mjs +189 -0
- package/plugins/lisa-wiki-copilot/scripts/ingest-memory.mjs +130 -0
- package/plugins/lisa-wiki-copilot/scripts/ingest-roles.mjs +85 -0
- package/plugins/lisa-wiki-copilot/scripts/ingest_slack_channel.py +329 -0
- package/plugins/lisa-wiki-copilot/scripts/lint-wiki.mjs +324 -0
- package/plugins/lisa-wiki-copilot/scripts/mcp-doctor.mjs +72 -0
- package/plugins/lisa-wiki-copilot/scripts/render-contract.mjs +107 -0
- package/plugins/lisa-wiki-copilot/scripts/rewrite-refs.mjs +144 -0
- package/plugins/lisa-wiki-copilot/scripts/slack_oauth_user.py +179 -0
- package/plugins/lisa-wiki-copilot/scripts/validate-config.mjs +232 -0
- package/plugins/lisa-wiki-copilot/scripts/verify-migration.mjs +199 -0
- package/plugins/lisa-wiki-copilot/scripts/wiki-status.mjs +345 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-add-ingest/SKILL.md +34 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-add-role/SKILL.md +30 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-confluence/SKILL.md +25 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-docs/SKILL.md +30 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-git/SKILL.md +25 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-jira/SKILL.md +28 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-memory/SKILL.md +28 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-notion/SKILL.md +25 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-roles/SKILL.md +22 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-slack/SKILL.md +30 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-connector-web/SKILL.md +23 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-doctor/SKILL.md +47 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-ingest/SKILL.md +72 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-lint/SKILL.md +32 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-migrate/SKILL.md +43 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-onboard-me/SKILL.md +33 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-query/SKILL.md +30 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-setup/SKILL.md +75 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-setup-automations/SKILL.md +80 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-status/SKILL.md +47 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-wiki-copilot/skills/lisa-wiki-usage/SKILL.md +50 -0
- package/plugins/lisa-wiki-copilot/templates/agents/role-agent.claude.md +16 -0
- package/plugins/lisa-wiki-copilot/templates/agents/role-agent.codex.toml +15 -0
- package/plugins/lisa-wiki-copilot/templates/index.md +17 -0
- package/plugins/lisa-wiki-copilot/templates/llm-wiki-contract.md +72 -0
- package/plugins/lisa-wiki-copilot/templates/log.md +8 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/architecture.md +18 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/concept.md +18 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/decision.md +18 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/entity.md +19 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/open-question.md +18 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/playbook.md +18 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/project.md +19 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/requirement.md +19 -0
- package/plugins/lisa-wiki-copilot/templates/page-types/staff.md +26 -0
- package/plugins/lisa-wiki-copilot/templates/start-here.md +24 -0
- package/plugins/lisa-wiki-copilot/templates/state-readme.md +20 -0
- package/plugins/lisa-wiki-copilot/templates/wrapper-gitignore.txt +19 -0
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-wiki-cursor/ci/lisa-wiki-validate.yml +33 -0
- package/plugins/lisa-wiki-cursor/commands/add-ingest.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/add-role.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/doctor.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/ingest.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/lint.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/migrate.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/onboard-me.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/query.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/setup/wiki.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/setup-automations.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/setup.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/status.md +6 -0
- package/plugins/lisa-wiki-cursor/commands/tear-down-automations.md +6 -0
- package/plugins/lisa-wiki-cursor/schema/lisa-wiki-config.schema.json +118 -0
- package/plugins/lisa-wiki-cursor/schema/wiki-structure.schema.json +51 -0
- package/plugins/lisa-wiki-cursor/scripts/_wiki-lib.mjs +185 -0
- package/plugins/lisa-wiki-cursor/scripts/diff-guard.mjs +116 -0
- package/plugins/lisa-wiki-cursor/scripts/ensure-gitignore.mjs +131 -0
- package/plugins/lisa-wiki-cursor/scripts/ingest-git.mjs +189 -0
- package/plugins/lisa-wiki-cursor/scripts/ingest-memory.mjs +130 -0
- package/plugins/lisa-wiki-cursor/scripts/ingest-roles.mjs +85 -0
- package/plugins/lisa-wiki-cursor/scripts/ingest_slack_channel.py +329 -0
- package/plugins/lisa-wiki-cursor/scripts/lint-wiki.mjs +324 -0
- package/plugins/lisa-wiki-cursor/scripts/mcp-doctor.mjs +72 -0
- package/plugins/lisa-wiki-cursor/scripts/render-contract.mjs +107 -0
- package/plugins/lisa-wiki-cursor/scripts/rewrite-refs.mjs +144 -0
- package/plugins/lisa-wiki-cursor/scripts/slack_oauth_user.py +179 -0
- package/plugins/lisa-wiki-cursor/scripts/validate-config.mjs +232 -0
- package/plugins/lisa-wiki-cursor/scripts/verify-migration.mjs +199 -0
- package/plugins/lisa-wiki-cursor/scripts/wiki-status.mjs +345 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-add-ingest/SKILL.md +34 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-add-role/SKILL.md +30 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-confluence/SKILL.md +25 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-docs/SKILL.md +30 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-git/SKILL.md +25 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-jira/SKILL.md +28 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-memory/SKILL.md +28 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-notion/SKILL.md +25 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-roles/SKILL.md +22 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-slack/SKILL.md +30 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-connector-web/SKILL.md +23 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-doctor/SKILL.md +47 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-ingest/SKILL.md +72 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-lint/SKILL.md +32 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-migrate/SKILL.md +43 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-onboard-me/SKILL.md +33 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-query/SKILL.md +30 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-setup/SKILL.md +75 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-setup-automations/SKILL.md +80 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-status/SKILL.md +47 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-wiki-cursor/skills/lisa-wiki-usage/SKILL.md +50 -0
- package/plugins/lisa-wiki-cursor/templates/agents/role-agent.claude.md +16 -0
- package/plugins/lisa-wiki-cursor/templates/agents/role-agent.codex.toml +15 -0
- package/plugins/lisa-wiki-cursor/templates/index.md +17 -0
- package/plugins/lisa-wiki-cursor/templates/llm-wiki-contract.md +72 -0
- package/plugins/lisa-wiki-cursor/templates/log.md +8 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/architecture.md +18 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/concept.md +18 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/decision.md +18 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/entity.md +19 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/open-question.md +18 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/playbook.md +18 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/project.md +19 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/requirement.md +19 -0
- package/plugins/lisa-wiki-cursor/templates/page-types/staff.md +26 -0
- package/plugins/lisa-wiki-cursor/templates/start-here.md +24 -0
- package/plugins/lisa-wiki-cursor/templates/state-readme.md +20 -0
- package/plugins/lisa-wiki-cursor/templates/wrapper-gitignore.txt +19 -0
- package/plugins/src/expo/skills/directory-structure/SKILL.md +32 -20
- package/plugins/src/expo/skills/directory-structure/scripts/validate_structure.py +15 -6
- package/scripts/build-plugins.sh +28 -11
- package/typescript/copy-overwrite/.prettierignore +1 -0
- package/typescript/copy-overwrite/eslint.ignore.config.json +2 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: action-view-best-practices
|
|
3
|
+
description: Build or Refactor Rails views, partials, and templates into clean, maintainable code. Use when views have inline Ruby logic, deeply nested partials, jQuery or legacy JavaScript, helper methods returning HTML, or when the user asks to modernize, refactor, or clean up Rails views. Applies patterns - Turbo Frames, Turbo Streams, Stimulus controllers, ViewComponent, presenters, strict locals, and proper partial extraction.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Rails View Refactoring
|
|
7
|
+
|
|
8
|
+
Views should contain markup and minimal display logic. If a view has conditionals, calculations, query calls, or complex Ruby blocks, it needs refactoring. The modern Rails 8+ stack uses Hotwire (Turbo + Stimulus) for interactivity, Propshaft for assets, and Importmap for JavaScript — no build step required.
|
|
9
|
+
|
|
10
|
+
## Decision Framework
|
|
11
|
+
|
|
12
|
+
Read the view and classify each block of code:
|
|
13
|
+
|
|
14
|
+
| Code type | Extract to | Location |
|
|
15
|
+
| ------------------------------------------------------- | ------------------------------- | ------------------------------------------ |
|
|
16
|
+
| Reusable UI patterns (buttons, cards, modals, badges) | ViewComponent | `app/components/` |
|
|
17
|
+
| Display logic (formatting, conditional CSS, label text) | Presenter or ViewComponent | `app/presenters/` or `app/components/` |
|
|
18
|
+
| HTML-returning helper methods | ViewComponent | `app/components/` |
|
|
19
|
+
| Inline `<script>` tags and jQuery | Stimulus controller | `app/javascript/controllers/` |
|
|
20
|
+
| AJAX calls, remote forms, `$.ajax` | Turbo Frame or Turbo Stream | ERB template + controller response |
|
|
21
|
+
| Partial page updates via JavaScript | Turbo Frame | Wrap in `turbo_frame_tag` |
|
|
22
|
+
| Real-time broadcasts (chat, notifications) | Turbo Stream | Model `broadcasts_to` or controller stream |
|
|
23
|
+
| One-off page sections that are too long | Partial with strict locals | `app/views/shared/` or alongside view |
|
|
24
|
+
| Complex data assembly for the view | Presenter | `app/presenters/` |
|
|
25
|
+
| Repeated inline Ruby (loops with logic) | Collection partial or component | Partial or component |
|
|
26
|
+
| Instance variables used across partials | Locals / strict locals | Pass explicitly |
|
|
27
|
+
|
|
28
|
+
## Modernizing to Hotwire
|
|
29
|
+
|
|
30
|
+
### Replace jQuery AJAX with Turbo Frames
|
|
31
|
+
|
|
32
|
+
Turbo Frames update a specific section of the page without a full reload. No JavaScript needed.
|
|
33
|
+
|
|
34
|
+
```erb
|
|
35
|
+
<%# Before — jQuery AJAX %>
|
|
36
|
+
<div id="player-stats"></div>
|
|
37
|
+
<script>
|
|
38
|
+
$.get('/players/<%= @player.id %>/stats', function(data) {
|
|
39
|
+
$('#player-stats').html(data);
|
|
40
|
+
});
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<%# After — Turbo Frame %>
|
|
44
|
+
<%= turbo_frame_tag "player_stats" do %>
|
|
45
|
+
<%= render partial: "players/stats", locals: { player: @player } %>
|
|
46
|
+
<% end %>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The linked page just needs a matching `turbo_frame_tag` with the same ID and Turbo handles the rest.
|
|
50
|
+
|
|
51
|
+
### Replace Remote Forms with Turbo
|
|
52
|
+
|
|
53
|
+
Rails UJS `remote: true` forms are deprecated. Turbo handles forms natively.
|
|
54
|
+
|
|
55
|
+
```erb
|
|
56
|
+
<%# Before — Rails UJS %>
|
|
57
|
+
<%= form_with model: @player, remote: true do |f| %>
|
|
58
|
+
...
|
|
59
|
+
<% end %>
|
|
60
|
+
|
|
61
|
+
<%# After — Turbo (just remove remote: true, Turbo handles it) %>
|
|
62
|
+
<%= form_with model: @player do |f| %>
|
|
63
|
+
...
|
|
64
|
+
<% end %>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Turbo intercepts all form submissions by default. For partial updates, wrap the form in a `turbo_frame_tag`. For multi-target updates, respond with a Turbo Stream:
|
|
68
|
+
|
|
69
|
+
```erb
|
|
70
|
+
<%# app/views/players/update.turbo_stream.erb %>
|
|
71
|
+
<%= turbo_stream.replace "player_header" do %>
|
|
72
|
+
<%= render partial: "players/header", locals: { player: @player } %>
|
|
73
|
+
<% end %>
|
|
74
|
+
|
|
75
|
+
<%= turbo_stream.update "flash_messages" do %>
|
|
76
|
+
<%= render partial: "shared/flash" %>
|
|
77
|
+
<% end %>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Replace Inline JavaScript with Stimulus
|
|
81
|
+
|
|
82
|
+
Any behavior attached to DOM elements (toggles, dropdowns, form validation, clipboard, modals) should be a Stimulus controller.
|
|
83
|
+
|
|
84
|
+
```erb
|
|
85
|
+
<%# Before — inline JS / jQuery %>
|
|
86
|
+
<button onclick="document.getElementById('details').classList.toggle('hidden')">
|
|
87
|
+
Toggle
|
|
88
|
+
</button>
|
|
89
|
+
<div id="details" class="hidden">...</div>
|
|
90
|
+
|
|
91
|
+
<%# After — Stimulus %>
|
|
92
|
+
<div data-controller="toggle">
|
|
93
|
+
<button data-action="click->toggle#switch">Toggle</button>
|
|
94
|
+
<div data-toggle-target="content" class="hidden">...</div>
|
|
95
|
+
</div>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
// app/javascript/controllers/toggle_controller.js
|
|
100
|
+
import { Controller } from "@hotwired/stimulus";
|
|
101
|
+
|
|
102
|
+
export default class extends Controller {
|
|
103
|
+
static targets = ["content"];
|
|
104
|
+
|
|
105
|
+
switch() {
|
|
106
|
+
this.contentTarget.classList.toggle("hidden");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Conventions:
|
|
112
|
+
|
|
113
|
+
- One behavior per controller — keep them small and composable
|
|
114
|
+
- Name controllers after what they do: `toggle`, `clipboard`, `dropdown`, `search-form`
|
|
115
|
+
- Use `targets` for elements, `values` for data, `classes` for CSS class names
|
|
116
|
+
- Never manipulate DOM outside the controller's element scope
|
|
117
|
+
|
|
118
|
+
### Replace Polling with Turbo Streams
|
|
119
|
+
|
|
120
|
+
For real-time updates, use Turbo Streams over WebSockets instead of JavaScript polling.
|
|
121
|
+
|
|
122
|
+
```ruby
|
|
123
|
+
# app/models/score.rb
|
|
124
|
+
class Score < ApplicationRecord
|
|
125
|
+
broadcasts_to ->(score) { [score.game] }, inserts_by: :prepend
|
|
126
|
+
end
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
```erb
|
|
130
|
+
<%# Subscribe in the view %>
|
|
131
|
+
<%= turbo_stream_from @game %>
|
|
132
|
+
|
|
133
|
+
<div id="scores">
|
|
134
|
+
<%= render @game.scores %>
|
|
135
|
+
</div>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
New scores automatically appear without any JavaScript.
|
|
139
|
+
|
|
140
|
+
## View Component Patterns
|
|
141
|
+
|
|
142
|
+
### When to Use ViewComponent vs Partials
|
|
143
|
+
|
|
144
|
+
Use **partials** for:
|
|
145
|
+
|
|
146
|
+
- One-off page sections that won't be reused
|
|
147
|
+
- Simple markup extraction to reduce file length
|
|
148
|
+
- Layouts and structural wrappers
|
|
149
|
+
|
|
150
|
+
Use **ViewComponent** for:
|
|
151
|
+
|
|
152
|
+
- Reusable UI elements (buttons, cards, badges, modals, alerts)
|
|
153
|
+
- Components with display logic or multiple variants
|
|
154
|
+
- Anything you'd want to unit test in isolation
|
|
155
|
+
- Complex components with slots for flexible content injection
|
|
156
|
+
|
|
157
|
+
### ViewComponent Example
|
|
158
|
+
|
|
159
|
+
```ruby
|
|
160
|
+
# app/components/stat_card_component.rb
|
|
161
|
+
class StatCardComponent < ViewComponent::Base
|
|
162
|
+
def initialize(label:, value:, trend: nil)
|
|
163
|
+
@label = label
|
|
164
|
+
@value = value
|
|
165
|
+
@trend = trend
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def trend_class
|
|
169
|
+
case @trend
|
|
170
|
+
when :up then "text-green-600"
|
|
171
|
+
when :down then "text-red-600"
|
|
172
|
+
else "text-gray-500"
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```erb
|
|
179
|
+
<%# app/components/stat_card_component.html.erb %>
|
|
180
|
+
<div class="rounded-lg border p-4">
|
|
181
|
+
<dt class="text-sm text-gray-500"><%= @label %></dt>
|
|
182
|
+
<dd class="text-2xl font-semibold"><%= @value %></dd>
|
|
183
|
+
<% if @trend %>
|
|
184
|
+
<span class="<%= trend_class %>"><%= @trend == :up ? "↑" : "↓" %></span>
|
|
185
|
+
<% end %>
|
|
186
|
+
</div>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```erb
|
|
190
|
+
<%# Usage %>
|
|
191
|
+
<%= render StatCardComponent.new(label: "Batting Avg", value: ".312", trend: :up) %>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Partial Best Practices
|
|
195
|
+
|
|
196
|
+
### Use Strict Locals
|
|
197
|
+
|
|
198
|
+
Always declare expected locals at the top of partials. This was added in Rails 7.1 and prevents silent nil bugs.
|
|
199
|
+
|
|
200
|
+
```erb
|
|
201
|
+
<%# app/views/players/_card.html.erb %>
|
|
202
|
+
<%# locals: (player:, show_stats: false) %>
|
|
203
|
+
|
|
204
|
+
<div class="player-card">
|
|
205
|
+
<h3><%= player.name %></h3>
|
|
206
|
+
<% if show_stats %>
|
|
207
|
+
<%= render partial: "players/stats", locals: { player: player } %>
|
|
208
|
+
<% end %>
|
|
209
|
+
</div>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Use Collection Rendering
|
|
213
|
+
|
|
214
|
+
Never loop and render partials manually.
|
|
215
|
+
|
|
216
|
+
```erb
|
|
217
|
+
<%# Before — slow, verbose %>
|
|
218
|
+
<% @players.each do |player| %>
|
|
219
|
+
<%= render partial: "players/card", locals: { player: player } %>
|
|
220
|
+
<% end %>
|
|
221
|
+
|
|
222
|
+
<%# After — collection rendering (faster, cleaner) %>
|
|
223
|
+
<%= render partial: "players/card", collection: @players, as: :player %>
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Avoid Deeply Nested Partials
|
|
227
|
+
|
|
228
|
+
If partial A renders partial B which renders partial C, it's too deep. Flatten the structure or extract to a ViewComponent that composes its own sub-components.
|
|
229
|
+
|
|
230
|
+
## Presenters for Complex View Logic
|
|
231
|
+
|
|
232
|
+
When a view needs data from multiple sources or complex formatting, use a presenter instead of cramming logic into the template.
|
|
233
|
+
|
|
234
|
+
```ruby
|
|
235
|
+
# app/presenters/player_profile_presenter.rb
|
|
236
|
+
class PlayerProfilePresenter
|
|
237
|
+
def initialize(player, current_user)
|
|
238
|
+
@player = player
|
|
239
|
+
@current_user = current_user
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def display_name
|
|
243
|
+
"#{@player.first_name} #{@player.last_name}"
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def contract_status_badge
|
|
247
|
+
if @player.free_agent?
|
|
248
|
+
{ text: "Free Agent", color: "green" }
|
|
249
|
+
elsif @player.contract_years_remaining <= 1
|
|
250
|
+
{ text: "Expiring", color: "yellow" }
|
|
251
|
+
else
|
|
252
|
+
{ text: "Under Contract", color: "gray" }
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def can_edit?
|
|
257
|
+
@current_user.admin? || @current_user.team == @player.team
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def formatted_salary
|
|
261
|
+
ActiveSupport::NumberHelper.number_to_currency(@player.salary)
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
```erb
|
|
267
|
+
<%# Clean view %>
|
|
268
|
+
<h1><%= @presenter.display_name %></h1>
|
|
269
|
+
|
|
270
|
+
<% badge = @presenter.contract_status_badge %>
|
|
271
|
+
<%= render BadgeComponent.new(text: badge[:text], color: badge[:color]) %>
|
|
272
|
+
|
|
273
|
+
<%= @presenter.formatted_salary %>
|
|
274
|
+
|
|
275
|
+
<% if @presenter.can_edit? %>
|
|
276
|
+
<%= link_to "Edit", edit_player_path(@player) %>
|
|
277
|
+
<% end %>
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Eliminating Helper Abuse
|
|
281
|
+
|
|
282
|
+
Rails helpers that return HTML are hard to test, hard to read, and hard to compose. Move them to ViewComponents.
|
|
283
|
+
|
|
284
|
+
```ruby
|
|
285
|
+
# Before — helper returning HTML (bad)
|
|
286
|
+
module PlayersHelper
|
|
287
|
+
def player_avatar(player, size: :md)
|
|
288
|
+
sizes = { sm: "w-8 h-8", md: "w-12 h-12", lg: "w-16 h-16" }
|
|
289
|
+
if player.avatar.attached?
|
|
290
|
+
image_tag player.avatar, class: "rounded-full #{sizes[size]}"
|
|
291
|
+
else
|
|
292
|
+
content_tag :div, player.initials,
|
|
293
|
+
class: "rounded-full #{sizes[size]} bg-gray-300 flex items-center justify-center"
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
# After — ViewComponent (good)
|
|
299
|
+
# app/components/avatar_component.rb
|
|
300
|
+
class AvatarComponent < ViewComponent::Base
|
|
301
|
+
SIZES = { sm: "w-8 h-8", md: "w-12 h-12", lg: "w-16 h-16" }.freeze
|
|
302
|
+
|
|
303
|
+
def initialize(player:, size: :md)
|
|
304
|
+
@player = player
|
|
305
|
+
@size = size
|
|
306
|
+
end
|
|
307
|
+
# ... with its own template and tests
|
|
308
|
+
end
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Keep helpers for non-HTML formatting utilities only (number formatting, date formatting, text truncation).
|
|
312
|
+
|
|
313
|
+
## Refactoring Process
|
|
314
|
+
|
|
315
|
+
1. **Audit the view layer** — identify inline Ruby logic, jQuery, `remote: true` forms, helpers returning HTML, and deeply nested partials.
|
|
316
|
+
2. **Remove jQuery and inline JS first** — replace with Stimulus controllers. This is the highest-impact change.
|
|
317
|
+
3. **Replace `remote: true` and AJAX** — Turbo handles forms and links natively. Convert to Turbo Frames and Turbo Streams.
|
|
318
|
+
4. **Add strict locals** to all existing partials.
|
|
319
|
+
5. **Extract reusable UI patterns** into ViewComponents.
|
|
320
|
+
6. **Move display logic** from views into presenters or component classes.
|
|
321
|
+
7. **Move HTML-returning helpers** into components.
|
|
322
|
+
8. **Flatten nested partials** — if nesting is deeper than 2 levels, restructure.
|
|
323
|
+
9. **Add collection rendering** wherever loops render partials.
|
|
324
|
+
10. **Remove all instance variables from partials** — pass data via locals only.
|
|
325
|
+
|
|
326
|
+
## What NOT to Do
|
|
327
|
+
|
|
328
|
+
- Don't put query calls in views — ever. Not even `count` or `any?`. Use the presenter or controller.
|
|
329
|
+
- Don't use `content_for` for complex logic — it creates invisible dependencies between layouts and views.
|
|
330
|
+
- Don't create Stimulus controllers that replicate what Turbo Frames already handle.
|
|
331
|
+
- Don't mix jQuery and Stimulus in the same app — commit to full migration.
|
|
332
|
+
- Don't render entire pages as ViewComponents — they are for reusable pieces, not whole pages.
|
|
333
|
+
- Don't use `html_safe` or `raw` unless you are certain the content is sanitized.
|
|
334
|
+
- Don't pass more than 3-4 locals to a partial — if you need more, it should be a component or presenter.
|
|
335
|
+
- Don't use `render partial:` inside loops — use collection rendering instead.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: active-record-model-best-practices
|
|
3
|
+
description: Best practices for Ruby on Rails models, splitting code into well-organized, maintainable code. Use when a model exceeds ~100 lines, has mixed responsibilities, or when the user asks to refactor, extract, clean up, or organize a Rails model. Applies patterns: concerns, service objects, query objects, form objects, and value objects.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Rails Model Refactoring
|
|
7
|
+
|
|
8
|
+
When refactoring a Rails model, analyze the file and extract code into the appropriate pattern based on what the code does. The model itself should only contain associations, enums, basic validations, and concern includes.
|
|
9
|
+
|
|
10
|
+
## Decision Framework
|
|
11
|
+
|
|
12
|
+
Read the model file and classify each block of code:
|
|
13
|
+
|
|
14
|
+
| Code type | Extract to | Location |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| Related scopes + simple methods sharing a theme | Concern | `app/models/concerns/` |
|
|
17
|
+
| Business logic, multi-step operations, callbacks with side effects | Service object | `app/services/` |
|
|
18
|
+
| Complex queries, multi-join scopes, reporting queries | Query object | `app/queries/` |
|
|
19
|
+
| Context-specific validations (e.g. registration vs admin update) | Form object | `app/forms/` |
|
|
20
|
+
| Domain concepts beyond a primitive (money, coordinates, scores) | Value object | `app/models/` |
|
|
21
|
+
| Associations, enums, core validations, simple scopes | Keep on model | — |
|
|
22
|
+
|
|
23
|
+
## Patterns
|
|
24
|
+
|
|
25
|
+
### Concerns
|
|
26
|
+
|
|
27
|
+
Use for grouping related scopes, validations, callbacks, and simple instance methods that share a single theme. Name the concern after the capability it provides.
|
|
28
|
+
|
|
29
|
+
```ruby
|
|
30
|
+
# app/models/concerns/searchable.rb
|
|
31
|
+
module Searchable
|
|
32
|
+
extend ActiveSupport::Concern
|
|
33
|
+
|
|
34
|
+
included do
|
|
35
|
+
scope :search, ->(query) { where("name ILIKE ?", "%#{query}%") }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def matching_terms(query)
|
|
39
|
+
name.scan(/#{Regexp.escape(query)}/i)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Service Objects
|
|
45
|
+
|
|
46
|
+
Use for business logic, orchestration of multiple models, and anything triggered by a user action that involves more than a simple CRUD operation. Follow the single-responsibility principle — one service, one operation.
|
|
47
|
+
|
|
48
|
+
```ruby
|
|
49
|
+
# app/services/players/calculate_stats.rb
|
|
50
|
+
module Players
|
|
51
|
+
class CalculateStats
|
|
52
|
+
def initialize(player)
|
|
53
|
+
@player = player
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def call
|
|
57
|
+
# complex logic here
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Conventions:
|
|
64
|
+
- Namespace under the model name: `Players::CalculateStats`
|
|
65
|
+
- Single public method: `call`
|
|
66
|
+
- Accept dependencies via `initialize`
|
|
67
|
+
- Return a result or raise a domain-specific error
|
|
68
|
+
|
|
69
|
+
### Query Objects
|
|
70
|
+
|
|
71
|
+
Use for complex database queries that involve joins, subqueries, CTEs, or multi-condition filtering that would clutter a model with scopes.
|
|
72
|
+
|
|
73
|
+
```ruby
|
|
74
|
+
# app/queries/players/free_agent_query.rb
|
|
75
|
+
module Players
|
|
76
|
+
class FreeAgentQuery
|
|
77
|
+
def initialize(relation = Player.all)
|
|
78
|
+
@relation = relation
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def call(filters = {})
|
|
82
|
+
@relation
|
|
83
|
+
.where(contract_status: :expired)
|
|
84
|
+
.where("age < ?", filters[:max_age])
|
|
85
|
+
.joins(:stats)
|
|
86
|
+
.order(war: :desc)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Conventions:
|
|
93
|
+
- Accept a base relation in `initialize` (default to `Model.all`)
|
|
94
|
+
- Return an ActiveRecord relation so it remains chainable
|
|
95
|
+
- Single public method: `call`
|
|
96
|
+
|
|
97
|
+
### Form Objects
|
|
98
|
+
|
|
99
|
+
Use when validations only apply in specific contexts, or when a form spans multiple models.
|
|
100
|
+
|
|
101
|
+
```ruby
|
|
102
|
+
# app/forms/player_registration_form.rb
|
|
103
|
+
class PlayerRegistrationForm
|
|
104
|
+
include ActiveModel::Model
|
|
105
|
+
include ActiveModel::Attributes
|
|
106
|
+
|
|
107
|
+
attribute :name, :string
|
|
108
|
+
attribute :email, :string
|
|
109
|
+
attribute :team_id, :integer
|
|
110
|
+
attribute :position, :string
|
|
111
|
+
|
|
112
|
+
validates :name, :email, :position, presence: true
|
|
113
|
+
validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
|
|
114
|
+
|
|
115
|
+
def save
|
|
116
|
+
return false unless valid?
|
|
117
|
+
Player.create!(attributes)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Value Objects
|
|
123
|
+
|
|
124
|
+
Use for domain concepts that deserve their own identity beyond a raw primitive.
|
|
125
|
+
|
|
126
|
+
```ruby
|
|
127
|
+
# app/models/batting_average.rb
|
|
128
|
+
class BattingAverage
|
|
129
|
+
include Comparable
|
|
130
|
+
|
|
131
|
+
def initialize(hits, at_bats)
|
|
132
|
+
@hits = hits
|
|
133
|
+
@at_bats = at_bats
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def value
|
|
137
|
+
return 0.0 if @at_bats.zero?
|
|
138
|
+
(@hits.to_f / @at_bats).round(3)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def elite?
|
|
142
|
+
value >= 0.300
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def <=>(other)
|
|
146
|
+
value <=> other.value
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Refactoring Process
|
|
152
|
+
|
|
153
|
+
1. **Read the entire model** and identify every method, scope, callback, and validation.
|
|
154
|
+
2. **Classify each block** using the decision framework table above.
|
|
155
|
+
3. **Extract in order**: value objects first, then query objects, then service objects, then concerns. Do concerns last because some may become unnecessary after other extractions.
|
|
156
|
+
4. **Update the model** to include concerns and delegate to new objects.
|
|
157
|
+
5. **Verify** that the slimmed-down model only contains: associations, enums, core validations, and concern includes.
|
|
158
|
+
6. **Create or update tests** for each extracted class. Each new class gets its own spec file mirroring the source path.
|
|
159
|
+
|
|
160
|
+
## What NOT to Do
|
|
161
|
+
|
|
162
|
+
- Don't extract everything — simple one-line scopes and basic validations belong on the model.
|
|
163
|
+
- Don't create a class for trivial logic just to hit a line count target.
|
|
164
|
+
- Don't use concerns as junk drawers — each concern should have a clear, single theme.
|
|
165
|
+
- Don't break ActiveRecord conventions (e.g. don't move associations into concerns).
|
|
166
|
+
- Don't introduce callback-heavy service objects — prefer explicit invocation over implicit hooks.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: e2e-coverage-gaps
|
|
3
|
+
description: Playwright/e2e coverage-gap explorer that FEEDS THE LIFECYCLE. Use when asked to find paths the automated end-to-end suite does NOT cover — routes with no test at all, or flows that are only happy-path tested (missing error, validation, permission, empty, loading, and edge states). It inventories the app's routes and the existing Playwright tests, explores the running app to confirm each uncovered or under-covered path is real and reachable, and files one build-ready missing-test ticket per gap via lisa:tracker-write. For human usability/experience issues (confusing, cramped, or broken UI), use the exploratory-qa skill instead.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# E2E Coverage Gaps
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Find where the automated end-to-end (Playwright) suite is **blind**: routes with no test at all, and
|
|
11
|
+
flows that only assert the **happy path** while ignoring error, permission, empty, loading, and edge
|
|
12
|
+
cases. Inventory the app's routes and the existing tests, explore the running app to confirm each gap
|
|
13
|
+
is real and reachable, then file each gap as a **build-ready missing-test work item** so it enters the
|
|
14
|
+
Lisa lifecycle.
|
|
15
|
+
|
|
16
|
+
This skill is purely about **automated-coverage gaps**. It does not judge whether the UI is confusing
|
|
17
|
+
or pretty — for human usability findings, use the `exploratory-qa` skill.
|
|
18
|
+
|
|
19
|
+
## Parameters
|
|
20
|
+
|
|
21
|
+
- **`target-url | env`** (first positional) — the app to inventory and explore.
|
|
22
|
+
- **`ready=true|false`** — build-ready state for the missing-test tickets (**default `true`**). Adding
|
|
23
|
+
missing coverage is safe to queue, so these default to build-ready; pass `ready=false` to leave them
|
|
24
|
+
in the backlog for human triage.
|
|
25
|
+
|
|
26
|
+
## Core Workflow
|
|
27
|
+
|
|
28
|
+
### 1. Establish Scope
|
|
29
|
+
|
|
30
|
+
- Identify the target environment, account type, and browser requirement, and read the `ready` flag
|
|
31
|
+
(default `true`).
|
|
32
|
+
- **Confirm the tracker is configured.** Gaps are filed as tickets, so read `tracker` from
|
|
33
|
+
`.lisa.config.json` (local overrides global). If it is unset, stop and report that the tracker must
|
|
34
|
+
be configured (via `/lisa:setup:jira` / `:github` / `:linear`) before gaps can be filed.
|
|
35
|
+
|
|
36
|
+
### 2. Inventory App Routes
|
|
37
|
+
|
|
38
|
+
- Enumerate every route/screen from the project's routing source — filesystem routes, the router
|
|
39
|
+
config, navigation definitions, or a generated sitemap.
|
|
40
|
+
- For each route capture: its path + params, the auth/role it requires, and the primary user actions
|
|
41
|
+
reachable from it (forms, mutations, filters, flows).
|
|
42
|
+
|
|
43
|
+
### 3. Inventory Existing Playwright Coverage
|
|
44
|
+
|
|
45
|
+
- Inspect the Playwright config, auth/setup projects, fixtures, constants, selectors, spec directories,
|
|
46
|
+
skipped/TODO/flaky tests, retries, and viewport/device projects.
|
|
47
|
+
- For each spec, record which route(s)/flow(s) it exercises and whether it asserts **behavior** or just
|
|
48
|
+
**presence**.
|
|
49
|
+
- Use existing test helpers/selectors when exploring — they reveal intended flows and stable hooks.
|
|
50
|
+
|
|
51
|
+
### 4. Compute the Gap Matrix
|
|
52
|
+
|
|
53
|
+
Map routes/flows against existing coverage and classify each gap:
|
|
54
|
+
|
|
55
|
+
- **Uncovered route/flow:** no test touches it at all.
|
|
56
|
+
- **Happy-path-only:** the success case is tested but the non-happy paths are not — missing
|
|
57
|
+
error/validation, permission/denied, empty/zero-state, loading/slow, and boundary/edge scenarios.
|
|
58
|
+
- **Assertion-thin:** a test exists but asserts presence rather than behavior/outcome.
|
|
59
|
+
- **Skipped/TODO/flaky:** coverage exists but is disabled or unreliable.
|
|
60
|
+
- **Breakpoint gap:** a flow is only tested at a single viewport when behavior changes across
|
|
61
|
+
breakpoints.
|
|
62
|
+
|
|
63
|
+
### 5. Explore to Confirm
|
|
64
|
+
|
|
65
|
+
- Navigate each candidate gap in the running app to confirm it is real, reachable, and worth a test.
|
|
66
|
+
Discard gaps that aren't actually reachable or are intentionally out of scope.
|
|
67
|
+
|
|
68
|
+
### 6. File One Ticket Per Gap
|
|
69
|
+
|
|
70
|
+
Each confirmed gap becomes a leaf **missing-test** work item created via `lisa:tracker-write` (the
|
|
71
|
+
vendor-neutral writer — it dispatches to the configured tracker and runs the validation gate; never
|
|
72
|
+
call a vendor `*-write-*` skill directly), `issue_type: Task`, **build-ready per the `ready` flag
|
|
73
|
+
(default `true`)**. Pass `build_ready` explicitly on every create. Each ticket MUST specify:
|
|
74
|
+
|
|
75
|
+
- The **route/flow** and the exact **user behavior the test must assert**.
|
|
76
|
+
- **Which scenario is missing** (uncovered vs which non-happy path: error / validation / permission /
|
|
77
|
+
empty / loading / edge / breakpoint).
|
|
78
|
+
- The **stable selector / fixture / flow** to use — concrete and automatable.
|
|
79
|
+
- **Three-audience description** + **Gherkin acceptance criteria** describing the test to add.
|
|
80
|
+
|
|
81
|
+
### Idempotency — don't spam duplicates
|
|
82
|
+
|
|
83
|
+
Before creating a ticket, search the tracker for an **open** ticket carrying a stable marker
|
|
84
|
+
`[lisa-e2e-coverage-gaps] <gap-key>` in its body (the `<gap-key>` is a stable slug of route + missing
|
|
85
|
+
scenario, e.g. `checkout/payment-declined` or `dashboard/empty-state@mobile`). If one exists, reference
|
|
86
|
+
it instead of duplicating. **Match by the marker, never by title.** A *closed* prior ticket does not
|
|
87
|
+
suppress a genuine new gap.
|
|
88
|
+
|
|
89
|
+
## Output
|
|
90
|
+
|
|
91
|
+
No report file. Emit a concise in-session summary:
|
|
92
|
+
|
|
93
|
+
- **Route inventory:** count of routes/screens discovered.
|
|
94
|
+
- **Existing coverage:** strengths and thin areas (skipped/flaky, assertion-thin, single-viewport).
|
|
95
|
+
- **Gap matrix:** uncovered vs happy-path-only vs breakpoint gaps.
|
|
96
|
+
- **Tickets filed:** each gap with its created/referenced ticket ref and build-ready state.
|
|
97
|
+
|
|
98
|
+
## Quality Bar
|
|
99
|
+
|
|
100
|
+
- Distinguish **no coverage** from **happy-path-only** — both are gaps, but the ticket must say which.
|
|
101
|
+
- Every ticket must stand alone for an implementer who was not in the session and must be concretely
|
|
102
|
+
automatable (named route, behavior, and stable hook).
|
|
103
|
+
- Do not refile gaps already covered or already ticketed (marker check).
|
|
104
|
+
- This skill is about automated coverage only — route human usability issues to `exploratory-qa`.
|
|
105
|
+
- Preserve unrelated repo changes.
|