@vypdev/copilot 3.3.1 → 3.5.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 (86) hide show
  1. package/README.md +33 -5
  2. package/action.yml +85 -109
  3. package/build/api/index.js +4737 -1506
  4. package/build/api/src/api.d.ts +60 -14
  5. package/build/api/src/application/errors/application_error.d.ts +10 -0
  6. package/build/api/src/application/ports/bugbot_context_ports.d.ts +20 -7
  7. package/build/api/src/application/ports/bugbot_finding_publication_ports.d.ts +4 -4
  8. package/build/api/src/application/ports/bugbot_finding_resolution_ports.d.ts +4 -4
  9. package/build/api/src/application/ports/bugbot_issue_read_ports.d.ts +3 -0
  10. package/build/api/src/application/ports/bugbot_issue_write_ports.d.ts +12 -0
  11. package/build/api/src/application/ports/bugbot_pull_request_read_ports.d.ts +3 -17
  12. package/build/api/src/application/ports/bugbot_pull_request_resolution_ports.d.ts +7 -1
  13. package/build/api/src/application/ports/bugbot_pull_request_write_ports.d.ts +6 -1
  14. package/build/api/src/application/ports/bugbot_reconciliation_ports.d.ts +18 -0
  15. package/build/api/src/application/ports/bugbot_review_navigation_ports.d.ts +13 -0
  16. package/build/api/src/application/ports/bugbot_rule_ports.d.ts +1 -1
  17. package/build/api/src/application/ports/bugbot_scm_ports.d.ts +14 -0
  18. package/build/api/src/application/ports/bugbot_telemetry_ports.d.ts +27 -2
  19. package/build/api/src/application/ports/message_catalog_ports.d.ts +17 -0
  20. package/build/api/src/application/ports/pull_request_review_comment_ports.d.ts +31 -2
  21. package/build/api/src/data/model/application_error.d.ts +82 -0
  22. package/build/api/src/data/model/result.d.ts +3 -4
  23. package/build/api/src/domain/agent.d.ts +6 -5
  24. package/build/api/src/domain/branch_sync_validation.d.ts +4 -0
  25. package/build/api/src/domain/bugbot/context.d.ts +68 -0
  26. package/build/api/src/domain/bugbot/finding.d.ts +61 -0
  27. package/build/api/src/domain/bugbot/review_projection.d.ts +33 -0
  28. package/build/api/src/domain/bugbot/review_state.d.ts +29 -0
  29. package/build/api/src/domain/message_catalog.d.ts +35 -0
  30. package/build/api/src/tooling/bugbot_analytics.d.ts +2 -1
  31. package/build/cli/index.js +93559 -71879
  32. package/build/github_action/index.js +79807 -63429
  33. package/build/web/assets/index-2NVaAtP1.js +3 -0
  34. package/build/web/assets/index-FN-aja4Y.css +1 -0
  35. package/build/web/index.html +14 -0
  36. package/package.json +35 -22
  37. package/scripts/install-git-hooks.cjs +38 -14
  38. package/setup/ISSUE_TEMPLATE/hotfix.yml +1 -1
  39. package/setup/ISSUE_TEMPLATE/release.yml +1 -1
  40. package/setup/pull_request_template.md +9 -135
  41. package/setup/source-workflows/copilot_pull_request_approval.yml +55 -0
  42. package/setup/workflows/agent-cli-provisioning.yml +37 -13
  43. package/setup/workflows/copilot_close_inactive_issues.yml +4 -4
  44. package/setup/workflows/copilot_commit.yml +16 -16
  45. package/setup/workflows/copilot_credential_health.yml +0 -20
  46. package/setup/workflows/copilot_deployment_orchestration.yml +91 -0
  47. package/setup/workflows/copilot_issue.yml +15 -19
  48. package/setup/workflows/copilot_issue_comment.yml +17 -19
  49. package/setup/workflows/copilot_pull_request.yml +21 -22
  50. package/setup/workflows/copilot_pull_request_approval.yml +51 -0
  51. package/setup/workflows/copilot_pull_request_comment.yml +17 -19
  52. package/setup/workflows/copilot_pull_request_merge_queue.yml +20 -0
  53. package/setup/workflows/copilot_pull_request_review_state.yml +109 -0
  54. package/setup/workflows/hotfix_workflow.yml +157 -168
  55. package/setup/workflows/release_workflow.yml +157 -168
  56. package/build/api/src/application/usecases/steps/commit/bugbot/types.d.ts +0 -112
  57. package/build/api/src/data/model/agent.d.ts +0 -2
  58. package/build/api/src/data/model/ai.d.ts +0 -28
  59. package/build/api/src/data/model/branch_configuration.d.ts +0 -6
  60. package/build/api/src/data/model/branches.d.ts +0 -12
  61. package/build/api/src/data/model/commit.d.ts +0 -8
  62. package/build/api/src/data/model/config.d.ts +0 -30
  63. package/build/api/src/data/model/emoji.d.ts +0 -5
  64. package/build/api/src/data/model/execution.d.ts +0 -75
  65. package/build/api/src/data/model/execution_components.d.ts +0 -43
  66. package/build/api/src/data/model/execution_inputs.d.ts +0 -94
  67. package/build/api/src/data/model/hotfix.d.ts +0 -7
  68. package/build/api/src/data/model/images.d.ts +0 -27
  69. package/build/api/src/data/model/issue.d.ts +0 -27
  70. package/build/api/src/data/model/issue_types.d.ts +0 -30
  71. package/build/api/src/data/model/labels.d.ts +0 -60
  72. package/build/api/src/data/model/locale.d.ts +0 -6
  73. package/build/api/src/data/model/project_detail.d.ts +0 -15
  74. package/build/api/src/data/model/projects.d.ts +0 -14
  75. package/build/api/src/data/model/pull_request.d.ts +0 -32
  76. package/build/api/src/data/model/recommendation_state.d.ts +0 -6
  77. package/build/api/src/data/model/release.d.ts +0 -6
  78. package/build/api/src/data/model/single_action.d.ts +0 -43
  79. package/build/api/src/data/model/size_threshold.d.ts +0 -6
  80. package/build/api/src/data/model/size_thresholds.d.ts +0 -10
  81. package/build/api/src/data/model/tokens.d.ts +0 -4
  82. package/build/api/src/data/model/welcome.d.ts +0 -5
  83. package/build/api/src/data/model/workflows.d.ts +0 -5
  84. package/build/api/src/domain/bugbot/review_command.d.ts +0 -16
  85. package/build/api/src/domain/copilot_lifecycle.d.ts +0 -42
  86. package/build/api/src/domain/pull_request_description.d.ts +0 -13
@@ -11,6 +11,7 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  timeout-minutes: 120
13
13
  permissions:
14
+ checks: write
14
15
  contents: read
15
16
  steps:
16
17
  - name: Checkout Repository
@@ -21,6 +22,10 @@ jobs:
21
22
 
22
23
  - uses: vypdev/copilot@v3
23
24
  with:
25
+ repository-locale: ${{ vars.REPOSITORY_LOCALE || 'en-US' }}
26
+ issues-locale: ${{ vars.ISSUES_LOCALE || '' }}
27
+ pull-requests-locale: ${{ vars.PULL_REQUESTS_LOCALE || '' }}
28
+ issue-workflow-profile: ${{ vars.COPILOT_ISSUE_WORKFLOW_PROFILE || '' }}
24
29
  ai-ignore-files: ${{ vars.AI_IGNORE_FILES || 'build/*' }}
25
30
  debug: ${{ vars.DEBUG }}
26
31
  main-branch: ${{ vars.MAIN_BRANCH || 'master' }}
@@ -31,15 +36,12 @@ jobs:
31
36
  release-tree: ${{ vars.RELEASE_TREE || 'release' }}
32
37
  docs-tree: ${{ vars.DOCS_TREE || 'docs' }}
33
38
  chore-tree: ${{ vars.CHORE_TREE || 'chore' }}
34
- branch-management-always: ${{ vars.BRANCH_MANAGEMENT_ALWAYS || 'false' }}
39
+ issue-managed-branches: ${{ vars.ISSUE_MANAGED_BRANCHES || 'true' }}
40
+ pre-branch-sdd: ${{ vars.PRE_BRANCH_SDD || 'false' }}
35
41
  reopen-issue-on-push: ${{ vars.REOPEN_ISSUE_ON_PUSH || 'true' }}
36
42
  desired-assignees-count: ${{ vars.DESIRED_ASSIGNEES_COUNT || '1' }}
37
43
  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
44
  commit-prefix-transforms: ${{ vars.COMMIT_PREFIX_TRANSFORMS || 'replace-slash' }}
42
- ai-pull-request-description: ${{ vars.AI_PULL_REQUEST_DESCRIPTION || 'true' }}
43
45
  ai-pull-request-description-mode: ${{ vars.AI_PULL_REQUEST_DESCRIPTION_MODE || 'replace' }}
44
46
  ai-members-only: ${{ vars.AI_MEMBERS_ONLY || 'false' }}
45
47
  ai-include-reasoning: ${{ vars.AI_INCLUDE_REASONING || 'false' }}
@@ -60,34 +62,34 @@ jobs:
60
62
  project-column-pull-request-in-progress: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_IN_PROGRESS || 'In Progress' }}
61
63
  agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
62
64
  agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
63
- agent-model: ${{ vars.AGENT_MODEL || 'gpt-5.6-luna' }}
65
+ agent-model: ${{ vars.AGENT_MODEL || 'gpt-6-luna' }}
64
66
  agent-effort: ${{ vars.AGENT_EFFORT }}
65
- agent-command: ${{ vars.AGENT_COMMAND }}
67
+ agent-executable: ${{ vars.AGENT_EXECUTABLE }}
66
68
  findings-provider: ${{ vars.FINDINGS_PROVIDER }}
67
69
  findings-model-provider: ${{ vars.FINDINGS_MODEL_PROVIDER }}
68
70
  findings-model: ${{ vars.FINDINGS_MODEL }}
69
71
  findings-effort: ${{ vars.FINDINGS_EFFORT }}
70
- findings-command: ${{ vars.FINDINGS_COMMAND }}
72
+ findings-executable: ${{ vars.FINDINGS_EXECUTABLE }}
71
73
  fixer-provider: ${{ vars.FIXER_PROVIDER }}
72
74
  fixer-model-provider: ${{ vars.FIXER_MODEL_PROVIDER }}
73
75
  fixer-model: ${{ vars.FIXER_MODEL }}
74
76
  fixer-effort: ${{ vars.FIXER_EFFORT }}
75
- fixer-command: ${{ vars.FIXER_COMMAND }}
77
+ fixer-executable: ${{ vars.FIXER_EXECUTABLE }}
76
78
  reviewer-provider: ${{ vars.REVIEWER_PROVIDER }}
77
79
  reviewer-model-provider: ${{ vars.REVIEWER_MODEL_PROVIDER }}
78
80
  reviewer-model: ${{ vars.REVIEWER_MODEL }}
79
81
  reviewer-effort: ${{ vars.REVIEWER_EFFORT }}
80
- reviewer-command: ${{ vars.REVIEWER_COMMAND }}
82
+ reviewer-executable: ${{ vars.REVIEWER_EXECUTABLE }}
81
83
  planner-provider: ${{ vars.PLANNER_PROVIDER }}
82
84
  planner-model-provider: ${{ vars.PLANNER_MODEL_PROVIDER }}
83
85
  planner-model: ${{ vars.PLANNER_MODEL }}
84
86
  planner-effort: ${{ vars.PLANNER_EFFORT }}
85
- planner-command: ${{ vars.PLANNER_COMMAND }}
87
+ planner-executable: ${{ vars.PLANNER_EXECUTABLE }}
86
88
  tester-provider: ${{ vars.TESTER_PROVIDER }}
87
89
  tester-model-provider: ${{ vars.TESTER_MODEL_PROVIDER }}
88
90
  tester-model: ${{ vars.TESTER_MODEL }}
89
91
  tester-effort: ${{ vars.TESTER_EFFORT }}
90
- tester-command: ${{ vars.TESTER_COMMAND }}
92
+ tester-executable: ${{ vars.TESTER_EXECUTABLE }}
91
93
  project-ids: ${{ vars.PROJECT_IDS }}
92
94
  token: ${{ secrets.PAT }}
93
95
  env:
@@ -95,13 +97,9 @@ jobs:
95
97
  AGENT_MODEL_PROVIDER: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
96
98
  AGENT_MODEL: ${{ vars.AGENT_MODEL }}
97
99
  AGENT_EFFORT: ${{ vars.AGENT_EFFORT }}
98
- AGENT_PROVISIONING: ${{ vars.AGENT_PROVISIONING || 'auto' }}
99
100
  AGENT_ALLOWED_MODEL_PROVIDERS: ${{ vars.AGENT_ALLOWED_MODEL_PROVIDERS || 'openai' }}
100
- AGENT_ALLOWED_MODELS: ${{ vars.AGENT_ALLOWED_MODELS || 'openai/gpt-5.6-luna' }}
101
- AGENT_COMMAND: ${{ vars.AGENT_COMMAND }}
102
- CODEX_VERSION: ${{ vars.CODEX_VERSION }}
103
- OPENCODE_VERSION: ${{ vars.OPENCODE_VERSION }}
104
- CURSOR_INSTALLER_SHA256: ${{ vars.CURSOR_INSTALLER_SHA256 }}
101
+ AGENT_ALLOWED_MODELS: ${{ vars.AGENT_ALLOWED_MODELS || 'openai/gpt-6-luna' }}
102
+ AGENT_EXECUTABLE: ${{ vars.AGENT_EXECUTABLE }}
105
103
  OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
106
104
  OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
107
105
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
@@ -109,4 +107,4 @@ jobs:
109
107
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
110
108
  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
109
  CODEX_API_KEY: ${{ secrets.CODEX_API_KEY }}
112
- CODEX_ACCESS_TOKEN: ${{ secrets.CODEX_ACCESS_TOKEN }}
110
+ COPILOT_EVIDENCE_TOKEN: ${{ github.token }}
@@ -0,0 +1,20 @@
1
+ name: Copilot - Pull Request Merge Queue
2
+ run-name: Copilot PR · ${{ github.event_name }}:${{ github.event.action }}
3
+
4
+ on:
5
+ merge_group:
6
+ types: [checks_requested]
7
+
8
+ jobs:
9
+ copilot-pull-request-required-check:
10
+ # GitHub required checks match the job name. Keep this identical to normal
11
+ # PR analysis while isolating merge-group runs in their own workflow.
12
+ name: Copilot - Pull Request
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 10
15
+ permissions:
16
+ checks: write
17
+ contents: read
18
+ steps:
19
+ - name: Confirm merge-group compatibility
20
+ run: echo "Copilot PR analysis already ran on each constituent pull request."
@@ -0,0 +1,109 @@
1
+ name: Copilot - Pull Request Review State
2
+ run-name: Copilot PR review · ${{ github.event_name }}:${{ github.event.action }}
3
+
4
+ on:
5
+ pull_request_review:
6
+ types: [submitted, edited, dismissed]
7
+
8
+ jobs:
9
+ copilot-pull-request-review-state:
10
+ if: ${{ (vars.COPILOT_BOT_LOGIN == '' || github.actor != vars.COPILOT_BOT_LOGIN) && github.event.pull_request.head.repo.full_name == github.repository }}
11
+ name: Copilot - Pull Request Review State
12
+ runs-on: ubuntu-latest
13
+ timeout-minutes: 120
14
+ concurrency:
15
+ group: copilot-pr-${{ github.repository }}-${{ github.event.pull_request.head.ref || github.ref_name }}-review-state
16
+ cancel-in-progress: true
17
+ permissions:
18
+ checks: write
19
+ contents: read
20
+ steps:
21
+ - name: Checkout Repository
22
+ uses: actions/checkout@v5
23
+ with:
24
+ persist-credentials: false
25
+ fetch-depth: 0
26
+
27
+ - uses: vypdev/copilot@v3
28
+ with:
29
+ repository-locale: ${{ vars.REPOSITORY_LOCALE || 'en-US' }}
30
+ issues-locale: ${{ vars.ISSUES_LOCALE || '' }}
31
+ pull-requests-locale: ${{ vars.PULL_REQUESTS_LOCALE || '' }}
32
+ issue-workflow-profile: ${{ vars.COPILOT_ISSUE_WORKFLOW_PROFILE || '' }}
33
+ ai-ignore-files: ${{ vars.AI_IGNORE_FILES || 'build/*' }}
34
+ debug: ${{ vars.DEBUG }}
35
+ main-branch: ${{ vars.MAIN_BRANCH || 'master' }}
36
+ development-branch: ${{ vars.DEVELOPMENT_BRANCH || 'develop' }}
37
+ feature-tree: ${{ vars.FEATURE_TREE || 'feature' }}
38
+ bugfix-tree: ${{ vars.BUGFIX_TREE || 'bugfix' }}
39
+ hotfix-tree: ${{ vars.HOTFIX_TREE || 'hotfix' }}
40
+ release-tree: ${{ vars.RELEASE_TREE || 'release' }}
41
+ docs-tree: ${{ vars.DOCS_TREE || 'docs' }}
42
+ chore-tree: ${{ vars.CHORE_TREE || 'chore' }}
43
+ issue-managed-branches: ${{ vars.ISSUE_MANAGED_BRANCHES || 'true' }}
44
+ pre-branch-sdd: ${{ vars.PRE_BRANCH_SDD || 'false' }}
45
+ reopen-issue-on-push: ${{ vars.REOPEN_ISSUE_ON_PUSH || 'true' }}
46
+ desired-assignees-count: ${{ vars.DESIRED_ASSIGNEES_COUNT || '1' }}
47
+ desired-reviewers-count: ${{ vars.DESIRED_REVIEWERS_COUNT || '1' }}
48
+ commit-prefix-transforms: ${{ vars.COMMIT_PREFIX_TRANSFORMS || 'replace-slash' }}
49
+ ai-pull-request-description-mode: ${{ vars.AI_PULL_REQUEST_DESCRIPTION_MODE || 'replace' }}
50
+ ai-members-only: ${{ vars.AI_MEMBERS_ONLY || 'false' }}
51
+ ai-include-reasoning: ${{ vars.AI_INCLUDE_REASONING || 'false' }}
52
+ bugbot-severity: ${{ vars.BUGBOT_SEVERITY || 'low' }}
53
+ bugbot-comment-limit: ${{ vars.BUGBOT_COMMENT_LIMIT || '20' }}
54
+ bugbot-fix-verify-commands: ${{ vars.BUGBOT_AUTOFIX_VERIFY_COMMANDS }}
55
+ bugbot-dry-run: ${{ vars.BUGBOT_DRY_RUN || 'false' }}
56
+ bugbot-effort: ${{ vars.BUGBOT_EFFORT || 'smart' }}
57
+ bugbot-review-drafts: ${{ vars.BUGBOT_REVIEW_DRAFTS || 'false' }}
58
+ bugbot-trace-rules: ${{ vars.BUGBOT_TRACE_RULES || 'false' }}
59
+ bugbot-suggested-changes: ${{ vars.BUGBOT_SUGGESTED_CHANGES || 'true' }}
60
+ bugbot-telemetry: ${{ vars.BUGBOT_TELEMETRY || 'true' }}
61
+ bugbot-fail-on-unresolved: ${{ vars.BUGBOT_FAIL_ON_UNRESOLVED || 'false' }}
62
+ bugbot-organization-rules: ${{ vars.BUGBOT_ORGANIZATION_RULES }}
63
+ project-column-issue-created: ${{ vars.PROJECT_COLUMN_ISSUE_CREATED || 'Todo' }}
64
+ project-column-pull-request-created: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_CREATED || 'In Progress' }}
65
+ project-column-issue-in-progress: ${{ vars.PROJECT_COLUMN_ISSUE_IN_PROGRESS || 'In Progress' }}
66
+ project-column-pull-request-in-progress: ${{ vars.PROJECT_COLUMN_PULL_REQUEST_IN_PROGRESS || 'In Progress' }}
67
+ agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
68
+ agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
69
+ agent-model: ${{ vars.AGENT_MODEL || 'gpt-6-luna' }}
70
+ agent-effort: ${{ vars.AGENT_EFFORT }}
71
+ agent-executable: ${{ vars.AGENT_EXECUTABLE }}
72
+ findings-provider: ${{ vars.FINDINGS_PROVIDER }}
73
+ findings-model-provider: ${{ vars.FINDINGS_MODEL_PROVIDER }}
74
+ findings-model: ${{ vars.FINDINGS_MODEL }}
75
+ findings-effort: ${{ vars.FINDINGS_EFFORT }}
76
+ findings-executable: ${{ vars.FINDINGS_EXECUTABLE }}
77
+ fixer-provider: ${{ vars.FIXER_PROVIDER }}
78
+ fixer-model-provider: ${{ vars.FIXER_MODEL_PROVIDER }}
79
+ fixer-model: ${{ vars.FIXER_MODEL }}
80
+ fixer-effort: ${{ vars.FIXER_EFFORT }}
81
+ fixer-executable: ${{ vars.FIXER_EXECUTABLE }}
82
+ planner-provider: ${{ vars.PLANNER_PROVIDER }}
83
+ planner-model-provider: ${{ vars.PLANNER_MODEL_PROVIDER }}
84
+ planner-model: ${{ vars.PLANNER_MODEL }}
85
+ planner-effort: ${{ vars.PLANNER_EFFORT }}
86
+ planner-executable: ${{ vars.PLANNER_EXECUTABLE }}
87
+ reviewer-provider: ${{ vars.REVIEWER_PROVIDER }}
88
+ reviewer-model-provider: ${{ vars.REVIEWER_MODEL_PROVIDER }}
89
+ reviewer-model: ${{ vars.REVIEWER_MODEL }}
90
+ reviewer-effort: ${{ vars.REVIEWER_EFFORT }}
91
+ reviewer-executable: ${{ vars.REVIEWER_EXECUTABLE }}
92
+ project-ids: ${{ vars.PROJECT_IDS }}
93
+ token: ${{ secrets.PAT }}
94
+ env:
95
+ AGENT_PROVIDER: ${{ vars.AGENT_PROVIDER || 'codex' }}
96
+ AGENT_MODEL_PROVIDER: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
97
+ AGENT_MODEL: ${{ vars.AGENT_MODEL }}
98
+ AGENT_EFFORT: ${{ vars.AGENT_EFFORT }}
99
+ AGENT_ALLOWED_MODEL_PROVIDERS: ${{ vars.AGENT_ALLOWED_MODEL_PROVIDERS || 'openai' }}
100
+ AGENT_ALLOWED_MODELS: ${{ vars.AGENT_ALLOWED_MODELS || 'openai/gpt-6-luna' }}
101
+ AGENT_EXECUTABLE: ${{ vars.AGENT_EXECUTABLE }}
102
+ OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
103
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
104
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
105
+ GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
106
+ OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
107
+ 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 || '' }}
108
+ CODEX_API_KEY: ${{ secrets.CODEX_API_KEY }}
109
+ COPILOT_EVIDENCE_TOKEN: ${{ github.token }}
@@ -3,230 +3,219 @@ name: Task - Hotfix
3
3
  on:
4
4
  workflow_dispatch:
5
5
  inputs:
6
- version:
7
- description: 'Hotfix version'
6
+ mode:
7
+ description: 'Internal orchestration phase'
8
8
  required: true
9
- default: '1.0.0'
9
+ default: prepare
10
+ type: choice
11
+ options: [prepare, publish]
12
+ operation-id:
13
+ description: 'Internal durable operation identifier'
14
+ required: false
15
+ default: ''
16
+ version:
17
+ description: 'Hotfix version (MAJOR.MINOR.PATCH)'
18
+ required: false
19
+ default: ''
10
20
  title:
11
- description: 'Title'
12
- required: true
13
- default: 'New Version'
21
+ description: 'Hotfix title'
22
+ required: false
23
+ default: ''
14
24
  changelog:
15
- description: 'Changelog'
16
- required: true
17
- default: '- Several improvements'
25
+ description: 'Hotfix changelog'
26
+ required: false
27
+ default: ''
18
28
  issue:
19
29
  description: 'Launcher issue'
20
30
  required: true
21
- default: '-1'
31
+
32
+ concurrency:
33
+ group: copilot-deployment-${{ github.repository_id }}-${{ inputs.issue }}
34
+ cancel-in-progress: false
35
+ queue: max
22
36
 
23
37
  jobs:
24
- queue-gate:
25
- name: Wait for previous mutation workflows
38
+ validate:
39
+ name: Validate deployment command
26
40
  runs-on: ubuntu-latest
27
- timeout-minutes: 120
28
- permissions:
29
- actions: read
30
- contents: read
41
+ timeout-minutes: 5
42
+ permissions: {}
31
43
  steps:
32
- - uses: actions/checkout@v5
33
- with:
34
- persist-credentials: false
35
- - name: Admit workflow to mutation queue
36
- uses: vypdev/copilot@v3
44
+ - name: Validate bounded orchestration inputs
45
+ uses: actions/github-script@v9
46
+ env:
47
+ MODE: ${{ inputs.mode }}
48
+ OPERATION_ID: ${{ inputs.operation-id }}
49
+ VERSION: ${{ inputs.version }}
50
+ ISSUE: ${{ inputs.issue }}
51
+ TITLE: ${{ inputs.title }}
52
+ CHANGELOG: ${{ inputs.changelog }}
37
53
  with:
38
- queue-gate-only: 'true'
39
- token: ${{ github.token }}
54
+ script: |
55
+ const mode = process.env.MODE;
56
+ const operationId = process.env.OPERATION_ID || '';
57
+ const version = process.env.VERSION || '';
58
+ const issueText = process.env.ISSUE || '';
59
+ const issue = Number(issueText);
60
+ const title = process.env.TITLE || '';
61
+ const changelog = process.env.CHANGELOG || '';
62
+ const errors = [];
63
+ if (!/^[1-9][0-9]*$/.test(issueText) || !Number.isSafeInteger(issue) || issue < 1) errors.push('Issue must be a positive safe integer.');
64
+ if (!/^[0-9]+\.[0-9]+\.[0-9]+$/.test(version)) errors.push('Version must use MAJOR.MINOR.PATCH.');
65
+ if (mode === 'prepare') {
66
+ if (operationId) errors.push('Operation ID must be empty in prepare mode.');
67
+ if (!title || title.length > 1000) errors.push('Title must contain 1-1000 characters.');
68
+ if (!changelog || changelog.length > 50000) errors.push('Changelog must contain 1-50000 characters.');
69
+ } else if (mode === 'publish') {
70
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]{7,127}$/.test(operationId)) errors.push('Operation ID is invalid.');
71
+ if (title || changelog) errors.push('Title and changelog must be empty in publish mode.');
72
+ } else errors.push('Mode must be prepare or publish.');
73
+ if (errors.length) core.setFailed(errors.join(' '));
40
74
 
41
75
  prepare-version-files:
42
- name: Prepare files for hotfix
76
+ name: Prepare and validate hotfix
77
+ if: ${{ inputs.mode == 'prepare' }}
43
78
  runs-on: ubuntu-latest
44
- needs: queue-gate
45
- timeout-minutes: 15
79
+ needs: validate
80
+ timeout-minutes: 30
46
81
  permissions:
47
82
  contents: write
48
83
  steps:
49
84
  - uses: actions/checkout@v5
50
85
  with:
51
86
  persist-credentials: true
52
-
53
- - name: Set up Node.js 24
54
- uses: actions/setup-node@v7
55
- with:
56
- node-version: '24.x'
57
-
58
- - name: Set up pnpm
59
- uses: pnpm/action-setup@v5
60
- with:
61
- version: 10.12.4
62
- standalone: false
63
-
64
- - name: Install dependencies
65
- run: pnpm install --frozen-lockfile
66
-
67
- - name: Validate inputs
68
- env:
69
- VERSION: ${{ github.event.inputs.version }}
70
- ISSUE: ${{ github.event.inputs.issue }}
71
- TITLE: ${{ github.event.inputs.title }}
72
- CHANGELOG: ${{ github.event.inputs.changelog }}
73
- run: |
74
- err=0
75
- if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
76
- echo "::error::Version must be in semver format (e.g. 1.0.0)."
77
- err=1
78
- fi
79
- if ! [[ "$ISSUE" =~ ^-?[0-9]+$ ]]; then
80
- echo "::error::Issue must be a number (e.g. 123 or -1)."
81
- err=1
82
- fi
83
- if [[ ${#TITLE} -gt 1000 ]]; then
84
- echo "::error::Title must be at most 1000 characters."
85
- err=1
86
- fi
87
- if [[ ${#CHANGELOG} -gt 50000 ]]; then
88
- echo "::error::Changelog must be at most 50000 characters."
89
- err=1
90
- fi
91
- [[ $err -eq 0 ]] || exit 1
92
-
93
- # Example: generic step to perform the version update or compilation (uncomment and adjust as needed)
94
- # - name: Generic step
95
- # uses: whatever/action@v2
96
-
97
- - name: Commit updated package.json and dist directory
87
+ # Add project-specific version, build, validation, smoke-test and generated-file steps here.
88
+ - name: Commit prepared hotfix files
98
89
  uses: EndBug/add-and-commit@v9
99
90
  with:
100
- add: './build/ ./package.json'
91
+ add: './'
101
92
  committer_name: GitHub Actions
102
93
  committer_email: actions@github.com
103
94
  default_author: user_info
104
- message: 'gh-action: updated compiled files and bumped version to ${{ github.event.inputs.version }} (hotfix)'
95
+ message: 'gh-action: prepare hotfix ${{ inputs.version }}'
105
96
 
106
- tag:
107
- name: Publish version
97
+ promote:
98
+ name: Open production promotion
99
+ if: ${{ inputs.mode == 'prepare' }}
108
100
  runs-on: ubuntu-latest
109
- timeout-minutes: 120
110
- needs: [ prepare-version-files ]
101
+ needs: prepare-version-files
102
+ timeout-minutes: 10
111
103
  permissions:
112
104
  contents: read
105
+ issues: write
106
+ pull-requests: write
107
+ actions: write
113
108
  steps:
114
- - name: Checkout Repository
115
- uses: actions/checkout@v5
109
+ - uses: actions/checkout@v5
116
110
  with:
117
111
  persist-credentials: false
118
-
119
- - name: Copilot - Create Tag
112
+ - name: Create or resume promotion PR
120
113
  uses: vypdev/copilot@v3
121
- if: ${{ success() }}
122
114
  with:
123
- debug: ${{ vars.DEBUG }}
115
+ single-action: prepare_deployment_action
116
+ single-action-issue: ${{ inputs.issue }}
117
+ issue-workflow-profile: ${{ vars.COPILOT_ISSUE_WORKFLOW_PROFILE || '' }}
118
+ single-action-version: ${{ inputs.version }}
119
+ single-action-title: ${{ inputs.title }}
120
+ single-action-changelog: ${{ inputs.changelog }}
124
121
  main-branch: ${{ vars.MAIN_BRANCH || 'master' }}
125
122
  development-branch: ${{ vars.DEVELOPMENT_BRANCH || 'develop' }}
126
123
  release-tree: ${{ vars.RELEASE_TREE || 'release' }}
127
124
  hotfix-tree: ${{ vars.HOTFIX_TREE || 'hotfix' }}
128
- single-action: 'create_tag'
129
- single-action-issue: '${{ github.event.inputs.issue }}'
130
- single-action-version: '${{ github.event.inputs.version }}'
131
- agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
132
- agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
133
- agent-model: ${{ vars.AGENT_MODEL || 'gpt-5.6-luna' }}
134
- agent-effort: ${{ vars.AGENT_EFFORT }}
135
- agent-command: ${{ vars.AGENT_COMMAND }}
136
- findings-provider: ${{ vars.FINDINGS_PROVIDER }}
137
- findings-model-provider: ${{ vars.FINDINGS_MODEL_PROVIDER }}
138
- findings-model: ${{ vars.FINDINGS_MODEL }}
139
- findings-effort: ${{ vars.FINDINGS_EFFORT }}
140
- findings-command: ${{ vars.FINDINGS_COMMAND }}
141
- fixer-provider: ${{ vars.FIXER_PROVIDER }}
142
- fixer-model-provider: ${{ vars.FIXER_MODEL_PROVIDER }}
143
- fixer-model: ${{ vars.FIXER_MODEL }}
144
- fixer-effort: ${{ vars.FIXER_EFFORT }}
145
- fixer-command: ${{ vars.FIXER_COMMAND }}
125
+ release-workflow: ${{ vars.RELEASE_WORKFLOW || 'release_workflow.yml' }}
126
+ hotfix-workflow: ${{ vars.HOTFIX_WORKFLOW || 'hotfix_workflow.yml' }}
127
+ release-reconciliation-strategy: ${{ vars.RELEASE_RECONCILIATION_STRATEGY || 'production-lineage' }}
128
+ hotfix-reconciliation-strategy: ${{ vars.HOTFIX_RECONCILIATION_STRATEGY || 'production-lineage' }}
129
+ reconciliation-pr-mode: ${{ vars.RECONCILIATION_PR_MODE || 'auto' }}
130
+ merge-queue-check-attestations: ${{ vars.MERGE_QUEUE_CHECK_ATTESTATIONS || '[]' }}
131
+ reconciliation-backmerge-mode: ${{ vars.RECONCILIATION_BACKMERGE_MODE || 'auto' }}
132
+ hotfix-active-release-policy: ${{ vars.HOTFIX_ACTIVE_RELEASE_POLICY || 'prefer-release' }}
133
+ reconciliation-tree: ${{ vars.RECONCILIATION_TREE || 'sync' }}
134
+ reconciliation-cleanup: ${{ vars.RECONCILIATION_CLEANUP || 'all' }}
135
+ reconciliation-issue-completion: ${{ vars.RECONCILIATION_ISSUE_COMPLETION || 'close' }}
136
+ orchestration-presentation-mode: ${{ vars.ORCHESTRATION_PRESENTATION_MODE || 'guided' }}
137
+ orchestration-diagrams: ${{ vars.ORCHESTRATION_DIAGRAMS || 'true' }}
138
+ orchestration-comment-mode: ${{ vars.ORCHESTRATION_COMMENT_MODE || 'update' }}
139
+ repository-locale: ${{ vars.REPOSITORY_LOCALE || 'en-US' }}
140
+ issues-locale: ${{ vars.ISSUES_LOCALE || '' }}
141
+ pull-requests-locale: ${{ vars.PULL_REQUESTS_LOCALE || '' }}
142
+ token: ${{ secrets.PAT }}
143
+
144
+ publish:
145
+ name: Publish accepted production commit
146
+ if: ${{ inputs.mode == 'publish' }}
147
+ runs-on: ubuntu-latest
148
+ needs: validate
149
+ timeout-minutes: 30
150
+ permissions:
151
+ contents: write
152
+ issues: write
153
+ pull-requests: write
154
+ steps:
155
+ - uses: actions/checkout@v5
156
+ with:
157
+ persist-credentials: false
158
+ ref: ${{ vars.MAIN_BRANCH || 'master' }}
159
+ - name: Create or verify production tag
160
+ uses: vypdev/copilot@v3
161
+ with:
162
+ single-action: create_tag
163
+ single-action-issue: ${{ inputs.issue }}
164
+ issue-workflow-profile: ${{ vars.COPILOT_ISSUE_WORKFLOW_PROFILE || '' }}
165
+ single-action-operation-id: ${{ inputs.operation-id }}
166
+ single-action-version: ${{ inputs.version }}
146
167
  token: ${{ secrets.PAT }}
147
-
148
- - name: Copilot - Create Release
168
+ # Add project-specific deployment here. It runs only after production promotion merged.
169
+ - name: Create or verify GitHub Release
149
170
  uses: vypdev/copilot@v3
150
- if: ${{ success() }}
151
171
  with:
152
- debug: ${{ vars.DEBUG }}
153
- main-branch: ${{ vars.MAIN_BRANCH || 'master' }}
154
- development-branch: ${{ vars.DEVELOPMENT_BRANCH || 'develop' }}
155
- release-tree: ${{ vars.RELEASE_TREE || 'release' }}
156
- hotfix-tree: ${{ vars.HOTFIX_TREE || 'hotfix' }}
157
- single-action: 'create_release'
158
- single-action-issue: '${{ github.event.inputs.issue }}'
159
- single-action-version: '${{ github.event.inputs.version }}'
160
- single-action-title: '${{ github.event.inputs.title }}'
161
- single-action-changelog: '${{ github.event.inputs.changelog }}'
162
- agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
163
- agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
164
- agent-model: ${{ vars.AGENT_MODEL || 'gpt-5.6-luna' }}
165
- agent-effort: ${{ vars.AGENT_EFFORT }}
166
- agent-command: ${{ vars.AGENT_COMMAND }}
167
- findings-provider: ${{ vars.FINDINGS_PROVIDER }}
168
- findings-model-provider: ${{ vars.FINDINGS_MODEL_PROVIDER }}
169
- findings-model: ${{ vars.FINDINGS_MODEL }}
170
- findings-effort: ${{ vars.FINDINGS_EFFORT }}
171
- findings-command: ${{ vars.FINDINGS_COMMAND }}
172
- fixer-provider: ${{ vars.FIXER_PROVIDER }}
173
- fixer-model-provider: ${{ vars.FIXER_MODEL_PROVIDER }}
174
- fixer-model: ${{ vars.FIXER_MODEL }}
175
- fixer-effort: ${{ vars.FIXER_EFFORT }}
176
- fixer-command: ${{ vars.FIXER_COMMAND }}
172
+ single-action: create_release
173
+ single-action-issue: ${{ inputs.issue }}
174
+ issue-workflow-profile: ${{ vars.COPILOT_ISSUE_WORKFLOW_PROFILE || '' }}
175
+ single-action-operation-id: ${{ inputs.operation-id }}
176
+ single-action-version: ${{ inputs.version }}
177
177
  token: ${{ secrets.PAT }}
178
-
179
- # Example: generic step to perform the deployment (uncomment and adjust as needed)
180
- # - name: Generic step
181
- # uses: whatever/action@v2
182
-
183
- - name: Copilot - Deploy success notification
178
+ - name: Start configured reconciliation
184
179
  uses: vypdev/copilot@v3
185
- if: ${{ success() }}
186
180
  with:
187
- debug: ${{ vars.DEBUG }}
188
- main-branch: ${{ vars.MAIN_BRANCH || 'master' }}
189
- development-branch: ${{ vars.DEVELOPMENT_BRANCH || 'develop' }}
190
- release-tree: ${{ vars.RELEASE_TREE || 'release' }}
191
- hotfix-tree: ${{ vars.HOTFIX_TREE || 'hotfix' }}
192
- single-action: 'deployed_action'
193
- single-action-issue: '${{ github.event.inputs.issue }}'
194
- agent-provider: ${{ vars.AGENT_PROVIDER || 'codex' }}
195
- agent-model-provider: ${{ vars.AGENT_MODEL_PROVIDER || 'openai' }}
196
- agent-model: ${{ vars.AGENT_MODEL || 'gpt-5.6-luna' }}
197
- agent-effort: ${{ vars.AGENT_EFFORT }}
198
- agent-command: ${{ vars.AGENT_COMMAND }}
199
- findings-provider: ${{ vars.FINDINGS_PROVIDER }}
200
- findings-model-provider: ${{ vars.FINDINGS_MODEL_PROVIDER }}
201
- findings-model: ${{ vars.FINDINGS_MODEL }}
202
- findings-effort: ${{ vars.FINDINGS_EFFORT }}
203
- findings-command: ${{ vars.FINDINGS_COMMAND }}
204
- fixer-provider: ${{ vars.FIXER_PROVIDER }}
205
- fixer-model-provider: ${{ vars.FIXER_MODEL_PROVIDER }}
206
- fixer-model: ${{ vars.FIXER_MODEL }}
207
- fixer-effort: ${{ vars.FIXER_EFFORT }}
208
- fixer-command: ${{ vars.FIXER_COMMAND }}
181
+ single-action: published_deployment_action
182
+ single-action-issue: ${{ inputs.issue }}
183
+ issue-workflow-profile: ${{ vars.COPILOT_ISSUE_WORKFLOW_PROFILE || '' }}
184
+ single-action-operation-id: ${{ inputs.operation-id }}
185
+ single-action-version: ${{ inputs.version }}
209
186
  token: ${{ secrets.PAT }}
210
187
 
211
188
  report-failure:
212
- name: Report deployment failure
189
+ name: Report orchestration failure
213
190
  runs-on: ubuntu-latest
214
191
  timeout-minutes: 5
215
- needs: [ queue-gate, prepare-version-files, tag ]
216
- if: ${{ failure() && github.event.inputs.issue != '-1' }}
192
+ needs: [validate, prepare-version-files, promote, publish]
193
+ if: ${{ failure() && needs.validate.result == 'success' }}
217
194
  permissions:
218
195
  issues: write
219
196
  steps:
220
- - name: Report failure on launcher issue
221
- # This tag is published after the release changes reach master.
197
+ - name: Persist publication failure
198
+ if: ${{ inputs.mode == 'publish' }}
199
+ uses: vypdev/copilot@v3
200
+ with:
201
+ single-action: failed_deployment_action
202
+ single-action-issue: ${{ inputs.issue }}
203
+ issue-workflow-profile: ${{ vars.COPILOT_ISSUE_WORKFLOW_PROFILE || '' }}
204
+ single-action-operation-id: ${{ inputs.operation-id }}
205
+ single-action-version: ${{ inputs.version }}
206
+ single-action-message: Publication failed. Review ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} before retrying.
207
+ token: ${{ secrets.PAT }}
208
+ - name: Report preparation failure
209
+ if: ${{ inputs.mode == 'prepare' }}
222
210
  uses: vypdev/copilot@v3
223
211
  with:
224
212
  single-action: publish_issue_comment
225
- single-action-issue: '${{ github.event.inputs.issue }}'
213
+ single-action-issue: ${{ inputs.issue }}
214
+ issue-workflow-profile: ${{ vars.COPILOT_ISSUE_WORKFLOW_PROFILE || '' }}
226
215
  single-action-message: |
227
- ## ❌ Hotfix deployment failed
216
+ ## ❌ Hotfix orchestration needs attention
228
217
 
229
- The hotfix workflow did not complete successfully.
218
+ Phase `${{ inputs.mode }}` failed. Review the control center before retrying.
230
219
 
231
220
  [Review the workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
232
- token: ${{ github.token }}
221
+ token: ${{ secrets.PAT }}