@codyswann/lisa 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +867 -0
- package/all/copy-overwrite/.claude/README.md +205 -0
- package/all/copy-overwrite/.claude/agents/agent-architect.md +311 -0
- package/all/copy-overwrite/.claude/agents/codebase-analyzer.md +146 -0
- package/all/copy-overwrite/.claude/agents/codebase-locator.md +125 -0
- package/all/copy-overwrite/.claude/agents/codebase-pattern-finder.md +237 -0
- package/all/copy-overwrite/.claude/agents/git-history-analyzer.md +183 -0
- package/all/copy-overwrite/.claude/agents/hooks-expert.md +74 -0
- package/all/copy-overwrite/.claude/agents/skill-evaluator.md +246 -0
- package/all/copy-overwrite/.claude/agents/slash-command-architect.md +87 -0
- package/all/copy-overwrite/.claude/agents/web-search-researcher.md +112 -0
- package/all/copy-overwrite/.claude/commands/git/commit-and-submit-pr.md +8 -0
- package/all/copy-overwrite/.claude/commands/git/commit.md +44 -0
- package/all/copy-overwrite/.claude/commands/git/prune.md +34 -0
- package/all/copy-overwrite/.claude/commands/git/submit-pr.md +50 -0
- package/all/copy-overwrite/.claude/commands/jira/create.md +50 -0
- package/all/copy-overwrite/.claude/commands/jira/verify.md +34 -0
- package/all/copy-overwrite/.claude/commands/project/archive.md +8 -0
- package/all/copy-overwrite/.claude/commands/project/bootstrap.md +49 -0
- package/all/copy-overwrite/.claude/commands/project/complete-task.md +7 -0
- package/all/copy-overwrite/.claude/commands/project/debrief.md +65 -0
- package/all/copy-overwrite/.claude/commands/project/execute.md +94 -0
- package/all/copy-overwrite/.claude/commands/project/implement.md +42 -0
- package/all/copy-overwrite/.claude/commands/project/local-code-review.md +88 -0
- package/all/copy-overwrite/.claude/commands/project/lower-code-complexity.md +74 -0
- package/all/copy-overwrite/.claude/commands/project/plan.md +314 -0
- package/all/copy-overwrite/.claude/commands/project/research.md +248 -0
- package/all/copy-overwrite/.claude/commands/project/review.md +63 -0
- package/all/copy-overwrite/.claude/commands/project/setup.md +19 -0
- package/all/copy-overwrite/.claude/commands/project/verify.md +38 -0
- package/all/copy-overwrite/.claude/commands/pull-request/review.md +12 -0
- package/all/copy-overwrite/.claude/commands/rules/format-md.md +72 -0
- package/all/copy-overwrite/.claude/commands/sonarqube/check.md +6 -0
- package/all/copy-overwrite/.claude/commands/sonarqube/fix.md +3 -0
- package/all/copy-overwrite/.claude/hooks/README.md +301 -0
- package/all/copy-overwrite/.claude/hooks/notify-ntfy.sh +181 -0
- package/all/copy-overwrite/.claude/settings.json +41 -0
- package/all/copy-overwrite/.claude/settings.local.json.example +14 -0
- package/all/copy-overwrite/.claude/skills/coding-philosophy/SKILL.md +405 -0
- package/all/copy-overwrite/.claude/skills/coding-philosophy/references/function-structure.md +416 -0
- package/all/copy-overwrite/.claude/skills/coding-philosophy/references/immutable-patterns.md +316 -0
- package/all/copy-overwrite/.claude/skills/prompt-complexity-scorer/SKILL.md +118 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/LICENSE.txt +202 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/SKILL.md +210 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-312.pyc +0 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/init_skill.py +303 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/all/copy-overwrite/.claude/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/all/copy-overwrite/CLAUDE.md +77 -0
- package/all/copy-overwrite/HUMAN.md +17 -0
- package/all/copy-overwrite/specs/.keep +0 -0
- package/all/create-only/PROJECT_RULES.md +0 -0
- package/cdk/merge/package.json +20 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +107 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +45 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +58 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/core/config.d.ts +73 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +36 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lisa.d.ts +81 -0
- package/dist/core/lisa.d.ts.map +1 -0
- package/dist/core/lisa.js +459 -0
- package/dist/core/lisa.js.map +1 -0
- package/dist/core/manifest.d.ts +58 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +104 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/detection/detector.interface.d.ts +15 -0
- package/dist/detection/detector.interface.d.ts.map +1 -0
- package/dist/detection/detector.interface.js +2 -0
- package/dist/detection/detector.interface.js.map +1 -0
- package/dist/detection/detectors/cdk.d.ts +10 -0
- package/dist/detection/detectors/cdk.d.ts.map +1 -0
- package/dist/detection/detectors/cdk.js +34 -0
- package/dist/detection/detectors/cdk.js.map +1 -0
- package/dist/detection/detectors/expo.d.ts +10 -0
- package/dist/detection/detectors/expo.d.ts.map +1 -0
- package/dist/detection/detectors/expo.js +30 -0
- package/dist/detection/detectors/expo.js.map +1 -0
- package/dist/detection/detectors/nestjs.d.ts +10 -0
- package/dist/detection/detectors/nestjs.d.ts.map +1 -0
- package/dist/detection/detectors/nestjs.js +34 -0
- package/dist/detection/detectors/nestjs.js.map +1 -0
- package/dist/detection/detectors/npm-package.d.ts +13 -0
- package/dist/detection/detectors/npm-package.d.ts.map +1 -0
- package/dist/detection/detectors/npm-package.js +30 -0
- package/dist/detection/detectors/npm-package.js.map +1 -0
- package/dist/detection/detectors/typescript.d.ts +10 -0
- package/dist/detection/detectors/typescript.d.ts.map +1 -0
- package/dist/detection/detectors/typescript.js +25 -0
- package/dist/detection/detectors/typescript.js.map +1 -0
- package/dist/detection/index.d.ts +24 -0
- package/dist/detection/index.d.ts.map +1 -0
- package/dist/detection/index.js +57 -0
- package/dist/detection/index.js.map +1 -0
- package/dist/errors/index.d.ts +69 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +110 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/console-logger.d.ts +12 -0
- package/dist/logging/console-logger.d.ts.map +1 -0
- package/dist/logging/console-logger.js +22 -0
- package/dist/logging/console-logger.js.map +1 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.interface.d.ts +20 -0
- package/dist/logging/logger.interface.d.ts.map +1 -0
- package/dist/logging/logger.interface.js +2 -0
- package/dist/logging/logger.interface.js.map +1 -0
- package/dist/logging/silent-logger.d.ts +12 -0
- package/dist/logging/silent-logger.d.ts.map +1 -0
- package/dist/logging/silent-logger.js +21 -0
- package/dist/logging/silent-logger.js.map +1 -0
- package/dist/strategies/copy-contents.d.ts +14 -0
- package/dist/strategies/copy-contents.d.ts.map +1 -0
- package/dist/strategies/copy-contents.js +69 -0
- package/dist/strategies/copy-contents.js.map +1 -0
- package/dist/strategies/copy-overwrite.d.ts +14 -0
- package/dist/strategies/copy-overwrite.d.ts.map +1 -0
- package/dist/strategies/copy-overwrite.js +47 -0
- package/dist/strategies/copy-overwrite.js.map +1 -0
- package/dist/strategies/create-only.d.ts +13 -0
- package/dist/strategies/create-only.d.ts.map +1 -0
- package/dist/strategies/create-only.js +30 -0
- package/dist/strategies/create-only.js.map +1 -0
- package/dist/strategies/index.d.ts +31 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +52 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/merge.d.ts +13 -0
- package/dist/strategies/merge.d.ts.map +1 -0
- package/dist/strategies/merge.js +60 -0
- package/dist/strategies/merge.js.map +1 -0
- package/dist/strategies/strategy.interface.d.ts +31 -0
- package/dist/strategies/strategy.interface.d.ts.map +1 -0
- package/dist/strategies/strategy.interface.js +2 -0
- package/dist/strategies/strategy.interface.js.map +1 -0
- package/dist/transaction/backup.d.ts +38 -0
- package/dist/transaction/backup.d.ts.map +1 -0
- package/dist/transaction/backup.js +97 -0
- package/dist/transaction/backup.js.map +1 -0
- package/dist/transaction/index.d.ts +4 -0
- package/dist/transaction/index.d.ts.map +1 -0
- package/dist/transaction/index.js +3 -0
- package/dist/transaction/index.js.map +1 -0
- package/dist/transaction/transaction.d.ts +34 -0
- package/dist/transaction/transaction.d.ts.map +1 -0
- package/dist/transaction/transaction.js +68 -0
- package/dist/transaction/transaction.js.map +1 -0
- package/dist/utils/file-operations.d.ts +29 -0
- package/dist/utils/file-operations.d.ts.map +1 -0
- package/dist/utils/file-operations.js +84 -0
- package/dist/utils/file-operations.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-utils.d.ts +22 -0
- package/dist/utils/json-utils.d.ts.map +1 -0
- package/dist/utils/json-utils.js +57 -0
- package/dist/utils/json-utils.js.map +1 -0
- package/dist/utils/path-utils.d.ts +21 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +35 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/eslint-plugin-code-organization/README.md +149 -0
- package/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +468 -0
- package/eslint-plugin-code-organization/index.js +23 -0
- package/eslint-plugin-code-organization/package.json +10 -0
- package/eslint-plugin-code-organization/rules/enforce-statement-order.js +157 -0
- package/expo/copy-overwrite/.claude/skills/apollo-client/SKILL.md +238 -0
- package/expo/copy-overwrite/.claude/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/SKILL.md +360 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/expo/copy-overwrite/.claude/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +327 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/SKILL.md +299 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/references/examples.md +749 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/references/patterns.md +318 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/create_component.py +198 -0
- package/expo/copy-overwrite/.claude/skills/container-view-pattern/scripts/validate_component.py +207 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/expo/copy-overwrite/.claude/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +414 -0
- package/expo/copy-overwrite/.claude/skills/directory-structure/SKILL.md +202 -0
- package/expo/copy-overwrite/.claude/skills/directory-structure/scripts/validate_structure.py +443 -0
- package/expo/copy-overwrite/.claude/skills/expo-env-config/SKILL.md +309 -0
- package/expo/copy-overwrite/.claude/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/SKILL.md +431 -0
- package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/expo/copy-overwrite/.claude/skills/expo-router-best-practices/scripts/generate-route.py +169 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/SKILL.md +411 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/expo/copy-overwrite/.claude/skills/gluestack-nativewind/scripts/validate_styling.py +354 -0
- package/expo/copy-overwrite/.claude/skills/local-state/SKILL.md +362 -0
- package/expo/copy-overwrite/.claude/skills/local-state/references/async-storage.md +505 -0
- package/expo/copy-overwrite/.claude/skills/local-state/references/persistence-patterns.md +711 -0
- package/expo/copy-overwrite/.claude/skills/local-state/references/reactive-variables.md +446 -0
- package/expo/copy-overwrite/.claude/skills/playwright-selectors/SKILL.md +223 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/SKILL.md +319 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/references/async-patterns.md +420 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/references/expo-router-testing.md +556 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/references/mocking-patterns.md +590 -0
- package/expo/copy-overwrite/.claude/skills/testing-library/references/query-priority.md +291 -0
- package/expo/copy-overwrite/.easignore.extra +2 -0
- package/expo/copy-overwrite/.mcp.json +33 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/README.md +234 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/plugin-index.test.js +84 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/require-memo-in-view.test.js +196 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/__tests__/single-component-per-file.test.js +289 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/index.js +32 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/package.json +10 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/enforce-component-structure.js +230 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/no-return-in-view.js +91 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/require-memo-in-view.js +178 -0
- package/expo/copy-overwrite/eslint-plugin-component-structure/rules/single-component-per-file.js +238 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/README.md +260 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/index.js +29 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/package.json +10 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-classname-outside-ui.js +51 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-direct-rn-imports.js +55 -0
- package/expo/copy-overwrite/eslint-plugin-ui-standards/rules/no-inline-styles.js +73 -0
- package/expo/copy-overwrite/eslint.config.mjs +560 -0
- package/expo/copy-overwrite/lighthouserc.js +194 -0
- package/expo/create-only/lighthouserc-config.json +28 -0
- package/expo/merge/package.json +132 -0
- package/lisa.sh +35 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/SKILL.md +176 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/project-patterns.md +483 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/nestjs/copy-overwrite/.claude/skills/nestjs-rules/SKILL.md +536 -0
- package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/SKILL.md +275 -0
- package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/nestjs/copy-overwrite/.claude/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/nestjs/merge/package.json +75 -0
- package/package.json +124 -0
- package/typescript/copy-contents/.husky/commit-msg +91 -0
- package/typescript/copy-contents/.husky/pre-commit +96 -0
- package/typescript/copy-contents/.husky/pre-push +211 -0
- package/typescript/copy-overwrite/.claude/hooks/format-on-edit.sh +74 -0
- package/typescript/copy-overwrite/.claude/hooks/install_pkgs.sh +59 -0
- package/typescript/copy-overwrite/.claude/hooks/lint-on-edit.sh +103 -0
- package/typescript/copy-overwrite/.claude/skills/jsdoc-best-practices/SKILL.md +388 -0
- package/typescript/copy-overwrite/.github/README.md +455 -0
- package/typescript/copy-overwrite/.github/dependabot.yml +40 -0
- package/typescript/copy-overwrite/.github/k6/BROWSER_TESTING_NOTE.md +129 -0
- package/typescript/copy-overwrite/.github/k6/INTEGRATION_GUIDE.md +354 -0
- package/typescript/copy-overwrite/.github/k6/README.md +386 -0
- package/typescript/copy-overwrite/.github/k6/SCENARIO_SELECTION_GUIDE.md +264 -0
- package/typescript/copy-overwrite/.github/k6/examples/customer-deploy-integration.yml +115 -0
- package/typescript/copy-overwrite/.github/k6/examples/data-driven-test.js +268 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/load.js +142 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/load.json +27 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/smoke.js +26 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/smoke.json +20 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/soak.js +244 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/soak.json +29 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/spike.js +180 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/spike.json +32 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/stress.js +206 -0
- package/typescript/copy-overwrite/.github/k6/scenarios/stress.json +38 -0
- package/typescript/copy-overwrite/.github/k6/scripts/api-test.js +452 -0
- package/typescript/copy-overwrite/.github/k6/scripts/default-test.js +185 -0
- package/typescript/copy-overwrite/.github/k6/thresholds/normal.json +30 -0
- package/typescript/copy-overwrite/.github/k6/thresholds/relaxed.json +21 -0
- package/typescript/copy-overwrite/.github/k6/thresholds/strict.json +29 -0
- package/typescript/copy-overwrite/.github/workflows/build.yml +72 -0
- package/typescript/copy-overwrite/.github/workflows/ci.yml +49 -0
- package/typescript/copy-overwrite/.github/workflows/claude.yml +51 -0
- package/typescript/copy-overwrite/.github/workflows/create-github-issue-on-failure.yml +113 -0
- package/typescript/copy-overwrite/.github/workflows/create-jira-issue-on-failure.yml +195 -0
- package/typescript/copy-overwrite/.github/workflows/create-sentry-issue-on-failure.yml +267 -0
- package/typescript/copy-overwrite/.github/workflows/deploy.yml +228 -0
- package/typescript/copy-overwrite/.github/workflows/k6-load-test-README.md +230 -0
- package/typescript/copy-overwrite/.github/workflows/lighthouse.yml +68 -0
- package/typescript/copy-overwrite/.github/workflows/load-test.yml +282 -0
- package/typescript/copy-overwrite/.github/workflows/quality.yml +1737 -0
- package/typescript/copy-overwrite/.github/workflows/release.yml +1599 -0
- package/typescript/copy-overwrite/.gitleaksignore +28 -0
- package/typescript/copy-overwrite/.nvmrc +1 -0
- package/typescript/copy-overwrite/.prettierignore +23 -0
- package/typescript/copy-overwrite/.prettierrc.json +22 -0
- package/typescript/copy-overwrite/.versionrc +42 -0
- package/typescript/copy-overwrite/.yamllint +20 -0
- package/typescript/copy-overwrite/commitlint.config.js +11 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/README.md +149 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/__tests__/enforce-statement-order.test.js +468 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/index.js +23 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/package.json +10 -0
- package/typescript/copy-overwrite/eslint-plugin-code-organization/rules/enforce-statement-order.js +157 -0
- package/typescript/copy-overwrite/eslint.config.mjs +390 -0
- package/typescript/copy-overwrite/eslint.ignore.config.json +57 -0
- package/typescript/copy-overwrite/eslint.thresholds.config.json +5 -0
- package/typescript/github-rulesets/base.json +106 -0
- package/typescript/merge/.claude/settings.json +28 -0
- package/typescript/merge/package.json +71 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
# GitHub Actions Configuration
|
|
2
|
+
|
|
3
|
+
This directory contains the CI/CD workflows and automation for the project. This document explains how to configure and use the GitHub Actions workflows.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Quick Start](#quick-start)
|
|
9
|
+
- [Workflows](#workflows)
|
|
10
|
+
- [Secrets Configuration](#secrets-configuration)
|
|
11
|
+
- [Repository Variables](#repository-variables)
|
|
12
|
+
- [External Service Setup](#external-service-setup)
|
|
13
|
+
- [Customization](#customization)
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
The CI/CD system provides:
|
|
18
|
+
|
|
19
|
+
- **Quality Gates**: Linting, type checking, formatting, and testing
|
|
20
|
+
- **Security Scanning**: Vulnerability detection, secret scanning, license compliance
|
|
21
|
+
- **Release Management**: Automated versioning, changelogs, and GitHub releases
|
|
22
|
+
- **Mobile Builds**: Expo EAS builds for iOS and Android
|
|
23
|
+
- **OTA Updates**: Expo EAS Update deployments
|
|
24
|
+
- **Performance Testing**: Lighthouse CI for web, k6 load testing
|
|
25
|
+
- **AI Integration**: Claude Code for automated code review and assistance
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
### Minimum Configuration
|
|
30
|
+
|
|
31
|
+
To get started with basic CI, add these secrets to your repository:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# No secrets required for basic quality checks (lint, typecheck, build, format)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Recommended Configuration
|
|
38
|
+
|
|
39
|
+
For full functionality, configure the following secrets:
|
|
40
|
+
|
|
41
|
+
| Secret | Purpose | Required For |
|
|
42
|
+
|--------|---------|--------------|
|
|
43
|
+
| `EXPO_TOKEN` | EAS builds and updates | Mobile deployment |
|
|
44
|
+
| `SENTRY_AUTH_TOKEN` | Error tracking | Release monitoring |
|
|
45
|
+
| `SONAR_TOKEN` | Code quality analysis | Security scanning |
|
|
46
|
+
| `SNYK_TOKEN` | Vulnerability scanning | Security scanning |
|
|
47
|
+
|
|
48
|
+
## Workflows
|
|
49
|
+
|
|
50
|
+
### CI Quality Checks (`ci.yml`)
|
|
51
|
+
|
|
52
|
+
**Triggers**: Pull requests, manual dispatch
|
|
53
|
+
|
|
54
|
+
Runs on every pull request to validate code quality:
|
|
55
|
+
|
|
56
|
+
- Lint (ESLint)
|
|
57
|
+
- Type checking (TypeScript)
|
|
58
|
+
- Formatting (Prettier)
|
|
59
|
+
- Build verification
|
|
60
|
+
- Security scans (when configured)
|
|
61
|
+
- Lighthouse CI (web performance)
|
|
62
|
+
|
|
63
|
+
**Configuration**:
|
|
64
|
+
```yaml
|
|
65
|
+
# In ci.yml, modify these inputs:
|
|
66
|
+
node_version: '22.21.1'
|
|
67
|
+
package_manager: 'bun'
|
|
68
|
+
skip_jobs: 'test,test:integration,test:e2e' # Comma-separated list
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Release and Deploy (`deploy.yml`)
|
|
72
|
+
|
|
73
|
+
**Triggers**: Push to `main`, `staging`, or `dev` branches; manual dispatch
|
|
74
|
+
|
|
75
|
+
Handles the complete release lifecycle:
|
|
76
|
+
|
|
77
|
+
1. Creates a new release with version bump
|
|
78
|
+
2. Generates changelog from commits
|
|
79
|
+
3. Triggers EAS build (if `app.config.ts` changed)
|
|
80
|
+
4. Publishes OTA update via EAS Update
|
|
81
|
+
5. Creates Sentry release (if configured)
|
|
82
|
+
|
|
83
|
+
**Environment Mapping**:
|
|
84
|
+
| Branch | Environment | EAS Channel |
|
|
85
|
+
|--------|-------------|-------------|
|
|
86
|
+
| `dev` | development | dev |
|
|
87
|
+
| `staging` | staging | staging |
|
|
88
|
+
| `main` | production | production |
|
|
89
|
+
|
|
90
|
+
### EAS Build (`build.yml`)
|
|
91
|
+
|
|
92
|
+
**Triggers**: Changes to `app.config.ts`, manual dispatch, workflow call
|
|
93
|
+
|
|
94
|
+
Builds native app binaries via Expo Application Services:
|
|
95
|
+
|
|
96
|
+
- **dev**: Development preview builds
|
|
97
|
+
- **staging**: Staging builds with auto-submit to TestFlight/Play Console
|
|
98
|
+
- **production**: Production builds with auto-submit
|
|
99
|
+
|
|
100
|
+
### Quality Checks (`quality.yml`)
|
|
101
|
+
|
|
102
|
+
**Type**: Reusable workflow
|
|
103
|
+
|
|
104
|
+
Comprehensive quality validation with 20+ configurable jobs. Called by other workflows.
|
|
105
|
+
|
|
106
|
+
**Skippable Jobs**:
|
|
107
|
+
```
|
|
108
|
+
lint, typecheck, test, test:unit, test:integration, test:e2e,
|
|
109
|
+
maestro_e2e, playwright_e2e, format, build, npm_security_scan,
|
|
110
|
+
sonarcloud, snyk, secret_scanning, license_compliance
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Release (`release.yml`)
|
|
114
|
+
|
|
115
|
+
**Type**: Reusable workflow
|
|
116
|
+
|
|
117
|
+
Enterprise-grade release management:
|
|
118
|
+
|
|
119
|
+
- Version strategies: `standard-version`, `semantic`, `calendar`, `custom`
|
|
120
|
+
- Changelog generation
|
|
121
|
+
- GPG signing (optional)
|
|
122
|
+
- SBOM generation
|
|
123
|
+
- Sentry release creation
|
|
124
|
+
- Jira release creation
|
|
125
|
+
- Compliance validation (SOC2, ISO27001, HIPAA, PCI-DSS)
|
|
126
|
+
|
|
127
|
+
**Blackout Periods** (configurable):
|
|
128
|
+
- Production: No weekends, no late nights (10 PM - 6 AM)
|
|
129
|
+
- Holiday blackouts: Dec 24 - Jan 2, Jul 3-5, Nov 27-29
|
|
130
|
+
|
|
131
|
+
### Lighthouse CI (`lighthouse.yml`)
|
|
132
|
+
|
|
133
|
+
**Type**: Reusable workflow
|
|
134
|
+
|
|
135
|
+
Web performance budget validation using Google Lighthouse.
|
|
136
|
+
|
|
137
|
+
### Claude Code (`claude.yml`)
|
|
138
|
+
|
|
139
|
+
**Triggers**: Comments/reviews mentioning `@claude`
|
|
140
|
+
|
|
141
|
+
AI-powered code assistance that can:
|
|
142
|
+
- Review code changes
|
|
143
|
+
- Suggest improvements
|
|
144
|
+
- Run tests and builds
|
|
145
|
+
- Answer questions about the codebase
|
|
146
|
+
|
|
147
|
+
### Load Testing (`load-test.yml`)
|
|
148
|
+
|
|
149
|
+
**Type**: Reusable workflow
|
|
150
|
+
|
|
151
|
+
Performance load testing using k6:
|
|
152
|
+
|
|
153
|
+
- Scenarios: `smoke`, `load`, `stress`, `spike`, `soak`
|
|
154
|
+
- Configurable thresholds
|
|
155
|
+
- Result artifact uploads
|
|
156
|
+
|
|
157
|
+
## Secrets Configuration
|
|
158
|
+
|
|
159
|
+
### How to Add Secrets
|
|
160
|
+
|
|
161
|
+
1. Go to **Settings** > **Secrets and variables** > **Actions**
|
|
162
|
+
2. Click **New repository secret**
|
|
163
|
+
3. Enter the secret name and value
|
|
164
|
+
|
|
165
|
+
Or use the GitHub CLI:
|
|
166
|
+
```bash
|
|
167
|
+
gh secret set SECRET_NAME --body "secret-value"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
For bulk setup, copy `.github/workflows/.env.example` and run:
|
|
171
|
+
```bash
|
|
172
|
+
gh secret set --env-file .env
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Core Secrets
|
|
176
|
+
|
|
177
|
+
#### EXPO_TOKEN
|
|
178
|
+
**Purpose**: Authenticate with Expo/EAS for builds and updates
|
|
179
|
+
|
|
180
|
+
**How to get it**:
|
|
181
|
+
1. Go to [expo.dev/settings/access-tokens](https://expo.dev/settings/access-tokens)
|
|
182
|
+
2. Click **Create Token**
|
|
183
|
+
3. Name it (e.g., "GitHub Actions")
|
|
184
|
+
4. Copy the token (starts with `expo_`)
|
|
185
|
+
|
|
186
|
+
**Required for**: EAS Build, EAS Update
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
#### SENTRY_AUTH_TOKEN
|
|
191
|
+
**Purpose**: Create releases and upload sourcemaps to Sentry
|
|
192
|
+
|
|
193
|
+
**How to get it**:
|
|
194
|
+
1. Go to [sentry.io/settings/account/api/auth-tokens/](https://sentry.io/settings/account/api/auth-tokens/)
|
|
195
|
+
2. Click **Create New Token**
|
|
196
|
+
3. Select scopes: `project:releases`, `project:write`
|
|
197
|
+
4. Copy the token
|
|
198
|
+
|
|
199
|
+
**Required for**: Error tracking, release monitoring
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
#### SONAR_TOKEN
|
|
204
|
+
**Purpose**: Authenticate with SonarCloud for code quality analysis
|
|
205
|
+
|
|
206
|
+
**How to get it**:
|
|
207
|
+
1. Go to [sonarcloud.io/account/security](https://sonarcloud.io/account/security)
|
|
208
|
+
2. Click **Generate Tokens**
|
|
209
|
+
3. Name your token and generate
|
|
210
|
+
4. Copy the token
|
|
211
|
+
|
|
212
|
+
**Required for**: Static code analysis (SAST)
|
|
213
|
+
|
|
214
|
+
**Additional Setup**:
|
|
215
|
+
Create `sonar-project.properties` in your repo root:
|
|
216
|
+
```properties
|
|
217
|
+
sonar.projectKey=your-org_your-project
|
|
218
|
+
sonar.organization=your-org
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
#### SNYK_TOKEN
|
|
224
|
+
**Purpose**: Scan dependencies for known vulnerabilities
|
|
225
|
+
|
|
226
|
+
**How to get it**:
|
|
227
|
+
1. Go to [app.snyk.io/account](https://app.snyk.io/account)
|
|
228
|
+
2. Find **Auth Token** section
|
|
229
|
+
3. Click **click to show** and copy
|
|
230
|
+
|
|
231
|
+
**Required for**: Dependency vulnerability scanning
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
#### GITGUARDIAN_API_KEY
|
|
236
|
+
**Purpose**: Detect hardcoded secrets in code
|
|
237
|
+
|
|
238
|
+
**How to get it**:
|
|
239
|
+
1. Go to [dashboard.gitguardian.com/api/personal-access-tokens](https://dashboard.gitguardian.com/api/personal-access-tokens)
|
|
240
|
+
2. Click **Create new token**
|
|
241
|
+
3. Select scope: `scan`
|
|
242
|
+
4. Copy the token
|
|
243
|
+
|
|
244
|
+
**Required for**: Secret detection
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
#### FOSSA_API_KEY
|
|
249
|
+
**Purpose**: License compliance checking for dependencies
|
|
250
|
+
|
|
251
|
+
**How to get it**:
|
|
252
|
+
1. Go to [app.fossa.com/account/settings/integrations/api_tokens](https://app.fossa.com/account/settings/integrations/api_tokens)
|
|
253
|
+
2. Click **Add API Token**
|
|
254
|
+
3. Copy the token
|
|
255
|
+
|
|
256
|
+
**Required for**: License compliance
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
#### CLAUDE_CODE_OAUTH_TOKEN
|
|
261
|
+
**Purpose**: Enable Claude AI code assistance in issues and PRs
|
|
262
|
+
|
|
263
|
+
**How to get it**:
|
|
264
|
+
1. Visit [claude.ai/code](https://claude.ai/code) or your Anthropic Console
|
|
265
|
+
2. Generate an OAuth token for GitHub integration
|
|
266
|
+
3. Copy the token
|
|
267
|
+
|
|
268
|
+
**Required for**: `@claude` mentions in issues/PRs
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
#### K6_CLOUD_TOKEN
|
|
273
|
+
**Purpose**: Run load tests on k6 Cloud infrastructure
|
|
274
|
+
|
|
275
|
+
**How to get it**:
|
|
276
|
+
1. Go to [app.k6.io/account/api-token](https://app.k6.io/account/api-token)
|
|
277
|
+
2. Copy your API token
|
|
278
|
+
|
|
279
|
+
**Required for**: Cloud-based load testing
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
### Release Signing Secrets (Optional)
|
|
284
|
+
|
|
285
|
+
For GPG-signed releases:
|
|
286
|
+
|
|
287
|
+
| Secret | Description |
|
|
288
|
+
|--------|-------------|
|
|
289
|
+
| `RELEASE_SIGNING_KEY` | Base64-encoded GPG private key |
|
|
290
|
+
| `SIGNING_KEY_ID` | GPG key ID |
|
|
291
|
+
| `SIGNING_KEY_PASSPHRASE` | GPG key passphrase |
|
|
292
|
+
| `DEPLOY_KEY` | SSH key for pushing to protected branches |
|
|
293
|
+
|
|
294
|
+
To generate:
|
|
295
|
+
```bash
|
|
296
|
+
# Generate GPG key
|
|
297
|
+
gpg --full-generate-key
|
|
298
|
+
|
|
299
|
+
# Export and base64 encode
|
|
300
|
+
gpg --export-secret-keys YOUR_KEY_ID | base64 > signing-key.txt
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
### Jira Integration Secrets (Optional)
|
|
306
|
+
|
|
307
|
+
| Secret | Description |
|
|
308
|
+
|--------|-------------|
|
|
309
|
+
| `JIRA_API_TOKEN` | API token from Atlassian |
|
|
310
|
+
| `JIRA_BASE_URL` | Your Jira instance URL (e.g., `https://company.atlassian.net`) |
|
|
311
|
+
| `JIRA_USER_EMAIL` | Email associated with the API token |
|
|
312
|
+
| `JIRA_AUTOMATION_WEBHOOK` | Webhook URL for Jira automation |
|
|
313
|
+
|
|
314
|
+
**How to get JIRA_API_TOKEN**:
|
|
315
|
+
1. Go to [id.atlassian.com/manage-profile/security/api-tokens](https://id.atlassian.com/manage-profile/security/api-tokens)
|
|
316
|
+
2. Click **Create API token**
|
|
317
|
+
3. Copy the token
|
|
318
|
+
|
|
319
|
+
## Repository Variables
|
|
320
|
+
|
|
321
|
+
Variables are non-sensitive configuration values. Set them in **Settings** > **Secrets and variables** > **Actions** > **Variables**.
|
|
322
|
+
|
|
323
|
+
| Variable | Description | Example |
|
|
324
|
+
|----------|-------------|---------|
|
|
325
|
+
| `SENTRY_ORG` | Sentry organization slug | `my-company` |
|
|
326
|
+
| `SENTRY_PROJECT` | Sentry project slug | `frontend-app` |
|
|
327
|
+
|
|
328
|
+
## External Service Setup
|
|
329
|
+
|
|
330
|
+
### SonarCloud
|
|
331
|
+
|
|
332
|
+
1. Sign in at [sonarcloud.io](https://sonarcloud.io)
|
|
333
|
+
2. Import your GitHub repository
|
|
334
|
+
3. Create `sonar-project.properties`:
|
|
335
|
+
```properties
|
|
336
|
+
sonar.projectKey=org_project
|
|
337
|
+
sonar.organization=org
|
|
338
|
+
sonar.sources=src
|
|
339
|
+
sonar.exclusions=**/node_modules/**,**/*.test.*
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Expo/EAS
|
|
343
|
+
|
|
344
|
+
1. Install EAS CLI: `npm install -g eas-cli`
|
|
345
|
+
2. Login: `eas login`
|
|
346
|
+
3. Configure project: `eas init`
|
|
347
|
+
4. Create `eas.json` with build profiles
|
|
348
|
+
|
|
349
|
+
### Sentry
|
|
350
|
+
|
|
351
|
+
1. Create a project at [sentry.io](https://sentry.io)
|
|
352
|
+
2. Note your organization and project slugs
|
|
353
|
+
3. Configure Sentry in your app (see Sentry React Native docs)
|
|
354
|
+
|
|
355
|
+
### Maestro Cloud (Mobile E2E)
|
|
356
|
+
|
|
357
|
+
1. Sign up at [cloud.mobile.dev](https://cloud.mobile.dev)
|
|
358
|
+
2. Create a project and note the project ID
|
|
359
|
+
3. Generate an API key
|
|
360
|
+
4. Add `MAESTRO_API_KEY` secret
|
|
361
|
+
5. Pass `maestro_project_id` input to quality workflow
|
|
362
|
+
|
|
363
|
+
## Customization
|
|
364
|
+
|
|
365
|
+
### Skipping Jobs
|
|
366
|
+
|
|
367
|
+
Add to your workflow call:
|
|
368
|
+
```yaml
|
|
369
|
+
uses: ./.github/workflows/quality.yml
|
|
370
|
+
with:
|
|
371
|
+
skip_jobs: 'test:e2e,maestro_e2e,playwright_e2e'
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Compliance Frameworks
|
|
375
|
+
|
|
376
|
+
Enable compliance validation:
|
|
377
|
+
```yaml
|
|
378
|
+
uses: ./.github/workflows/quality.yml
|
|
379
|
+
with:
|
|
380
|
+
compliance_framework: 'soc2' # or iso27001, hipaa, pci-dss
|
|
381
|
+
require_approval: true
|
|
382
|
+
approval_environment: 'production'
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**Note**: Create the environment in **Settings** > **Environments** first.
|
|
386
|
+
|
|
387
|
+
### Custom Node Version
|
|
388
|
+
|
|
389
|
+
```yaml
|
|
390
|
+
uses: ./.github/workflows/quality.yml
|
|
391
|
+
with:
|
|
392
|
+
node_version: '22.21.1'
|
|
393
|
+
package_manager: 'bun' # or npm, yarn
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Load Test Scenarios
|
|
397
|
+
|
|
398
|
+
```yaml
|
|
399
|
+
uses: ./.github/workflows/load-test.yml
|
|
400
|
+
with:
|
|
401
|
+
test_scenario: 'stress' # smoke, load, stress, spike, soak
|
|
402
|
+
base_url: 'https://api.example.com'
|
|
403
|
+
virtual_users: 100
|
|
404
|
+
test_duration: '10m'
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
## Directory Structure
|
|
408
|
+
|
|
409
|
+
```
|
|
410
|
+
.github/
|
|
411
|
+
├── workflows/
|
|
412
|
+
│ ├── ci.yml # PR quality checks
|
|
413
|
+
│ ├── deploy.yml # Release and deploy
|
|
414
|
+
│ ├── build.yml # EAS builds
|
|
415
|
+
│ ├── quality.yml # Reusable quality checks
|
|
416
|
+
│ ├── release.yml # Reusable release workflow
|
|
417
|
+
│ ├── lighthouse.yml # Web performance
|
|
418
|
+
│ ├── load-test.yml # k6 load testing
|
|
419
|
+
│ ├── claude.yml # AI assistance
|
|
420
|
+
│ ├── create-sentry-issue-on-failure.yml # Error tracking
|
|
421
|
+
│ ├── create-github-issue-on-failure.yml # Issue creation
|
|
422
|
+
│ ├── create-jira-issue-on-failure.yml # Jira integration
|
|
423
|
+
│ └── .env.example # Secrets template
|
|
424
|
+
├── k6/
|
|
425
|
+
│ ├── scripts/ # Test scripts
|
|
426
|
+
│ ├── scenarios/ # Test configurations
|
|
427
|
+
│ ├── thresholds/ # Performance thresholds
|
|
428
|
+
│ └── README.md # K6 documentation
|
|
429
|
+
└── dependabot.yml # Dependency updates
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
## Troubleshooting
|
|
433
|
+
|
|
434
|
+
### "Secret not found" errors
|
|
435
|
+
Ensure the secret is added to the repository, not just your local environment.
|
|
436
|
+
|
|
437
|
+
### SonarCloud scan fails
|
|
438
|
+
Verify `sonar-project.properties` exists and `SONAR_TOKEN` is set.
|
|
439
|
+
|
|
440
|
+
### EAS builds fail
|
|
441
|
+
Check `EXPO_TOKEN` is valid and has necessary permissions.
|
|
442
|
+
|
|
443
|
+
### Deployment fails on protected branches
|
|
444
|
+
Add `DEPLOY_KEY` (SSH deploy key) for pushing version bumps.
|
|
445
|
+
|
|
446
|
+
### Claude doesn't respond
|
|
447
|
+
Ensure `CLAUDE_CODE_OAUTH_TOKEN` is set and the comment includes `@claude`.
|
|
448
|
+
|
|
449
|
+
## Related Documentation
|
|
450
|
+
|
|
451
|
+
- [K6 Load Testing Guide](.github/k6/README.md)
|
|
452
|
+
- [K6 Scenario Selection Guide](.github/k6/SCENARIO_SELECTION_GUIDE.md)
|
|
453
|
+
- [Expo EAS Documentation](https://docs.expo.dev/eas/)
|
|
454
|
+
- [SonarCloud Documentation](https://docs.sonarcloud.io/)
|
|
455
|
+
- [Sentry React Native](https://docs.sentry.io/platforms/react-native/)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
# JavaScript/Node.js dependencies
|
|
4
|
+
- package-ecosystem: npm
|
|
5
|
+
directory: /
|
|
6
|
+
schedule:
|
|
7
|
+
interval: weekly
|
|
8
|
+
day: monday
|
|
9
|
+
target-branch: dev
|
|
10
|
+
open-pull-requests-limit: 10
|
|
11
|
+
groups:
|
|
12
|
+
production-dependencies:
|
|
13
|
+
dependency-type: production
|
|
14
|
+
update-types:
|
|
15
|
+
- minor
|
|
16
|
+
- patch
|
|
17
|
+
development-dependencies:
|
|
18
|
+
dependency-type: development
|
|
19
|
+
update-types:
|
|
20
|
+
- minor
|
|
21
|
+
- patch
|
|
22
|
+
labels:
|
|
23
|
+
- dependencies
|
|
24
|
+
commit-message:
|
|
25
|
+
prefix: 'chore(deps)'
|
|
26
|
+
prefix-development: 'chore(deps-dev)'
|
|
27
|
+
|
|
28
|
+
# GitHub Actions
|
|
29
|
+
- package-ecosystem: github-actions
|
|
30
|
+
directory: /
|
|
31
|
+
schedule:
|
|
32
|
+
interval: weekly
|
|
33
|
+
day: monday
|
|
34
|
+
target-branch: dev
|
|
35
|
+
open-pull-requests-limit: 5
|
|
36
|
+
labels:
|
|
37
|
+
- dependencies
|
|
38
|
+
- github-actions
|
|
39
|
+
commit-message:
|
|
40
|
+
prefix: 'ci(deps)'
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# K6 Browser Testing - Future Enhancement
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
K6 browser testing was deferred in Phase 3 due to additional complexity and dependencies. This document outlines what would be needed to add browser testing support in the future.
|
|
5
|
+
|
|
6
|
+
## Requirements for Browser Testing
|
|
7
|
+
|
|
8
|
+
### 1. Additional Dependencies
|
|
9
|
+
- Chromium or Chrome browser installation
|
|
10
|
+
- k6 browser module (experimental)
|
|
11
|
+
- Additional GitHub Actions setup for headless browser
|
|
12
|
+
|
|
13
|
+
### 2. Workflow Changes Needed
|
|
14
|
+
```yaml
|
|
15
|
+
- name: Setup Chrome
|
|
16
|
+
uses: browser-actions/setup-chrome@latest
|
|
17
|
+
|
|
18
|
+
- name: Install k6 with browser support
|
|
19
|
+
run: |
|
|
20
|
+
# k6 browser requires different installation
|
|
21
|
+
xk6 build --with github.com/grafana/xk6-browser
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 3. Example Browser Test Structure
|
|
25
|
+
```javascript
|
|
26
|
+
// .github/k6/scripts/browser-test.js
|
|
27
|
+
import { chromium } from 'k6/experimental/browser';
|
|
28
|
+
import { check, sleep } from 'k6';
|
|
29
|
+
|
|
30
|
+
export const options = {
|
|
31
|
+
scenarios: {
|
|
32
|
+
browser: {
|
|
33
|
+
executor: 'shared-iterations',
|
|
34
|
+
vus: 1,
|
|
35
|
+
iterations: 10,
|
|
36
|
+
options: {
|
|
37
|
+
browser: {
|
|
38
|
+
type: 'chromium',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
thresholds: {
|
|
44
|
+
browser_web_vital_lcp: ['p(90) < 2500'],
|
|
45
|
+
browser_web_vital_fid: ['p(90) < 100'],
|
|
46
|
+
browser_web_vital_cls: ['p(90) < 0.1'],
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export default async function () {
|
|
51
|
+
const browser = chromium.launch({
|
|
52
|
+
headless: true,
|
|
53
|
+
timeout: '60s',
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const context = browser.newContext();
|
|
57
|
+
const page = context.newPage();
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
// Navigate and measure
|
|
61
|
+
await page.goto(__ENV.K6_BASE_URL, { waitUntil: 'networkidle' });
|
|
62
|
+
|
|
63
|
+
// Capture Core Web Vitals
|
|
64
|
+
const metrics = await page.evaluate(() => ({
|
|
65
|
+
lcp: performance.getEntriesByType('largest-contentful-paint')[0]?.startTime,
|
|
66
|
+
fid: performance.getEntriesByType('first-input')[0]?.processingStart,
|
|
67
|
+
cls: performance.getEntriesByType('layout-shift')
|
|
68
|
+
.reduce((sum, entry) => sum + entry.value, 0),
|
|
69
|
+
}));
|
|
70
|
+
|
|
71
|
+
check(metrics, {
|
|
72
|
+
'LCP under 2.5s': (m) => m.lcp < 2500,
|
|
73
|
+
'FID under 100ms': (m) => !m.fid || m.fid < 100,
|
|
74
|
+
'CLS under 0.1': (m) => m.cls < 0.1,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// User journey testing
|
|
78
|
+
await page.click('text=Login');
|
|
79
|
+
await page.fill('input[name="username"]', 'testuser');
|
|
80
|
+
await page.fill('input[name="password"]', 'testpass');
|
|
81
|
+
await page.click('button[type="submit"]');
|
|
82
|
+
|
|
83
|
+
// Wait for navigation
|
|
84
|
+
await page.waitForSelector('.dashboard', { timeout: 5000 });
|
|
85
|
+
|
|
86
|
+
} finally {
|
|
87
|
+
page.close();
|
|
88
|
+
browser.close();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Benefits of Adding Browser Testing
|
|
94
|
+
|
|
95
|
+
1. **Real User Experience**: Test actual page load and interaction performance
|
|
96
|
+
2. **Core Web Vitals**: Measure Google's key metrics (LCP, FID, CLS)
|
|
97
|
+
3. **JavaScript Performance**: Test client-side rendering and SPA performance
|
|
98
|
+
4. **Visual Testing**: Capture screenshots and visual regressions
|
|
99
|
+
5. **User Journey Testing**: Test complete workflows including JS interactions
|
|
100
|
+
|
|
101
|
+
## Implementation Considerations
|
|
102
|
+
|
|
103
|
+
1. **Resource Usage**: Browser tests use significantly more resources than HTTP tests
|
|
104
|
+
2. **Execution Time**: Browser tests are slower than API tests
|
|
105
|
+
3. **Parallelization**: Limited VUs due to browser overhead
|
|
106
|
+
4. **Debugging**: More complex to debug in CI/CD environments
|
|
107
|
+
|
|
108
|
+
## When to Add Browser Testing
|
|
109
|
+
|
|
110
|
+
Consider adding browser testing when:
|
|
111
|
+
- Frontend performance is critical
|
|
112
|
+
- You need to measure Core Web Vitals
|
|
113
|
+
- Testing SPAs or heavily JavaScript-dependent applications
|
|
114
|
+
- User experience metrics are KPIs
|
|
115
|
+
- Visual regression testing is needed
|
|
116
|
+
|
|
117
|
+
## Alternative Approaches
|
|
118
|
+
|
|
119
|
+
If full browser testing is too heavy, consider:
|
|
120
|
+
1. **Synthetic monitoring** - Use external services for browser testing
|
|
121
|
+
2. **Lighthouse CI** - Automated Lighthouse tests in CI/CD
|
|
122
|
+
3. **Puppeteer/Playwright** - Separate browser testing pipeline
|
|
123
|
+
4. **WebPageTest API** - Integration with WebPageTest for detailed metrics
|
|
124
|
+
|
|
125
|
+
## References
|
|
126
|
+
|
|
127
|
+
- [k6 Browser Documentation](https://k6.io/docs/using-k6-browser/)
|
|
128
|
+
- [k6 Browser Examples](https://github.com/grafana/k6-browser-examples)
|
|
129
|
+
- [Core Web Vitals](https://web.dev/vitals/)
|