@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
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
# BEGIN: AI GUARDRAILS
|
|
1
|
+
# BEGIN: AI GUARDRAILS
|
|
2
|
+
|
|
3
|
+
# Skip pre-push checks in Claude Code remote environment
|
|
4
|
+
# These checks run in CI/CD anyway, and remote environments have limited resources
|
|
5
|
+
if [ "$CLAUDE_CODE_REMOTE" = "true" ]; then
|
|
6
|
+
echo "ℹ️ Skipping pre-push checks (running in Claude Code remote environment)"
|
|
7
|
+
exit 0
|
|
8
|
+
fi
|
|
2
9
|
|
|
3
10
|
# Detect package manager (check if tool is available before using it)
|
|
4
11
|
# Priority: bun > yarn > npm (bun first since package.json engines prefer it)
|
|
@@ -65,61 +72,33 @@ elif [ "$PACKAGE_MANAGER" = "npm" ]; then
|
|
|
65
72
|
echo "✅ No high or critical vulnerabilities found in production dependencies"
|
|
66
73
|
|
|
67
74
|
elif [ "$PACKAGE_MANAGER" = "bun" ]; then
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
|
|
75
|
+
# Excluding GHSA-5j98-mcp5-4vw2 (CVE-2025-64756): glob CLI command injection
|
|
76
|
+
# This vulnerability only affects the glob CLI (--cmd flag), not library usage
|
|
77
|
+
# We only use glob as a library through Babel and other tools - never invoke CLI
|
|
78
|
+
|
|
79
|
+
# Excluding GHSA-8qq5-rm4j-mr97: node-tar path sanitization vulnerability
|
|
80
|
+
# Nested dependency in @expo/cli - bun resolves to patched version but audit still flags it
|
|
81
|
+
# Risk: Low - only affects tar extraction with malicious filenames, not our use case
|
|
82
|
+
if ! bun audit --audit-level=high --ignore GHSA-5j98-mcp5-4vw2 --ignore GHSA-8qq5-rm4j-mr97; then
|
|
83
|
+
echo "⚠️ Security audit failed. Please fix high/critical vulnerabilities before pushing."
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
echo "✅ No high or critical vulnerabilities found in production dependencies"
|
|
87
|
+
fi
|
|
71
88
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
echo "
|
|
78
|
-
echo " macOS: brew install jq"
|
|
79
|
-
echo " Windows: choco install jq # or scoop install jq"
|
|
80
|
-
echo " Linux: apt-get install jq"
|
|
81
|
-
echo ""
|
|
82
|
-
echo "Continuing without security audit..."
|
|
89
|
+
# Run dead code detection (knip) - only if script exists
|
|
90
|
+
if jq -e '.scripts.knip' package.json >/dev/null 2>&1; then
|
|
91
|
+
echo "🗑️ Running dead code detection (knip)..."
|
|
92
|
+
$RUNNER knip
|
|
93
|
+
if [ $? -ne 0 ]; then
|
|
94
|
+
echo "❌ Dead code detected. Please remove unused exports/dependencies before pushing."
|
|
83
95
|
echo ""
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
TEMP_LOCKFILE=false
|
|
87
|
-
if [ ! -f "package-lock.json" ]; then
|
|
88
|
-
echo " Generating temporary package-lock.json for audit..."
|
|
89
|
-
npm i --package-lock-only --ignore-scripts --legacy-peer-deps --silent 2>/dev/null
|
|
90
|
-
TEMP_LOCKFILE=true
|
|
91
|
-
fi
|
|
92
|
-
|
|
93
|
-
# Excluding GHSA-8qq5-rm4j-mr97: node-tar path sanitization vulnerability
|
|
94
|
-
# This is a nested dependency in @expo/cli that bun resolves to the patched version (7.5.3)
|
|
95
|
-
# npm audit generates its own lockfile and doesn't respect bun's resolutions
|
|
96
|
-
# Risk: None - bun.lock shows tar@7.5.3 is used, not the vulnerable version
|
|
97
|
-
VULN_COUNT=$(npm audit --omit=dev --json 2>/dev/null | jq '
|
|
98
|
-
.vulnerabilities | to_entries | map(select(
|
|
99
|
-
.value.severity == "high" or .value.severity == "critical"
|
|
100
|
-
)) | map(select(
|
|
101
|
-
.value.via | all(. | if type == "object" then (.url == "https://github.com/advisories/GHSA-8qq5-rm4j-mr97" | not) else true end)
|
|
102
|
-
)) | length
|
|
103
|
-
')
|
|
104
|
-
if [ "$VULN_COUNT" -gt 0 ] 2>/dev/null; then
|
|
105
|
-
AUDIT_EXIT=1
|
|
106
|
-
else
|
|
107
|
-
AUDIT_EXIT=0
|
|
108
|
-
fi
|
|
109
|
-
|
|
110
|
-
# Clean up temporary lockfile
|
|
111
|
-
if [ "$TEMP_LOCKFILE" = "true" ]; then
|
|
112
|
-
rm -f package-lock.json
|
|
113
|
-
fi
|
|
114
|
-
|
|
115
|
-
if [ $AUDIT_EXIT -ne 0 ]; then
|
|
116
|
-
# Re-run to show the actual vulnerabilities (excluding the known one)
|
|
117
|
-
echo "⚠️ Security audit found high/critical vulnerabilities:"
|
|
118
|
-
npm audit --omit=dev 2>/dev/null | grep -v "GHSA-8qq5-rm4j-mr97" || true
|
|
119
|
-
exit 1
|
|
120
|
-
fi
|
|
121
|
-
echo "✅ No high or critical vulnerabilities found in production dependencies (excluding known false positives)"
|
|
96
|
+
echo "To auto-fix some issues, run: $RUNNER knip:fix"
|
|
97
|
+
exit 1
|
|
122
98
|
fi
|
|
99
|
+
echo "✅ No dead code detected"
|
|
100
|
+
else
|
|
101
|
+
echo "ℹ️ Skipping dead code detection (knip not configured)"
|
|
123
102
|
fi
|
|
124
103
|
|
|
125
104
|
# Run unit tests with coverage
|
|
@@ -139,72 +118,74 @@ if [ $? -ne 0 ]; then
|
|
|
139
118
|
fi
|
|
140
119
|
|
|
141
120
|
# Run Lighthouse CI performance audit (only if installed)
|
|
121
|
+
# Disable Lighthouse beause it takes too long to run on push. Just let it run in ci/cd
|
|
142
122
|
# Check if lighthouse:check script exists in package.json
|
|
143
|
-
if ! grep -q '"lighthouse:check"' package.json 2>/dev/null; then
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
else
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
fi
|
|
123
|
+
# if ! grep -q '"lighthouse:check"' package.json 2>/dev/null; then
|
|
124
|
+
# echo ""
|
|
125
|
+
# echo "ℹ️ Skipping Lighthouse CI audit (not configured for this project)"
|
|
126
|
+
# echo ""
|
|
127
|
+
# else
|
|
128
|
+
# # Check if Chrome is available (required for Lighthouse)
|
|
129
|
+
# CHROME_AVAILABLE=false
|
|
130
|
+
# if command -v google-chrome >/dev/null 2>&1 || \
|
|
131
|
+
# command -v google-chrome-stable >/dev/null 2>&1 || \
|
|
132
|
+
# command -v chromium >/dev/null 2>&1 || \
|
|
133
|
+
# command -v chromium-browser >/dev/null 2>&1 || \
|
|
134
|
+
# [ -x "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" ]; then
|
|
135
|
+
# CHROME_AVAILABLE=true
|
|
136
|
+
# fi
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
# if [ "$CHROME_AVAILABLE" = "false" ]; then
|
|
140
|
+
# echo ""
|
|
141
|
+
# echo "⚠️ WARNING: Chrome/Chromium not found - skipping Lighthouse CI audit"
|
|
142
|
+
# echo ""
|
|
143
|
+
# echo "To enable Lighthouse performance audits, install Chrome:"
|
|
144
|
+
# echo " macOS: brew install --cask google-chrome"
|
|
145
|
+
# echo " Linux: apt-get install chromium-browser # or google-chrome-stable"
|
|
146
|
+
# echo " Windows: choco install googlechrome"
|
|
147
|
+
# echo ""
|
|
148
|
+
# echo "Continuing without Lighthouse audit..."
|
|
149
|
+
# echo ""
|
|
150
|
+
# else
|
|
151
|
+
# echo "🔦 Building web export for Lighthouse..."
|
|
152
|
+
# $RUNNER export:web
|
|
153
|
+
# if [ $? -ne 0 ]; then
|
|
154
|
+
# echo "❌ Web export failed. Please fix build errors before pushing."
|
|
155
|
+
# exit 1
|
|
156
|
+
# fi
|
|
157
|
+
|
|
158
|
+
# echo "🔦 Running Lighthouse CI performance audit..."
|
|
159
|
+
# LIGHTHOUSE_OUTPUT=$($RUNNER lighthouse:check 2>&1)
|
|
160
|
+
# LIGHTHOUSE_EXIT=$?
|
|
161
|
+
# echo "$LIGHTHOUSE_OUTPUT"
|
|
162
|
+
|
|
163
|
+
# # Extract report URL from output
|
|
164
|
+
# REPORT_URL=$(echo "$LIGHTHOUSE_OUTPUT" | grep -o 'https://storage.googleapis.com/[^ ]*\.html' | head -1)
|
|
165
|
+
|
|
166
|
+
# if [ $LIGHTHOUSE_EXIT -ne 0 ]; then
|
|
167
|
+
# echo ""
|
|
168
|
+
# echo "❌ Lighthouse CI performance audit failed!"
|
|
169
|
+
# echo ""
|
|
170
|
+
# echo "Your changes caused performance regressions that exceed the allowed thresholds."
|
|
171
|
+
# echo ""
|
|
172
|
+
# if [ -n "$REPORT_URL" ]; then
|
|
173
|
+
# echo "📊 View full report: $REPORT_URL"
|
|
174
|
+
# echo ""
|
|
175
|
+
# fi
|
|
176
|
+
# echo "Common fixes:"
|
|
177
|
+
# echo " • Bundle size too large → Remove unused dependencies, add code splitting"
|
|
178
|
+
# echo " • LCP/FCP too slow → Optimize images, reduce render-blocking resources"
|
|
179
|
+
# echo " • CLS too high → Add explicit dimensions to images/containers"
|
|
180
|
+
# echo " • Too much unused JS → Implement lazy loading for non-critical code"
|
|
181
|
+
# echo ""
|
|
182
|
+
# echo "See lighthouserc.js for threshold details."
|
|
183
|
+
# echo ""
|
|
184
|
+
# exit 1
|
|
185
|
+
# fi
|
|
186
|
+
# echo "✅ Lighthouse CI performance audit passed"
|
|
187
|
+
# fi
|
|
188
|
+
# fi
|
|
208
189
|
|
|
209
190
|
exit 0
|
|
210
191
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
+
# This file is managed by Lisa.
|
|
3
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
2
4
|
|
|
3
5
|
# Only run package installation in remote (Claude Code web) environment
|
|
4
6
|
# node_modules are gitignored, so they need to be installed remotely
|
|
@@ -34,16 +36,7 @@ npx playwright install chromium
|
|
|
34
36
|
# Use sort to ensure deterministic selection of the latest version
|
|
35
37
|
CHROME_PATH=$(find ~/.cache/ms-playwright -name "chrome" -type f 2>/dev/null | grep "chrome-linux" | sort | tail -n 1)
|
|
36
38
|
if [ -n "$CHROME_PATH" ]; then
|
|
37
|
-
#
|
|
38
|
-
ENV_LOCAL="$CLAUDE_PROJECT_DIR/.claude/env.local"
|
|
39
|
-
if [ -f "$ENV_LOCAL" ]; then
|
|
40
|
-
# Remove old CHROME_PATH entries and add new one
|
|
41
|
-
grep -v "^export CHROME_PATH=" "$ENV_LOCAL" > "$ENV_LOCAL.tmp" 2>/dev/null || true
|
|
42
|
-
mv "$ENV_LOCAL.tmp" "$ENV_LOCAL"
|
|
43
|
-
fi
|
|
44
|
-
echo "export CHROME_PATH=\"$CHROME_PATH\"" >> "$ENV_LOCAL"
|
|
45
|
-
|
|
46
|
-
# Also append to ~/.bashrc for shell sessions (idempotent)
|
|
39
|
+
# Append to ~/.bashrc for shell sessions (idempotent)
|
|
47
40
|
if ! grep -q "export CHROME_PATH=" ~/.bashrc 2>/dev/null; then
|
|
48
41
|
echo "export CHROME_PATH=\"$CHROME_PATH\"" >> ~/.bashrc
|
|
49
42
|
else
|
|
@@ -53,7 +46,6 @@ if [ -n "$CHROME_PATH" ]; then
|
|
|
53
46
|
|
|
54
47
|
export CHROME_PATH="$CHROME_PATH"
|
|
55
48
|
echo "Chromium installed at: $CHROME_PATH"
|
|
56
|
-
echo "CHROME_PATH exported to: $ENV_LOCAL and ~/.bashrc"
|
|
57
49
|
fi
|
|
58
50
|
|
|
59
51
|
exit 0
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
+
# This file is managed by Lisa.
|
|
3
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
2
4
|
|
|
3
5
|
# Hook script to lint and auto-fix files with ESLint after Claude edits them
|
|
4
6
|
# This script receives JSON input via stdin with tool information
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# This file is managed by Lisa.
|
|
3
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
4
|
+
|
|
5
|
+
# Hook script to run ast-grep scan after Claude edits files
|
|
6
|
+
# This script receives JSON input via stdin with tool information
|
|
7
|
+
# Reference: https://docs.claude.com/en/docs/claude-code/hooks
|
|
8
|
+
# Note: This hook is BLOCKING - it returns non-zero exit codes so Claude must fix issues
|
|
9
|
+
|
|
10
|
+
# Extract file path from JSON input
|
|
11
|
+
FILE_PATH=$(cat | grep -o '"file_path":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
12
|
+
|
|
13
|
+
if [ -z "$FILE_PATH" ] || [ ! -f "$FILE_PATH" ]; then
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# Check if file type is supported (TypeScript, JavaScript)
|
|
18
|
+
case "${FILE_PATH##*.}" in
|
|
19
|
+
ts|tsx|js|jsx|mjs|cjs) ;;
|
|
20
|
+
*) exit 0 ;;
|
|
21
|
+
esac
|
|
22
|
+
|
|
23
|
+
# Validate project directory
|
|
24
|
+
if [ -z "${CLAUDE_PROJECT_DIR:-}" ]; then
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Check if file is in a source directory
|
|
29
|
+
RELATIVE_PATH="${FILE_PATH#$CLAUDE_PROJECT_DIR/}"
|
|
30
|
+
case "$RELATIVE_PATH" in
|
|
31
|
+
src/*|apps/*|libs/*|test/*|tests/*|features/*|components/*|hooks/*|screens/*|app/*|constants/*|utils/*|providers/*|stores/*) ;;
|
|
32
|
+
*) exit 0 ;;
|
|
33
|
+
esac
|
|
34
|
+
|
|
35
|
+
cd "$CLAUDE_PROJECT_DIR" || exit 0
|
|
36
|
+
|
|
37
|
+
# Verify ast-grep configuration exists
|
|
38
|
+
if [ ! -f "sgconfig.yml" ]; then
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Verify rules are defined
|
|
43
|
+
RULE_COUNT=$(find ast-grep/rules -name "*.yml" -o -name "*.yaml" 2>/dev/null | grep -v ".gitkeep" | wc -l | tr -d ' ')
|
|
44
|
+
if [ "$RULE_COUNT" -eq 0 ]; then
|
|
45
|
+
exit 0
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# Detect package manager
|
|
49
|
+
if [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
|
|
50
|
+
PKG_MANAGER="bun"
|
|
51
|
+
elif [ -f "pnpm-lock.yaml" ]; then
|
|
52
|
+
PKG_MANAGER="pnpm"
|
|
53
|
+
elif [ -f "yarn.lock" ]; then
|
|
54
|
+
PKG_MANAGER="yarn"
|
|
55
|
+
else
|
|
56
|
+
PKG_MANAGER="npm"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Run ast-grep scan
|
|
60
|
+
echo "Running ast-grep scan on: $FILE_PATH"
|
|
61
|
+
if OUTPUT=$($PKG_MANAGER run sg:scan "$FILE_PATH" 2>&1); then
|
|
62
|
+
echo "ast-grep: No issues found in $(basename "$FILE_PATH")"
|
|
63
|
+
exit 0
|
|
64
|
+
else
|
|
65
|
+
echo "ast-grep found issues in: $FILE_PATH" >&2
|
|
66
|
+
echo "$OUTPUT" >&2
|
|
67
|
+
exit 1
|
|
68
|
+
fi
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"SessionStart": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "startup",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/install_pkgs.sh",
|
|
10
|
+
"timeout": 480
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"PostToolUse": [
|
|
16
|
+
{
|
|
17
|
+
"matcher": "Write|Edit",
|
|
18
|
+
"hooks": [
|
|
19
|
+
{
|
|
20
|
+
"type": "command",
|
|
21
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/format-on-edit.sh",
|
|
22
|
+
"timeout": 10
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"type": "command",
|
|
26
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/sg-scan-on-edit.sh",
|
|
27
|
+
"timeout": 30
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"matcher": "TaskCreate|TaskUpdate",
|
|
33
|
+
"hooks": [
|
|
34
|
+
{
|
|
35
|
+
"type": "command",
|
|
36
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/sync-tasks.sh",
|
|
37
|
+
"timeout": 10
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"Notification": [
|
|
43
|
+
{
|
|
44
|
+
"matcher": "permission_prompt|idle_prompt",
|
|
45
|
+
"hooks": [
|
|
46
|
+
{
|
|
47
|
+
"type": "command",
|
|
48
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/notify-ntfy.sh",
|
|
49
|
+
"timeout": 5
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"Stop": [
|
|
55
|
+
{
|
|
56
|
+
"matcher": "",
|
|
57
|
+
"hooks": [
|
|
58
|
+
{
|
|
59
|
+
"type": "command",
|
|
60
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/notify-ntfy.sh",
|
|
61
|
+
"timeout": 5
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
"env": {
|
|
68
|
+
"BASH_DEFAULT_TIMEOUT_MS": "1800000",
|
|
69
|
+
"BASH_MAX_TIMEOUT_MS": "7200000"
|
|
70
|
+
},
|
|
71
|
+
"includeCoAuthoredBy": true,
|
|
72
|
+
"enabledPlugins": {
|
|
73
|
+
"typescript-lsp@claude-plugins-official": true,
|
|
74
|
+
"safety-net@cc-marketplace": true,
|
|
75
|
+
"code-simplifier@claude-plugins-official": true,
|
|
76
|
+
"code-review@claude-plugins-official": true,
|
|
77
|
+
"playwright@claude-plugins-official": true
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -312,6 +312,50 @@ const activeUsers = users.filter(u => u.active);
|
|
|
312
312
|
const activeUsers = users.filter(u => u.active);
|
|
313
313
|
```
|
|
314
314
|
|
|
315
|
+
## Escaping @ Symbols in JSDoc
|
|
316
|
+
|
|
317
|
+
When documenting code that contains TypeScript/NestJS decorators (like `@Injectable()`, `@Processor('queue-name')`), JSDoc will interpret the `@` as a tag marker. This causes lint errors because JSDoc sees `@Processor('qpr-v2')` as a single unknown tag name (including the parentheses and arguments).
|
|
318
|
+
|
|
319
|
+
**The problem:** Adding decorator names to `definedTags` doesn't help because JSDoc parses the entire string `@Processor('qpr-v2')` as the tag name, not just `@Processor`.
|
|
320
|
+
|
|
321
|
+
### Solution 1: Backticks in Prose
|
|
322
|
+
|
|
323
|
+
When mentioning decorators in description text, wrap them in backticks:
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
/**
|
|
327
|
+
* Queue processor for QPR calculations
|
|
328
|
+
* @description Handles jobs from the `@Processor('qpr-v2')` queue
|
|
329
|
+
* @remarks Uses `@Injectable()` scope for request isolation
|
|
330
|
+
*/
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Solution 2: Escape in @example Blocks
|
|
334
|
+
|
|
335
|
+
In `@example` blocks, use fenced code blocks and escape `@` as `\@`:
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
/**
|
|
339
|
+
* Creates a queue processor
|
|
340
|
+
* @example
|
|
341
|
+
* ```typescript
|
|
342
|
+
* \@Processor('my-queue')
|
|
343
|
+
* export class MyProcessor {
|
|
344
|
+
* \@Process()
|
|
345
|
+
* async handle(job: Job) { ... }
|
|
346
|
+
* }
|
|
347
|
+
* ```
|
|
348
|
+
*/
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Quick Reference for Escaping
|
|
352
|
+
|
|
353
|
+
| Context | Approach | Example |
|
|
354
|
+
|---------|----------|---------|
|
|
355
|
+
| Prose/description | Wrap in backticks | `` `@Injectable()` `` |
|
|
356
|
+
| @example block | Escape with backslash | `\@Processor('name')` |
|
|
357
|
+
| Code comments | No escaping needed | `// Uses @Injectable` |
|
|
358
|
+
|
|
315
359
|
## Quick Reference
|
|
316
360
|
|
|
317
361
|
### Required Structure for Services
|
|
@@ -280,6 +280,55 @@ sonar.organization=your-org
|
|
|
280
280
|
|
|
281
281
|
---
|
|
282
282
|
|
|
283
|
+
#### DEPLOY_KEY
|
|
284
|
+
**Purpose**: Push version bumps and releases to protected branches
|
|
285
|
+
|
|
286
|
+
GitHub Actions workflows cannot push directly to protected branches using the default `GITHUB_TOKEN`. A deploy key (SSH key) with write access bypasses branch protection rules for automated releases.
|
|
287
|
+
|
|
288
|
+
**How to set it up**:
|
|
289
|
+
|
|
290
|
+
1. **Generate an SSH key pair locally**:
|
|
291
|
+
```bash
|
|
292
|
+
# Generate a new SSH key (no passphrase for CI use)
|
|
293
|
+
ssh-keygen -t ed25519 -C "github-actions-deploy-key" -f deploy_key -N ""
|
|
294
|
+
|
|
295
|
+
# This creates two files:
|
|
296
|
+
# - deploy_key (private key - goes to GitHub Secrets)
|
|
297
|
+
# - deploy_key.pub (public key - goes to Deploy Keys)
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
2. **Add the public key to GitHub Deploy Keys**:
|
|
301
|
+
- Go to your repository **Settings** > **Deploy keys**
|
|
302
|
+
- Click **Add deploy key**
|
|
303
|
+
- Title: `GitHub Actions Deploy Key`
|
|
304
|
+
- Key: Paste contents of `deploy_key.pub`
|
|
305
|
+
- **Check "Allow write access"** (required for pushing)
|
|
306
|
+
- Click **Add key**
|
|
307
|
+
|
|
308
|
+
3. **Add the private key as a repository secret**:
|
|
309
|
+
```bash
|
|
310
|
+
# Using GitHub CLI
|
|
311
|
+
gh secret set DEPLOY_KEY < deploy_key
|
|
312
|
+
|
|
313
|
+
# Or manually:
|
|
314
|
+
# Go to Settings > Secrets and variables > Actions
|
|
315
|
+
# Click "New repository secret"
|
|
316
|
+
# Name: DEPLOY_KEY
|
|
317
|
+
# Value: Paste entire contents of deploy_key file (including BEGIN/END lines)
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
4. **Clean up local keys**:
|
|
321
|
+
```bash
|
|
322
|
+
# Delete the local key files after setup
|
|
323
|
+
rm deploy_key deploy_key.pub
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Required for**: Automated releases pushing to protected branches (main, staging, dev)
|
|
327
|
+
|
|
328
|
+
**Note**: If your branch protection rules require signed commits, you'll also need to set up GPG signing (see Release Signing Secrets below).
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
283
332
|
### Release Signing Secrets (Optional)
|
|
284
333
|
|
|
285
334
|
For GPG-signed releases:
|
|
@@ -289,7 +338,6 @@ For GPG-signed releases:
|
|
|
289
338
|
| `RELEASE_SIGNING_KEY` | Base64-encoded GPG private key |
|
|
290
339
|
| `SIGNING_KEY_ID` | GPG key ID |
|
|
291
340
|
| `SIGNING_KEY_PASSPHRASE` | GPG key passphrase |
|
|
292
|
-
| `DEPLOY_KEY` | SSH key for pushing to protected branches |
|
|
293
341
|
|
|
294
342
|
To generate:
|
|
295
343
|
```bash
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
# This file is managed by Lisa.
|
|
2
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
3
|
+
|
|
1
4
|
name: 🔍 CI Quality Checks
|
|
2
5
|
|
|
3
6
|
on:
|
|
@@ -7,43 +10,18 @@ on:
|
|
|
7
10
|
jobs:
|
|
8
11
|
quality:
|
|
9
12
|
name: 🔍 Quality Checks
|
|
10
|
-
timeout-minutes: 30
|
|
11
|
-
# Reference to the quality checks workflow
|
|
12
13
|
uses: ./.github/workflows/quality.yml
|
|
13
14
|
with:
|
|
14
15
|
node_version: '22.21.1'
|
|
15
16
|
package_manager: 'bun'
|
|
16
|
-
skip_jobs: '
|
|
17
|
+
skip_jobs: ''
|
|
17
18
|
secrets: inherit
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
# name: 🎭 Playwright Tests
|
|
21
|
-
# timeout-minutes: 30
|
|
22
|
-
# needs: [quality]
|
|
23
|
-
# uses: ./.github/workflows/playwright.yml
|
|
24
|
-
# with:
|
|
25
|
-
# pr_number: ${{ github.event.pull_request.number }}
|
|
26
|
-
# branch_ref: ${{ github.head_ref }}
|
|
27
|
-
# base_ref: ${{ github.base_ref }}
|
|
28
|
-
|
|
29
|
-
lighthouse:
|
|
30
|
-
name: 💡 Lighthouse CI
|
|
31
|
-
timeout-minutes: 15
|
|
32
|
-
needs: [quality]
|
|
33
|
-
uses: ./.github/workflows/lighthouse.yml
|
|
34
|
-
with:
|
|
35
|
-
node_version: '22.21.1'
|
|
36
|
-
package_manager: 'bun'
|
|
37
|
-
|
|
38
|
-
create_sentry_issue_on_failure:
|
|
39
|
-
name: 🚨 Create Sentry Issue on Failure
|
|
40
|
-
timeout-minutes: 5
|
|
19
|
+
create_issue_on_failure:
|
|
20
|
+
name: 📌 Create Issue on Failure
|
|
41
21
|
needs: [quality]
|
|
42
22
|
if: ${{ always() && (needs.quality.result == 'failure' || needs.quality.result == 'failure') && !contains(github.event.head_commit.message, '[skip ci]') }}
|
|
43
|
-
uses: ./.github/workflows/create-
|
|
23
|
+
uses: ./.github/workflows/create-issue-on-failure.yml
|
|
44
24
|
with:
|
|
45
25
|
workflow_name: 'CI Quality Checks'
|
|
46
26
|
failed_job: ${{ needs.quality.result == 'failure' && 'quality' || 'playwright' }}
|
|
47
|
-
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
|
|
48
|
-
SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
|
|
49
27
|
secrets: inherit
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# This file is managed by Lisa.
|
|
2
|
+
# Do not edit directly — changes will be overwritten on the next `lisa` run.
|
|
1
3
|
# -----------------------------------------------------------------------------
|
|
2
4
|
# GitHub Issue Creation Workflow
|
|
3
5
|
# -----------------------------------------------------------------------------
|
|
@@ -35,7 +37,7 @@ on:
|
|
|
35
37
|
node_version:
|
|
36
38
|
description: 'Node.js version to use'
|
|
37
39
|
required: false
|
|
38
|
-
default: '
|
|
40
|
+
default: '22.21.1'
|
|
39
41
|
type: string
|
|
40
42
|
package_manager:
|
|
41
43
|
description: 'Package manager to use (npm, yarn, or bun)'
|
|
@@ -49,8 +51,8 @@ on:
|
|
|
49
51
|
type: string
|
|
50
52
|
secrets:
|
|
51
53
|
PAT:
|
|
52
|
-
required:
|
|
53
|
-
description: 'Personal Access Token with repo scope'
|
|
54
|
+
required: false
|
|
55
|
+
description: 'Personal Access Token with repo scope (falls back to GITHUB_TOKEN)'
|
|
54
56
|
|
|
55
57
|
# Concurrency is managed by the parent workflow that calls this one
|
|
56
58
|
# This avoids deadlocks between parent and child workflows
|
|
@@ -73,7 +75,7 @@ jobs:
|
|
|
73
75
|
- name: 🔖 Create Issue
|
|
74
76
|
uses: actions/github-script@v7
|
|
75
77
|
with:
|
|
76
|
-
github-token: ${{ secrets.PAT }}
|
|
78
|
+
github-token: ${{ secrets.PAT || github.token }}
|
|
77
79
|
script: |
|
|
78
80
|
// Get repository and run information
|
|
79
81
|
const { owner, repo } = context.repo;
|