@codyswann/lisa 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +867 -0
- package/all/copy-overwrite/.claude/README.md +205 -0
- package/all/copy-overwrite/.claude/agents/agent-architect.md +311 -0
- package/all/copy-overwrite/.claude/agents/codebase-analyzer.md +146 -0
- package/all/copy-overwrite/.claude/agents/codebase-locator.md +125 -0
- package/all/copy-overwrite/.claude/agents/codebase-pattern-finder.md +237 -0
- package/all/copy-overwrite/.claude/agents/git-history-analyzer.md +183 -0
- package/all/copy-overwrite/.claude/agents/hooks-expert.md +74 -0
- package/all/copy-overwrite/.claude/agents/skill-evaluator.md +246 -0
- package/all/copy-overwrite/.claude/agents/slash-command-architect.md +87 -0
- package/all/copy-overwrite/.claude/agents/web-search-researcher.md +112 -0
- package/all/copy-overwrite/.claude/commands/git/commit-and-submit-pr.md +8 -0
- package/all/copy-overwrite/.claude/commands/git/commit.md +44 -0
- package/all/copy-overwrite/.claude/commands/git/prune.md +34 -0
- package/all/copy-overwrite/.claude/commands/git/submit-pr.md +50 -0
- package/all/copy-overwrite/.claude/commands/jira/create.md +50 -0
- package/all/copy-overwrite/.claude/commands/jira/verify.md +34 -0
- package/all/copy-overwrite/.claude/commands/project/archive.md +8 -0
- package/all/copy-overwrite/.claude/commands/project/bootstrap.md +49 -0
- package/all/copy-overwrite/.claude/commands/project/complete-task.md +7 -0
- package/all/copy-overwrite/.claude/commands/project/debrief.md +65 -0
- package/all/copy-overwrite/.claude/commands/project/execute.md +94 -0
- package/all/copy-overwrite/.claude/commands/project/implement.md +42 -0
- package/all/copy-overwrite/.claude/commands/project/local-code-review.md +88 -0
- package/all/copy-overwrite/.claude/commands/project/lower-code-complexity.md +74 -0
- package/all/copy-overwrite/.claude/commands/project/plan.md +314 -0
- package/all/copy-overwrite/.claude/commands/project/research.md +248 -0
- package/all/copy-overwrite/.claude/commands/project/review.md +63 -0
- package/all/copy-overwrite/.claude/commands/project/setup.md +19 -0
- package/all/copy-overwrite/.claude/commands/project/verify.md +38 -0
- package/all/copy-overwrite/.claude/commands/pull-request/review.md +12 -0
- package/all/copy-overwrite/.claude/commands/rules/format-md.md +72 -0
- package/all/copy-overwrite/.claude/commands/sonarqube/check.md +6 -0
- package/all/copy-overwrite/.claude/commands/sonarqube/fix.md +3 -0
- package/all/copy-overwrite/.claude/hooks/README.md +301 -0
- package/all/copy-overwrite/.claude/hooks/notify-ntfy.sh +181 -0
- package/all/copy-overwrite/.claude/settings.json +41 -0
- package/all/copy-overwrite/.claude/settings.local.json.example +14 -0
- package/all/copy-overwrite/.claude/skills/coding-philosophy/SKILL.md +405 -0
- package/all/copy-overwrite/.claude/skills/coding-philosophy/references/function-structure.md +416 -0
- package/all/copy-overwrite/.claude/skills/coding-philosophy/references/immutable-patterns.md +316 -0
- package/all/copy-overwrite/.claude/skills/prompt-complexity-scorer/SKILL.md +118 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/LICENSE.txt +202 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/SKILL.md +210 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-312.pyc +0 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/init_skill.py +303 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/all/copy-overwrite/CLAUDE.md +77 -0
- package/all/copy-overwrite/HUMAN.md +17 -0
- package/all/copy-overwrite/specs/.keep +0 -0
- package/all/create-only/PROJECT_RULES.md +0 -0
- package/cdk/merge/package.json +20 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +107 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +45 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +58 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/core/config.d.ts +73 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +36 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lisa.d.ts +81 -0
- package/dist/core/lisa.d.ts.map +1 -0
- package/dist/core/lisa.js +459 -0
- package/dist/core/lisa.js.map +1 -0
- package/dist/core/manifest.d.ts +58 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +104 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/detection/detector.interface.d.ts +15 -0
- package/dist/detection/detector.interface.d.ts.map +1 -0
- package/dist/detection/detector.interface.js +2 -0
- package/dist/detection/detector.interface.js.map +1 -0
- package/dist/detection/detectors/cdk.d.ts +10 -0
- package/dist/detection/detectors/cdk.d.ts.map +1 -0
- package/dist/detection/detectors/cdk.js +34 -0
- package/dist/detection/detectors/cdk.js.map +1 -0
- package/dist/detection/detectors/expo.d.ts +10 -0
- package/dist/detection/detectors/expo.d.ts.map +1 -0
- package/dist/detection/detectors/expo.js +30 -0
- package/dist/detection/detectors/expo.js.map +1 -0
- package/dist/detection/detectors/nestjs.d.ts +10 -0
- package/dist/detection/detectors/nestjs.d.ts.map +1 -0
- package/dist/detection/detectors/nestjs.js +34 -0
- package/dist/detection/detectors/nestjs.js.map +1 -0
- package/dist/detection/detectors/npm-package.d.ts +13 -0
- package/dist/detection/detectors/npm-package.d.ts.map +1 -0
- package/dist/detection/detectors/npm-package.js +30 -0
- package/dist/detection/detectors/npm-package.js.map +1 -0
- package/dist/detection/detectors/typescript.d.ts +10 -0
- package/dist/detection/detectors/typescript.d.ts.map +1 -0
- package/dist/detection/detectors/typescript.js +25 -0
- package/dist/detection/detectors/typescript.js.map +1 -0
- package/dist/detection/index.d.ts +24 -0
- package/dist/detection/index.d.ts.map +1 -0
- package/dist/detection/index.js +57 -0
- package/dist/detection/index.js.map +1 -0
- package/dist/errors/index.d.ts +69 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +110 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/console-logger.d.ts +12 -0
- package/dist/logging/console-logger.d.ts.map +1 -0
- package/dist/logging/console-logger.js +22 -0
- package/dist/logging/console-logger.js.map +1 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.interface.d.ts +20 -0
- package/dist/logging/logger.interface.d.ts.map +1 -0
- package/dist/logging/logger.interface.js +2 -0
- package/dist/logging/logger.interface.js.map +1 -0
- package/dist/logging/silent-logger.d.ts +12 -0
- package/dist/logging/silent-logger.d.ts.map +1 -0
- package/dist/logging/silent-logger.js +21 -0
- package/dist/logging/silent-logger.js.map +1 -0
- package/dist/strategies/copy-contents.d.ts +14 -0
- package/dist/strategies/copy-contents.d.ts.map +1 -0
- package/dist/strategies/copy-contents.js +69 -0
- package/dist/strategies/copy-contents.js.map +1 -0
- package/dist/strategies/copy-overwrite.d.ts +14 -0
- package/dist/strategies/copy-overwrite.d.ts.map +1 -0
- package/dist/strategies/copy-overwrite.js +47 -0
- package/dist/strategies/copy-overwrite.js.map +1 -0
- package/dist/strategies/create-only.d.ts +13 -0
- package/dist/strategies/create-only.d.ts.map +1 -0
- package/dist/strategies/create-only.js +30 -0
- package/dist/strategies/create-only.js.map +1 -0
- package/dist/strategies/index.d.ts +31 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +52 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/merge.d.ts +13 -0
- package/dist/strategies/merge.d.ts.map +1 -0
- package/dist/strategies/merge.js +60 -0
- package/dist/strategies/merge.js.map +1 -0
- package/dist/strategies/strategy.interface.d.ts +31 -0
- package/dist/strategies/strategy.interface.d.ts.map +1 -0
- package/dist/strategies/strategy.interface.js +2 -0
- package/dist/strategies/strategy.interface.js.map +1 -0
- package/dist/transaction/backup.d.ts +38 -0
- package/dist/transaction/backup.d.ts.map +1 -0
- package/dist/transaction/backup.js +97 -0
- package/dist/transaction/backup.js.map +1 -0
- package/dist/transaction/index.d.ts +4 -0
- package/dist/transaction/index.d.ts.map +1 -0
- package/dist/transaction/index.js +3 -0
- package/dist/transaction/index.js.map +1 -0
- package/dist/transaction/transaction.d.ts +34 -0
- package/dist/transaction/transaction.d.ts.map +1 -0
- package/dist/transaction/transaction.js +68 -0
- package/dist/transaction/transaction.js.map +1 -0
- package/dist/utils/file-operations.d.ts +29 -0
- package/dist/utils/file-operations.d.ts.map +1 -0
- package/dist/utils/file-operations.js +84 -0
- package/dist/utils/file-operations.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-utils.d.ts +22 -0
- package/dist/utils/json-utils.d.ts.map +1 -0
- package/dist/utils/json-utils.js +57 -0
- package/dist/utils/json-utils.js.map +1 -0
- package/dist/utils/path-utils.d.ts +21 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +35 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/eslint-plugin-code-organization/README.md +149 -0
- package/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +468 -0
- package/eslint-plugin-code-organization/index.js +23 -0
- package/eslint-plugin-code-organization/package.json +10 -0
- package/eslint-plugin-code-organization/rules/enforce-statement-order.js +157 -0
- package/expo/copy-overwrite/.claude/skills/apollo-client/SKILL.md +238 -0
- package/expo/copy-overwrite/.claude/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/SKILL.md +360 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +327 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/SKILL.md +299 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/references/examples.md +749 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/references/patterns.md +318 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/create_component.py +198 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/validate_component.py +207 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +414 -0
- package/expo/copy-overwrite/.claude/skills/directory-structure/SKILL.md +202 -0
- package/expo/copy-overwrite/.claude/skills/directory-structure/scripts/validate_structure.py +443 -0
- package/expo/copy-overwrite/.claude/skills/expo-env-config/SKILL.md +309 -0
- package/expo/copy-overwrite/.claude/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/SKILL.md +431 -0
- package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/scripts/generate-route.py +169 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/SKILL.md +411 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/scripts/validate_styling.py +354 -0
- package/expo/copy-overwrite/.claude/skills/local-state/SKILL.md +362 -0
- package/expo/copy-overwrite/.claude/skills/local-state/references/async-storage.md +505 -0
- package/expo/copy-overwrite/.claude/skills/local-state/references/persistence-patterns.md +711 -0
- package/expo/copy-overwrite/.claude/skills/local-state/references/reactive-variables.md +446 -0
- package/expo/copy-overwrite/.claude/skills/playwright-selectors/SKILL.md +223 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/SKILL.md +319 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/references/async-patterns.md +420 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/references/expo-router-testing.md +556 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/references/mocking-patterns.md +590 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/references/query-priority.md +291 -0
- package/expo/copy-overwrite/.easignore.extra +2 -0
- package/expo/copy-overwrite/.mcp.json +33 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/README.md +234 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/plugin-index.test.js +84 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/require-memo-in-view.test.js +196 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/single-component-per-file.test.js +289 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/index.js +32 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/package.json +10 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/enforce-component-structure.js +230 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/no-return-in-view.js +91 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/require-memo-in-view.js +178 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/single-component-per-file.js +238 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/README.md +260 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/index.js +29 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/package.json +10 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-classname-outside-ui.js +51 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-direct-rn-imports.js +55 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-inline-styles.js +73 -0
- package/expo/copy-overwrite/eslint.config.mjs +560 -0
- package/expo/copy-overwrite/lighthouserc.js +194 -0
- package/expo/create-only/lighthouserc-config.json +28 -0
- package/expo/merge/package.json +132 -0
- package/lisa.sh +35 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/SKILL.md +176 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/project-patterns.md +483 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-rules/SKILL.md +536 -0
- package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/SKILL.md +275 -0
- package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/nestjs/merge/package.json +75 -0
- package/package.json +124 -0
- package/typescript/copy-contents/.husky/commit-msg +91 -0
- package/typescript/copy-contents/.husky/pre-commit +96 -0
- package/typescript/copy-contents/.husky/pre-push +211 -0
- package/typescript/copy-overwrite/.claude/hooks/format-on-edit.sh +74 -0
- package/typescript/copy-overwrite/.claude/hooks/install_pkgs.sh +59 -0
- package/typescript/copy-overwrite/.claude/hooks/lint-on-edit.sh +103 -0
- package/typescript/copy-overwrite/.claude/skills/jsdoc-best-practices/SKILL.md +388 -0
- package/typescript/copy-overwrite/.github/README.md +455 -0
- package/typescript/copy-overwrite/.github/dependabot.yml +40 -0
- package/typescript/copy-overwrite/.github/k6/BROWSER_TESTING_NOTE.md +129 -0
- package/typescript/copy-overwrite/.github/k6/INTEGRATION_GUIDE.md +354 -0
- package/typescript/copy-overwrite/.github/k6/README.md +386 -0
- package/typescript/copy-overwrite/.github/k6/SCENARIO_SELECTION_GUIDE.md +264 -0
- package/typescript/copy-overwrite/.github/k6/examples/customer-deploy-integration.yml +115 -0
- package/typescript/copy-overwrite/.github/k6/examples/data-driven-test.js +268 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/load.js +142 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/load.json +27 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/smoke.js +26 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/smoke.json +20 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/soak.js +244 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/soak.json +29 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/spike.js +180 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/spike.json +32 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/stress.js +206 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/stress.json +38 -0
- package/typescript/copy-overwrite/.github/k6/scripts/api-test.js +452 -0
- package/typescript/copy-overwrite/.github/k6/scripts/default-test.js +185 -0
- package/typescript/copy-overwrite/.github/k6/thresholds/normal.json +30 -0
- package/typescript/copy-overwrite/.github/k6/thresholds/relaxed.json +21 -0
- package/typescript/copy-overwrite/.github/k6/thresholds/strict.json +29 -0
- package/typescript/copy-overwrite/.github/workflows/build.yml +72 -0
- package/typescript/copy-overwrite/.github/workflows/ci.yml +49 -0
- package/typescript/copy-overwrite/.github/workflows/claude.yml +51 -0
- package/typescript/copy-overwrite/.github/workflows/create-github-issue-on-failure.yml +113 -0
- package/typescript/copy-overwrite/.github/workflows/create-jira-issue-on-failure.yml +195 -0
- package/typescript/copy-overwrite/.github/workflows/create-sentry-issue-on-failure.yml +267 -0
- package/typescript/copy-overwrite/.github/workflows/deploy.yml +228 -0
- package/typescript/copy-overwrite/.github/workflows/k6-load-test-README.md +230 -0
- package/typescript/copy-overwrite/.github/workflows/lighthouse.yml +68 -0
- package/typescript/copy-overwrite/.github/workflows/load-test.yml +282 -0
- package/typescript/copy-overwrite/.github/workflows/quality.yml +1737 -0
- package/typescript/copy-overwrite/.github/workflows/release.yml +1599 -0
- package/typescript/copy-overwrite/.gitleaksignore +28 -0
- package/typescript/copy-overwrite/.nvmrc +1 -0
- package/typescript/copy-overwrite/.prettierignore +23 -0
- package/typescript/copy-overwrite/.prettierrc.json +22 -0
- package/typescript/copy-overwrite/.versionrc +42 -0
- package/typescript/copy-overwrite/.yamllint +20 -0
- package/typescript/copy-overwrite/commitlint.config.js +11 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/README.md +149 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +468 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/index.js +23 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/package.json +10 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/rules/enforce-statement-order.js +157 -0
- package/typescript/copy-overwrite/eslint.config.mjs +390 -0
- package/typescript/copy-overwrite/eslint.ignore.config.json +57 -0
- package/typescript/copy-overwrite/eslint.thresholds.config.json +5 -0
- package/typescript/github-rulesets/base.json +106 -0
- package/typescript/merge/.claude/settings.json +28 -0
- package/typescript/merge/package.json +71 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint rule to enforce statement order in all functions
|
|
3
|
+
*
|
|
4
|
+
* Enforces the following order:
|
|
5
|
+
* 1. Definitions: Variable declarations (const/let/var) and function declarations
|
|
6
|
+
* 2. Side effects: Expression statements that are function calls
|
|
7
|
+
* 3. Return statement
|
|
8
|
+
*
|
|
9
|
+
* Applies to all functions: hooks, components, utilities, etc.
|
|
10
|
+
* @type {import('eslint').Rule.RuleModule}
|
|
11
|
+
*/
|
|
12
|
+
module.exports = {
|
|
13
|
+
meta: {
|
|
14
|
+
type: "problem",
|
|
15
|
+
docs: {
|
|
16
|
+
description:
|
|
17
|
+
"Enforce statement order: definitions → side effects → return",
|
|
18
|
+
category: "Best Practices",
|
|
19
|
+
recommended: true,
|
|
20
|
+
},
|
|
21
|
+
fixable: null,
|
|
22
|
+
schema: [],
|
|
23
|
+
messages: {
|
|
24
|
+
wrongOrder:
|
|
25
|
+
"{{current}} should come before {{previous}}. Expected order: definitions → side effects → return statement",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
create(context) {
|
|
30
|
+
const ORDER = {
|
|
31
|
+
DEFINITION: 1, // Variable declarations, function declarations
|
|
32
|
+
SIDE_EFFECT: 2, // Expression statements with function calls
|
|
33
|
+
RETURN: 3, // Return statement
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const ORDER_NAMES = {
|
|
37
|
+
[ORDER.DEFINITION]: "Definitions",
|
|
38
|
+
[ORDER.SIDE_EFFECT]: "Side effects",
|
|
39
|
+
[ORDER.RETURN]: "Return statement",
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Checks if an expression statement is a function call (side effect)
|
|
44
|
+
* @param {import('eslint').Rule.Node} statement - AST node
|
|
45
|
+
* @returns {boolean} True if this is a function call expression
|
|
46
|
+
*/
|
|
47
|
+
function isFunctionCallExpression(statement) {
|
|
48
|
+
if (statement.type !== "ExpressionStatement") {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const expression = statement.expression;
|
|
53
|
+
|
|
54
|
+
// Direct call: doSomething() or object.method()
|
|
55
|
+
if (expression.type === "CallExpression") {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Determines the order category of a statement
|
|
64
|
+
* Guard clauses (if statements with early returns) are ignored and don't
|
|
65
|
+
* affect order validation - they can appear anywhere in the function.
|
|
66
|
+
* @param {import('eslint').Rule.Node} statement - AST node
|
|
67
|
+
* @returns {number|null} Order category value, or null to skip this statement
|
|
68
|
+
*/
|
|
69
|
+
function getStatementOrder(statement) {
|
|
70
|
+
// Bare return statement (not in an if block)
|
|
71
|
+
if (statement.type === "ReturnStatement") {
|
|
72
|
+
return ORDER.RETURN;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// If statements are ignored - they may contain guard clauses (early returns)
|
|
76
|
+
// which are valid at any position in the function
|
|
77
|
+
if (statement.type === "IfStatement") {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Variable declarations are definitions
|
|
82
|
+
if (statement.type === "VariableDeclaration") {
|
|
83
|
+
return ORDER.DEFINITION;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Function declarations are definitions
|
|
87
|
+
if (statement.type === "FunctionDeclaration") {
|
|
88
|
+
return ORDER.DEFINITION;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Expression statements with function calls are side effects
|
|
92
|
+
if (isFunctionCallExpression(statement)) {
|
|
93
|
+
return ORDER.SIDE_EFFECT;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Default to null for other statements (they don't affect order)
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Checks if a function body follows the correct statement order
|
|
102
|
+
* @param {import('eslint').Rule.Node} node - Function node
|
|
103
|
+
*/
|
|
104
|
+
function checkBodyOrder(node) {
|
|
105
|
+
if (!node.body || node.body.type !== "BlockStatement") {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const statements = node.body.body;
|
|
110
|
+
// eslint-disable-next-line functional/no-let -- ESLint plugin requires mutable tracking variable for order validation
|
|
111
|
+
let maxOrderSeen = 0;
|
|
112
|
+
|
|
113
|
+
statements.forEach(statement => {
|
|
114
|
+
const currentOrder = getStatementOrder(statement);
|
|
115
|
+
|
|
116
|
+
// Skip statements that don't affect order (e.g., if statements)
|
|
117
|
+
if (currentOrder === null) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (currentOrder < maxOrderSeen) {
|
|
122
|
+
context.report({
|
|
123
|
+
node: statement,
|
|
124
|
+
messageId: "wrongOrder",
|
|
125
|
+
data: {
|
|
126
|
+
current: ORDER_NAMES[currentOrder],
|
|
127
|
+
previous: ORDER_NAMES[maxOrderSeen],
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Track the highest order we've seen so far
|
|
133
|
+
if (currentOrder > maxOrderSeen) {
|
|
134
|
+
maxOrderSeen = currentOrder;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
// Check all function declarations
|
|
141
|
+
FunctionDeclaration(node) {
|
|
142
|
+
checkBodyOrder(node);
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
// Check all arrow functions and function expressions assigned to variables
|
|
146
|
+
VariableDeclarator(node) {
|
|
147
|
+
if (
|
|
148
|
+
node.init &&
|
|
149
|
+
(node.init.type === "ArrowFunctionExpression" ||
|
|
150
|
+
node.init.type === "FunctionExpression")
|
|
151
|
+
) {
|
|
152
|
+
checkBodyOrder(node.init);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
},
|
|
157
|
+
};
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: apollo-client
|
|
3
|
+
description: This skill should be used when writing or modifying GraphQL operations, hooks, or mutations using Apollo Client 3.10. It enforces best practices for optimistic responses, cache updates, and TypeScript type generation. Use this skill when creating new queries/mutations, reviewing Apollo code, or troubleshooting cache issues.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Apollo Client 3.10
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This skill provides best practices for Apollo Client 3.10 in this codebase, ensuring consistent patterns for GraphQL operations, optimistic UI updates, cache management, and TypeScript type safety.
|
|
11
|
+
|
|
12
|
+
## Quick Reference
|
|
13
|
+
|
|
14
|
+
### Generator Commands
|
|
15
|
+
|
|
16
|
+
After modifying any `operations.graphql` file, run the appropriate generator:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
bun run generate:types:dev # Development environment
|
|
20
|
+
bun run generate:types:staging # Staging environment
|
|
21
|
+
bun run generate:types:production # Production environment
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
> **Note:** Replace `bun` with your project's package manager (`npm`, `yarn`, `pnpm`) as needed.
|
|
25
|
+
|
|
26
|
+
### Import Pattern
|
|
27
|
+
|
|
28
|
+
All GraphQL types, hooks, and documents must come from generated types:
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import {
|
|
32
|
+
useGetPlayerQuery,
|
|
33
|
+
useUpdatePlayerMutation,
|
|
34
|
+
GetPlayerQuery,
|
|
35
|
+
PlayerFragment,
|
|
36
|
+
ListPlayersDocument,
|
|
37
|
+
} from "@/generated/graphql";
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Core Rules
|
|
41
|
+
|
|
42
|
+
### 1. Only Use Generated Types
|
|
43
|
+
|
|
44
|
+
Import all GraphQL-related types from `@/generated/graphql`. Never define manual TypeScript types for GraphQL entities.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// CORRECT
|
|
48
|
+
import { PlayerFragment, useUpdatePlayerMutation } from "@/generated/graphql";
|
|
49
|
+
|
|
50
|
+
// INCORRECT - Never do this
|
|
51
|
+
type Player = { id: string; name: string };
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 2. Never Modify Generated Files
|
|
55
|
+
|
|
56
|
+
The `generated/graphql.ts` file is auto-generated by codegen. To change types:
|
|
57
|
+
|
|
58
|
+
1. Edit the appropriate `operations.graphql` file in the feature directory
|
|
59
|
+
2. Run `bun run generate:types:dev`
|
|
60
|
+
3. Import the newly generated types
|
|
61
|
+
|
|
62
|
+
### 3. Always Run Generator After Schema Changes
|
|
63
|
+
|
|
64
|
+
After modifying any `operations.graphql` file, immediately run the generator before committing. Verify changes compile with `bun run typecheck`.
|
|
65
|
+
|
|
66
|
+
### 4. Always Include Optimistic Response
|
|
67
|
+
|
|
68
|
+
Every mutation must include an `optimisticResponse` for instant UI feedback:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
const [updatePlayer] = useUpdatePlayerMutation({
|
|
72
|
+
optimisticResponse: variables => ({
|
|
73
|
+
__typename: "Mutation",
|
|
74
|
+
updatePlayer: {
|
|
75
|
+
__typename: "Player",
|
|
76
|
+
id: variables.id,
|
|
77
|
+
name: variables.input.name,
|
|
78
|
+
updatedAt: new Date().toISOString(),
|
|
79
|
+
},
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Key requirements:
|
|
85
|
+
|
|
86
|
+
- Always include `__typename` for every object in the response
|
|
87
|
+
- Always include `id` for cache normalization
|
|
88
|
+
- Use temporary IDs for new objects (e.g., `crypto.randomUUID()`)
|
|
89
|
+
- Include all fields that the mutation returns
|
|
90
|
+
|
|
91
|
+
### 5. Always Update Cache
|
|
92
|
+
|
|
93
|
+
Every mutation must handle cache updates using one of these strategies:
|
|
94
|
+
|
|
95
|
+
**Automatic Updates** - When mutation returns the full entity with `id` and `__typename`, Apollo updates automatically. No extra code needed.
|
|
96
|
+
|
|
97
|
+
**cache.modify** - For adding/removing items from lists:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const [addPlayer] = useAddPlayerMutation({
|
|
101
|
+
optimisticResponse: {
|
|
102
|
+
/* ... */
|
|
103
|
+
},
|
|
104
|
+
update(cache, { data }) {
|
|
105
|
+
cache.modify({
|
|
106
|
+
fields: {
|
|
107
|
+
players(existingPlayers = [], { readField }) {
|
|
108
|
+
const newRef = cache.writeFragment({
|
|
109
|
+
data: data.addPlayer,
|
|
110
|
+
fragment: PlayerFragmentDoc,
|
|
111
|
+
});
|
|
112
|
+
return [...existingPlayers, newRef];
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**refetchQueries** - Fallback for complex scenarios:
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
const [complexMutation] = useComplexMutation({
|
|
124
|
+
refetchQueries: ["ListPlayers"],
|
|
125
|
+
awaitRefetchQueries: true,
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Operations.graphql Structure
|
|
130
|
+
|
|
131
|
+
### Fragment-First Pattern
|
|
132
|
+
|
|
133
|
+
Define fragments before queries/mutations that use them:
|
|
134
|
+
|
|
135
|
+
```graphql
|
|
136
|
+
# 1. Fragments first
|
|
137
|
+
fragment PlayerFragment on Player {
|
|
138
|
+
id
|
|
139
|
+
knownName
|
|
140
|
+
firstName
|
|
141
|
+
lastName
|
|
142
|
+
team {
|
|
143
|
+
id
|
|
144
|
+
name
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
# 2. Queries second
|
|
149
|
+
query GetPlayer($id: ID!) {
|
|
150
|
+
player(id: $id) {
|
|
151
|
+
...PlayerFragment
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# 3. Mutations last
|
|
156
|
+
mutation UpdatePlayer($id: ID!, $input: UpdatePlayerInput!) {
|
|
157
|
+
updatePlayer(id: $id, input: $input) {
|
|
158
|
+
...PlayerFragment
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Include Required Fields
|
|
164
|
+
|
|
165
|
+
Mutations must return all fields needed for cache updates:
|
|
166
|
+
|
|
167
|
+
```graphql
|
|
168
|
+
mutation AddPlayerToKanban($input: AddPlayerToKanbanInput!) {
|
|
169
|
+
addPlayerToKanban(input: $input) {
|
|
170
|
+
id # Required for cache normalization
|
|
171
|
+
position
|
|
172
|
+
notes
|
|
173
|
+
kanbanPhaseId
|
|
174
|
+
kanbanPhase {
|
|
175
|
+
# Include related objects
|
|
176
|
+
id
|
|
177
|
+
name
|
|
178
|
+
}
|
|
179
|
+
createdAt
|
|
180
|
+
updatedAt
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Query Best Practices
|
|
186
|
+
|
|
187
|
+
### Fetch Policies
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
// Frequently changing data - balance speed and freshness
|
|
191
|
+
fetchPolicy: "cache-and-network";
|
|
192
|
+
|
|
193
|
+
// Stable reference data - prioritize cache
|
|
194
|
+
fetchPolicy: "cache-first";
|
|
195
|
+
|
|
196
|
+
// Always-fresh data - skip cache
|
|
197
|
+
fetchPolicy: "network-only";
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Skip When Variables Undefined
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
const { data } = useGetPlayerQuery({
|
|
204
|
+
variables: { id: playerId! },
|
|
205
|
+
skip: !playerId,
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Error Handling
|
|
210
|
+
|
|
211
|
+
Use `onError` callback instead of try/catch with console.log:
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
const [mutation] = useMutation(MUTATION, {
|
|
215
|
+
onError: error => {
|
|
216
|
+
setErrorState("Failed to update. Please try again.");
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Complete Mutation Pattern
|
|
222
|
+
|
|
223
|
+
Reference `references/mutation-patterns.md` for comprehensive examples of the complete mutation pattern including optimistic responses, cache updates, and error handling.
|
|
224
|
+
|
|
225
|
+
## Validation Checklist
|
|
226
|
+
|
|
227
|
+
When writing or reviewing Apollo code, verify:
|
|
228
|
+
|
|
229
|
+
- [ ] All types imported from `@/generated/graphql`
|
|
230
|
+
- [ ] No manual type definitions for GraphQL entities
|
|
231
|
+
- [ ] Every mutation has `optimisticResponse`
|
|
232
|
+
- [ ] Every mutation has cache update strategy
|
|
233
|
+
- [ ] `__typename` included in all optimistic response objects
|
|
234
|
+
- [ ] `id` included in all optimistic response objects
|
|
235
|
+
- [ ] Queries use appropriate `fetchPolicy`
|
|
236
|
+
- [ ] Queries use `skip` when variables may be undefined
|
|
237
|
+
- [ ] Error handling via `onError` callback
|
|
238
|
+
- [ ] Generator was run after operations.graphql changes
|