@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,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"thresholds": {
|
|
3
|
+
"http_req_failed": {
|
|
4
|
+
"threshold": "rate<0.2",
|
|
5
|
+
"abortOnFail": false
|
|
6
|
+
},
|
|
7
|
+
"http_req_duration": {
|
|
8
|
+
"threshold": "p(95)<3000"
|
|
9
|
+
},
|
|
10
|
+
"http_req_duration{name:Home}": {
|
|
11
|
+
"threshold": "p(95)<2000"
|
|
12
|
+
},
|
|
13
|
+
"http_req_duration{name:API}": {
|
|
14
|
+
"threshold": "p(95)<5000"
|
|
15
|
+
},
|
|
16
|
+
"checks": {
|
|
17
|
+
"threshold": "rate>0.8"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"description": "Relaxed thresholds for development and initial testing"
|
|
21
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"thresholds": {
|
|
3
|
+
"http_req_failed": {
|
|
4
|
+
"threshold": "rate<0.01",
|
|
5
|
+
"abortOnFail": true,
|
|
6
|
+
"delayAbortEval": "10s"
|
|
7
|
+
},
|
|
8
|
+
"http_req_duration": {
|
|
9
|
+
"threshold": "p(95)<200",
|
|
10
|
+
"abortOnFail": false
|
|
11
|
+
},
|
|
12
|
+
"http_req_duration{name:Home}": {
|
|
13
|
+
"threshold": "p(95)<150"
|
|
14
|
+
},
|
|
15
|
+
"http_req_duration{name:API}": {
|
|
16
|
+
"threshold": "p(95)<300"
|
|
17
|
+
},
|
|
18
|
+
"http_reqs": {
|
|
19
|
+
"threshold": "rate>10",
|
|
20
|
+
"abortOnFail": false
|
|
21
|
+
},
|
|
22
|
+
"checks": {
|
|
23
|
+
"threshold": "rate>0.95"
|
|
24
|
+
},
|
|
25
|
+
"iterations": {
|
|
26
|
+
"threshold": "count>100"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
name: EAS Build
|
|
2
|
+
on:
|
|
3
|
+
workflow_dispatch:
|
|
4
|
+
inputs:
|
|
5
|
+
environment:
|
|
6
|
+
description: 'Environment to build for'
|
|
7
|
+
required: true
|
|
8
|
+
default: 'dev'
|
|
9
|
+
type: choice
|
|
10
|
+
options:
|
|
11
|
+
- dev
|
|
12
|
+
- staging
|
|
13
|
+
- main
|
|
14
|
+
workflow_call:
|
|
15
|
+
inputs:
|
|
16
|
+
environment:
|
|
17
|
+
description: 'Environment to build for'
|
|
18
|
+
required: true
|
|
19
|
+
type: string
|
|
20
|
+
secrets:
|
|
21
|
+
EXPO_TOKEN:
|
|
22
|
+
required: true
|
|
23
|
+
push:
|
|
24
|
+
branches:
|
|
25
|
+
- dev
|
|
26
|
+
- staging
|
|
27
|
+
- main
|
|
28
|
+
paths:
|
|
29
|
+
- app.config.ts # Only trigger builds if this file changes
|
|
30
|
+
|
|
31
|
+
jobs:
|
|
32
|
+
build:
|
|
33
|
+
name: Install and build
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v4
|
|
37
|
+
- uses: actions/setup-node@v4
|
|
38
|
+
with:
|
|
39
|
+
node-version: '22.21.1'
|
|
40
|
+
- name: 🍞 Setup Bun
|
|
41
|
+
uses: oven-sh/setup-bun@v2
|
|
42
|
+
with:
|
|
43
|
+
bun-version: latest
|
|
44
|
+
- name: Setup Expo and EAS
|
|
45
|
+
uses: expo/expo-github-action@v8
|
|
46
|
+
with:
|
|
47
|
+
eas-version: latest
|
|
48
|
+
token: ${{ secrets.EXPO_TOKEN }}
|
|
49
|
+
- name: Install dependencies
|
|
50
|
+
run: bun install
|
|
51
|
+
- name: Determine Environment
|
|
52
|
+
id: env
|
|
53
|
+
run: |
|
|
54
|
+
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
|
|
55
|
+
echo "environment=${{ github.event.inputs.environment }}" >> $GITHUB_OUTPUT
|
|
56
|
+
elif [ "${{ github.event_name }}" == "workflow_call" ]; then
|
|
57
|
+
echo "environment=${{ inputs.environment }}" >> $GITHUB_OUTPUT
|
|
58
|
+
else
|
|
59
|
+
echo "environment=${{ github.ref_name }}" >> $GITHUB_OUTPUT
|
|
60
|
+
fi
|
|
61
|
+
- name: Build Dev Preview
|
|
62
|
+
if: steps.env.outputs.environment == 'dev'
|
|
63
|
+
run: eas build --platform all --non-interactive --no-wait --profile=dev-preview
|
|
64
|
+
- name: Build Dev
|
|
65
|
+
if: steps.env.outputs.environment == 'dev'
|
|
66
|
+
run: eas build --platform all --non-interactive --no-wait --profile=dev
|
|
67
|
+
- name: Build Staging
|
|
68
|
+
if: steps.env.outputs.environment == 'staging'
|
|
69
|
+
run: eas build --platform all --non-interactive --no-wait --profile=staging --auto-submit
|
|
70
|
+
- name: Build Production
|
|
71
|
+
if: steps.env.outputs.environment == 'main'
|
|
72
|
+
run: eas build --platform all --non-interactive --no-wait --profile=production --auto-submit
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: 🔍 CI Quality Checks
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
quality:
|
|
9
|
+
name: 🔍 Quality Checks
|
|
10
|
+
timeout-minutes: 30
|
|
11
|
+
# Reference to the quality checks workflow
|
|
12
|
+
uses: ./.github/workflows/quality.yml
|
|
13
|
+
with:
|
|
14
|
+
node_version: '22.21.1'
|
|
15
|
+
package_manager: 'bun'
|
|
16
|
+
skip_jobs: 'test,test:integration,test:e2e'
|
|
17
|
+
secrets: inherit
|
|
18
|
+
|
|
19
|
+
# playwright:
|
|
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
|
|
41
|
+
needs: [quality]
|
|
42
|
+
if: ${{ always() && (needs.quality.result == 'failure' || needs.quality.result == 'failure') && !contains(github.event.head_commit.message, '[skip ci]') }}
|
|
43
|
+
uses: ./.github/workflows/create-sentry-issue-on-failure.yml
|
|
44
|
+
with:
|
|
45
|
+
workflow_name: 'CI Quality Checks'
|
|
46
|
+
failed_job: ${{ needs.quality.result == 'failure' && 'quality' || 'playwright' }}
|
|
47
|
+
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
|
|
48
|
+
SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
|
|
49
|
+
secrets: inherit
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Claude Code
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issue_comment:
|
|
5
|
+
types: [created]
|
|
6
|
+
pull_request_review_comment:
|
|
7
|
+
types: [created]
|
|
8
|
+
issues:
|
|
9
|
+
types: [opened, assigned]
|
|
10
|
+
pull_request_review:
|
|
11
|
+
types: [submitted]
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude:
|
|
15
|
+
if: |
|
|
16
|
+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
17
|
+
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
18
|
+
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
|
19
|
+
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
pull-requests: read
|
|
24
|
+
issues: read
|
|
25
|
+
id-token: write
|
|
26
|
+
actions: read # Required for Claude to read CI results on PRs
|
|
27
|
+
steps:
|
|
28
|
+
- name: Checkout repository
|
|
29
|
+
uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 1
|
|
32
|
+
|
|
33
|
+
- name: Run Claude Code
|
|
34
|
+
id: claude
|
|
35
|
+
uses: anthropics/claude-code-action@v1
|
|
36
|
+
with:
|
|
37
|
+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
38
|
+
|
|
39
|
+
# This is an optional setting that allows Claude to read CI results on PRs
|
|
40
|
+
additional_permissions: |
|
|
41
|
+
actions: read
|
|
42
|
+
|
|
43
|
+
# Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
|
|
44
|
+
# prompt: 'Update the pull request description to include a summary of changes.'
|
|
45
|
+
|
|
46
|
+
# Optional: Add claude_args to customize behavior and configuration
|
|
47
|
+
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
|
|
48
|
+
# or https://docs.anthropic.com/en/docs/claude-code/sdk#command-line for available options
|
|
49
|
+
claude_args: |
|
|
50
|
+
--allowedTools "Bash(npm install),Bash(npm run build),Bash(npm run test:*),Bash(npm run lint:*),Bash(npm run format:*),Bash(npm run typecheck),Bash(npm run lint)"
|
|
51
|
+
--system-prompt "Follow our coding standards. Ensure all new code has tests. Look at package.json for scripts. Make sure all quality checks pass before committing. Reuse existing helper functions when possible."
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# -----------------------------------------------------------------------------
|
|
2
|
+
# GitHub Issue Creation Workflow
|
|
3
|
+
# -----------------------------------------------------------------------------
|
|
4
|
+
# ⚠️ WARNING: THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY! ⚠️
|
|
5
|
+
# Any changes may be overwritten by the generation process.
|
|
6
|
+
# This workflow creates a GitHub issue when another workflow fails.
|
|
7
|
+
# It captures details about the failure and creates a standardized issue
|
|
8
|
+
# to help track and resolve CI/CD problems.
|
|
9
|
+
#
|
|
10
|
+
# Example usage in another workflow:
|
|
11
|
+
# ```yaml
|
|
12
|
+
# create_github_issue_on_failure:
|
|
13
|
+
# if: failure()
|
|
14
|
+
# uses: ./.github/workflows/github-issue-on-failure.yml
|
|
15
|
+
# with:
|
|
16
|
+
# workflow_name: 'My Workflow'
|
|
17
|
+
# failed_job: 'build_and_test'
|
|
18
|
+
# secrets:
|
|
19
|
+
# PAT: ${{ secrets.PAT }}
|
|
20
|
+
# ```
|
|
21
|
+
|
|
22
|
+
name: 🚨 GitHub Issue on Workflow Failure
|
|
23
|
+
|
|
24
|
+
on:
|
|
25
|
+
workflow_call:
|
|
26
|
+
inputs:
|
|
27
|
+
workflow_name:
|
|
28
|
+
required: true
|
|
29
|
+
type: string
|
|
30
|
+
description: 'Name of the workflow that failed'
|
|
31
|
+
failed_job:
|
|
32
|
+
required: false
|
|
33
|
+
type: string
|
|
34
|
+
description: 'Name of the job that failed (optional)'
|
|
35
|
+
node_version:
|
|
36
|
+
description: 'Node.js version to use'
|
|
37
|
+
required: false
|
|
38
|
+
default: '20.x'
|
|
39
|
+
type: string
|
|
40
|
+
package_manager:
|
|
41
|
+
description: 'Package manager to use (npm, yarn, or bun)'
|
|
42
|
+
required: false
|
|
43
|
+
default: 'npm'
|
|
44
|
+
type: string
|
|
45
|
+
working_directory:
|
|
46
|
+
description: 'Directory to run commands in (if not root)'
|
|
47
|
+
required: false
|
|
48
|
+
default: ''
|
|
49
|
+
type: string
|
|
50
|
+
secrets:
|
|
51
|
+
PAT:
|
|
52
|
+
required: true
|
|
53
|
+
description: 'Personal Access Token with repo scope'
|
|
54
|
+
|
|
55
|
+
# Concurrency is managed by the parent workflow that calls this one
|
|
56
|
+
# This avoids deadlocks between parent and child workflows
|
|
57
|
+
|
|
58
|
+
jobs:
|
|
59
|
+
create_issue:
|
|
60
|
+
name: 📝 Create GitHub Issue
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
timeout-minutes: 5
|
|
63
|
+
steps:
|
|
64
|
+
- name: 📥 Checkout repository
|
|
65
|
+
uses: actions/checkout@v4
|
|
66
|
+
|
|
67
|
+
- name: 🔧 Setup Node.js
|
|
68
|
+
uses: actions/setup-node@v4
|
|
69
|
+
with:
|
|
70
|
+
node-version: ${{ inputs.node_version }}
|
|
71
|
+
cache: ${{ inputs.package_manager }}
|
|
72
|
+
|
|
73
|
+
- name: 🔖 Create Issue
|
|
74
|
+
uses: actions/github-script@v7
|
|
75
|
+
with:
|
|
76
|
+
github-token: ${{ secrets.PAT }}
|
|
77
|
+
script: |
|
|
78
|
+
// Get repository and run information
|
|
79
|
+
const { owner, repo } = context.repo;
|
|
80
|
+
const runId = context.runId;
|
|
81
|
+
const runUrl = `https://github.com/${owner}/${repo}/actions/runs/${runId}`;
|
|
82
|
+
|
|
83
|
+
// Get workflow information from inputs
|
|
84
|
+
const workflowName = '${{ inputs.workflow_name }}';
|
|
85
|
+
const failedJob = '${{ inputs.failed_job }}' || 'Unknown';
|
|
86
|
+
|
|
87
|
+
// Create standardized issue title and body
|
|
88
|
+
const title = `🚨 Workflow Failure: ${workflowName}${failedJob !== 'Unknown' ? ` - ${failedJob}` : ''}`;
|
|
89
|
+
const body = `
|
|
90
|
+
## Workflow Failure
|
|
91
|
+
|
|
92
|
+
The "${workflowName}" workflow has failed${failedJob !== 'Unknown' ? ` in job: **${failedJob}**` : ''}.
|
|
93
|
+
|
|
94
|
+
### Details
|
|
95
|
+
- **Workflow Run**: [View Run Details](${runUrl})
|
|
96
|
+
- **Commit**: ${context.sha}
|
|
97
|
+
- **Commit Message**: ${context.payload.head_commit ? context.payload.head_commit.message : 'N/A'}
|
|
98
|
+
- **Triggered by**: ${context.actor}
|
|
99
|
+
- **Failed at**: ${new Date().toISOString()}
|
|
100
|
+
|
|
101
|
+
Please investigate the workflow logs for more details on the failure.
|
|
102
|
+
`;
|
|
103
|
+
|
|
104
|
+
// Create the issue
|
|
105
|
+
await github.rest.issues.create({
|
|
106
|
+
owner,
|
|
107
|
+
repo,
|
|
108
|
+
title,
|
|
109
|
+
body,
|
|
110
|
+
labels: ['bug', 'automation', 'ci-failure']
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
console.log(`Issue created for workflow failure: ${runUrl}`);
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# -----------------------------------------------------------------------------
|
|
2
|
+
# Jira Issue Creation Workflow
|
|
3
|
+
# -----------------------------------------------------------------------------
|
|
4
|
+
# ⚠️ WARNING: THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY! ⚠️
|
|
5
|
+
# Any changes may be overwritten by the generation process.
|
|
6
|
+
# This workflow creates a Jira issue when another workflow fails.
|
|
7
|
+
# It captures details about the failure and creates a standardized issue
|
|
8
|
+
# to help track and resolve CI/CD problems in Jira.
|
|
9
|
+
#
|
|
10
|
+
# Example usage in another workflow:
|
|
11
|
+
# ```yaml
|
|
12
|
+
# create_jira_issue_on_failure:
|
|
13
|
+
# if: failure()
|
|
14
|
+
# uses: ./.github/workflows/jira-issue-on-failure.yml
|
|
15
|
+
# with:
|
|
16
|
+
# workflow_name: 'My Workflow'
|
|
17
|
+
# failed_job: 'build_and_test'
|
|
18
|
+
# JIRA_BASE_URL: ${{ vars.JIRA_BASE_URL }}
|
|
19
|
+
# JIRA_USER_EMAIL: ${{ vars.JIRA_USER_EMAIL }}
|
|
20
|
+
# JIRA_PROJECT_KEY: ${{ vars.JIRA_PROJECT_KEY }}
|
|
21
|
+
# secrets:
|
|
22
|
+
# JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
|
|
23
|
+
# ```
|
|
24
|
+
|
|
25
|
+
name: 🔖 Jira Issue on Workflow Failure
|
|
26
|
+
|
|
27
|
+
on:
|
|
28
|
+
workflow_call:
|
|
29
|
+
inputs:
|
|
30
|
+
workflow_name:
|
|
31
|
+
required: true
|
|
32
|
+
type: string
|
|
33
|
+
description: 'Name of the workflow that failed'
|
|
34
|
+
failed_job:
|
|
35
|
+
required: false
|
|
36
|
+
type: string
|
|
37
|
+
description: 'Name of the job that failed (optional)'
|
|
38
|
+
issue_type:
|
|
39
|
+
required: false
|
|
40
|
+
type: string
|
|
41
|
+
default: 'Bug'
|
|
42
|
+
description: 'Type of Jira issue to create (Bug, Task, etc.)'
|
|
43
|
+
JIRA_BASE_URL:
|
|
44
|
+
required: true
|
|
45
|
+
type: string
|
|
46
|
+
description: 'Jira instance base URL (e.g., https://your-domain.atlassian.net)'
|
|
47
|
+
JIRA_USER_EMAIL:
|
|
48
|
+
required: true
|
|
49
|
+
type: string
|
|
50
|
+
description: 'Email address of the Jira user associated with the API token'
|
|
51
|
+
JIRA_PROJECT_KEY:
|
|
52
|
+
required: true
|
|
53
|
+
type: string
|
|
54
|
+
description: 'The key of the Jira project where issues should be created'
|
|
55
|
+
node_version:
|
|
56
|
+
description: 'Node.js version to use'
|
|
57
|
+
required: false
|
|
58
|
+
default: '20.x'
|
|
59
|
+
type: string
|
|
60
|
+
package_manager:
|
|
61
|
+
description: 'Package manager to use (npm, yarn, or bun)'
|
|
62
|
+
required: false
|
|
63
|
+
default: 'npm'
|
|
64
|
+
type: string
|
|
65
|
+
working_directory:
|
|
66
|
+
description: 'Directory to run commands in (if not root)'
|
|
67
|
+
required: false
|
|
68
|
+
default: ''
|
|
69
|
+
type: string
|
|
70
|
+
secrets:
|
|
71
|
+
JIRA_API_TOKEN:
|
|
72
|
+
required: true
|
|
73
|
+
description: 'Jira API token for authentication'
|
|
74
|
+
|
|
75
|
+
# Concurrency is managed by the parent workflow that calls this one
|
|
76
|
+
# This avoids deadlocks between parent and child workflows
|
|
77
|
+
|
|
78
|
+
jobs:
|
|
79
|
+
create_jira_issue:
|
|
80
|
+
name: 📝 Create Jira Issue
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
timeout-minutes: 5
|
|
83
|
+
steps:
|
|
84
|
+
- name: 📥 Checkout repository
|
|
85
|
+
uses: actions/checkout@v4
|
|
86
|
+
|
|
87
|
+
- name: 🔧 Setup Node.js
|
|
88
|
+
uses: actions/setup-node@v4
|
|
89
|
+
with:
|
|
90
|
+
node-version: ${{ inputs.node_version }}
|
|
91
|
+
cache: ${{ inputs.package_manager }}
|
|
92
|
+
|
|
93
|
+
- name: 🔖 Create Jira Issue
|
|
94
|
+
id: create_jira_issue
|
|
95
|
+
run: |
|
|
96
|
+
cd "${{ inputs.working_directory || '.' }}"
|
|
97
|
+
|
|
98
|
+
# Set variables
|
|
99
|
+
WORKFLOW_NAME="${{ inputs.workflow_name }}"
|
|
100
|
+
FAILED_JOB="${{ inputs.failed_job || 'Unknown' }}"
|
|
101
|
+
ISSUE_TYPE="${{ inputs.issue_type }}"
|
|
102
|
+
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
103
|
+
|
|
104
|
+
# Get commit message, handling special characters properly
|
|
105
|
+
# Remove leading/trailing whitespace and escape for shell
|
|
106
|
+
COMMIT_MESSAGE="${{ github.event.head_commit.message || 'N/A' }}"
|
|
107
|
+
|
|
108
|
+
# Create summary with failure details
|
|
109
|
+
if [ "$FAILED_JOB" != "Unknown" ]; then
|
|
110
|
+
SUMMARY="🚨 CI Failure: ${WORKFLOW_NAME} - ${FAILED_JOB}"
|
|
111
|
+
else
|
|
112
|
+
SUMMARY="🚨 CI Failure: ${WORKFLOW_NAME}"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Create Jira description with properly escaped values
|
|
116
|
+
FAILED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
117
|
+
|
|
118
|
+
# Create JSON payload for Jira API using jq for proper escaping
|
|
119
|
+
# All dynamic content is passed as jq arguments to ensure proper escaping
|
|
120
|
+
PAYLOAD=$(jq -n \
|
|
121
|
+
--arg key "${{ inputs.JIRA_PROJECT_KEY }}" \
|
|
122
|
+
--arg summary "${SUMMARY}" \
|
|
123
|
+
--arg workflow_name "${WORKFLOW_NAME}" \
|
|
124
|
+
--arg failed_job "${FAILED_JOB}" \
|
|
125
|
+
--arg run_url "${RUN_URL}" \
|
|
126
|
+
--arg repository "${{ github.repository }}" \
|
|
127
|
+
--arg commit "${{ github.sha }}" \
|
|
128
|
+
--arg commit_message "${COMMIT_MESSAGE}" \
|
|
129
|
+
--arg triggered_by "${{ github.actor }}" \
|
|
130
|
+
--arg failed_at "${FAILED_AT}" \
|
|
131
|
+
--arg issuetype "${ISSUE_TYPE}" \
|
|
132
|
+
'{
|
|
133
|
+
"fields": {
|
|
134
|
+
"project": {
|
|
135
|
+
"key": $key
|
|
136
|
+
},
|
|
137
|
+
"summary": $summary,
|
|
138
|
+
"description": ("h2. Workflow Failure\n\nThe \"" + $workflow_name + "\" workflow has failed" + (if $failed_job != "Unknown" then " in job: *" + $failed_job + "*" else "" end) + ".\n\nh3. Details\n* *Workflow Run*: [View Run Details|" + $run_url + "]\n* *Repository*: " + $repository + "\n* *Commit*: " + $commit + "\n* *Commit Message*: " + $commit_message + "\n* *Triggered by*: " + $triggered_by + "\n* *Failed at*: " + $failed_at + "\n\nPlease investigate the workflow logs for more details on the failure."),
|
|
139
|
+
"issuetype": {
|
|
140
|
+
"name": $issuetype
|
|
141
|
+
},
|
|
142
|
+
"labels": ["ci-failure", "automated"]
|
|
143
|
+
}
|
|
144
|
+
}')
|
|
145
|
+
|
|
146
|
+
# Debug: Print the payload to see what's being sent
|
|
147
|
+
echo "Debug: Generated payload:"
|
|
148
|
+
echo "$PAYLOAD" | jq .
|
|
149
|
+
|
|
150
|
+
# Call Jira API to create issue
|
|
151
|
+
RESPONSE=$(curl -s -D- \
|
|
152
|
+
-u "${{ inputs.JIRA_USER_EMAIL }}:${{ secrets.JIRA_API_TOKEN }}" \
|
|
153
|
+
-X POST \
|
|
154
|
+
-H "Content-Type: application/json" \
|
|
155
|
+
--data "${PAYLOAD}" \
|
|
156
|
+
"${{ inputs.JIRA_BASE_URL }}/rest/api/2/issue")
|
|
157
|
+
|
|
158
|
+
# Extract issue key from response
|
|
159
|
+
ISSUE_KEY=$(echo "$RESPONSE" | grep -o 'key":"[^"]*' | cut -d'"' -f3)
|
|
160
|
+
|
|
161
|
+
if [ -n "$ISSUE_KEY" ]; then
|
|
162
|
+
echo "Successfully created Jira issue: $ISSUE_KEY"
|
|
163
|
+
echo "issue_key=$ISSUE_KEY" >> $GITHUB_OUTPUT
|
|
164
|
+
echo "issue_url=${{ inputs.JIRA_BASE_URL }}/browse/$ISSUE_KEY" >> $GITHUB_OUTPUT
|
|
165
|
+
else
|
|
166
|
+
echo "Failed to create Jira issue. API response:"
|
|
167
|
+
echo "$RESPONSE"
|
|
168
|
+
|
|
169
|
+
# Extract HTTP status code for better error diagnosis
|
|
170
|
+
HTTP_STATUS=$(echo "$RESPONSE" | grep -oE "^HTTP/[0-9.]+ [0-9]+" | awk '{print $2}')
|
|
171
|
+
if [ -n "$HTTP_STATUS" ]; then
|
|
172
|
+
echo "HTTP Status Code: $HTTP_STATUS"
|
|
173
|
+
|
|
174
|
+
if [ "$HTTP_STATUS" = "404" ]; then
|
|
175
|
+
echo "Error: API endpoint not found. Please check JIRA_BASE_URL configuration."
|
|
176
|
+
elif [ "$HTTP_STATUS" = "401" ]; then
|
|
177
|
+
echo "Error: Authentication failed. Please check JIRA_USER_EMAIL and JIRA_API_TOKEN."
|
|
178
|
+
elif [ "$HTTP_STATUS" = "403" ]; then
|
|
179
|
+
echo "Error: Permission denied. Please check user permissions."
|
|
180
|
+
fi
|
|
181
|
+
fi
|
|
182
|
+
|
|
183
|
+
# Print payload for debugging (with sensitive data redacted)
|
|
184
|
+
echo "Request payload (redacted):"
|
|
185
|
+
echo "$PAYLOAD" | sed 's/"key":"[^"]*"/"key":"***"/g'
|
|
186
|
+
|
|
187
|
+
exit 1
|
|
188
|
+
fi
|
|
189
|
+
|
|
190
|
+
- name: 📢 Report Issue Creation
|
|
191
|
+
if: steps.create_jira_issue.outputs.issue_key
|
|
192
|
+
run: |
|
|
193
|
+
cd "${{ inputs.working_directory || '.' }}"
|
|
194
|
+
echo "Created Jira issue: ${{ steps.create_jira_issue.outputs.issue_key }}"
|
|
195
|
+
echo "Issue URL: ${{ steps.create_jira_issue.outputs.issue_url }}"
|