@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
package/README.md
ADDED
|
@@ -0,0 +1,867 @@
|
|
|
1
|
+
# Lisa
|
|
2
|
+
|
|
3
|
+
Lisa is a **Claude Code governance framework** that ensures Claude produces high-quality, consistent code through multiple layers of guardrails, guidance, and automated enforcement.
|
|
4
|
+
|
|
5
|
+
## Why Lisa Exists
|
|
6
|
+
|
|
7
|
+
Claude Code is powerful, but without guardrails it can:
|
|
8
|
+
- Produce inconsistent code styles across sessions
|
|
9
|
+
- Skip tests or quality checks when not reminded
|
|
10
|
+
- Over-engineer solutions or create unnecessary abstractions
|
|
11
|
+
- Mutate data instead of using immutable patterns
|
|
12
|
+
- Leave deprecated code instead of cleanly deleting it
|
|
13
|
+
|
|
14
|
+
Lisa solves this by applying a comprehensive governance system that guides Claude's behavior at every step.
|
|
15
|
+
|
|
16
|
+
**The key insight:** Not every developer needs to be an AI expert. Platform teams with deep AI knowledge can encode best practices into Lisa, and implementation teams get the benefits automatically through simple commands.
|
|
17
|
+
|
|
18
|
+
## How It Works
|
|
19
|
+
|
|
20
|
+
Lisa applies multiple layers of quality control to your project:
|
|
21
|
+
|
|
22
|
+
| Layer | Purpose | Examples |
|
|
23
|
+
|-------|---------|----------|
|
|
24
|
+
| **CLAUDE.md** | Direct behavioral rules | "Never skip tests", "Always use immutable patterns" |
|
|
25
|
+
| **Skills** | Teach patterns & philosophy | Immutability, TDD, YAGNI/SOLID/DRY/KISS |
|
|
26
|
+
| **Hooks** | Auto-enforcement on every edit | Format and lint after Write/Edit operations |
|
|
27
|
+
| **Slash Commands** | Guided workflows | `/project:implement`, `/project:review`, `/git:commit` |
|
|
28
|
+
| **Custom ESLint Plugins** | Enforce code structure | Statement ordering, component structure |
|
|
29
|
+
| **Thresholds** | Configurable limits | Max complexity, max file length |
|
|
30
|
+
| **Git Hooks** | Pre-commit quality gates | Husky + lint-staged + commitlint |
|
|
31
|
+
| **Agents** | Specialized sub-agents | Codebase analysis, pattern finding |
|
|
32
|
+
|
|
33
|
+
These layers work together. When Claude writes code:
|
|
34
|
+
1. **CLAUDE.md** tells it what patterns to follow
|
|
35
|
+
2. **Skills** teach it the philosophy behind those patterns
|
|
36
|
+
3. **Hooks** automatically format and lint the code
|
|
37
|
+
4. **ESLint plugins** catch structural violations
|
|
38
|
+
5. **Git hooks** prevent commits that fail quality checks
|
|
39
|
+
|
|
40
|
+
## Team & Organization Usage
|
|
41
|
+
|
|
42
|
+
Lisa is designed for a **two-tier organizational model** that separates AI expertise from day-to-day development:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
46
|
+
│ PLATFORM TEAM │
|
|
47
|
+
│ │
|
|
48
|
+
│ • Deep AI/LLM expertise (prompting, context engineering) │
|
|
49
|
+
│ • Domain knowledge of coding standards & best practices │
|
|
50
|
+
│ • Maintains and iterates on Lisa configurations │
|
|
51
|
+
│ • Writes skills, hooks, ESLint rules, slash commands │
|
|
52
|
+
│ • Tests guardrails against real-world edge cases │
|
|
53
|
+
│ │
|
|
54
|
+
│ │ │
|
|
55
|
+
│ ▼ │
|
|
56
|
+
│ Lisa Repository │
|
|
57
|
+
│ │ │
|
|
58
|
+
│ ▼ │
|
|
59
|
+
├─────────────────────────────────────────────────────────────┤
|
|
60
|
+
│ IMPLEMENTATION TEAMS │
|
|
61
|
+
│ │
|
|
62
|
+
│ • Focus on building end-user software │
|
|
63
|
+
│ • Run `lisa.sh` to bootstrap projects │
|
|
64
|
+
│ • Use simple commands like `/project:implement` │
|
|
65
|
+
│ • Don't need deep AI expertise │
|
|
66
|
+
│ • Automatically get guardrails & quality enforcement │
|
|
67
|
+
│ │
|
|
68
|
+
└─────────────────────────────────────────────────────────────┘
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Why This Model Works
|
|
72
|
+
|
|
73
|
+
**For Platform Teams:**
|
|
74
|
+
- Centralize AI governance expertise in one place
|
|
75
|
+
- Iterate on prompts, skills, and guardrails based on real feedback
|
|
76
|
+
- A/B test different approaches across the organization
|
|
77
|
+
- Push improvements to all teams instantly via Lisa updates
|
|
78
|
+
|
|
79
|
+
**For Implementation Teams:**
|
|
80
|
+
- No need to learn prompt engineering or context engineering
|
|
81
|
+
- Simple commands produce high-quality, consistent code
|
|
82
|
+
- Guardrails prevent common mistakes automatically
|
|
83
|
+
- Focus on business logic, not AI wrangling
|
|
84
|
+
|
|
85
|
+
### How Implementation Teams Work
|
|
86
|
+
|
|
87
|
+
Once Lisa is applied to a project, developers have two paths:
|
|
88
|
+
|
|
89
|
+
**Path 1: Just Type a Prompt**
|
|
90
|
+
|
|
91
|
+
Even if a developer just types a vague request, Lisa's built-in `prompt-complexity-scorer` skill automatically evaluates it:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
Developer: "Make the app faster"
|
|
95
|
+
|
|
96
|
+
Claude: This request scores 8/10 on complexity. I suggest writing it
|
|
97
|
+
as a spec to plan it out properly.
|
|
98
|
+
|
|
99
|
+
Would you like me to create `specs/performance-optimization.md`?
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Complex or vague prompts (score 5+) are automatically routed to the spec workflow. Simple, well-defined requests (score 1-4) proceed immediately. Developers don't need to know which path to take—Lisa routes them automatically.
|
|
103
|
+
|
|
104
|
+
**Path 2: The Full Workflow**
|
|
105
|
+
|
|
106
|
+
For planned work, the workflow is two commands:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# 1. Create a spec file describing what you want
|
|
110
|
+
# (or let Claude create it from your prompt)
|
|
111
|
+
echo "Add user authentication with OAuth" > specs/add-auth.md
|
|
112
|
+
|
|
113
|
+
# 2. Bootstrap: research, analyze, identify gaps
|
|
114
|
+
/project:bootstrap @specs/add-auth.md
|
|
115
|
+
|
|
116
|
+
# 3. Execute: plan tasks, implement with TDD, verify completion
|
|
117
|
+
/project:execute @projects/add-auth
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
That's it. Behind the scenes, Lisa ensures:
|
|
121
|
+
- Comprehensive codebase and web research
|
|
122
|
+
- Knowledge gap detection (stops if questions need answering)
|
|
123
|
+
- Task breakdown and TDD implementation
|
|
124
|
+
- Verification that all tasks completed
|
|
125
|
+
- New patterns captured in `PROJECT_RULES.md`
|
|
126
|
+
|
|
127
|
+
### Platform Team Iteration Example
|
|
128
|
+
|
|
129
|
+
1. **Platform Team** discovers Claude sometimes creates overly complex functions
|
|
130
|
+
2. **Platform Team** adds a `cognitiveComplexity: 10` threshold to ESLint config
|
|
131
|
+
3. **Platform Team** writes a skill teaching Claude to decompose complex logic
|
|
132
|
+
4. **Platform Team** pushes update to Lisa repository
|
|
133
|
+
5. **Implementation Teams** run `lisa.sh` on their projects (or it happens via CI)
|
|
134
|
+
6. **Implementation Teams** now automatically get simpler, more maintainable code
|
|
135
|
+
|
|
136
|
+
### Forking for Your Organization
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Fork Lisa for your organization
|
|
140
|
+
gh repo fork CodySwannGT/lisa --org your-org --clone
|
|
141
|
+
|
|
142
|
+
# Customize configurations
|
|
143
|
+
cd lisa
|
|
144
|
+
# Edit skills, hooks, CLAUDE.md, ESLint rules, etc.
|
|
145
|
+
|
|
146
|
+
# Push to your org's fork
|
|
147
|
+
git push origin main
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Implementation teams then clone from your organization's fork:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
git clone https://github.com/your-org/lisa ~/lisa
|
|
154
|
+
~/lisa/lisa.sh /path/to/project
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Installation
|
|
158
|
+
|
|
159
|
+
Clone the Lisa repository to your machine:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
git clone <lisa-repo-url> ~/lisa
|
|
163
|
+
cd ~/lisa
|
|
164
|
+
npm install
|
|
165
|
+
npm run build
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Requirements
|
|
169
|
+
|
|
170
|
+
- **Node.js 18+**
|
|
171
|
+
- **npm** or **bun**
|
|
172
|
+
|
|
173
|
+
## Usage
|
|
174
|
+
|
|
175
|
+
Run Lisa against any project directory:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
~/lisa/lisa.sh /path/to/your-project
|
|
179
|
+
|
|
180
|
+
# Or from within your project
|
|
181
|
+
~/lisa/lisa.sh .
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Options
|
|
185
|
+
|
|
186
|
+
| Option | Description |
|
|
187
|
+
|--------|-------------|
|
|
188
|
+
| `-n, --dry-run` | Show what would be done without making changes |
|
|
189
|
+
| `-y, --yes` | Non-interactive mode (auto-accept defaults, overwrite on conflict) |
|
|
190
|
+
| `-v, --validate` | Validate project compatibility without applying changes |
|
|
191
|
+
| `-u, --uninstall` | Remove Lisa-managed files from the project |
|
|
192
|
+
| `-h, --help` | Show help message |
|
|
193
|
+
|
|
194
|
+
### Dry Run
|
|
195
|
+
|
|
196
|
+
Preview changes before applying them:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
~/lisa/lisa.sh --dry-run /path/to/your-project
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### CI/CD Usage
|
|
203
|
+
|
|
204
|
+
For automated pipelines, use non-interactive mode:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
~/lisa/lisa.sh --yes /path/to/project
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Validate Mode
|
|
211
|
+
|
|
212
|
+
Check project compatibility without making changes:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
~/lisa/lisa.sh --validate /path/to/project
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Uninstall
|
|
219
|
+
|
|
220
|
+
Remove Lisa-managed files from a project:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
~/lisa/lisa.sh --uninstall /path/to/project
|
|
224
|
+
|
|
225
|
+
# Preview what would be removed
|
|
226
|
+
~/lisa/lisa.sh --dry-run --uninstall /path/to/project
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Note: Files applied with `copy-contents` or `merge` strategies require manual cleanup as they modify existing content.
|
|
230
|
+
|
|
231
|
+
### GitHub Rulesets
|
|
232
|
+
|
|
233
|
+
Lisa can also apply GitHub repository rulesets via a separate script. This enforces branch protection rules like requiring PRs, status checks, and preventing force pushes.
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# Apply rulesets to a project's GitHub repo
|
|
237
|
+
~/lisa/lisa-github-rulesets.sh /path/to/project
|
|
238
|
+
|
|
239
|
+
# Preview what would be applied
|
|
240
|
+
~/lisa/lisa-github-rulesets.sh --dry-run /path/to/project
|
|
241
|
+
|
|
242
|
+
# Non-interactive mode
|
|
243
|
+
~/lisa/lisa-github-rulesets.sh --yes /path/to/project
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Requirements:**
|
|
247
|
+
- `gh` CLI installed and authenticated (`gh auth login`)
|
|
248
|
+
- Admin permissions on the repository
|
|
249
|
+
- `jq` installed
|
|
250
|
+
|
|
251
|
+
**How it works:**
|
|
252
|
+
|
|
253
|
+
1. Detects project types (same as main Lisa script)
|
|
254
|
+
2. Collects ruleset templates from `github-rulesets/` directories:
|
|
255
|
+
- `all/github-rulesets/` → applied to all projects
|
|
256
|
+
- `typescript/github-rulesets/` → TypeScript projects
|
|
257
|
+
- `expo/github-rulesets/` → Expo projects (inherits typescript)
|
|
258
|
+
- etc.
|
|
259
|
+
3. Creates or updates rulesets via the GitHub API
|
|
260
|
+
|
|
261
|
+
**Template format:**
|
|
262
|
+
|
|
263
|
+
Place JSON files in `{type}/github-rulesets/`. The script strips read-only fields (`id`, `source`, `source_type`) before applying:
|
|
264
|
+
|
|
265
|
+
```json
|
|
266
|
+
{
|
|
267
|
+
"name": "Protect Main Branch",
|
|
268
|
+
"target": "branch",
|
|
269
|
+
"enforcement": "active",
|
|
270
|
+
"conditions": {
|
|
271
|
+
"ref_name": {
|
|
272
|
+
"include": ["~DEFAULT_BRANCH"],
|
|
273
|
+
"exclude": []
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
"rules": [
|
|
277
|
+
{ "type": "deletion" },
|
|
278
|
+
{ "type": "non_fast_forward" },
|
|
279
|
+
{
|
|
280
|
+
"type": "pull_request",
|
|
281
|
+
"parameters": {
|
|
282
|
+
"required_approving_review_count": 1,
|
|
283
|
+
"dismiss_stale_reviews_on_push": true,
|
|
284
|
+
"require_code_owner_review": false,
|
|
285
|
+
"require_last_push_approval": true,
|
|
286
|
+
"required_review_thread_resolution": true
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
]
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
You can export an existing ruleset from GitHub's UI or API and place it in the appropriate directory. The script handles idempotency—if a ruleset with the same name exists, it updates rather than creates.
|
|
294
|
+
|
|
295
|
+
## What Lisa Applies
|
|
296
|
+
|
|
297
|
+
### CLAUDE.md - Behavioral Rules
|
|
298
|
+
|
|
299
|
+
Direct instructions for Claude Code:
|
|
300
|
+
|
|
301
|
+
```markdown
|
|
302
|
+
Always invoke /coding-philosophy skill to enforce immutable patterns
|
|
303
|
+
Always make atomic commits with clear conventional messages
|
|
304
|
+
Never skip or disable any tests or quality checks
|
|
305
|
+
Never use --no-verify with git commands
|
|
306
|
+
Never create TODOs or placeholders
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Skills - Teaching Philosophy
|
|
310
|
+
|
|
311
|
+
Skills teach Claude the "why" behind coding decisions:
|
|
312
|
+
|
|
313
|
+
- **coding-philosophy** - Immutability, function structure, TDD, clean deletion
|
|
314
|
+
- **jsdoc-best-practices** - Documentation that explains "why" not "what"
|
|
315
|
+
- **container-view-pattern** - Component architecture for React/Expo
|
|
316
|
+
|
|
317
|
+
### Hooks - Automated Enforcement
|
|
318
|
+
|
|
319
|
+
Hooks run automatically during Claude Code sessions:
|
|
320
|
+
|
|
321
|
+
| Hook | Trigger | Action |
|
|
322
|
+
|------|---------|--------|
|
|
323
|
+
| `format-on-edit.sh` | After Write/Edit | Run Prettier on changed files |
|
|
324
|
+
| `lint-on-edit.sh` | After Write/Edit | Run ESLint on changed files |
|
|
325
|
+
| `install_pkgs.sh` | Session start | Ensure dependencies installed |
|
|
326
|
+
| `notify-ntfy.sh` | Permission prompt/Stop | Send notifications |
|
|
327
|
+
|
|
328
|
+
**Async Workflow:** Lisa includes built-in [ntfy.sh](https://ntfy.sh) integration for push notifications. This enables a powerful async workflow with Claude Code Web - fire off tasks and get notified when they complete or need attention. See [Claude Code Web + Notifications](docs/workflows/claude-code-web-notifications.md) for setup instructions.
|
|
329
|
+
|
|
330
|
+
### Slash Commands - Guided Workflows
|
|
331
|
+
|
|
332
|
+
Pre-built workflows for common tasks:
|
|
333
|
+
|
|
334
|
+
| Command | Purpose |
|
|
335
|
+
|---------|---------|
|
|
336
|
+
| `/project:plan` | Create implementation plan |
|
|
337
|
+
| `/project:implement` | Execute all planned tasks |
|
|
338
|
+
| `/project:review` | Run code review |
|
|
339
|
+
| `/project:verify` | Run all quality checks |
|
|
340
|
+
| `/git:commit` | Create conventional commit |
|
|
341
|
+
| `/git:submit-pr` | Create pull request |
|
|
342
|
+
|
|
343
|
+
### Custom ESLint Plugins
|
|
344
|
+
|
|
345
|
+
Lisa includes custom ESLint plugins that enforce code structure:
|
|
346
|
+
|
|
347
|
+
**eslint-plugin-code-organization**
|
|
348
|
+
- `enforce-statement-order` - Definitions → Side effects → Return
|
|
349
|
+
|
|
350
|
+
**eslint-plugin-component-structure** (Expo)
|
|
351
|
+
- `single-component-per-file` - One component per file
|
|
352
|
+
- `require-memo-in-view` - Memoization in view components
|
|
353
|
+
- `no-inline-styles` - Extract styles to StyleSheet
|
|
354
|
+
|
|
355
|
+
### Thresholds
|
|
356
|
+
|
|
357
|
+
Configurable limits in `eslint.thresholds.config.json`:
|
|
358
|
+
|
|
359
|
+
```json
|
|
360
|
+
{
|
|
361
|
+
"cognitiveComplexity": 10,
|
|
362
|
+
"maxLines": 300,
|
|
363
|
+
"maxLinesView": 300
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
## Project Type Detection
|
|
368
|
+
|
|
369
|
+
Lisa auto-detects project types and applies appropriate configurations:
|
|
370
|
+
|
|
371
|
+
| Type | Detection |
|
|
372
|
+
|------|-----------|
|
|
373
|
+
| TypeScript | `tsconfig.json` or `"typescript"` in package.json |
|
|
374
|
+
| npm-package | Not `"private": true` and has `main`, `bin`, `exports`, or `files` |
|
|
375
|
+
| Expo | `app.json`, `eas.json`, or `"expo"` in package.json |
|
|
376
|
+
| NestJS | `nest-cli.json` or `"@nestjs"` in package.json |
|
|
377
|
+
| CDK | `cdk.json` or `"aws-cdk"` in package.json |
|
|
378
|
+
|
|
379
|
+
### Cascading Inheritance
|
|
380
|
+
|
|
381
|
+
Types inherit from their parents:
|
|
382
|
+
|
|
383
|
+
```
|
|
384
|
+
all/ ← Applied to every project
|
|
385
|
+
└── typescript/ ← TypeScript-specific
|
|
386
|
+
├── npm-package/ ← Publishable npm packages (includes typescript)
|
|
387
|
+
├── expo/ ← Expo (includes typescript)
|
|
388
|
+
├── nestjs/ ← NestJS (includes typescript)
|
|
389
|
+
└── cdk/ ← CDK (includes typescript)
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
An Expo project receives configs from: `all/` → `typescript/` → `expo/`
|
|
393
|
+
|
|
394
|
+
An npm package receives configs from: `all/` → `typescript/` → `npm-package/`
|
|
395
|
+
|
|
396
|
+
### Why Stack-Specific Rules Matter
|
|
397
|
+
|
|
398
|
+
**Generic AI rules don't work.** Each technology stack has its own:
|
|
399
|
+
- Architectural patterns (NestJS modules vs. Expo screens vs. CDK constructs)
|
|
400
|
+
- Testing approaches (Jest + Testing Library vs. Supertest vs. CDK assertions)
|
|
401
|
+
- File organization conventions
|
|
402
|
+
- Performance pitfalls
|
|
403
|
+
- Security considerations
|
|
404
|
+
|
|
405
|
+
When Claude writes code without stack-specific guidance, it produces "generic" solutions that miss the idioms and best practices of your stack. For example:
|
|
406
|
+
|
|
407
|
+
| Stack | Generic AI Output | With Lisa Stack Rules |
|
|
408
|
+
|-------|-------------------|----------------------|
|
|
409
|
+
| **Expo** | Inline styles, direct RN imports | Uses design system, container/view pattern |
|
|
410
|
+
| **NestJS** | Mixed concerns in controllers | Proper service/repository separation |
|
|
411
|
+
| **CDK** | Hardcoded values, no constructs | Parameterized, reusable L3 constructs |
|
|
412
|
+
|
|
413
|
+
The more specific the guidance, the better the output. That's why Lisa is structured around project types rather than one-size-fits-all rules.
|
|
414
|
+
|
|
415
|
+
### npm Package Publishing
|
|
416
|
+
|
|
417
|
+
Projects detected as `npm-package` automatically receive a GitHub Actions workflow for publishing to npm using **OIDC trusted publishing**. This workflow:
|
|
418
|
+
|
|
419
|
+
1. Triggers on push to `main`
|
|
420
|
+
2. Runs semantic versioning via `release.yml`
|
|
421
|
+
3. Publishes to npm with `npm publish --access public --provenance`
|
|
422
|
+
|
|
423
|
+
**Step 1: First-Time Publish (Manual)**
|
|
424
|
+
|
|
425
|
+
OIDC trusted publishing requires the package to exist on npm first. For new packages, do a manual initial publish:
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
# Login to npm (opens browser for authentication)
|
|
429
|
+
npm login
|
|
430
|
+
|
|
431
|
+
# Verify you're logged in
|
|
432
|
+
npm whoami
|
|
433
|
+
|
|
434
|
+
# Build the package
|
|
435
|
+
npm run build
|
|
436
|
+
|
|
437
|
+
# Publish for the first time
|
|
438
|
+
npm publish --access public
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
**Step 2: Configure Trusted Publisher on npm**
|
|
442
|
+
|
|
443
|
+
After the first publish, configure OIDC for automated future releases:
|
|
444
|
+
|
|
445
|
+
1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package
|
|
446
|
+
2. Click **Settings** → **Trusted Publishers**
|
|
447
|
+
3. Click **Add GitHub Actions**
|
|
448
|
+
4. Fill in the required fields:
|
|
449
|
+
- **Organization/User**: Your GitHub username or org (e.g., `CodySwannGT`)
|
|
450
|
+
- **Repository**: Your repo name (e.g., `lisa`)
|
|
451
|
+
- **Workflow filename**: `publish.yml` (must match exactly, including `.yml`)
|
|
452
|
+
- **Environment**: Leave blank unless using GitHub environments
|
|
453
|
+
5. Click **Save**
|
|
454
|
+
|
|
455
|
+
**Step 3: Future Releases (Automatic)**
|
|
456
|
+
|
|
457
|
+
Once configured, all future releases are automatic:
|
|
458
|
+
- Push to `main` triggers the workflow
|
|
459
|
+
- Semantic versioning determines the version bump
|
|
460
|
+
- OIDC authenticates without tokens
|
|
461
|
+
- Package publishes with provenance attestation
|
|
462
|
+
|
|
463
|
+
**Benefits of OIDC Trusted Publishing:**
|
|
464
|
+
|
|
465
|
+
- No tokens to manage, rotate, or risk leaking
|
|
466
|
+
- Automatic provenance attestations for supply chain security
|
|
467
|
+
- Short-lived, workflow-specific credentials
|
|
468
|
+
- No 90-day expiration limits to worry about
|
|
469
|
+
|
|
470
|
+
**Requirements:**
|
|
471
|
+
|
|
472
|
+
- npm CLI 11.5+ (workflow automatically installs latest)
|
|
473
|
+
- Cannot use self-hosted GitHub runners (not yet supported by npm)
|
|
474
|
+
|
|
475
|
+
### Extending Lisa for Other Stacks
|
|
476
|
+
|
|
477
|
+
Lisa currently supports TypeScript, npm-package, Expo, NestJS, and CDK—but the architecture is designed for extension. **We're calling on the community to contribute stack-specific configurations.**
|
|
478
|
+
|
|
479
|
+
**Stacks that would benefit from Lisa extensions:**
|
|
480
|
+
|
|
481
|
+
| Stack | Potential Rules |
|
|
482
|
+
|-------|-----------------|
|
|
483
|
+
| **Next.js** | App Router patterns, Server Components vs. Client, caching strategies |
|
|
484
|
+
| **React Native (non-Expo)** | Native module patterns, platform-specific code |
|
|
485
|
+
| **Django** | Model/View/Template separation, ORM patterns, admin customization |
|
|
486
|
+
| **FastAPI** | Dependency injection, Pydantic models, async patterns |
|
|
487
|
+
| **Spring Boot** | Bean lifecycle, annotation patterns, JPA repositories |
|
|
488
|
+
| **Laravel** | Eloquent patterns, Blade templates, queue workers |
|
|
489
|
+
| **Rails** | Convention over configuration, concerns, ActiveRecord |
|
|
490
|
+
| **Go (Gin/Echo)** | Error handling, middleware patterns, struct design |
|
|
491
|
+
| **Rust (Axum/Actix)** | Ownership patterns, error types, async runtime |
|
|
492
|
+
| **Flutter** | Widget composition, BLoC pattern, platform channels |
|
|
493
|
+
| **Vue/Nuxt** | Composition API, Pinia stores, auto-imports |
|
|
494
|
+
| **Svelte/SvelteKit** | Reactive statements, load functions, form actions |
|
|
495
|
+
| **Terraform** | Module structure, state management, provider patterns |
|
|
496
|
+
| **Kubernetes** | Helm charts, operator patterns, RBAC |
|
|
497
|
+
|
|
498
|
+
**To contribute a new stack:**
|
|
499
|
+
|
|
500
|
+
1. Create a new detector in `src/detection/detectors/`
|
|
501
|
+
2. Register the detector in `src/detection/index.ts`
|
|
502
|
+
3. Add the config directory structure:
|
|
503
|
+
|
|
504
|
+
```bash
|
|
505
|
+
# Create the stack directory
|
|
506
|
+
mkdir -p your-stack/{copy-overwrite,merge}
|
|
507
|
+
|
|
508
|
+
# Add stack-specific skills
|
|
509
|
+
mkdir -p your-stack/copy-overwrite/.claude/skills/your-pattern
|
|
510
|
+
cat > your-stack/copy-overwrite/.claude/skills/your-pattern/SKILL.md << 'EOF'
|
|
511
|
+
---
|
|
512
|
+
name: your-pattern
|
|
513
|
+
description: Teaches Claude the idioms of your stack
|
|
514
|
+
---
|
|
515
|
+
# Your Pattern
|
|
516
|
+
...
|
|
517
|
+
EOF
|
|
518
|
+
|
|
519
|
+
# Add stack-specific ESLint rules
|
|
520
|
+
mkdir -p your-stack/copy-overwrite/eslint-plugin-your-stack
|
|
521
|
+
|
|
522
|
+
# Add package.json dependencies via merge/
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
See the `expo/` directory for a comprehensive example of stack-specific configuration.
|
|
526
|
+
|
|
527
|
+
**Example prompts to bootstrap a new stack with Claude:**
|
|
528
|
+
|
|
529
|
+
Use these prompts in Claude Code (with Lisa applied) to generate stack configurations:
|
|
530
|
+
|
|
531
|
+
```
|
|
532
|
+
Research Rails best practices and create a Lisa configuration for Ruby on Rails projects.
|
|
533
|
+
Look at the expo/ directory as a reference for structure. Include:
|
|
534
|
+
- Detection logic as a new detector in src/detection/detectors/
|
|
535
|
+
- Skills for Rails conventions (MVC, ActiveRecord patterns, concerns)
|
|
536
|
+
- ESLint equivalent rules using RuboCop (create a rubocop config, not an ESLint plugin)
|
|
537
|
+
- Common .gitignore entries for Rails projects
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
```
|
|
541
|
+
Create a Lisa configuration for Flutter projects. Reference expo/ for structure.
|
|
542
|
+
Include:
|
|
543
|
+
- Detection logic (pubspec.yaml with flutter dependency)
|
|
544
|
+
- Skills for widget composition, BLoC/Riverpod patterns, platform channels
|
|
545
|
+
- Dart analyzer rules (analysis_options.yaml instead of ESLint)
|
|
546
|
+
- Flutter-specific .gitignore entries
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
```
|
|
550
|
+
Add Next.js support to Lisa. This should be a child of typescript/ (like expo is).
|
|
551
|
+
Include:
|
|
552
|
+
- Detection logic (next.config.js or "next" in package.json)
|
|
553
|
+
- Skills for App Router patterns, Server vs Client Components, caching
|
|
554
|
+
- ESLint rules for Next.js idioms (or extend next/core-web-vitals)
|
|
555
|
+
- Typical Next.js scripts in package.json
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
```
|
|
559
|
+
Analyze the expo/ directory structure and create equivalent configuration for Django.
|
|
560
|
+
Include:
|
|
561
|
+
- Detection logic (manage.py, settings.py, or django in requirements.txt)
|
|
562
|
+
- Skills for MVT pattern, ORM best practices, admin customization
|
|
563
|
+
- Linting via flake8/ruff config (not ESLint)
|
|
564
|
+
- Django-specific .gitignore entries
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
## Copy Strategies
|
|
568
|
+
|
|
569
|
+
Each type directory contains subdirectories that control how files are applied:
|
|
570
|
+
|
|
571
|
+
| Strategy | Dest doesn't exist | Dest identical | Dest differs |
|
|
572
|
+
|----------|-------------------|----------------|--------------|
|
|
573
|
+
| `copy-overwrite/` | Copy | Skip | Prompt (overwrite/skip) |
|
|
574
|
+
| `copy-contents/` | Copy | Skip | Append missing lines |
|
|
575
|
+
| `create-only/` | Copy | Skip | Skip |
|
|
576
|
+
| `merge/` | Copy | Skip | JSON deep merge |
|
|
577
|
+
|
|
578
|
+
### Strategy Details
|
|
579
|
+
|
|
580
|
+
**copy-overwrite**: Standard config files that should match Lisa's version. Prompts when local changes exist.
|
|
581
|
+
|
|
582
|
+
**copy-contents**: For files like `.gitignore` where you want to ensure certain lines exist without removing custom entries.
|
|
583
|
+
|
|
584
|
+
**create-only**: Template files that should only be created once (e.g., `PROJECT_RULES.md` for project-specific customization).
|
|
585
|
+
|
|
586
|
+
**merge**: For `package.json` files. Performs a deep merge where:
|
|
587
|
+
- Lisa provides default values
|
|
588
|
+
- Your project's values take precedence
|
|
589
|
+
- Missing scripts/dependencies are added without overwriting existing ones
|
|
590
|
+
|
|
591
|
+
## Architecture
|
|
592
|
+
|
|
593
|
+
Lisa is written in TypeScript with the following structure:
|
|
594
|
+
|
|
595
|
+
```
|
|
596
|
+
lisa/
|
|
597
|
+
├── src/
|
|
598
|
+
│ ├── index.ts # CLI entry point
|
|
599
|
+
│ ├── cli/
|
|
600
|
+
│ │ ├── index.ts # Commander setup
|
|
601
|
+
│ │ └── prompts.ts # Interactive prompts
|
|
602
|
+
│ ├── core/
|
|
603
|
+
│ │ ├── lisa.ts # Main orchestrator
|
|
604
|
+
│ │ ├── config.ts # Types and configuration
|
|
605
|
+
│ │ └── manifest.ts # Manifest operations
|
|
606
|
+
│ ├── detection/
|
|
607
|
+
│ │ ├── index.ts # Detector registry
|
|
608
|
+
│ │ └── detectors/ # Project type detectors
|
|
609
|
+
│ ├── strategies/
|
|
610
|
+
│ │ ├── index.ts # Strategy registry
|
|
611
|
+
│ │ ├── copy-overwrite.ts
|
|
612
|
+
│ │ ├── copy-contents.ts
|
|
613
|
+
│ │ ├── create-only.ts
|
|
614
|
+
│ │ └── merge.ts
|
|
615
|
+
│ ├── transaction/
|
|
616
|
+
│ │ ├── backup.ts # Backup/restore
|
|
617
|
+
│ │ └── transaction.ts # Atomic wrapper
|
|
618
|
+
│ ├── logging/ # Console logger
|
|
619
|
+
│ ├── errors/ # Custom error types
|
|
620
|
+
│ └── utils/ # File and JSON utilities
|
|
621
|
+
├── all/ # Applied to all projects
|
|
622
|
+
├── typescript/ # TypeScript projects
|
|
623
|
+
├── npm-package/ # Publishable npm packages
|
|
624
|
+
├── expo/ # Expo projects
|
|
625
|
+
├── nestjs/ # NestJS projects
|
|
626
|
+
├── cdk/ # CDK projects
|
|
627
|
+
├── tests/ # Vitest test suite
|
|
628
|
+
├── lisa.sh # Wrapper script
|
|
629
|
+
├── package.json
|
|
630
|
+
├── tsconfig.json
|
|
631
|
+
└── vitest.config.ts
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
## Coding Philosophy
|
|
635
|
+
|
|
636
|
+
Lisa enforces a consistent coding philosophy through skills and linting:
|
|
637
|
+
|
|
638
|
+
### Core Principles
|
|
639
|
+
|
|
640
|
+
1. **Immutability First** - Never mutate data; always create new references
|
|
641
|
+
2. **Function Structure** - Definitions → Side effects → Return
|
|
642
|
+
3. **Functional Transformations** - Use `map`, `filter`, `reduce` over loops
|
|
643
|
+
4. **Test-Driven Development** - Write failing tests before implementation
|
|
644
|
+
5. **Clean Deletion** - Delete old code completely; no deprecation layers
|
|
645
|
+
|
|
646
|
+
### YAGNI + SOLID + DRY + KISS
|
|
647
|
+
|
|
648
|
+
When principles conflict, **KISS wins**. The decision framework:
|
|
649
|
+
|
|
650
|
+
1. Do I need this now? (YAGNI) → If no, don't build it
|
|
651
|
+
2. Is there a simpler way? (KISS) → Choose simpler
|
|
652
|
+
3. Am I repeating 3+ times? (DRY) → Extract if simpler
|
|
653
|
+
4. Does this do one thing? (SRP) → Split only if clearer
|
|
654
|
+
|
|
655
|
+
## Configuration Customization
|
|
656
|
+
|
|
657
|
+
### Project-Specific Rules
|
|
658
|
+
|
|
659
|
+
Edit `PROJECT_RULES.md` (created by Lisa) to add project-specific instructions:
|
|
660
|
+
|
|
661
|
+
```markdown
|
|
662
|
+
# Project Rules
|
|
663
|
+
|
|
664
|
+
This is a mobile app for sports betting.
|
|
665
|
+
Always use the design system components from `@/ui`.
|
|
666
|
+
Never import directly from react-native.
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### Threshold Adjustment
|
|
670
|
+
|
|
671
|
+
Edit `eslint.thresholds.config.json` to adjust limits:
|
|
672
|
+
|
|
673
|
+
```json
|
|
674
|
+
{
|
|
675
|
+
"cognitiveComplexity": 15,
|
|
676
|
+
"maxLines": 400
|
|
677
|
+
}
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
### Local Settings
|
|
681
|
+
|
|
682
|
+
Create `.claude/settings.local.json` for machine-specific overrides:
|
|
683
|
+
|
|
684
|
+
```json
|
|
685
|
+
{
|
|
686
|
+
"env": {
|
|
687
|
+
"CUSTOM_VAR": "value"
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
This file should be in `.gitignore`.
|
|
693
|
+
|
|
694
|
+
## Troubleshooting
|
|
695
|
+
|
|
696
|
+
### Common Issues
|
|
697
|
+
|
|
698
|
+
#### "Node.js not found"
|
|
699
|
+
|
|
700
|
+
Install Node.js 18+:
|
|
701
|
+
|
|
702
|
+
```bash
|
|
703
|
+
# macOS with Homebrew
|
|
704
|
+
brew install node
|
|
705
|
+
|
|
706
|
+
# Using nvm
|
|
707
|
+
nvm install 18
|
|
708
|
+
nvm use 18
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
#### "Permission denied" when running lisa.sh
|
|
712
|
+
|
|
713
|
+
Make the script executable:
|
|
714
|
+
|
|
715
|
+
```bash
|
|
716
|
+
chmod +x ~/lisa/lisa.sh
|
|
717
|
+
```
|
|
718
|
+
|
|
719
|
+
#### JSON merge fails with "parse error"
|
|
720
|
+
|
|
721
|
+
Your project's `package.json` may have syntax errors. Validate it:
|
|
722
|
+
|
|
723
|
+
```bash
|
|
724
|
+
node -e "require('./package.json')"
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
#### Hooks not running
|
|
728
|
+
|
|
729
|
+
Ensure `.claude/settings.json` was applied and hooks are executable:
|
|
730
|
+
|
|
731
|
+
```bash
|
|
732
|
+
chmod +x .claude/hooks/*.sh
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
### Debug Mode
|
|
736
|
+
|
|
737
|
+
```bash
|
|
738
|
+
# See all operations without making changes
|
|
739
|
+
~/lisa/lisa.sh --dry-run /path/to/project
|
|
740
|
+
|
|
741
|
+
# Check compatibility issues
|
|
742
|
+
~/lisa/lisa.sh --validate /path/to/project
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
## Development
|
|
746
|
+
|
|
747
|
+
### Building
|
|
748
|
+
|
|
749
|
+
```bash
|
|
750
|
+
npm install
|
|
751
|
+
npm run build
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
### Testing
|
|
755
|
+
|
|
756
|
+
Lisa includes a comprehensive test suite using Vitest:
|
|
757
|
+
|
|
758
|
+
```bash
|
|
759
|
+
# Run all tests
|
|
760
|
+
npm test
|
|
761
|
+
|
|
762
|
+
# Run tests in watch mode
|
|
763
|
+
npm run test:watch
|
|
764
|
+
|
|
765
|
+
# Run with coverage
|
|
766
|
+
npm run test:coverage
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
### Type Checking
|
|
770
|
+
|
|
771
|
+
```bash
|
|
772
|
+
npm run typecheck
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
## Adding New Configurations
|
|
776
|
+
|
|
777
|
+
### Adding a Skill
|
|
778
|
+
|
|
779
|
+
```bash
|
|
780
|
+
mkdir -p all/copy-overwrite/.claude/skills/my-skill
|
|
781
|
+
cat > all/copy-overwrite/.claude/skills/my-skill/SKILL.md << 'EOF'
|
|
782
|
+
---
|
|
783
|
+
name: my-skill
|
|
784
|
+
description: What this skill teaches Claude
|
|
785
|
+
---
|
|
786
|
+
|
|
787
|
+
# My Skill
|
|
788
|
+
|
|
789
|
+
## When to Use
|
|
790
|
+
- Scenario 1
|
|
791
|
+
- Scenario 2
|
|
792
|
+
|
|
793
|
+
## Instructions
|
|
794
|
+
1. Step one
|
|
795
|
+
2. Step two
|
|
796
|
+
EOF
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
### Adding a Slash Command
|
|
800
|
+
|
|
801
|
+
```bash
|
|
802
|
+
mkdir -p all/copy-overwrite/.claude/commands/my-category
|
|
803
|
+
cat > all/copy-overwrite/.claude/commands/my-category/my-command.md << 'EOF'
|
|
804
|
+
---
|
|
805
|
+
description: What this command does
|
|
806
|
+
argument-hint: <optional-args>
|
|
807
|
+
---
|
|
808
|
+
|
|
809
|
+
Instructions for Claude to follow...
|
|
810
|
+
EOF
|
|
811
|
+
```
|
|
812
|
+
|
|
813
|
+
### Adding an ESLint Rule
|
|
814
|
+
|
|
815
|
+
1. Add rule to appropriate plugin in `eslint-plugin-*/rules/`
|
|
816
|
+
2. Register in plugin's `index.js`
|
|
817
|
+
3. Add tests in `__tests__/`
|
|
818
|
+
|
|
819
|
+
### Adding a New Project Type Detector
|
|
820
|
+
|
|
821
|
+
1. Create detector in `src/detection/detectors/your-type.ts`
|
|
822
|
+
2. Register in `src/detection/index.ts`
|
|
823
|
+
3. Update `PROJECT_TYPE_HIERARCHY` in `src/core/config.ts` if it has a parent
|
|
824
|
+
4. Add tests in `tests/unit/detection/`
|
|
825
|
+
|
|
826
|
+
## Changelog
|
|
827
|
+
|
|
828
|
+
### v2.0.0 (2026-01-17)
|
|
829
|
+
|
|
830
|
+
**Breaking Changes:**
|
|
831
|
+
- Rewritten from Bash to TypeScript
|
|
832
|
+
- Removed dependency on `jq` - now uses native Node.js
|
|
833
|
+
- Removed bats test suite - now uses Vitest
|
|
834
|
+
|
|
835
|
+
**Features:**
|
|
836
|
+
- Full TypeScript implementation with type safety
|
|
837
|
+
- 97 comprehensive tests with Vitest
|
|
838
|
+
- Modular architecture with dependency injection
|
|
839
|
+
- Atomic transactions with backup/rollback
|
|
840
|
+
- Improved error handling with custom error types
|
|
841
|
+
- New `npm-package` project type with automated npm publishing workflow
|
|
842
|
+
- ESLint 9 flat config support for TypeScript projects
|
|
843
|
+
|
|
844
|
+
### v1.0.0 (2026-01-17)
|
|
845
|
+
|
|
846
|
+
**Features:**
|
|
847
|
+
- Initial release
|
|
848
|
+
- Multi-layer Claude Code governance (CLAUDE.md, skills, hooks, commands)
|
|
849
|
+
- Custom ESLint plugins for code structure enforcement
|
|
850
|
+
- Project type detection (TypeScript, Expo, NestJS, CDK)
|
|
851
|
+
- Four copy strategies: copy-overwrite, copy-contents, create-only, merge
|
|
852
|
+
- Cascading type inheritance
|
|
853
|
+
- Dry-run and validate modes
|
|
854
|
+
- Non-interactive mode for CI/CD
|
|
855
|
+
- Uninstall capability with manifest tracking
|
|
856
|
+
|
|
857
|
+
**Governance Layers:**
|
|
858
|
+
- Behavioral rules via CLAUDE.md
|
|
859
|
+
- Teaching skills for coding philosophy
|
|
860
|
+
- Automated hooks for format/lint on edit
|
|
861
|
+
- Pre-built slash commands for workflows
|
|
862
|
+
- Threshold-based complexity limits
|
|
863
|
+
- Git hooks via Husky for pre-commit gates
|
|
864
|
+
|
|
865
|
+
## License
|
|
866
|
+
|
|
867
|
+
MIT License - see [LICENSE](LICENSE) for details
|