@codyswann/lisa 1.0.0 → 1.0.5
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/README.md +244 -36
- package/all/copy-overwrite/.claude/README.md +1 -3
- package/all/copy-overwrite/.claude/REFERENCE.md +519 -0
- package/all/copy-overwrite/.claude/agents/skill-evaluator.md +7 -7
- package/all/copy-overwrite/.claude/agents/test-coverage-agent.md +17 -0
- package/all/copy-overwrite/.claude/commands/git/commit.md +9 -5
- package/all/copy-overwrite/.claude/commands/git/submit-pr.md +1 -1
- package/all/copy-overwrite/.claude/commands/lisa/review-implementation.md +209 -0
- package/all/copy-overwrite/.claude/commands/project/add-test-coverage.md +58 -0
- package/all/copy-overwrite/.claude/commands/project/archive.md +1 -1
- package/all/copy-overwrite/.claude/commands/project/complete-task.md +53 -1
- package/all/copy-overwrite/.claude/commands/project/debrief.md +12 -23
- package/all/copy-overwrite/.claude/commands/project/execute.md +33 -77
- package/all/copy-overwrite/.claude/commands/project/fix-linter-error.md +87 -0
- package/all/copy-overwrite/.claude/commands/project/implement.md +24 -28
- package/all/copy-overwrite/.claude/commands/project/lower-code-complexity.md +30 -55
- package/all/copy-overwrite/.claude/commands/project/plan.md +87 -242
- package/all/copy-overwrite/.claude/commands/project/reduce-max-lines-per-function.md +76 -0
- package/all/copy-overwrite/.claude/commands/project/reduce-max-lines.md +75 -0
- package/all/copy-overwrite/.claude/commands/project/research.md +86 -188
- package/all/copy-overwrite/.claude/commands/project/review.md +19 -38
- package/all/copy-overwrite/.claude/commands/project/setup.md +1 -1
- package/all/copy-overwrite/.claude/commands/project/verify.md +62 -25
- package/all/copy-overwrite/.claude/commands/pull-request/review.md +25 -7
- package/all/copy-overwrite/.claude/commands/tasks/load.md +63 -0
- package/all/copy-overwrite/.claude/commands/tasks/sync.md +84 -0
- package/all/copy-overwrite/.claude/hooks/README.md +75 -0
- package/all/copy-overwrite/.claude/hooks/check-tired-boss.sh +61 -0
- package/all/copy-overwrite/.claude/hooks/debug-hook.sh +47 -0
- package/all/copy-overwrite/.claude/hooks/notify-ntfy.sh +2 -0
- package/all/copy-overwrite/.claude/hooks/sync-tasks.sh +95 -0
- package/all/copy-overwrite/.claude/{skills/coding-philosophy/SKILL.md → rules/coding-philosophy.md} +93 -70
- package/all/copy-overwrite/.claude/settings.json +35 -14
- package/all/copy-overwrite/.claude/skills/prompt-complexity-scorer/SKILL.md +41 -9
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/init_skill.py +2 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/package_skill.py +2 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/quick_validate.py +2 -0
- package/all/copy-overwrite/.safety-net.json +25 -0
- package/all/copy-overwrite/CLAUDE.md +8 -30
- package/all/copy-overwrite/HUMAN.md +517 -17
- package/all/create-only/.claude/rules/PROJECT_RULES.md +9 -0
- package/all/create-only/scripts/setup-deploy-key.sh +190 -0
- package/all/deletions.json +5 -0
- package/cdk/copy-overwrite/.github/workflows/ci.yml +142 -0
- package/cdk/copy-overwrite/.github/workflows/deploy.yml +59 -0
- package/cdk/copy-overwrite/eslint.cdk.ts +175 -0
- package/cdk/copy-overwrite/eslint.config.ts +51 -0
- package/cdk/copy-overwrite/eslint.slow.config.ts +80 -0
- package/cdk/copy-overwrite/knip.json +53 -0
- package/cdk/copy-overwrite/tsconfig.eslint.json +11 -0
- package/cdk/merge/package.json +17 -1
- package/dist/cli/index.d.ts +3 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +83 -64
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/prompts.d.ts +17 -3
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +52 -16
- package/dist/cli/prompts.js.map +1 -1
- package/dist/core/config.d.ts +13 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +17 -9
- package/dist/core/config.js.map +1 -1
- package/dist/core/git-service.d.ts +40 -0
- package/dist/core/git-service.d.ts.map +1 -0
- package/dist/core/git-service.js +52 -0
- package/dist/core/git-service.js.map +1 -0
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +3 -3
- package/dist/core/lisa.d.ts +124 -7
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +423 -221
- package/dist/core/lisa.js.map +1 -1
- package/dist/core/manifest.d.ts +5 -1
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/manifest.js +22 -16
- package/dist/core/manifest.js.map +1 -1
- package/dist/detection/detector.interface.d.ts +1 -1
- package/dist/detection/detectors/cdk.d.ts +6 -1
- package/dist/detection/detectors/cdk.d.ts.map +1 -1
- package/dist/detection/detectors/cdk.js +16 -8
- package/dist/detection/detectors/cdk.js.map +1 -1
- package/dist/detection/detectors/expo.d.ts +6 -1
- package/dist/detection/detectors/expo.d.ts.map +1 -1
- package/dist/detection/detectors/expo.js +13 -8
- package/dist/detection/detectors/expo.js.map +1 -1
- package/dist/detection/detectors/nestjs.d.ts +7 -2
- package/dist/detection/detectors/nestjs.d.ts.map +1 -1
- package/dist/detection/detectors/nestjs.js +17 -9
- package/dist/detection/detectors/nestjs.js.map +1 -1
- package/dist/detection/detectors/npm-package.d.ts +6 -1
- package/dist/detection/detectors/npm-package.d.ts.map +1 -1
- package/dist/detection/detectors/npm-package.js +9 -4
- package/dist/detection/detectors/npm-package.js.map +1 -1
- package/dist/detection/detectors/typescript.d.ts +6 -1
- package/dist/detection/detectors/typescript.d.ts.map +1 -1
- package/dist/detection/detectors/typescript.js +12 -7
- package/dist/detection/detectors/typescript.js.map +1 -1
- package/dist/detection/index.d.ts +13 -3
- package/dist/detection/index.d.ts.map +1 -1
- package/dist/detection/index.js +17 -7
- package/dist/detection/index.js.map +1 -1
- package/dist/errors/index.d.ts +66 -2
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +89 -17
- package/dist/errors/index.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/logging/console-logger.d.ts +21 -1
- package/dist/logging/console-logger.d.ts.map +1 -1
- package/dist/logging/console-logger.js +26 -6
- package/dist/logging/console-logger.js.map +1 -1
- package/dist/logging/index.d.ts +3 -3
- package/dist/logging/index.js +2 -2
- package/dist/logging/logger.interface.d.ts +1 -1
- package/dist/logging/silent-logger.d.ts +21 -1
- package/dist/logging/silent-logger.d.ts.map +1 -1
- package/dist/logging/silent-logger.js +20 -0
- package/dist/logging/silent-logger.js.map +1 -1
- package/dist/strategies/copy-contents.d.ts +47 -6
- package/dist/strategies/copy-contents.d.ts.map +1 -1
- package/dist/strategies/copy-contents.js +99 -49
- package/dist/strategies/copy-contents.js.map +1 -1
- package/dist/strategies/copy-overwrite.d.ts +10 -2
- package/dist/strategies/copy-overwrite.d.ts.map +1 -1
- package/dist/strategies/copy-overwrite.js +17 -9
- package/dist/strategies/copy-overwrite.js.map +1 -1
- package/dist/strategies/create-only.d.ts +10 -2
- package/dist/strategies/create-only.d.ts.map +1 -1
- package/dist/strategies/create-only.js +14 -6
- package/dist/strategies/create-only.js.map +1 -1
- package/dist/strategies/index.d.ts +17 -7
- package/dist/strategies/index.d.ts.map +1 -1
- package/dist/strategies/index.js +19 -9
- package/dist/strategies/index.js.map +1 -1
- package/dist/strategies/merge.d.ts +10 -2
- package/dist/strategies/merge.d.ts.map +1 -1
- package/dist/strategies/merge.js +21 -21
- package/dist/strategies/merge.js.map +1 -1
- package/dist/strategies/strategy.interface.d.ts +1 -1
- package/dist/strategies/strategy.interface.d.ts.map +1 -1
- package/dist/transaction/backup.d.ts +15 -1
- package/dist/transaction/backup.d.ts.map +1 -1
- package/dist/transaction/backup.js +47 -12
- package/dist/transaction/backup.js.map +1 -1
- package/dist/transaction/index.d.ts +3 -3
- package/dist/transaction/index.js +2 -2
- package/dist/transaction/transaction.d.ts +25 -2
- package/dist/transaction/transaction.d.ts.map +1 -1
- package/dist/transaction/transaction.js +25 -2
- package/dist/transaction/transaction.js.map +1 -1
- package/dist/utils/file-operations.d.ts +21 -0
- package/dist/utils/file-operations.d.ts.map +1 -1
- package/dist/utils/file-operations.js +48 -12
- package/dist/utils/file-operations.js.map +1 -1
- package/dist/utils/index.d.ts +3 -3
- package/dist/utils/index.js +3 -3
- package/dist/utils/json-utils.d.ts +12 -0
- package/dist/utils/json-utils.d.ts.map +1 -1
- package/dist/utils/json-utils.js +17 -5
- package/dist/utils/json-utils.js.map +1 -1
- package/dist/utils/path-utils.d.ts +11 -0
- package/dist/utils/path-utils.d.ts.map +1 -1
- package/dist/utils/path-utils.js +12 -1
- package/dist/utils/path-utils.js.map +1 -1
- package/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +5 -0
- package/eslint-plugin-code-organization/index.js +5 -0
- package/eslint-plugin-code-organization/rules/enforce-statement-order.js +5 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +2 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/create_component.py +2 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/validate_component.py +2 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +2 -0
- package/expo/copy-overwrite/.claude/skills/directory-structure/scripts/validate_structure.py +2 -0
- package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/scripts/generate-route.py +2 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/scripts/validate_styling.py +2 -41
- package/{typescript → expo}/copy-overwrite/.github/workflows/build.yml +3 -0
- package/expo/copy-overwrite/.github/workflows/ci.yml +36 -0
- package/{typescript → expo}/copy-overwrite/.github/workflows/deploy.yml +22 -26
- package/{typescript → expo}/copy-overwrite/.github/workflows/lighthouse.yml +4 -1
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/plugin-index.test.js +5 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/require-memo-in-view.test.js +5 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/single-component-per-file.test.js +5 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/index.js +5 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/enforce-component-structure.js +5 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/no-return-in-view.js +6 -1
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/require-memo-in-view.js +5 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/single-component-per-file.js +5 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/README.md +0 -68
- package/expo/copy-overwrite/eslint-plugin-ui-standards/index.js +5 -3
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-classname-outside-ui.js +5 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-direct-rn-imports.js +5 -0
- package/expo/copy-overwrite/eslint.config.ts +53 -0
- package/expo/copy-overwrite/eslint.expo.ts +330 -0
- package/expo/copy-overwrite/eslint.slow.config.ts +86 -0
- package/expo/copy-overwrite/knip.json +132 -0
- package/expo/copy-overwrite/lighthouserc.js +27 -0
- package/expo/copy-overwrite/tsconfig.eslint.json +25 -0
- package/expo/create-only/lighthouserc-config.json +6 -1
- package/expo/merge/package.json +16 -3
- package/nestjs/copy-overwrite/.claude/skills/nestjs-rules/SKILL.md +1 -1
- package/{typescript → nestjs}/copy-overwrite/.github/k6/README.md +2 -2
- package/{typescript → nestjs}/copy-overwrite/.github/k6/examples/customer-deploy-integration.yml +3 -0
- package/{typescript → nestjs}/copy-overwrite/.github/k6/examples/data-driven-test.js +5 -0
- package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/load.js +6 -2
- package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/smoke.js +5 -0
- package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/soak.js +5 -0
- package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/spike.js +5 -0
- package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/stress.js +5 -0
- package/{typescript → nestjs}/copy-overwrite/.github/k6/scripts/api-test.js +5 -0
- package/{typescript → nestjs}/copy-overwrite/.github/k6/scripts/default-test.js +5 -0
- package/nestjs/copy-overwrite/.github/workflows/ci.yml +29 -0
- package/nestjs/copy-overwrite/.github/workflows/deploy.yml +291 -0
- package/{typescript → nestjs}/copy-overwrite/.github/workflows/load-test.yml +3 -0
- package/nestjs/copy-overwrite/eslint.config.ts +53 -0
- package/nestjs/copy-overwrite/eslint.nestjs.ts +178 -0
- package/nestjs/merge/package.json +11 -3
- package/package.json +34 -40
- package/typescript/copy-contents/.husky/pre-commit +1 -1
- package/typescript/copy-contents/.husky/pre-push +99 -118
- package/typescript/copy-overwrite/.claude/hooks/format-on-edit.sh +2 -0
- package/typescript/copy-overwrite/.claude/hooks/install_pkgs.sh +3 -11
- package/typescript/copy-overwrite/.claude/hooks/lint-on-edit.sh +2 -0
- package/typescript/copy-overwrite/.claude/hooks/sg-scan-on-edit.sh +68 -0
- package/typescript/copy-overwrite/.claude/settings.json +79 -0
- package/typescript/copy-overwrite/.claude/skills/jsdoc-best-practices/SKILL.md +44 -0
- package/typescript/copy-overwrite/.github/README.md +49 -1
- package/typescript/copy-overwrite/.github/dependabot.yml +3 -0
- package/typescript/copy-overwrite/.github/workflows/ci.yml +7 -29
- package/typescript/copy-overwrite/.github/workflows/claude.yml +3 -0
- package/typescript/copy-overwrite/.github/workflows/create-github-issue-on-failure.yml +6 -4
- package/typescript/copy-overwrite/.github/workflows/create-issue-on-failure.yml +176 -0
- package/typescript/copy-overwrite/.github/workflows/create-jira-issue-on-failure.yml +3 -1
- package/typescript/copy-overwrite/.github/workflows/create-sentry-issue-on-failure.yml +3 -1
- package/typescript/copy-overwrite/.github/workflows/lint-slow.yml +40 -0
- package/typescript/copy-overwrite/.github/workflows/quality.yml +151 -38
- package/typescript/copy-overwrite/.github/workflows/release.yml +3 -0
- package/typescript/copy-overwrite/.gitleaksignore +3 -0
- package/typescript/copy-overwrite/.lintstagedrc.json +6 -0
- package/typescript/copy-overwrite/.prettierignore +2 -1
- package/typescript/copy-overwrite/.yamllint +2 -0
- package/typescript/copy-overwrite/ast-grep/rule-tests/.gitkeep +3 -0
- package/typescript/copy-overwrite/ast-grep/rules/.gitkeep +3 -0
- package/typescript/copy-overwrite/ast-grep/utils/.gitkeep +3 -0
- package/typescript/copy-overwrite/{commitlint.config.js → commitlint.config.cjs} +5 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +5 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/index.js +5 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/rules/enforce-statement-order.js +5 -0
- package/typescript/copy-overwrite/eslint.base.ts +430 -0
- package/typescript/copy-overwrite/eslint.config.ts +52 -0
- package/typescript/copy-overwrite/eslint.ignore.config.json +19 -2
- package/typescript/copy-overwrite/eslint.slow.config.ts +69 -0
- package/typescript/copy-overwrite/eslint.typescript.ts +142 -0
- package/typescript/copy-overwrite/knip.json +64 -0
- package/typescript/copy-overwrite/sgconfig.yml +11 -0
- package/typescript/copy-overwrite/tsconfig.eslint.json +9 -0
- package/typescript/create-only/eslint.config.local.ts +24 -0
- package/typescript/{copy-overwrite/eslint.thresholds.config.json → create-only/eslint.thresholds.json} +1 -1
- package/typescript/github-rulesets/base.json +2 -75
- package/typescript/merge/.claude/settings.json +160 -0
- package/typescript/merge/package.json +35 -34
- package/all/copy-overwrite/.claude/commands/rules/format-md.md +0 -72
- package/all/copy-overwrite/.claude/skills/coding-philosophy/references/function-structure.md +0 -416
- package/all/copy-overwrite/.claude/skills/coding-philosophy/references/immutable-patterns.md +0 -316
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-inline-styles.js +0 -73
- package/expo/copy-overwrite/eslint.config.mjs +0 -560
- package/lisa.sh +0 -35
- package/typescript/copy-overwrite/eslint.config.mjs +0 -390
- /package/{all/create-only/PROJECT_RULES.md → cdk/copy-overwrite/.github/workflows/.keep} +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/BROWSER_TESTING_NOTE.md +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/INTEGRATION_GUIDE.md +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/SCENARIO_SELECTION_GUIDE.md +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/load.json +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/smoke.json +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/soak.json +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/spike.json +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/scenarios/stress.json +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/thresholds/normal.json +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/thresholds/relaxed.json +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/k6/thresholds/strict.json +0 -0
- /package/{typescript → nestjs}/copy-overwrite/.github/workflows/k6-load-test-README.md +0 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# This file is managed by Lisa.
|
|
2
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
3
|
+
|
|
4
|
+
# This is an example deployment workflow that demonstrates the recommended pattern:
|
|
5
|
+
# 1. Call the release.yml workflow to create a release
|
|
6
|
+
# 2. Implement your custom deployment logic
|
|
7
|
+
# 3. Optionally run load tests for staging deployments
|
|
8
|
+
#
|
|
9
|
+
# The release.yml workflow is kept separate from deployment to allow:
|
|
10
|
+
# - Different deployment strategies per project (AWS, Azure, GCP, etc.)
|
|
11
|
+
# - Custom deployment logic without modifying the release workflow
|
|
12
|
+
# - Optional load testing based on environment
|
|
13
|
+
# - Flexibility to deploy the same release to multiple environments
|
|
14
|
+
|
|
15
|
+
name: 🚀 Release and Deploy
|
|
16
|
+
|
|
17
|
+
on:
|
|
18
|
+
push:
|
|
19
|
+
branches:
|
|
20
|
+
- main
|
|
21
|
+
- staging
|
|
22
|
+
- dev
|
|
23
|
+
workflow_dispatch:
|
|
24
|
+
inputs:
|
|
25
|
+
environment:
|
|
26
|
+
description: 'Environment to deploy to'
|
|
27
|
+
required: true
|
|
28
|
+
default: 'dev'
|
|
29
|
+
type: choice
|
|
30
|
+
options:
|
|
31
|
+
- main
|
|
32
|
+
- staging
|
|
33
|
+
- dev
|
|
34
|
+
|
|
35
|
+
# Prevent concurrent runs of the same workflow on the same ref
|
|
36
|
+
concurrency:
|
|
37
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
38
|
+
cancel-in-progress: true
|
|
39
|
+
|
|
40
|
+
jobs:
|
|
41
|
+
# Environment setup
|
|
42
|
+
determine_environment:
|
|
43
|
+
name: 🌍 Determine Environment
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
timeout-minutes: 5
|
|
46
|
+
outputs:
|
|
47
|
+
environment: ${{ steps.env.outputs.environment }}
|
|
48
|
+
steps:
|
|
49
|
+
- name: 🔄 Set environment
|
|
50
|
+
id: env
|
|
51
|
+
run: |
|
|
52
|
+
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
|
|
53
|
+
echo "environment=${{ github.event.inputs.environment }}" >> $GITHUB_OUTPUT
|
|
54
|
+
else
|
|
55
|
+
echo "environment=${{ github.ref_name }}" >> $GITHUB_OUTPUT
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# Step 1: Create a release
|
|
59
|
+
release:
|
|
60
|
+
name: 📦 Release
|
|
61
|
+
uses: ./.github/workflows/release.yml
|
|
62
|
+
needs: [determine_environment]
|
|
63
|
+
with:
|
|
64
|
+
environment: ${{ needs.determine_environment.outputs.environment }}
|
|
65
|
+
release_strategy: 'semantic'
|
|
66
|
+
skip_jobs: 'test:e2e,test:unit,test:integration,test'
|
|
67
|
+
# require_approval: ${{ needs.determine_environment.outputs.environment == 'main' }}
|
|
68
|
+
# require_signatures: ${{ needs.determine_environment.outputs.environment == 'main' }}
|
|
69
|
+
generate_sbom: true
|
|
70
|
+
override_blackout: true
|
|
71
|
+
require_approval: false
|
|
72
|
+
require_signatures: false
|
|
73
|
+
node_version: '22.21.1'
|
|
74
|
+
package_manager: 'bun'
|
|
75
|
+
secrets: inherit
|
|
76
|
+
|
|
77
|
+
check_migration_required:
|
|
78
|
+
name: Check Migration Required
|
|
79
|
+
runs-on: ubuntu-latest
|
|
80
|
+
needs: [release]
|
|
81
|
+
outputs:
|
|
82
|
+
requires_migration: ${{ steps.check.outputs.requires_migration }}
|
|
83
|
+
steps:
|
|
84
|
+
- name: Checkout
|
|
85
|
+
uses: actions/checkout@v4
|
|
86
|
+
- id: check
|
|
87
|
+
run: |
|
|
88
|
+
if [[ -z "${SKIP_MIGRATIONS}" ]]; then
|
|
89
|
+
echo "requires_migration=true" >> $GITHUB_OUTPUT
|
|
90
|
+
else
|
|
91
|
+
echo "requires_migration=false" >> $GITHUB_OUTPUT
|
|
92
|
+
fi
|
|
93
|
+
shell: bash
|
|
94
|
+
env:
|
|
95
|
+
SKIP_MIGRATIONS: ${{ vars.SKIP_MIGRATIONS }}
|
|
96
|
+
|
|
97
|
+
verify_vpn:
|
|
98
|
+
name: Verify VPN
|
|
99
|
+
runs-on: ubuntu-latest
|
|
100
|
+
needs: [check_migration_required]
|
|
101
|
+
if: always() && needs.check_migration_required.outputs.requires_migration == 'true'
|
|
102
|
+
outputs:
|
|
103
|
+
has_vpn_setup: ${{ steps.check.outputs.has_vpn_setup }}
|
|
104
|
+
steps:
|
|
105
|
+
- name: Checkout
|
|
106
|
+
uses: actions/checkout@v4
|
|
107
|
+
- uses: noliran/branch-based-secrets@v1
|
|
108
|
+
with:
|
|
109
|
+
secrets: OVPN_CONFIG
|
|
110
|
+
- id: check
|
|
111
|
+
run: |
|
|
112
|
+
if [[ -z "${OVPN_CONFIG}" ]]; then
|
|
113
|
+
echo "has_vpn_setup=false" >> $GITHUB_OUTPUT
|
|
114
|
+
else
|
|
115
|
+
echo "has_vpn_setup=true" >> $GITHUB_OUTPUT
|
|
116
|
+
fi
|
|
117
|
+
env:
|
|
118
|
+
OVPN_CONFIG: ${{ secrets[env.OVPN_CONFIG_NAME] }}
|
|
119
|
+
migrate:
|
|
120
|
+
name: Schema Migrations
|
|
121
|
+
runs-on: ubuntu-latest
|
|
122
|
+
needs: [determine_environment, verify_vpn]
|
|
123
|
+
if: always() && needs.verify_vpn.outputs.has_vpn_setup == 'true'
|
|
124
|
+
permissions:
|
|
125
|
+
id-token: write # needed to interact with GitHub's OIDC Token endpoint.
|
|
126
|
+
contents: read
|
|
127
|
+
steps:
|
|
128
|
+
- uses: actions/checkout@v2
|
|
129
|
+
- uses: noliran/branch-based-secrets@v1
|
|
130
|
+
with:
|
|
131
|
+
secrets: AWS_ACCOUNT_ID
|
|
132
|
+
- name: configure aws credentials
|
|
133
|
+
uses: aws-actions/configure-aws-credentials@v1
|
|
134
|
+
with:
|
|
135
|
+
role-to-assume: arn:aws:iam::${{ secrets[env.AWS_ACCOUNT_ID_NAME] }}:role/DeployServiceRole
|
|
136
|
+
role-session-name: fedeploysession
|
|
137
|
+
aws-region: us-east-1
|
|
138
|
+
- name: Install Open VPN
|
|
139
|
+
run: sudo apt-get update; sudo apt-get install openvpn
|
|
140
|
+
- uses: noliran/branch-based-secrets@v1
|
|
141
|
+
with:
|
|
142
|
+
secrets: OVPN_CONFIG
|
|
143
|
+
- name: Setup VPN config
|
|
144
|
+
run: |
|
|
145
|
+
echo -e "${{ secrets[env.OVPN_CONFIG_NAME] }}" > config.ovpn
|
|
146
|
+
sudo chmod 700 config.ovpn
|
|
147
|
+
- name: Connect VPN
|
|
148
|
+
run: |
|
|
149
|
+
sudo openvpn --config "config.ovpn" --log "vpn.log" --daemon
|
|
150
|
+
- name: Wait for a VPN connection
|
|
151
|
+
timeout-minutes: 2
|
|
152
|
+
run: |
|
|
153
|
+
sleep 60s
|
|
154
|
+
sudo cat vpn.log
|
|
155
|
+
- name: Setup Bun
|
|
156
|
+
uses: oven-sh/setup-bun@v2
|
|
157
|
+
with:
|
|
158
|
+
bun-version: latest
|
|
159
|
+
- name: Install dependencies
|
|
160
|
+
run: bun install
|
|
161
|
+
- name: Run Schema Migrations
|
|
162
|
+
run: STAGE=${{ needs.determine_environment.outputs.environment != 'main' && needs.determine_environment.outputs.environment || 'production' }} bun run migration:run
|
|
163
|
+
env:
|
|
164
|
+
SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }}
|
|
165
|
+
AWS_PROFILE: '' # Override serverless.yml profile with empty string for CI
|
|
166
|
+
deploy:
|
|
167
|
+
needs: [determine_environment, migrate]
|
|
168
|
+
if: |
|
|
169
|
+
always() &&
|
|
170
|
+
(needs.migrate.result == 'success' || needs.migrate.result == 'skipped')
|
|
171
|
+
name: Deploy
|
|
172
|
+
runs-on: ubuntu-latest
|
|
173
|
+
outputs:
|
|
174
|
+
environment_url: ${{ steps.deploy.outputs.environment_url }}
|
|
175
|
+
deployment_status: ${{ steps.deploy.outputs.deployment_status }}
|
|
176
|
+
permissions:
|
|
177
|
+
id-token: write # needed to interact with GitHub's OIDC Token endpoint
|
|
178
|
+
contents: read
|
|
179
|
+
steps:
|
|
180
|
+
- uses: actions/checkout@v3
|
|
181
|
+
- name: Setup Bun
|
|
182
|
+
uses: oven-sh/setup-bun@v2
|
|
183
|
+
with:
|
|
184
|
+
bun-version: latest
|
|
185
|
+
- uses: noliran/branch-based-secrets@v1
|
|
186
|
+
with:
|
|
187
|
+
secrets: AWS_ACCOUNT_ID
|
|
188
|
+
- name: configure aws credentials
|
|
189
|
+
uses: aws-actions/configure-aws-credentials@v1
|
|
190
|
+
with:
|
|
191
|
+
role-to-assume: arn:aws:iam::${{ secrets[env.AWS_ACCOUNT_ID_NAME] }}:role/DeployServiceRole
|
|
192
|
+
role-session-name: fedeploysession
|
|
193
|
+
aws-region: us-east-1
|
|
194
|
+
- name: Install dependencies
|
|
195
|
+
run: bun install
|
|
196
|
+
- name: serverless deploy
|
|
197
|
+
id: deploy
|
|
198
|
+
run: |
|
|
199
|
+
STAGE=${{ needs.determine_environment.outputs.environment != 'main' && needs.determine_environment.outputs.environment || 'production' }}
|
|
200
|
+
OUTPUT=$(bun run serverless deploy --stage $STAGE 2>&1) || {
|
|
201
|
+
echo "deployment_status=failed" >> $GITHUB_OUTPUT
|
|
202
|
+
echo "$OUTPUT"
|
|
203
|
+
exit 1
|
|
204
|
+
}
|
|
205
|
+
echo "$OUTPUT"
|
|
206
|
+
# Extract endpoint URL from serverless output
|
|
207
|
+
ENDPOINT_URL=$(echo "$OUTPUT" | grep -oP 'endpoint: \K(https?://[^\s]+)' | head -1 || echo "")
|
|
208
|
+
if [ -z "$ENDPOINT_URL" ]; then
|
|
209
|
+
# Fallback: try to extract any URL from output
|
|
210
|
+
ENDPOINT_URL=$(echo "$OUTPUT" | grep -oP 'https?://[^\s]+' | head -1 || echo "")
|
|
211
|
+
fi
|
|
212
|
+
echo "environment_url=$ENDPOINT_URL" >> $GITHUB_OUTPUT
|
|
213
|
+
echo "deployment_status=success" >> $GITHUB_OUTPUT
|
|
214
|
+
env:
|
|
215
|
+
SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }}
|
|
216
|
+
AWS_PROFILE: '' # Override serverless.yml profile with empty string for CI
|
|
217
|
+
|
|
218
|
+
- name: 📢 Notify on success
|
|
219
|
+
run: echo "Successfully deployed version ${{ needs.release.outputs.version }} to ${{ needs.determine_environment.outputs.environment }}"
|
|
220
|
+
|
|
221
|
+
# Step 3: Load testing for staging deployments
|
|
222
|
+
load_testing:
|
|
223
|
+
name: 🔍 Load Testing
|
|
224
|
+
needs: [determine_environment, release, deploy]
|
|
225
|
+
if: |
|
|
226
|
+
always() &&
|
|
227
|
+
!cancelled() &&
|
|
228
|
+
needs.deploy.result == 'success' &&
|
|
229
|
+
(needs.determine_environment.outputs.environment == 'staging' || needs.determine_environment.outputs.environment == 'stage')
|
|
230
|
+
uses: ./.github/workflows/load-test.yml
|
|
231
|
+
with:
|
|
232
|
+
environment: ${{ needs.determine_environment.outputs.environment }}
|
|
233
|
+
test_scenario: 'smoke' # Start with smoke test after deployment
|
|
234
|
+
base_url: ${{ needs.deploy.outputs.environment_url }}
|
|
235
|
+
test_duration: '5m'
|
|
236
|
+
virtual_users: 50
|
|
237
|
+
fail_on_threshold: false # Don't fail the release if load test fails
|
|
238
|
+
upload_results: true
|
|
239
|
+
secrets: inherit
|
|
240
|
+
|
|
241
|
+
# Post-deployment monitoring (optional)
|
|
242
|
+
post_deployment_monitoring:
|
|
243
|
+
name: 📊 Post-Deployment Monitoring
|
|
244
|
+
needs: [determine_environment, release, deploy, load_testing]
|
|
245
|
+
if: |
|
|
246
|
+
always() &&
|
|
247
|
+
!cancelled() &&
|
|
248
|
+
needs.deploy.result == 'success'
|
|
249
|
+
runs-on: ubuntu-latest
|
|
250
|
+
steps:
|
|
251
|
+
- name: Monitor Deployment Health
|
|
252
|
+
run: |
|
|
253
|
+
echo "## 📊 Post-Deployment Monitoring" >> $GITHUB_STEP_SUMMARY
|
|
254
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
255
|
+
echo "- **Environment**: ${{ needs.determine_environment.outputs.environment }}" >> $GITHUB_STEP_SUMMARY
|
|
256
|
+
echo "- **Version**: ${{ needs.release.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
|
257
|
+
echo "- **Deployment Status**: ${{ needs.deploy.outputs.deployment_status }}" >> $GITHUB_STEP_SUMMARY
|
|
258
|
+
echo "- **Environment URL**: ${{ needs.deploy.outputs.environment_url }}" >> $GITHUB_STEP_SUMMARY
|
|
259
|
+
|
|
260
|
+
# Add load test results for staging
|
|
261
|
+
if [[ "${{ needs.determine_environment.outputs.environment }}" == "staging" || "${{ needs.determine_environment.outputs.environment }}" == "stage" ]]; then
|
|
262
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
263
|
+
echo "### 🔍 Load Test Results" >> $GITHUB_STEP_SUMMARY
|
|
264
|
+
echo "- **Test Scenario**: smoke" >> $GITHUB_STEP_SUMMARY
|
|
265
|
+
echo "- **Duration**: 5m" >> $GITHUB_STEP_SUMMARY
|
|
266
|
+
echo "- **Virtual Users**: 50" >> $GITHUB_STEP_SUMMARY
|
|
267
|
+
echo "- **Status**: ${{ needs.load_testing.result }}" >> $GITHUB_STEP_SUMMARY
|
|
268
|
+
fi
|
|
269
|
+
|
|
270
|
+
# Add monitoring checks here
|
|
271
|
+
# - Check application metrics
|
|
272
|
+
# - Verify error rates
|
|
273
|
+
# - Monitor response times
|
|
274
|
+
# - Check resource utilization
|
|
275
|
+
|
|
276
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
277
|
+
echo "✅ Post-deployment monitoring complete" >> $GITHUB_STEP_SUMMARY
|
|
278
|
+
|
|
279
|
+
# Basic health check (uncomment and customize)
|
|
280
|
+
# curl -f ${{ needs.deploy.outputs.environment_url }}/health || echo "Health check failed"
|
|
281
|
+
create_issue_on_failure:
|
|
282
|
+
name: 📌 Create Issue on Failure
|
|
283
|
+
needs: [release, deploy]
|
|
284
|
+
if: ${{ always() && (needs.release.result == 'failure' || needs.deploy.result == 'failure') && !contains(github.event.head_commit.message, '[skip ci]') }}
|
|
285
|
+
uses: ./.github/workflows/create-issue-on-failure.yml
|
|
286
|
+
with:
|
|
287
|
+
package_manager: 'bun'
|
|
288
|
+
node_version: '22.21.1'
|
|
289
|
+
workflow_name: 'Release and Deploy'
|
|
290
|
+
failed_job: ${{ needs.release.result == 'failure' && 'release' || 'deploy' }}
|
|
291
|
+
secrets: inherit
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is managed by Lisa.
|
|
3
|
+
* Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* ESLint 9 Flat Config - Main Entry Point (NestJS)
|
|
8
|
+
*
|
|
9
|
+
* This file imports the NestJS-specific configuration and project-local customizations.
|
|
10
|
+
* Do not modify this file directly - use eslint.config.local.ts for project-specific rules.
|
|
11
|
+
*
|
|
12
|
+
* Inheritance chain:
|
|
13
|
+
* eslint.config.ts (this file)
|
|
14
|
+
* └── eslint.nestjs.ts
|
|
15
|
+
* └── eslint.typescript.ts
|
|
16
|
+
* └── eslint.base.ts
|
|
17
|
+
*
|
|
18
|
+
* @see https://eslint.org/docs/latest/use/configure/configuration-files-new
|
|
19
|
+
* @module eslint.config
|
|
20
|
+
*/
|
|
21
|
+
import path from "path";
|
|
22
|
+
import { fileURLToPath } from "url";
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
defaultIgnores,
|
|
26
|
+
defaultThresholds,
|
|
27
|
+
getNestjsConfig,
|
|
28
|
+
} from "./eslint.nestjs";
|
|
29
|
+
|
|
30
|
+
// Project-specific configuration loaded from JSON files
|
|
31
|
+
import ignoreConfig from "./eslint.ignore.config.json" with { type: "json" };
|
|
32
|
+
import thresholdsConfig from "./eslint.thresholds.json" with { type: "json" };
|
|
33
|
+
|
|
34
|
+
// Project-local customizations (create-only - safe to modify)
|
|
35
|
+
import localConfig from "./eslint.config.local";
|
|
36
|
+
|
|
37
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
38
|
+
const __dirname = path.dirname(__filename);
|
|
39
|
+
|
|
40
|
+
const ignorePatterns = ignoreConfig.ignores || defaultIgnores;
|
|
41
|
+
const thresholds = { ...defaultThresholds, ...thresholdsConfig };
|
|
42
|
+
|
|
43
|
+
export default [
|
|
44
|
+
// Stack-specific configuration (NestJS)
|
|
45
|
+
...getNestjsConfig({
|
|
46
|
+
tsconfigRootDir: __dirname,
|
|
47
|
+
ignorePatterns,
|
|
48
|
+
thresholds,
|
|
49
|
+
}),
|
|
50
|
+
|
|
51
|
+
// Project-local customizations
|
|
52
|
+
...localConfig,
|
|
53
|
+
];
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is managed by Lisa.
|
|
3
|
+
* Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* eslint-disable max-lines-per-function -- config file requires many lines */
|
|
7
|
+
/**
|
|
8
|
+
* ESLint 9 Flat Config - NestJS Stack
|
|
9
|
+
*
|
|
10
|
+
* This configuration extends TypeScript config for NestJS projects.
|
|
11
|
+
* It adjusts rules for NestJS patterns like decorators, dependency injection,
|
|
12
|
+
* and class-based architecture.
|
|
13
|
+
*
|
|
14
|
+
* Inheritance chain:
|
|
15
|
+
* eslint.nestjs.ts (this file)
|
|
16
|
+
* └── eslint.typescript.ts
|
|
17
|
+
* └── eslint.base.ts
|
|
18
|
+
*
|
|
19
|
+
* @see https://eslint.org/docs/latest/use/configure/configuration-files-new
|
|
20
|
+
* @module eslint.nestjs
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
// Import TypeScript config and utilities
|
|
24
|
+
import {
|
|
25
|
+
codeOrganization,
|
|
26
|
+
defaultIgnores,
|
|
27
|
+
defaultThresholds,
|
|
28
|
+
getBaseConfigs,
|
|
29
|
+
getBaseLanguageOptions,
|
|
30
|
+
getJsFilesOverride,
|
|
31
|
+
getSharedFilesOverride,
|
|
32
|
+
getSharedRules,
|
|
33
|
+
getTestFilesOverride,
|
|
34
|
+
getTsFilesOverride,
|
|
35
|
+
getTsTestFilesOverride,
|
|
36
|
+
} from "./eslint.typescript";
|
|
37
|
+
|
|
38
|
+
// Re-export for downstream configs
|
|
39
|
+
export {
|
|
40
|
+
defaultIgnores,
|
|
41
|
+
defaultThresholds,
|
|
42
|
+
getBaseConfigs,
|
|
43
|
+
getBaseLanguageOptions,
|
|
44
|
+
getSharedRules,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates the NestJS ESLint configuration.
|
|
49
|
+
*
|
|
50
|
+
* @param {object} options - Configuration options
|
|
51
|
+
* @param {string} options.tsconfigRootDir - Root directory for tsconfig.json
|
|
52
|
+
* @param {string[]} [options.ignorePatterns] - Patterns to ignore
|
|
53
|
+
* @param {object} [options.thresholds] - Threshold overrides
|
|
54
|
+
* @returns {Array} ESLint flat config array
|
|
55
|
+
*/
|
|
56
|
+
export function getNestjsConfig({
|
|
57
|
+
tsconfigRootDir,
|
|
58
|
+
ignorePatterns = defaultIgnores,
|
|
59
|
+
thresholds = defaultThresholds,
|
|
60
|
+
}: {
|
|
61
|
+
tsconfigRootDir: string;
|
|
62
|
+
ignorePatterns?: string[];
|
|
63
|
+
thresholds?: typeof defaultThresholds;
|
|
64
|
+
}) {
|
|
65
|
+
return [
|
|
66
|
+
// Global ignores
|
|
67
|
+
{
|
|
68
|
+
ignores: ignorePatterns,
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
// Base configurations from shared module
|
|
72
|
+
...getBaseConfigs(),
|
|
73
|
+
|
|
74
|
+
// Base configuration for all files
|
|
75
|
+
{
|
|
76
|
+
languageOptions: getBaseLanguageOptions(),
|
|
77
|
+
plugins: {
|
|
78
|
+
"code-organization": codeOrganization,
|
|
79
|
+
},
|
|
80
|
+
rules: {
|
|
81
|
+
// Shared rules from base
|
|
82
|
+
...getSharedRules(thresholds),
|
|
83
|
+
|
|
84
|
+
// Code organization
|
|
85
|
+
"code-organization/enforce-statement-order": "error",
|
|
86
|
+
|
|
87
|
+
// Configuration enforcement - prevent direct process.env access
|
|
88
|
+
// All configuration should go through ConfigService
|
|
89
|
+
// @see .claude/rules/PROJECT_RULES.md
|
|
90
|
+
"no-restricted-syntax": [
|
|
91
|
+
"error",
|
|
92
|
+
{
|
|
93
|
+
selector:
|
|
94
|
+
"MemberExpression[object.name='process'][property.name='env']",
|
|
95
|
+
message:
|
|
96
|
+
"Direct process.env access is forbidden. Use ConfigService for type-safe configuration. See .claude/rules/PROJECT_RULES.md.",
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
|
|
100
|
+
// NestJS uses classes extensively for modules, controllers, services, etc.
|
|
101
|
+
"functional/no-classes": "off",
|
|
102
|
+
|
|
103
|
+
// NestJS decorators require class methods
|
|
104
|
+
"jsdoc/require-jsdoc": [
|
|
105
|
+
"error",
|
|
106
|
+
{
|
|
107
|
+
require: {
|
|
108
|
+
FunctionDeclaration: true,
|
|
109
|
+
MethodDefinition: true,
|
|
110
|
+
ClassDeclaration: true,
|
|
111
|
+
ArrowFunctionExpression: false,
|
|
112
|
+
FunctionExpression: false,
|
|
113
|
+
},
|
|
114
|
+
contexts: [
|
|
115
|
+
"TSInterfaceDeclaration",
|
|
116
|
+
"TSTypeAliasDeclaration",
|
|
117
|
+
"VariableDeclaration[declarations.0.init.type='ArrowFunctionExpression']:has([id.name=/^[A-Z]/])",
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
// JavaScript files override
|
|
125
|
+
getJsFilesOverride(),
|
|
126
|
+
|
|
127
|
+
// Shared hooks and components
|
|
128
|
+
getSharedFilesOverride(),
|
|
129
|
+
|
|
130
|
+
// Test files
|
|
131
|
+
getTestFilesOverride(),
|
|
132
|
+
|
|
133
|
+
// TypeScript files - enable type-checked linting
|
|
134
|
+
getTsFilesOverride(["**/*.ts"], tsconfigRootDir),
|
|
135
|
+
|
|
136
|
+
// TypeScript test files - disable immutable-data
|
|
137
|
+
getTsTestFilesOverride([
|
|
138
|
+
"**/*.test.ts",
|
|
139
|
+
"**/*.spec.ts",
|
|
140
|
+
"**/*.e2e-spec.ts",
|
|
141
|
+
]),
|
|
142
|
+
|
|
143
|
+
// NestJS module files - relax some rules
|
|
144
|
+
{
|
|
145
|
+
files: ["**/*.module.ts"],
|
|
146
|
+
rules: {
|
|
147
|
+
// Modules often import many things
|
|
148
|
+
"max-lines": "off",
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
// NestJS controller/service files
|
|
153
|
+
{
|
|
154
|
+
files: ["**/*.controller.ts", "**/*.service.ts", "**/*.resolver.ts"],
|
|
155
|
+
rules: {
|
|
156
|
+
// These files often have many methods
|
|
157
|
+
"max-lines-per-function": ["error", { max: 100 }],
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
|
|
161
|
+
// Configuration files - allowed to use process.env directly
|
|
162
|
+
{
|
|
163
|
+
files: ["**/*config.*", "**/configuration.ts", "**/config/*.ts"],
|
|
164
|
+
rules: {
|
|
165
|
+
"no-restricted-syntax": "off",
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
// Lambda handlers - allowed to use getStandaloneConfig()
|
|
170
|
+
{
|
|
171
|
+
files: ["**/handlers/**/*.ts", "**/lambda/**/*.ts"],
|
|
172
|
+
rules: {
|
|
173
|
+
"no-restricted-syntax": "off",
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
}
|
|
178
|
+
/* eslint-enable max-lines-per-function -- config file requires many lines */
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"scripts": {
|
|
3
|
+
"test": "NODE_ENV=test jest --passWithNoTests",
|
|
4
|
+
"test:unit": "NODE_ENV=test jest --testPathIgnorePatterns=\"\\.integration\\.test\\.(ts|tsx)$\" --passWithNoTests",
|
|
5
|
+
"test:integration": "NODE_ENV=test jest --testPathPatterns=\"\\.integration\\.test\\.(ts|tsx)$\" --passWithNoTests",
|
|
6
|
+
"test:cov": "NODE_ENV=test jest --coverage",
|
|
3
7
|
"start:local": "IS_OFFLINE=true sls offline start --noTimeout",
|
|
4
8
|
"start:dev": "IS_OFFLINE=true sls offline start --stage dev",
|
|
5
|
-
"start:docker": "docker
|
|
6
|
-
"start:docker:build": "docker
|
|
7
|
-
"start:docker:down": "docker
|
|
9
|
+
"start:docker": "docker compose up",
|
|
10
|
+
"start:docker:build": "docker compose up --build",
|
|
11
|
+
"start:docker:down": "docker compose down",
|
|
8
12
|
"deploy:dev": "sls deploy --stage dev",
|
|
9
13
|
"deploy:staging": "sls deploy --stage staging",
|
|
10
14
|
"deploy:production": "sls deploy --stage production",
|
|
@@ -66,7 +70,11 @@
|
|
|
66
70
|
"@nestjs/testing": "^11.1.11",
|
|
67
71
|
"@types/aws-lambda": "^8.10.159",
|
|
68
72
|
"@types/express": "^5.0.6",
|
|
73
|
+
"@istanbuljs/nyc-config-typescript": "^1.0.2",
|
|
74
|
+
"@jest/test-sequencer": "^30.2.0",
|
|
69
75
|
"@types/jest": "^30.0.0",
|
|
76
|
+
"jest": "^30.0.0",
|
|
77
|
+
"ts-jest": "^29.4.6",
|
|
70
78
|
"serverless": "^4.30.0",
|
|
71
79
|
"serverless-esbuild": "^1.57.0",
|
|
72
80
|
"serverless-offline": "^14.4.0"
|
package/package.json
CHANGED
|
@@ -1,42 +1,27 @@
|
|
|
1
1
|
{
|
|
2
|
-
"lint-staged": {
|
|
3
|
-
"*.{js,ts,tsx}": [
|
|
4
|
-
"eslint --quiet --cache --fix"
|
|
5
|
-
],
|
|
6
|
-
"*.{js,ts,jsx,tsx,html,css,scss,yaml,yml,graphql}": [
|
|
7
|
-
"prettier --write"
|
|
8
|
-
]
|
|
9
|
-
},
|
|
10
|
-
"engines": {
|
|
11
|
-
"npm": "please-use-bun",
|
|
12
|
-
"yarn": "please-use-bun",
|
|
13
|
-
"bun": ">= 1.3.5",
|
|
14
|
-
"node": ">=18.0.0"
|
|
15
|
-
},
|
|
16
|
-
"config": {
|
|
17
|
-
"commitizen": {
|
|
18
|
-
"path": "./node_modules/cz-conventional-changelog"
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
2
|
"scripts": {
|
|
22
3
|
"//docs": "The following commands MUST be defined for CI/CD to work properly - even if they're no-ops.",
|
|
23
|
-
"lint": "eslint
|
|
4
|
+
"lint": "eslint . --quiet",
|
|
24
5
|
"lint:fix": "eslint . --fix",
|
|
25
6
|
"build": "tsc",
|
|
26
7
|
"test": "vitest run",
|
|
27
|
-
"test:unit": "
|
|
28
|
-
"test:integration": "
|
|
29
|
-
"test:cov": "
|
|
8
|
+
"test:unit": "vitest run tests/unit",
|
|
9
|
+
"test:integration": "vitest run tests/integration",
|
|
10
|
+
"test:cov": "vitest run --coverage",
|
|
30
11
|
"types:check": "tsc --noEmit",
|
|
31
12
|
"typecheck": "tsc --noEmit",
|
|
32
13
|
"format:check": "prettier --check .",
|
|
33
14
|
"format": "prettier --check . --write",
|
|
34
|
-
"prepare": "npm run build",
|
|
15
|
+
"prepare": "npm run build && husky install || true",
|
|
35
16
|
"//end-docs": "",
|
|
36
17
|
"start": "node dist/index.js",
|
|
37
18
|
"dev": "tsx src/index.ts",
|
|
38
19
|
"test:watch": "vitest",
|
|
39
|
-
"
|
|
20
|
+
"update-node-version": "tsx scripts/update-node-version.ts",
|
|
21
|
+
"lint:slow": "eslint . --config eslint.slow.config.ts --quiet",
|
|
22
|
+
"knip": "knip",
|
|
23
|
+
"knip:fix": "knip --fix",
|
|
24
|
+
"sg:scan": "ast-grep scan"
|
|
40
25
|
},
|
|
41
26
|
"devDependencies": {
|
|
42
27
|
"@commitlint/cli": "^20.3.1",
|
|
@@ -44,9 +29,6 @@
|
|
|
44
29
|
"@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
|
|
45
30
|
"@eslint/eslintrc": "^3.2.0",
|
|
46
31
|
"@eslint/js": "^9.39.0",
|
|
47
|
-
"@istanbuljs/nyc-config-typescript": "^1.0.2",
|
|
48
|
-
"@jest/test-sequencer": "^30.2.0",
|
|
49
|
-
"@types/jest": "^30.0.0",
|
|
50
32
|
"commitizen": "^4.3.0",
|
|
51
33
|
"cz-conventional-changelog": "^3.3.0",
|
|
52
34
|
"eslint": "^9.39.0",
|
|
@@ -57,32 +39,44 @@
|
|
|
57
39
|
"eslint-plugin-prettier": "^5.5.0",
|
|
58
40
|
"eslint-plugin-sonarjs": "^3.0.0",
|
|
59
41
|
"husky": "^8.0.0",
|
|
60
|
-
"jest": "^30.0.0",
|
|
61
42
|
"jscodeshift": "0.15.2",
|
|
62
43
|
"lint-staged": "^16.2.7",
|
|
63
44
|
"prettier": "^3.3.3",
|
|
64
45
|
"standard-version": "^9.5.0",
|
|
65
|
-
"ts-jest": "^29.4.6",
|
|
66
|
-
"ts-morph": "^27.0.2",
|
|
67
|
-
"ts-node": "^10.9.2",
|
|
68
46
|
"typescript": "~5.7.0",
|
|
69
47
|
"typescript-eslint": "^8.0.0",
|
|
70
48
|
"@types/fs-extra": "^11.0.0",
|
|
71
49
|
"@types/lodash.merge": "^4.6.0",
|
|
72
50
|
"@types/node": "^22.0.0",
|
|
73
51
|
"@vitest/coverage-v8": "^3.0.0",
|
|
74
|
-
"memfs": "^4.0.0",
|
|
75
52
|
"tsx": "^4.0.0",
|
|
76
|
-
"vitest": "^3.0.0"
|
|
53
|
+
"vitest": "^3.0.0",
|
|
54
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
55
|
+
"eslint-plugin-import": "^2.32.0",
|
|
56
|
+
"jiti": "^2.4.0",
|
|
57
|
+
"knip": "^5.82.0",
|
|
58
|
+
"@ast-grep/cli": "^0.40.4"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"npm": "please-use-bun",
|
|
62
|
+
"yarn": "please-use-bun",
|
|
63
|
+
"pnpm": "please-use-bun",
|
|
64
|
+
"bun": ">= 1.3.5",
|
|
65
|
+
"node": "22.21.1"
|
|
66
|
+
},
|
|
67
|
+
"config": {
|
|
68
|
+
"commitizen": {
|
|
69
|
+
"path": "./node_modules/cz-conventional-changelog"
|
|
70
|
+
}
|
|
77
71
|
},
|
|
78
72
|
"resolutions": {},
|
|
79
73
|
"trustedDependencies": [
|
|
80
|
-
"@sentry/cli"
|
|
74
|
+
"@sentry/cli",
|
|
75
|
+
"@ast-grep/cli"
|
|
81
76
|
],
|
|
82
77
|
"name": "@codyswann/lisa",
|
|
83
|
-
"version": "1.0.
|
|
78
|
+
"version": "1.0.5",
|
|
84
79
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
85
|
-
"type": "module",
|
|
86
80
|
"main": "dist/index.js",
|
|
87
81
|
"bin": {
|
|
88
82
|
"lisa": "dist/index.js"
|
|
@@ -118,7 +112,7 @@
|
|
|
118
112
|
"expo",
|
|
119
113
|
"nestjs",
|
|
120
114
|
"cdk",
|
|
121
|
-
"eslint-plugin-code-organization"
|
|
122
|
-
|
|
123
|
-
|
|
115
|
+
"eslint-plugin-code-organization"
|
|
116
|
+
],
|
|
117
|
+
"type": "module"
|
|
124
118
|
}
|