@vypdev/copilot 3.2.0 → 3.3.1

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.
Files changed (71) hide show
  1. package/README.md +49 -16
  2. package/action.yml +67 -35
  3. package/build/api/index.js +4666 -0
  4. package/build/api/src/api.d.ts +35 -0
  5. package/build/api/src/application/ports/agent_configuration_ports.d.ts +3 -0
  6. package/build/api/src/application/ports/agent_findings_ports.d.ts +8 -0
  7. package/build/api/src/application/ports/agent_query_ports.d.ts +14 -0
  8. package/build/api/src/application/ports/bugbot_context_ports.d.ts +9 -0
  9. package/build/api/src/application/ports/bugbot_finding_publication_ports.d.ts +7 -0
  10. package/build/api/src/application/ports/bugbot_finding_resolution_ports.d.ts +6 -0
  11. package/build/api/src/application/ports/bugbot_issue_read_ports.d.ts +10 -0
  12. package/build/api/src/application/ports/bugbot_issue_write_ports.d.ts +12 -0
  13. package/build/api/src/application/ports/bugbot_pull_request_read_ports.d.ts +47 -0
  14. package/build/api/src/application/ports/bugbot_pull_request_resolution_ports.d.ts +3 -0
  15. package/build/api/src/application/ports/bugbot_pull_request_write_ports.d.ts +4 -0
  16. package/build/api/src/application/ports/bugbot_rule_ports.d.ts +12 -0
  17. package/build/api/src/application/ports/bugbot_telemetry_ports.d.ts +32 -0
  18. package/build/api/src/application/ports/pull_request_review_comment_ports.d.ts +43 -0
  19. package/build/api/src/application/usecases/steps/commit/bugbot/types.d.ts +112 -0
  20. package/build/api/src/data/model/agent.d.ts +2 -0
  21. package/build/api/src/data/model/ai.d.ts +28 -0
  22. package/build/api/src/data/model/branch_configuration.d.ts +6 -0
  23. package/build/api/src/data/model/branches.d.ts +12 -0
  24. package/build/api/src/data/model/commit.d.ts +8 -0
  25. package/build/api/src/data/model/config.d.ts +30 -0
  26. package/build/api/src/data/model/emoji.d.ts +5 -0
  27. package/build/api/src/data/model/execution.d.ts +75 -0
  28. package/build/api/src/data/model/execution_components.d.ts +43 -0
  29. package/build/api/src/data/model/execution_inputs.d.ts +94 -0
  30. package/build/api/src/data/model/hotfix.d.ts +7 -0
  31. package/build/api/src/data/model/images.d.ts +27 -0
  32. package/build/api/src/data/model/issue.d.ts +27 -0
  33. package/build/api/src/data/model/issue_types.d.ts +30 -0
  34. package/build/api/src/data/model/labels.d.ts +60 -0
  35. package/build/api/src/data/model/locale.d.ts +6 -0
  36. package/build/api/src/data/model/project_detail.d.ts +15 -0
  37. package/build/api/src/data/model/projects.d.ts +14 -0
  38. package/build/api/src/data/model/pull_request.d.ts +32 -0
  39. package/build/api/src/data/model/recommendation_state.d.ts +6 -0
  40. package/build/api/src/data/model/release.d.ts +6 -0
  41. package/build/api/src/data/model/result.d.ts +25 -0
  42. package/build/api/src/data/model/single_action.d.ts +43 -0
  43. package/build/api/src/data/model/size_threshold.d.ts +6 -0
  44. package/build/api/src/data/model/size_thresholds.d.ts +10 -0
  45. package/build/api/src/data/model/tokens.d.ts +4 -0
  46. package/build/api/src/data/model/welcome.d.ts +5 -0
  47. package/build/api/src/data/model/workflows.d.ts +5 -0
  48. package/build/api/src/domain/agent.d.ts +26 -0
  49. package/build/api/src/domain/bugbot/finding_identity.d.ts +26 -0
  50. package/build/api/src/domain/bugbot/review_command.d.ts +16 -0
  51. package/build/api/src/domain/bugbot/review_configuration.d.ts +25 -0
  52. package/build/api/src/domain/copilot_lifecycle.d.ts +42 -0
  53. package/build/api/src/domain/pull_request_description.d.ts +13 -0
  54. package/build/api/src/tooling/bugbot_analytics.d.ts +24 -0
  55. package/build/api/src/tooling/bugbot_benchmark.d.ts +26 -0
  56. package/build/api/src/tooling/bugbot_quality_eval.d.ts +41 -0
  57. package/build/cli/index.js +12503 -1754
  58. package/build/github_action/index.js +10076 -1305
  59. package/package.json +16 -6
  60. package/setup/ISSUE_TEMPLATE/help_request.yml +5 -0
  61. package/setup/workflows/agent-cli-provisioning.yml +26 -27
  62. package/setup/workflows/copilot_branch_sync.yml +19 -0
  63. package/setup/workflows/copilot_close_inactive_issues.yml +49 -0
  64. package/setup/workflows/copilot_commit.yml +56 -1
  65. package/setup/workflows/copilot_credential_health.yml +190 -0
  66. package/setup/workflows/copilot_issue.yml +42 -2
  67. package/setup/workflows/copilot_issue_comment.yml +53 -4
  68. package/setup/workflows/copilot_pull_request.yml +65 -3
  69. package/setup/workflows/copilot_pull_request_comment.yml +53 -4
  70. package/setup/workflows/hotfix_workflow.yml +39 -19
  71. package/setup/workflows/release_workflow.yml +39 -19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vypdev/copilot",
3
- "version": "3.2.0",
3
+ "version": "3.3.1",
4
4
  "packageManager": "pnpm@10.12.4",
5
5
  "description": "Automates branch management, GitHub project linking, and issue/PR tracking with Git-Flow methodology.",
6
6
  "homepage": "https://github.com/vypdev/copilot",
@@ -12,6 +12,13 @@
12
12
  "url": "https://github.com/vypdev/copilot/issues"
13
13
  },
14
14
  "main": "build/github_action/index.js",
15
+ "exports": {
16
+ ".": "./build/github_action/index.js",
17
+ "./bugbot": {
18
+ "types": "./build/api/src/api.d.ts",
19
+ "default": "./build/api/index.js"
20
+ }
21
+ },
15
22
  "bin": {
16
23
  "copilot": "./build/cli/index.js"
17
24
  },
@@ -19,6 +26,8 @@
19
26
  "action.yml",
20
27
  "build/cli/index.js",
21
28
  "build/github_action/index.js",
29
+ "build/api/index.js",
30
+ "build/api/src/",
22
31
  "setup/ISSUE_TEMPLATE/",
23
32
  "setup/workflows/",
24
33
  "setup/pull_request_template.md",
@@ -33,18 +42,20 @@
33
42
  "node": ">=24"
34
43
  },
35
44
  "scripts": {
36
- "build": "ncc build src/actions/github_action.ts -o build/github_action && ncc build src/cli.ts -o build/cli && chmod +x build/cli/index.js",
45
+ "build": "node scripts/clean-generated-bundles.cjs && ncc build src/actions/github_action.ts -o build/github_action && ncc build src/cli.ts -o build/cli && ncc build src/api.ts -o build/api && node scripts/prepare-generated-bundles.cjs && chmod +x build/cli/index.js",
37
46
  "validate:build": "node scripts/validate-build.cjs",
38
47
  "validate:npm-package": "node scripts/validate-npm-package.cjs",
39
48
  "smoke:npm-package": "node scripts/smoke-test-npm-package.cjs",
40
49
  "test": "jest",
41
50
  "test:watch": "jest --watch",
42
51
  "test:coverage": "jest --coverage",
52
+ "eval:bugbot": "jest src/tooling/__tests__/bugbot_quality_eval.test.ts src/tooling/__tests__/bugbot_benchmark.test.ts --runInBand",
43
53
  "typecheck": "tsc --noEmit",
44
54
  "metrics:architecture": "node scripts/collect-architecture-metrics.cjs",
45
55
  "lint": "eslint src",
46
56
  "validate:agent-docs": "node scripts/validate-agent-documentation.cjs",
47
57
  "validate:docs-page": "node scripts/validate-docs-page-assets.cjs",
58
+ "validate:documentation": "node scripts/validate-documentation-contract.cjs",
48
59
  "validate:workflows": "node scripts/validate-workflow-contract.cjs",
49
60
  "lint:fix": "eslint src --fix",
50
61
  "postinstall": "node scripts/install-git-hooks.cjs"
@@ -59,7 +70,6 @@
59
70
  "@actions/github": "^6.0.1",
60
71
  "@types/axios": "^0.14.4",
61
72
  "@types/chance": "^1.1.6",
62
- "@types/dotenv": "^8.2.3",
63
73
  "@types/js-yaml": "^4.0.9",
64
74
  "axios": "^1.8.4",
65
75
  "boxen": "^8.0.1",
@@ -67,9 +77,9 @@
67
77
  "chance": "^1.1.12",
68
78
  "commander": "^12.0.0",
69
79
  "dockerode": "^4.0.5",
70
- "dotenv": "^16.5.0",
71
80
  "js-yaml": "^4.1.0",
72
- "shell-quote": "^1.8.3"
81
+ "shell-quote": "^1.8.3",
82
+ "tweetnacl": "^1.0.3"
73
83
  },
74
84
  "devDependencies": {
75
85
  "@eslint/js": "^9.15.0",
@@ -83,4 +93,4 @@
83
93
  "typescript": "^5.2.2",
84
94
  "typescript-eslint": "^8.15.0"
85
95
  }
86
- }
96
+ }
@@ -17,6 +17,11 @@ body:
17
17
  value: |
18
18
  ---
19
19
 
20
+ - type: markdown
21
+ attributes:
22
+ value: |
23
+ **Copilot assistance:** After opening this issue, mention `@vypbot` in a comment to ask for an explanation, diagnosis, or read-only code/security analysis. Use `/copilot help` to see all available commands.
24
+
20
25
  - type: dropdown
21
26
  id: help_area
22
27
  attributes:
@@ -14,41 +14,40 @@ jobs:
14
14
  steps:
15
15
  - name: Checkout repository
16
16
  uses: actions/checkout@v5
17
+ with:
18
+ persist-credentials: false
17
19
 
18
20
  - name: Verify selected CLI binary and headless contract
19
21
  shell: bash
20
22
  env:
21
23
  AGENT_PROVIDER: ${{ vars.AGENT_PROVIDER || 'codex' }}
24
+ FINDINGS_PROVIDER: ${{ vars.FINDINGS_PROVIDER }}
25
+ FIXER_PROVIDER: ${{ vars.FIXER_PROVIDER }}
26
+ PLANNER_PROVIDER: ${{ vars.PLANNER_PROVIDER }}
27
+ REVIEWER_PROVIDER: ${{ vars.REVIEWER_PROVIDER }}
28
+ TESTER_PROVIDER: ${{ vars.TESTER_PROVIDER }}
22
29
  AGENT_COMMAND: ${{ vars.AGENT_COMMAND }}
23
30
  run: |
24
31
  set -euo pipefail
25
32
 
26
- if [[ -n "${AGENT_COMMAND// }" ]]; then
27
- read -r executable _ <<< "$AGENT_COMMAND"
28
- command -v "$executable"
29
- echo "Configured agent command: $executable"
30
- else
31
- case "$AGENT_PROVIDER" in
32
- opencode)
33
- command -v opencode
34
- opencode --version >/dev/null
35
- opencode run --help >/dev/null
36
- ;;
37
- codex)
38
- command -v codex
39
- codex --version >/dev/null
40
- codex exec --help >/dev/null
41
- ;;
42
- cursor)
43
- command -v agent
44
- agent --version >/dev/null
45
- agent --help >/dev/null
46
- ;;
47
- *)
48
- echo "Unsupported AGENT_PROVIDER: $AGENT_PROVIDER" >&2
49
- exit 1
50
- ;;
33
+ providers=("$AGENT_PROVIDER" "$FINDINGS_PROVIDER" "$FIXER_PROVIDER" "$PLANNER_PROVIDER" "$REVIEWER_PROVIDER" "$TESTER_PROVIDER")
34
+ checked=""
35
+ for provider in "${providers[@]}"; do
36
+ [[ -z "${provider// }" ]] && continue
37
+ [[ " $checked " == *" $provider "* ]] && continue
38
+ checked="$checked $provider"
39
+ if [[ -n "${AGENT_COMMAND// }" && "$provider" == "$AGENT_PROVIDER" ]]; then
40
+ read -r executable _ <<< "$AGENT_COMMAND"
41
+ command -v "$executable"
42
+ echo "Configured agent command: $executable"
43
+ continue
44
+ fi
45
+ case "$provider" in
46
+ opencode) command -v opencode; opencode --version >/dev/null; opencode run --help >/dev/null ;;
47
+ codex) command -v codex; codex --version >/dev/null; codex exec --help >/dev/null ;;
48
+ cursor) command -v agent; agent --version >/dev/null; agent --help >/dev/null ;;
49
+ *) echo "Unsupported agent provider: $provider" >&2; exit 1 ;;
51
50
  esac
52
- fi
51
+ done
53
52
 
54
- echo "Agent CLI contract passed for $AGENT_PROVIDER."
53
+ echo "Agent CLI contract passed for: $checked."
@@ -0,0 +1,19 @@
1
+ name: Copilot - Branch Sync
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '**'
7
+
8
+ jobs:
9
+ branch-sync:
10
+ name: Copilot - Branch Sync
11
+ runs-on: ubuntu-latest
12
+ timeout-minutes: 120
13
+ permissions:
14
+ contents: read
15
+ steps:
16
+ - uses: vypdev/copilot@v3
17
+ with:
18
+ single-action: check_branch_sync_action
19
+ token: ${{ secrets.PAT }}
@@ -0,0 +1,49 @@
1
+ name: Copilot - Close Inactive Issues
2
+
3
+ on:
4
+ schedule:
5
+ - cron: '0 */6 * * *'
6
+ workflow_dispatch:
7
+ inputs:
8
+ inactivity_threshold_hours:
9
+ description: Hours without activity before closing a waiting issue
10
+ required: false
11
+ default: '168'
12
+ type: string
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ copilot-inactive-issues:
19
+ name: Copilot - Close Inactive Issues
20
+ runs-on: ubuntu-latest
21
+ timeout-minutes: 120
22
+ permissions:
23
+ contents: read
24
+ steps:
25
+ - name: Checkout Repository
26
+ uses: actions/checkout@v5
27
+ with:
28
+ persist-credentials: false
29
+
30
+ - uses: vypdev/copilot@v3
31
+ with:
32
+ single-action: close_inactive_issues_action
33
+ inactivity-threshold-hours: ${{ inputs.inactivity_threshold_hours || vars.INACTIVITY_THRESHOLD_HOURS || '168' }}
34
+ agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
35
+ agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
36
+ agent-model: ${{ vars.AGENT_MODEL || 'gpt-5.6-luna' }}
37
+ agent-effort: ${{ vars.AGENT_EFFORT }}
38
+ agent-command: ${{ vars.AGENT_COMMAND }}
39
+ findings-provider: ${{ vars.FINDINGS_PROVIDER }}
40
+ findings-model-provider: ${{ vars.FINDINGS_MODEL_PROVIDER }}
41
+ findings-model: ${{ vars.FINDINGS_MODEL }}
42
+ findings-effort: ${{ vars.FINDINGS_EFFORT }}
43
+ findings-command: ${{ vars.FINDINGS_COMMAND }}
44
+ fixer-provider: ${{ vars.FIXER_PROVIDER }}
45
+ fixer-model-provider: ${{ vars.FIXER_MODEL_PROVIDER }}
46
+ fixer-model: ${{ vars.FIXER_MODEL }}
47
+ fixer-effort: ${{ vars.FIXER_EFFORT }}
48
+ fixer-command: ${{ vars.FIXER_COMMAND }}
49
+ token: ${{ secrets.PAT }}
@@ -9,16 +9,70 @@ on:
9
9
 
10
10
  jobs:
11
11
  copilot-commits:
12
+ if: ${{ vars.COPILOT_BOT_LOGIN == '' || github.actor != vars.COPILOT_BOT_LOGIN }}
12
13
  name: Copilot - Commit
13
14
  runs-on: ubuntu-latest
14
15
  timeout-minutes: 120
16
+ permissions:
17
+ contents: read
15
18
  steps:
16
19
  - name: Checkout Repository
17
20
  uses: actions/checkout@v5
21
+ with:
22
+ persist-credentials: false
23
+ fetch-depth: 0
24
+
25
+ - name: Fetch push review range
26
+ if: github.event.after != '0000000000000000000000000000000000000000'
27
+ env:
28
+ BEFORE_SHA: ${{ github.event.before }}
29
+ AFTER_SHA: ${{ github.event.after }}
30
+ BRANCH_CREATED: ${{ github.event.created }}
31
+ run: |
32
+ git cat-file -e "${AFTER_SHA}^{commit}"
33
+ if [ "$BRANCH_CREATED" != "true" ] && ! git cat-file -e "${BEFORE_SHA}^{commit}"; then
34
+ echo "::notice::The previous push commit is unavailable; Bugbot will use its documented fallback scope."
35
+ fi
18
36
 
19
37
  - uses: vypdev/copilot@v3
20
38
  with:
39
+ ai-ignore-files: ${{ vars.AI_IGNORE_FILES || 'build/*' }}
21
40
  debug: ${{ vars.DEBUG }}
41
+ main-branch: ${{ vars.MAIN_BRANCH || 'master' }}
42
+ development-branch: ${{ vars.DEVELOPMENT_BRANCH || 'develop' }}
43
+ feature-tree: ${{ vars.FEATURE_TREE || 'feature' }}
44
+ bugfix-tree: ${{ vars.BUGFIX_TREE || 'bugfix' }}
45
+ hotfix-tree: ${{ vars.HOTFIX_TREE || 'hotfix' }}
46
+ release-tree: ${{ vars.RELEASE_TREE || 'release' }}
47
+ docs-tree: ${{ vars.DOCS_TREE || 'docs' }}
48
+ chore-tree: ${{ vars.CHORE_TREE || 'chore' }}
49
+ branch-management-always: ${{ vars.BRANCH_MANAGEMENT_ALWAYS || 'false' }}
50
+ reopen-issue-on-push: ${{ vars.REOPEN_ISSUE_ON_PUSH || 'true' }}
51
+ desired-assignees-count: ${{ vars.DESIRED_ASSIGNEES_COUNT || '1' }}
52
+ desired-reviewers-count: ${{ vars.DESIRED_REVIEWERS_COUNT || '1' }}
53
+ merge-timeout: ${{ vars.MERGE_TIMEOUT || '600' }}
54
+ issues-locale: ${{ vars.ISSUES_LOCALE || 'en-US' }}
55
+ pull-requests-locale: ${{ vars.PULL_REQUESTS_LOCALE || 'en-US' }}
56
+ commit-prefix-transforms: ${{ vars.COMMIT_PREFIX_TRANSFORMS || 'replace-slash' }}
57
+ ai-pull-request-description: ${{ vars.AI_PULL_REQUEST_DESCRIPTION || 'true' }}
58
+ ai-pull-request-description-mode: ${{ vars.AI_PULL_REQUEST_DESCRIPTION_MODE || 'replace' }}
59
+ ai-members-only: ${{ vars.AI_MEMBERS_ONLY || 'false' }}
60
+ ai-include-reasoning: ${{ vars.AI_INCLUDE_REASONING || 'false' }}
61
+ bugbot-severity: ${{ vars.BUGBOT_SEVERITY || 'low' }}
62
+ bugbot-comment-limit: ${{ vars.BUGBOT_COMMENT_LIMIT || '20' }}
63
+ bugbot-fix-verify-commands: ${{ vars.BUGBOT_AUTOFIX_VERIFY_COMMANDS }}
64
+ bugbot-dry-run: ${{ vars.BUGBOT_DRY_RUN || 'false' }}
65
+ bugbot-effort: ${{ vars.BUGBOT_EFFORT || 'smart' }}
66
+ bugbot-review-drafts: ${{ vars.BUGBOT_REVIEW_DRAFTS || 'false' }}
67
+ bugbot-trace-rules: ${{ vars.BUGBOT_TRACE_RULES || 'false' }}
68
+ bugbot-suggested-changes: ${{ vars.BUGBOT_SUGGESTED_CHANGES || 'true' }}
69
+ bugbot-telemetry: ${{ vars.BUGBOT_TELEMETRY || 'true' }}
70
+ bugbot-fail-on-unresolved: ${{ vars.BUGBOT_FAIL_ON_UNRESOLVED || 'false' }}
71
+ bugbot-organization-rules: ${{ vars.BUGBOT_ORGANIZATION_RULES }}
72
+ project-column-issue-created: ${{ vars.PROJECT_COLUMN_ISSUE_CREATED || 'Todo' }}
73
+ project-column-pull-request-created: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_CREATED || 'In Progress' }}
74
+ project-column-issue-in-progress: ${{ vars.PROJECT_COLUMN_ISSUE_IN_PROGRESS || 'In Progress' }}
75
+ project-column-pull-request-in-progress: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_IN_PROGRESS || 'In Progress' }}
22
76
  project-ids: ${{ vars.PROJECT_IDS }}
23
77
  agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
24
78
  agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
@@ -53,5 +107,6 @@ jobs:
53
107
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
54
108
  GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
55
109
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
56
- CURSOR_API_KEY: ${{ (vars.AGENT_PROVIDER == 'cursor' || vars.FINDINGS_PROVIDER == 'cursor' || vars.FIXER_PROVIDER == 'cursor' || vars.PLANNER_PROVIDER == 'cursor' || vars.REVIEWER_PROVIDER == 'cursor' || vars.TESTER_PROVIDER == 'cursor' || vars.RELEASE_PROVIDER == 'cursor') && secrets.CURSOR_API_KEY || '' }}
110
+ CURSOR_API_KEY: ${{ (vars.AGENT_PROVIDER == 'cursor' || vars.FINDINGS_PROVIDER == 'cursor' || vars.FIXER_PROVIDER == 'cursor' || vars.PLANNER_PROVIDER == 'cursor' || vars.REVIEWER_PROVIDER == 'cursor' || vars.TESTER_PROVIDER == 'cursor') && secrets.CURSOR_API_KEY || '' }}
111
+ CODEX_API_KEY: ${{ secrets.CODEX_API_KEY }}
57
112
  CODEX_ACCESS_TOKEN: ${{ secrets.CODEX_ACCESS_TOKEN }}
@@ -0,0 +1,190 @@
1
+ name: Copilot - Credential Health
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ check_pat:
7
+ description: Check the workflow PAT against GitHub
8
+ required: false
9
+ default: false
10
+ type: boolean
11
+ check_openai:
12
+ description: Check OPENAI_API_KEY
13
+ required: false
14
+ default: false
15
+ type: boolean
16
+ check_anthropic:
17
+ description: Check ANTHROPIC_API_KEY
18
+ required: false
19
+ default: false
20
+ type: boolean
21
+ check_google:
22
+ description: Check GOOGLE_API_KEY
23
+ required: false
24
+ default: false
25
+ type: boolean
26
+ check_openrouter:
27
+ description: Check OPENROUTER_API_KEY
28
+ required: false
29
+ default: false
30
+ type: boolean
31
+ check_cursor:
32
+ description: Check CURSOR_API_KEY
33
+ required: false
34
+ default: false
35
+ type: boolean
36
+ check_opencode:
37
+ description: Check OPENCODE_API_KEY
38
+ required: false
39
+ default: false
40
+ type: boolean
41
+ check_codex:
42
+ description: Check CODEX_ACCESS_TOKEN
43
+ required: false
44
+ default: false
45
+ type: boolean
46
+ check_codex_api_key:
47
+ description: Check CODEX_API_KEY
48
+ required: false
49
+ default: false
50
+ type: boolean
51
+
52
+ permissions:
53
+ contents: read
54
+
55
+ jobs:
56
+ verify-pat:
57
+ if: ${{ inputs.check_pat }}
58
+ name: Verify PAT
59
+ runs-on: ubuntu-latest
60
+ timeout-minutes: 10
61
+ steps:
62
+ - name: Validate PAT without exposing its value
63
+ shell: bash
64
+ env:
65
+ PAT: ${{ secrets.PAT }}
66
+ run: |
67
+ set -euo pipefail
68
+ [[ -n "${PAT:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
69
+ curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $PAT" -H 'Accept: application/vnd.github+json' https://api.github.com/user >/dev/null
70
+ curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $PAT" -H 'Accept: application/vnd.github+json' "https://api.github.com/repos/${GITHUB_REPOSITORY}" >/dev/null
71
+
72
+ verify-openai:
73
+ if: ${{ inputs.check_openai }}
74
+ name: Verify OPENAI_API_KEY
75
+ runs-on: ubuntu-latest
76
+ timeout-minutes: 10
77
+ steps:
78
+ - name: Validate OpenAI key without exposing its value
79
+ shell: bash
80
+ env:
81
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
82
+ run: |
83
+ set -euo pipefail
84
+ [[ -n "${OPENAI_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
85
+ curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $OPENAI_API_KEY" https://api.openai.com/v1/models >/dev/null
86
+
87
+ verify-anthropic:
88
+ if: ${{ inputs.check_anthropic }}
89
+ name: Verify ANTHROPIC_API_KEY
90
+ runs-on: ubuntu-latest
91
+ timeout-minutes: 10
92
+ steps:
93
+ - name: Validate Anthropic key without exposing its value
94
+ shell: bash
95
+ env:
96
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
97
+ run: |
98
+ set -euo pipefail
99
+ [[ -n "${ANTHROPIC_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
100
+ curl --fail --silent --show-error --location --max-time 20 -H "x-api-key: $ANTHROPIC_API_KEY" -H 'anthropic-version: 2023-06-01' https://api.anthropic.com/v1/models >/dev/null
101
+
102
+ verify-google:
103
+ if: ${{ inputs.check_google }}
104
+ name: Verify GOOGLE_API_KEY
105
+ runs-on: ubuntu-latest
106
+ timeout-minutes: 10
107
+ steps:
108
+ - name: Validate Google key without exposing its value
109
+ shell: bash
110
+ env:
111
+ GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
112
+ run: |
113
+ set -euo pipefail
114
+ [[ -n "${GOOGLE_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
115
+ curl --fail --silent --show-error --location --max-time 20 "https://generativelanguage.googleapis.com/v1beta/models?key=$GOOGLE_API_KEY" >/dev/null
116
+
117
+ verify-openrouter:
118
+ if: ${{ inputs.check_openrouter }}
119
+ name: Verify OPENROUTER_API_KEY
120
+ runs-on: ubuntu-latest
121
+ timeout-minutes: 10
122
+ steps:
123
+ - name: Validate OpenRouter key without exposing its value
124
+ shell: bash
125
+ env:
126
+ OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
127
+ run: |
128
+ set -euo pipefail
129
+ [[ -n "${OPENROUTER_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
130
+ curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $OPENROUTER_API_KEY" https://openrouter.ai/api/v1/models >/dev/null
131
+
132
+ verify-cursor:
133
+ if: ${{ inputs.check_cursor }}
134
+ name: Verify CURSOR_API_KEY
135
+ runs-on: ubuntu-latest
136
+ timeout-minutes: 10
137
+ steps:
138
+ - name: Validate Cursor key without exposing its value
139
+ shell: bash
140
+ env:
141
+ CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
142
+ run: |
143
+ set -euo pipefail
144
+ [[ -n "${CURSOR_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
145
+ curl --fail --silent --show-error --location --max-time 20 -u "$CURSOR_API_KEY:" 'https://api.cursor.com/analytics/ai-code/changes?startDate=30d&page=1&pageSize=1' >/dev/null
146
+
147
+ verify-opencode:
148
+ if: ${{ inputs.check_opencode }}
149
+ name: Verify OPENCODE_API_KEY
150
+ runs-on: ubuntu-latest
151
+ timeout-minutes: 10
152
+ steps:
153
+ - name: Validate OpenCode key without exposing its value
154
+ shell: bash
155
+ env:
156
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
157
+ run: |
158
+ set -euo pipefail
159
+ [[ -n "${OPENCODE_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
160
+ curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $OPENCODE_API_KEY" https://opencode.ai/zen/v1/models >/dev/null
161
+
162
+ verify-codex:
163
+ if: ${{ inputs.check_codex }}
164
+ name: Verify CODEX_ACCESS_TOKEN
165
+ runs-on: ubuntu-latest
166
+ timeout-minutes: 10
167
+ steps:
168
+ - name: Validate Codex token without exposing its value
169
+ shell: bash
170
+ env:
171
+ CODEX_ACCESS_TOKEN: ${{ secrets.CODEX_ACCESS_TOKEN }}
172
+ run: |
173
+ set -euo pipefail
174
+ [[ -n "${CODEX_ACCESS_TOKEN:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
175
+ curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $CODEX_ACCESS_TOKEN" https://api.openai.com/v1/models >/dev/null
176
+
177
+ verify-codex-api-key:
178
+ if: ${{ inputs.check_codex_api_key }}
179
+ name: Verify CODEX_API_KEY
180
+ runs-on: ubuntu-latest
181
+ timeout-minutes: 10
182
+ steps:
183
+ - name: Validate Codex API key without exposing its value
184
+ shell: bash
185
+ env:
186
+ CODEX_API_KEY: ${{ secrets.CODEX_API_KEY }}
187
+ run: |
188
+ set -euo pipefail
189
+ [[ -n "${CODEX_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; }
190
+ curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $CODEX_API_KEY" https://api.openai.com/v1/models >/dev/null
@@ -6,6 +6,7 @@ on:
6
6
 
7
7
  jobs:
8
8
  copilot-issues:
9
+ if: ${{ vars.COPILOT_BOT_LOGIN == '' || github.actor != vars.COPILOT_BOT_LOGIN }}
9
10
  name: Copilot - Issue
10
11
  runs-on: ubuntu-latest
11
12
  timeout-minutes: 120
@@ -14,11 +15,49 @@ jobs:
14
15
  steps:
15
16
  - name: Checkout Repository
16
17
  uses: actions/checkout@v5
18
+ with:
19
+ persist-credentials: false
17
20
 
18
21
  - uses: vypdev/copilot@v3
19
22
  with:
20
- ai-ignore-files: build/*
23
+ ai-ignore-files: ${{ vars.AI_IGNORE_FILES || 'build/*' }}
21
24
  debug: ${{ vars.DEBUG }}
25
+ main-branch: ${{ vars.MAIN_BRANCH || 'master' }}
26
+ development-branch: ${{ vars.DEVELOPMENT_BRANCH || 'develop' }}
27
+ feature-tree: ${{ vars.FEATURE_TREE || 'feature' }}
28
+ bugfix-tree: ${{ vars.BUGFIX_TREE || 'bugfix' }}
29
+ hotfix-tree: ${{ vars.HOTFIX_TREE || 'hotfix' }}
30
+ release-tree: ${{ vars.RELEASE_TREE || 'release' }}
31
+ docs-tree: ${{ vars.DOCS_TREE || 'docs' }}
32
+ chore-tree: ${{ vars.CHORE_TREE || 'chore' }}
33
+ branch-management-always: ${{ vars.BRANCH_MANAGEMENT_ALWAYS || 'false' }}
34
+ reopen-issue-on-push: ${{ vars.REOPEN_ISSUE_ON_PUSH || 'true' }}
35
+ desired-assignees-count: ${{ vars.DESIRED_ASSIGNEES_COUNT || '1' }}
36
+ desired-reviewers-count: ${{ vars.DESIRED_REVIEWERS_COUNT || '1' }}
37
+ merge-timeout: ${{ vars.MERGE_TIMEOUT || '600' }}
38
+ issues-locale: ${{ vars.ISSUES_LOCALE || 'en-US' }}
39
+ pull-requests-locale: ${{ vars.PULL_REQUESTS_LOCALE || 'en-US' }}
40
+ commit-prefix-transforms: ${{ vars.COMMIT_PREFIX_TRANSFORMS || 'replace-slash' }}
41
+ ai-pull-request-description: ${{ vars.AI_PULL_REQUEST_DESCRIPTION || 'true' }}
42
+ ai-pull-request-description-mode: ${{ vars.AI_PULL_REQUEST_DESCRIPTION_MODE || 'replace' }}
43
+ ai-members-only: ${{ vars.AI_MEMBERS_ONLY || 'false' }}
44
+ ai-include-reasoning: ${{ vars.AI_INCLUDE_REASONING || 'false' }}
45
+ bugbot-severity: ${{ vars.BUGBOT_SEVERITY || 'low' }}
46
+ bugbot-comment-limit: ${{ vars.BUGBOT_COMMENT_LIMIT || '20' }}
47
+ bugbot-fix-verify-commands: ${{ vars.BUGBOT_AUTOFIX_VERIFY_COMMANDS }}
48
+ bugbot-dry-run: ${{ vars.BUGBOT_DRY_RUN || 'false' }}
49
+ bugbot-effort: ${{ vars.BUGBOT_EFFORT || 'smart' }}
50
+ bugbot-review-drafts: ${{ vars.BUGBOT_REVIEW_DRAFTS || 'false' }}
51
+ bugbot-trace-rules: ${{ vars.BUGBOT_TRACE_RULES || 'false' }}
52
+ bugbot-suggested-changes: ${{ vars.BUGBOT_SUGGESTED_CHANGES || 'true' }}
53
+ bugbot-telemetry: ${{ vars.BUGBOT_TELEMETRY || 'true' }}
54
+ bugbot-fail-on-unresolved: ${{ vars.BUGBOT_FAIL_ON_UNRESOLVED || 'false' }}
55
+ bugbot-organization-rules: ${{ vars.BUGBOT_ORGANIZATION_RULES }}
56
+ project-ids: ${{ vars.PROJECT_IDS }}
57
+ project-column-issue-created: ${{ vars.PROJECT_COLUMN_ISSUE_CREATED || 'Todo' }}
58
+ project-column-pull-request-created: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_CREATED || 'In Progress' }}
59
+ project-column-issue-in-progress: ${{ vars.PROJECT_COLUMN_ISSUE_IN_PROGRESS || 'In Progress' }}
60
+ project-column-pull-request-in-progress: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_IN_PROGRESS || 'In Progress' }}
22
61
  agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
23
62
  agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
24
63
  agent-model: ${{ vars.AGENT_MODEL || 'gpt-5.6-luna' }}
@@ -57,5 +96,6 @@ jobs:
57
96
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
58
97
  GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
59
98
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
60
- CURSOR_API_KEY: ${{ (vars.AGENT_PROVIDER == 'cursor' || vars.FINDINGS_PROVIDER == 'cursor' || vars.FIXER_PROVIDER == 'cursor' || vars.PLANNER_PROVIDER == 'cursor' || vars.REVIEWER_PROVIDER == 'cursor' || vars.TESTER_PROVIDER == 'cursor' || vars.RELEASE_PROVIDER == 'cursor') && secrets.CURSOR_API_KEY || '' }}
99
+ CURSOR_API_KEY: ${{ (vars.AGENT_PROVIDER == 'cursor' || vars.FINDINGS_PROVIDER == 'cursor' || vars.FIXER_PROVIDER == 'cursor' || vars.PLANNER_PROVIDER == 'cursor' || vars.REVIEWER_PROVIDER == 'cursor' || vars.TESTER_PROVIDER == 'cursor') && secrets.CURSOR_API_KEY || '' }}
100
+ CODEX_API_KEY: ${{ secrets.CODEX_API_KEY }}
61
101
  CODEX_ACCESS_TOKEN: ${{ secrets.CODEX_ACCESS_TOKEN }}
@@ -6,19 +6,58 @@ on:
6
6
 
7
7
  jobs:
8
8
  copilot-issues:
9
+ if: ${{ vars.COPILOT_BOT_LOGIN == '' || github.actor != vars.COPILOT_BOT_LOGIN }}
9
10
  name: Copilot - Issue Comment
10
11
  runs-on: ubuntu-latest
11
12
  timeout-minutes: 120
12
13
  permissions:
13
- contents: write
14
+ contents: read
14
15
  steps:
15
16
  - name: Checkout Repository
16
17
  uses: actions/checkout@v5
18
+ with:
19
+ persist-credentials: false
20
+ fetch-depth: 0
17
21
 
18
22
  - uses: vypdev/copilot@v3
19
23
  with:
20
- ai-ignore-files: build/*
24
+ ai-ignore-files: ${{ vars.AI_IGNORE_FILES || 'build/*' }}
21
25
  debug: ${{ vars.DEBUG }}
26
+ main-branch: ${{ vars.MAIN_BRANCH || 'master' }}
27
+ development-branch: ${{ vars.DEVELOPMENT_BRANCH || 'develop' }}
28
+ feature-tree: ${{ vars.FEATURE_TREE || 'feature' }}
29
+ bugfix-tree: ${{ vars.BUGFIX_TREE || 'bugfix' }}
30
+ hotfix-tree: ${{ vars.HOTFIX_TREE || 'hotfix' }}
31
+ release-tree: ${{ vars.RELEASE_TREE || 'release' }}
32
+ docs-tree: ${{ vars.DOCS_TREE || 'docs' }}
33
+ chore-tree: ${{ vars.CHORE_TREE || 'chore' }}
34
+ branch-management-always: ${{ vars.BRANCH_MANAGEMENT_ALWAYS || 'false' }}
35
+ reopen-issue-on-push: ${{ vars.REOPEN_ISSUE_ON_PUSH || 'true' }}
36
+ desired-assignees-count: ${{ vars.DESIRED_ASSIGNEES_COUNT || '1' }}
37
+ desired-reviewers-count: ${{ vars.DESIRED_REVIEWERS_COUNT || '1' }}
38
+ merge-timeout: ${{ vars.MERGE_TIMEOUT || '600' }}
39
+ issues-locale: ${{ vars.ISSUES_LOCALE || 'en-US' }}
40
+ pull-requests-locale: ${{ vars.PULL_REQUESTS_LOCALE || 'en-US' }}
41
+ commit-prefix-transforms: ${{ vars.COMMIT_PREFIX_TRANSFORMS || 'replace-slash' }}
42
+ ai-pull-request-description: ${{ vars.AI_PULL_REQUEST_DESCRIPTION || 'true' }}
43
+ ai-pull-request-description-mode: ${{ vars.AI_PULL_REQUEST_DESCRIPTION_MODE || 'replace' }}
44
+ ai-members-only: ${{ vars.AI_MEMBERS_ONLY || 'false' }}
45
+ ai-include-reasoning: ${{ vars.AI_INCLUDE_REASONING || 'false' }}
46
+ bugbot-severity: ${{ vars.BUGBOT_SEVERITY || 'low' }}
47
+ bugbot-comment-limit: ${{ vars.BUGBOT_COMMENT_LIMIT || '20' }}
48
+ bugbot-fix-verify-commands: ${{ vars.BUGBOT_AUTOFIX_VERIFY_COMMANDS }}
49
+ bugbot-dry-run: ${{ vars.BUGBOT_DRY_RUN || 'false' }}
50
+ bugbot-effort: ${{ vars.BUGBOT_EFFORT || 'smart' }}
51
+ bugbot-review-drafts: ${{ vars.BUGBOT_REVIEW_DRAFTS || 'false' }}
52
+ bugbot-trace-rules: ${{ vars.BUGBOT_TRACE_RULES || 'false' }}
53
+ bugbot-suggested-changes: ${{ vars.BUGBOT_SUGGESTED_CHANGES || 'true' }}
54
+ bugbot-telemetry: ${{ vars.BUGBOT_TELEMETRY || 'true' }}
55
+ bugbot-fail-on-unresolved: ${{ vars.BUGBOT_FAIL_ON_UNRESOLVED || 'false' }}
56
+ bugbot-organization-rules: ${{ vars.BUGBOT_ORGANIZATION_RULES }}
57
+ project-column-issue-created: ${{ vars.PROJECT_COLUMN_ISSUE_CREATED || 'Todo' }}
58
+ project-column-pull-request-created: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_CREATED || 'In Progress' }}
59
+ project-column-issue-in-progress: ${{ vars.PROJECT_COLUMN_ISSUE_IN_PROGRESS || 'In Progress' }}
60
+ project-column-pull-request-in-progress: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_IN_PROGRESS || 'In Progress' }}
22
61
  agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
23
62
  agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
24
63
  agent-model: ${{ vars.AGENT_MODEL || 'gpt-5.6-luna' }}
@@ -39,8 +78,17 @@ jobs:
39
78
  planner-model: ${{ vars.PLANNER_MODEL }}
40
79
  planner-effort: ${{ vars.PLANNER_EFFORT }}
41
80
  planner-command: ${{ vars.PLANNER_COMMAND }}
81
+ reviewer-provider: ${{ vars.REVIEWER_PROVIDER }}
82
+ reviewer-model-provider: ${{ vars.REVIEWER_MODEL_PROVIDER }}
83
+ reviewer-model: ${{ vars.REVIEWER_MODEL }}
84
+ reviewer-effort: ${{ vars.REVIEWER_EFFORT }}
85
+ reviewer-command: ${{ vars.REVIEWER_COMMAND }}
86
+ tester-provider: ${{ vars.TESTER_PROVIDER }}
87
+ tester-model-provider: ${{ vars.TESTER_MODEL_PROVIDER }}
88
+ tester-model: ${{ vars.TESTER_MODEL }}
89
+ tester-effort: ${{ vars.TESTER_EFFORT }}
90
+ tester-command: ${{ vars.TESTER_COMMAND }}
42
91
  project-ids: ${{ vars.PROJECT_IDS }}
43
- bugbot-fix-verify-commands: ${{ vars.BUGBOT_AUTOFIX_VERIFY_COMMANDS }}
44
92
  token: ${{ secrets.PAT }}
45
93
  env:
46
94
  AGENT_PROVIDER: ${{ vars.AGENT_PROVIDER || 'codex' }}
@@ -59,5 +107,6 @@ jobs:
59
107
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
60
108
  GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
61
109
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
62
- CURSOR_API_KEY: ${{ (vars.AGENT_PROVIDER == 'cursor' || vars.FINDINGS_PROVIDER == 'cursor' || vars.FIXER_PROVIDER == 'cursor' || vars.PLANNER_PROVIDER == 'cursor' || vars.REVIEWER_PROVIDER == 'cursor' || vars.TESTER_PROVIDER == 'cursor' || vars.RELEASE_PROVIDER == 'cursor') && secrets.CURSOR_API_KEY || '' }}
110
+ CURSOR_API_KEY: ${{ (vars.AGENT_PROVIDER == 'cursor' || vars.FINDINGS_PROVIDER == 'cursor' || vars.FIXER_PROVIDER == 'cursor' || vars.PLANNER_PROVIDER == 'cursor' || vars.REVIEWER_PROVIDER == 'cursor' || vars.TESTER_PROVIDER == 'cursor') && secrets.CURSOR_API_KEY || '' }}
111
+ CODEX_API_KEY: ${{ secrets.CODEX_API_KEY }}
63
112
  CODEX_ACCESS_TOKEN: ${{ secrets.CODEX_ACCESS_TOKEN }}