specify-cli 0.12.3__tar.gz → 0.12.4__tar.gz

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 (451) hide show
  1. specify_cli-0.12.4/.github/workflows/bug-fix.lock.yml +1732 -0
  2. specify_cli-0.12.4/.github/workflows/bug-fix.md +312 -0
  3. specify_cli-0.12.4/.github/workflows/bug-test.lock.yml +1644 -0
  4. specify_cli-0.12.4/.github/workflows/bug-test.md +344 -0
  5. {specify_cli-0.12.3 → specify_cli-0.12.4}/CHANGELOG.md +15 -0
  6. {specify_cli-0.12.3 → specify_cli-0.12.4}/PKG-INFO +1 -1
  7. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/community/extensions.md +1 -0
  8. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/guides/monorepo.md +12 -0
  9. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/reference/core.md +3 -1
  10. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/catalog.community.json +35 -1
  11. {specify_cli-0.12.3 → specify_cli-0.12.4}/pyproject.toml +1 -1
  12. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/bash/common.sh +9 -0
  13. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/powershell/common.ps1 +11 -0
  14. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/__init__.py +20 -4
  15. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/_agent_config.py +5 -1
  16. specify_cli-0.12.4/src/specify_cli/_project.py +53 -0
  17. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/lib/project.py +27 -1
  18. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/commands/bundle/__init__.py +96 -19
  19. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/extensions/__init__.py +18 -3
  20. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/_scaffold_commands.py +2 -0
  21. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/base.py +61 -3
  22. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/copilot/__init__.py +1 -0
  23. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/forge/__init__.py +1 -0
  24. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/generic/__init__.py +1 -0
  25. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/hermes/__init__.py +1 -0
  26. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/_commands.py +9 -6
  27. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/expressions.py +52 -4
  28. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/conftest.py +14 -0
  29. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/contract/test_bundle_cli.py +313 -0
  30. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integration/test_bundler_security_paths.py +19 -0
  31. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_base.py +185 -0
  32. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_cli.py +5 -5
  33. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_catalog.py +1 -1
  34. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_subcommand.py +5 -5
  35. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_check_prerequisites_paths_only.py +79 -0
  36. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_commands_package.py +14 -0
  37. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_extensions.py +67 -0
  38. specify_cli-0.12.4/tests/test_init_dir_cli.py +294 -0
  39. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_workflow_run_without_project.py +1 -1
  40. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_workflows.py +34 -0
  41. {specify_cli-0.12.3 → specify_cli-0.12.4}/.devcontainer/devcontainer.json +0 -0
  42. {specify_cli-0.12.3 → specify_cli-0.12.4}/.devcontainer/post-create.sh +0 -0
  43. {specify_cli-0.12.3 → specify_cli-0.12.4}/.editorconfig +0 -0
  44. {specify_cli-0.12.3 → specify_cli-0.12.4}/.gitattributes +0 -0
  45. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/CODEOWNERS +0 -0
  46. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  47. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  48. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  49. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  50. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  51. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  52. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  53. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  54. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/aw/actions-lock.json +0 -0
  55. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/dependabot.yml +0 -0
  56. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/skills/add-community-extension/SKILL.md +0 -0
  57. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/RELEASE-PROCESS.md +0 -0
  58. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/add-community-extension.lock.yml +0 -0
  59. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/add-community-extension.md +0 -0
  60. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/add-community-preset.lock.yml +0 -0
  61. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/add-community-preset.md +0 -0
  62. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/bug-assess.lock.yml +0 -0
  63. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/bug-assess.md +0 -0
  64. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/catalog-assign.yml +0 -0
  65. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/codeql.yml +0 -0
  66. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/docs.yml +0 -0
  67. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/lint.yml +0 -0
  68. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/publish-pypi.yml +0 -0
  69. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/release-trigger.yml +0 -0
  70. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/release.yml +0 -0
  71. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/stale.yml +0 -0
  72. {specify_cli-0.12.3 → specify_cli-0.12.4}/.github/workflows/test.yml +0 -0
  73. {specify_cli-0.12.3 → specify_cli-0.12.4}/.gitignore +0 -0
  74. {specify_cli-0.12.3 → specify_cli-0.12.4}/.markdownlint-cli2.jsonc +0 -0
  75. {specify_cli-0.12.3 → specify_cli-0.12.4}/.zenodo.json +0 -0
  76. {specify_cli-0.12.3 → specify_cli-0.12.4}/AGENTS.md +0 -0
  77. {specify_cli-0.12.3 → specify_cli-0.12.4}/CITATION.cff +0 -0
  78. {specify_cli-0.12.3 → specify_cli-0.12.4}/CODE_OF_CONDUCT.md +0 -0
  79. {specify_cli-0.12.3 → specify_cli-0.12.4}/CONTRIBUTING.md +0 -0
  80. {specify_cli-0.12.3 → specify_cli-0.12.4}/DEVELOPMENT.md +0 -0
  81. {specify_cli-0.12.3 → specify_cli-0.12.4}/LICENSE +0 -0
  82. {specify_cli-0.12.3 → specify_cli-0.12.4}/README.md +0 -0
  83. {specify_cli-0.12.3 → specify_cli-0.12.4}/SECURITY.md +0 -0
  84. {specify_cli-0.12.3 → specify_cli-0.12.4}/SUPPORT.md +0 -0
  85. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/.gitignore +0 -0
  86. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/README.md +0 -0
  87. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/community/bundles.md +0 -0
  88. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/community/friends.md +0 -0
  89. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/community/overview.md +0 -0
  90. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/community/presets.md +0 -0
  91. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/community/walkthroughs.md +0 -0
  92. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/concepts/complex-features.md +0 -0
  93. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/concepts/sdd.md +0 -0
  94. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/concepts/spec-persistence.md +0 -0
  95. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/docfx.json +0 -0
  96. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/guides/evolving-specs.md +0 -0
  97. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/index.md +0 -0
  98. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/install/air-gapped.md +0 -0
  99. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/install/one-time.md +0 -0
  100. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/install/pipx.md +0 -0
  101. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/install/uv.md +0 -0
  102. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/installation.md +0 -0
  103. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/local-development.md +0 -0
  104. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/quickstart.md +0 -0
  105. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/reference/authentication.md +0 -0
  106. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/reference/bundles.md +0 -0
  107. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/reference/extensions.md +0 -0
  108. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/reference/integrations.md +0 -0
  109. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/reference/overview.md +0 -0
  110. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/reference/presets.md +0 -0
  111. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/reference/workflows.md +0 -0
  112. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/template/public/main.css +0 -0
  113. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/toc.yml +0 -0
  114. {specify_cli-0.12.3 → specify_cli-0.12.4}/docs/upgrade.md +0 -0
  115. {specify_cli-0.12.3 → specify_cli-0.12.4}/examples/bundles/business-analyst/README.md +0 -0
  116. {specify_cli-0.12.3 → specify_cli-0.12.4}/examples/bundles/business-analyst/bundle.yml +0 -0
  117. {specify_cli-0.12.3 → specify_cli-0.12.4}/examples/bundles/developer/README.md +0 -0
  118. {specify_cli-0.12.3 → specify_cli-0.12.4}/examples/bundles/developer/bundle.yml +0 -0
  119. {specify_cli-0.12.3 → specify_cli-0.12.4}/examples/bundles/product-manager/README.md +0 -0
  120. {specify_cli-0.12.3 → specify_cli-0.12.4}/examples/bundles/product-manager/bundle.yml +0 -0
  121. {specify_cli-0.12.3 → specify_cli-0.12.4}/examples/bundles/security-researcher/README.md +0 -0
  122. {specify_cli-0.12.3 → specify_cli-0.12.4}/examples/bundles/security-researcher/bundle.yml +0 -0
  123. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  124. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  125. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  126. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  127. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/README.md +0 -0
  128. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  129. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/agent-context/README.md +0 -0
  130. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/agent-context/agent-context-config.yml +0 -0
  131. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/agent-context/agent-context-defaults.json +0 -0
  132. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  133. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/agent-context/extension.yml +0 -0
  134. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  135. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  136. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/bug/README.md +0 -0
  137. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  138. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  139. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/bug/commands/speckit.bug.test.md +0 -0
  140. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/bug/extension.yml +0 -0
  141. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/catalog.json +0 -0
  142. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/README.md +0 -0
  143. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/commands/speckit.git.commit.md +0 -0
  144. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/commands/speckit.git.feature.md +0 -0
  145. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/commands/speckit.git.initialize.md +0 -0
  146. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/commands/speckit.git.remote.md +0 -0
  147. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/commands/speckit.git.validate.md +0 -0
  148. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/config-template.yml +0 -0
  149. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/extension.yml +0 -0
  150. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/git-config.yml +0 -0
  151. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  152. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  153. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/scripts/bash/git-common.sh +0 -0
  154. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  155. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  156. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  157. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  158. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  159. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/selftest/commands/selftest.md +0 -0
  160. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/selftest/extension.yml +0 -0
  161. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/template/.gitignore +0 -0
  162. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/template/CHANGELOG.md +0 -0
  163. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/template/EXAMPLE-README.md +0 -0
  164. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/template/LICENSE +0 -0
  165. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/template/README.md +0 -0
  166. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/template/commands/example.md +0 -0
  167. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/template/config-template.yml +0 -0
  168. {specify_cli-0.12.3 → specify_cli-0.12.4}/extensions/template/extension.yml +0 -0
  169. {specify_cli-0.12.3 → specify_cli-0.12.4}/integrations/CONTRIBUTING.md +0 -0
  170. {specify_cli-0.12.3 → specify_cli-0.12.4}/integrations/README.md +0 -0
  171. {specify_cli-0.12.3 → specify_cli-0.12.4}/integrations/catalog.community.json +0 -0
  172. {specify_cli-0.12.3 → specify_cli-0.12.4}/integrations/catalog.json +0 -0
  173. {specify_cli-0.12.3 → specify_cli-0.12.4}/media/bootstrap-claude-code.gif +0 -0
  174. {specify_cli-0.12.3 → specify_cli-0.12.4}/media/logo_large.webp +0 -0
  175. {specify_cli-0.12.3 → specify_cli-0.12.4}/media/logo_small.webp +0 -0
  176. {specify_cli-0.12.3 → specify_cli-0.12.4}/media/spec-kit-video-header.jpg +0 -0
  177. {specify_cli-0.12.3 → specify_cli-0.12.4}/media/specify_cli.gif +0 -0
  178. {specify_cli-0.12.3 → specify_cli-0.12.4}/newsletters/2026-April.md +0 -0
  179. {specify_cli-0.12.3 → specify_cli-0.12.4}/newsletters/2026-February.md +0 -0
  180. {specify_cli-0.12.3 → specify_cli-0.12.4}/newsletters/2026-June.md +0 -0
  181. {specify_cli-0.12.3 → specify_cli-0.12.4}/newsletters/2026-March.md +0 -0
  182. {specify_cli-0.12.3 → specify_cli-0.12.4}/newsletters/2026-May.md +0 -0
  183. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/ARCHITECTURE.md +0 -0
  184. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/PUBLISHING.md +0 -0
  185. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/README.md +0 -0
  186. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/catalog.community.json +0 -0
  187. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/catalog.json +0 -0
  188. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/lean/README.md +0 -0
  189. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/lean/commands/speckit.constitution.md +0 -0
  190. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/lean/commands/speckit.implement.md +0 -0
  191. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/lean/commands/speckit.plan.md +0 -0
  192. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/lean/commands/speckit.specify.md +0 -0
  193. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/lean/commands/speckit.tasks.md +0 -0
  194. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/lean/preset.yml +0 -0
  195. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/scaffold/README.md +0 -0
  196. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  197. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/scaffold/commands/speckit.specify.md +0 -0
  198. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/scaffold/preset.yml +0 -0
  199. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/scaffold/templates/myext-template.md +0 -0
  200. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/scaffold/templates/spec-template.md +0 -0
  201. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/commands/speckit.specify.md +0 -0
  202. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  203. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/preset.yml +0 -0
  204. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/templates/agent-file-template.md +0 -0
  205. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/templates/checklist-template.md +0 -0
  206. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/templates/constitution-template.md +0 -0
  207. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/templates/plan-template.md +0 -0
  208. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/templates/spec-template.md +0 -0
  209. {specify_cli-0.12.3 → specify_cli-0.12.4}/presets/self-test/templates/tasks-template.md +0 -0
  210. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/bash/check-prerequisites.sh +0 -0
  211. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/bash/create-new-feature.sh +0 -0
  212. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/bash/setup-plan.sh +0 -0
  213. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/bash/setup-tasks.sh +0 -0
  214. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/powershell/check-prerequisites.ps1 +0 -0
  215. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/powershell/create-new-feature.ps1 +0 -0
  216. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/powershell/setup-plan.ps1 +0 -0
  217. {specify_cli-0.12.3 → specify_cli-0.12.4}/scripts/powershell/setup-tasks.ps1 +0 -0
  218. {specify_cli-0.12.3 → specify_cli-0.12.4}/spec-driven.md +0 -0
  219. {specify_cli-0.12.3 → specify_cli-0.12.4}/spec-kit.code-workspace +0 -0
  220. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/_assets.py +0 -0
  221. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/_console.py +0 -0
  222. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/_github_http.py +0 -0
  223. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/_init_options.py +0 -0
  224. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/_invocation_style.py +0 -0
  225. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/_utils.py +0 -0
  226. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/_version.py +0 -0
  227. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/agents.py +0 -0
  228. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/authentication/__init__.py +0 -0
  229. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/authentication/azure_devops.py +0 -0
  230. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/authentication/base.py +0 -0
  231. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/authentication/config.py +0 -0
  232. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/authentication/github.py +0 -0
  233. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/authentication/http.py +0 -0
  234. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/__init__.py +0 -0
  235. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  236. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  237. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/lib/__init__.py +0 -0
  238. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/lib/versioning.py +0 -0
  239. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  240. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/models/__init__.py +0 -0
  241. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/models/catalog.py +0 -0
  242. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/models/manifest.py +0 -0
  243. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/models/records.py +0 -0
  244. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/__init__.py +0 -0
  245. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/adapters.py +0 -0
  246. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  247. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/conflict.py +0 -0
  248. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/installer.py +0 -0
  249. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/packager.py +0 -0
  250. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/primitives.py +0 -0
  251. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/references.py +0 -0
  252. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/resolver.py +0 -0
  253. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/bundler/services/validator.py +0 -0
  254. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/catalogs.py +0 -0
  255. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/commands/__init__.py +0 -0
  256. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/commands/init.py +0 -0
  257. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/extensions/_commands.py +0 -0
  258. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integration_runtime.py +0 -0
  259. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integration_scaffold.py +0 -0
  260. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integration_state.py +0 -0
  261. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integration_status.py +0 -0
  262. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/__init__.py +0 -0
  263. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/_commands.py +0 -0
  264. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/_helpers.py +0 -0
  265. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/_install_commands.py +0 -0
  266. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  267. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/_query_commands.py +0 -0
  268. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/agy/__init__.py +0 -0
  269. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/amp/__init__.py +0 -0
  270. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  271. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/bob/__init__.py +0 -0
  272. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/catalog.py +0 -0
  273. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/claude/__init__.py +0 -0
  274. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/cline/__init__.py +0 -0
  275. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  276. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/codex/__init__.py +0 -0
  277. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  278. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/devin/__init__.py +0 -0
  279. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  280. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  281. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/goose/__init__.py +0 -0
  282. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/junie/__init__.py +0 -0
  283. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  284. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  285. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  286. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  287. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/manifest.py +0 -0
  288. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/omp/__init__.py +0 -0
  289. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  290. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/pi/__init__.py +0 -0
  291. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  292. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  293. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  294. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/shai/__init__.py +0 -0
  295. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  296. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/trae/__init__.py +0 -0
  297. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  298. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  299. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/integrations/zed/__init__.py +0 -0
  300. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/presets/__init__.py +0 -0
  301. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/presets/_commands.py +0 -0
  302. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/shared_infra.py +0 -0
  303. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/__init__.py +0 -0
  304. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/base.py +0 -0
  305. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/catalog.py +0 -0
  306. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/engine.py +0 -0
  307. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/__init__.py +0 -0
  308. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  309. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  310. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  311. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  312. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  313. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  314. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  315. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  316. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  317. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  318. {specify_cli-0.12.3 → specify_cli-0.12.4}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  319. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/checklist-template.md +0 -0
  320. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/analyze.md +0 -0
  321. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/checklist.md +0 -0
  322. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/clarify.md +0 -0
  323. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/constitution.md +0 -0
  324. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/converge.md +0 -0
  325. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/implement.md +0 -0
  326. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/plan.md +0 -0
  327. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/specify.md +0 -0
  328. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/tasks.md +0 -0
  329. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/commands/taskstoissues.md +0 -0
  330. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/constitution-template.md +0 -0
  331. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/plan-template.md +0 -0
  332. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/spec-template.md +0 -0
  333. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/tasks-template.md +0 -0
  334. {specify_cli-0.12.3 → specify_cli-0.12.4}/templates/vscode-settings.json +0 -0
  335. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/__init__.py +0 -0
  336. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/auth_helpers.py +0 -0
  337. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/bundler_helpers.py +0 -0
  338. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/contract/test_catalog_schema.py +0 -0
  339. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/contract/test_manifest_schema.py +0 -0
  340. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/extensions/__init__.py +0 -0
  341. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/extensions/bug/__init__.py +0 -0
  342. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/extensions/bug/test_bug_extension.py +0 -0
  343. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/extensions/git/__init__.py +0 -0
  344. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/extensions/git/test_git_extension.py +0 -0
  345. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/extensions/test_agent_context_cli_free.py +0 -0
  346. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/extensions/test_extension_agent_context.py +0 -0
  347. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  348. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/hooks/TESTING.md +0 -0
  349. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/hooks/plan.md +0 -0
  350. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/hooks/spec.md +0 -0
  351. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/hooks/tasks.md +0 -0
  352. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/http_helpers.py +0 -0
  353. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integration/test_bundler_catalog_stack.py +0 -0
  354. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integration/test_bundler_init_install.py +0 -0
  355. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integration/test_bundler_install_flow.py +0 -0
  356. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integration/test_bundler_local_install.py +0 -0
  357. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integration/test_bundler_offline.py +0 -0
  358. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/__init__.py +0 -0
  359. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/conftest.py +0 -0
  360. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_extra_args.py +0 -0
  361. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_agy.py +0 -0
  362. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_amp.py +0 -0
  363. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_auggie.py +0 -0
  364. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_base_markdown.py +0 -0
  365. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_base_skills.py +0 -0
  366. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_base_toml.py +0 -0
  367. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_base_yaml.py +0 -0
  368. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_bob.py +0 -0
  369. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_claude.py +0 -0
  370. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_cline.py +0 -0
  371. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_codebuddy.py +0 -0
  372. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_codex.py +0 -0
  373. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_copilot.py +0 -0
  374. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_cursor_agent.py +0 -0
  375. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_devin.py +0 -0
  376. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_firebender.py +0 -0
  377. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_forge.py +0 -0
  378. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_gemini.py +0 -0
  379. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_generic.py +0 -0
  380. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_goose.py +0 -0
  381. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_hermes.py +0 -0
  382. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_junie.py +0 -0
  383. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_kilocode.py +0 -0
  384. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_kimi.py +0 -0
  385. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_kiro_cli.py +0 -0
  386. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_lingma.py +0 -0
  387. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_omp.py +0 -0
  388. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_opencode.py +0 -0
  389. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_pi.py +0 -0
  390. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_qodercli.py +0 -0
  391. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_qwen.py +0 -0
  392. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_rovodev.py +0 -0
  393. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_scaffold.py +0 -0
  394. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_shai.py +0 -0
  395. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_state.py +0 -0
  396. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_tabnine.py +0 -0
  397. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_trae.py +0 -0
  398. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_vibe.py +0 -0
  399. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_zcode.py +0 -0
  400. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_integration_zed.py +0 -0
  401. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_manifest.py +0 -0
  402. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/integrations/test_registry.py +0 -0
  403. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/self_upgrade_helpers.py +0 -0
  404. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_agent_config_consistency.py +0 -0
  405. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_authentication.py +0 -0
  406. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_branch_numbering.py +0 -0
  407. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_check_tool.py +0 -0
  408. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_cli_version.py +0 -0
  409. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_console_imports.py +0 -0
  410. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_extension_registration.py +0 -0
  411. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_extension_skills.py +0 -0
  412. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_extension_update_hardening.py +0 -0
  413. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_github_http.py +0 -0
  414. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_github_workflows.py +0 -0
  415. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_init_dir.py +0 -0
  416. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_live_transient_windows.py +0 -0
  417. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_merge.py +0 -0
  418. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_presets.py +0 -0
  419. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_ps1_encoding.py +0 -0
  420. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_registrar_path_traversal.py +0 -0
  421. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_self_upgrade_detection.py +0 -0
  422. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_self_upgrade_execution.py +0 -0
  423. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_self_upgrade_guidance.py +0 -0
  424. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_self_upgrade_verification.py +0 -0
  425. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_setup_plan_feature_json.py +0 -0
  426. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_setup_plan_no_overwrite.py +0 -0
  427. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_setup_tasks.py +0 -0
  428. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_shared_infra_integrity.py +0 -0
  429. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_timestamp_branches.py +0 -0
  430. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_upgrade.py +0 -0
  431. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_utils.py +0 -0
  432. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_utils_assets_imports.py +0 -0
  433. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/test_version_imports.py +0 -0
  434. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_adapters.py +0 -0
  435. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_catalog_config.py +0 -0
  436. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_conflict.py +0 -0
  437. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_packager.py +0 -0
  438. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_primitives.py +0 -0
  439. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_records.py +0 -0
  440. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_references.py +0 -0
  441. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_resolver.py +0 -0
  442. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_validator.py +0 -0
  443. {specify_cli-0.12.3 → specify_cli-0.12.4}/tests/unit/test_bundler_versioning.py +0 -0
  444. {specify_cli-0.12.3 → specify_cli-0.12.4}/workflows/ARCHITECTURE.md +0 -0
  445. {specify_cli-0.12.3 → specify_cli-0.12.4}/workflows/PUBLISHING.md +0 -0
  446. {specify_cli-0.12.3 → specify_cli-0.12.4}/workflows/README.md +0 -0
  447. {specify_cli-0.12.3 → specify_cli-0.12.4}/workflows/catalog.community.json +0 -0
  448. {specify_cli-0.12.3 → specify_cli-0.12.4}/workflows/catalog.json +0 -0
  449. {specify_cli-0.12.3 → specify_cli-0.12.4}/workflows/speckit/workflow.yml +0 -0
  450. {specify_cli-0.12.3 → specify_cli-0.12.4}/workflows/step-catalog.community.json +0 -0
  451. {specify_cli-0.12.3 → specify_cli-0.12.4}/workflows/step-catalog.json +0 -0
@@ -0,0 +1,1732 @@
1
+ # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"aafdb01f262d603577971994522575829802b93d9042d62446313955485df558","body_hash":"4596de2b7de95c7c73c05caedc5c1e97724b39d09d21e9b0dbfc8b570312798a","compiler_version":"v0.79.8","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
2
+ # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"df4cb1c069e1874edd31b4311f1884172cec0e10","version":"v6.0.3"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"c0338fef4749d08c21f8f975fb0e37efa17dda47","version":"v0.79.8"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2","digest":"sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2","digest":"sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2","digest":"sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.25","digest":"sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa"},{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]}
3
+ # This file was automatically generated by gh-aw (v0.79.8). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
4
+ #
5
+ # ___ _ _
6
+ # / _ \ | | (_)
7
+ # | |_| | __ _ ___ _ __ | |_ _ ___
8
+ # | _ |/ _` |/ _ \ '_ \| __| |/ __|
9
+ # | | | | (_| | __/ | | | |_| | (__
10
+ # \_| |_/\__, |\___|_| |_|\__|_|\___|
11
+ # __/ |
12
+ # _ _ |___/
13
+ # | | | | / _| |
14
+ # | | | | ___ _ __ _ __| |_| | _____ ____
15
+ # | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___|
16
+ # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \
17
+ # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/
18
+ #
19
+ #
20
+ # To update this file, edit the corresponding .md file and run:
21
+ # gh aw compile
22
+ # Not all edits will cause changes to this file.
23
+ #
24
+ # For more information: https://github.github.com/gh-aw/introduction/overview/
25
+ #
26
+ # Apply the remediation from a prior bug assessment to a bug-fix-labeled issue and open a draft PR for human review
27
+ #
28
+ # Secrets used:
29
+ # - COPILOT_GITHUB_TOKEN
30
+ # - GH_AW_CI_TRIGGER_TOKEN
31
+ # - GH_AW_GITHUB_MCP_SERVER_TOKEN
32
+ # - GH_AW_GITHUB_TOKEN
33
+ # - GITHUB_TOKEN
34
+ #
35
+ # Custom actions used:
36
+ # - actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
37
+ # - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
38
+ # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
39
+ # - actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
40
+ # - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
41
+ # - github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8
42
+ #
43
+ # Container images used:
44
+ # - ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6
45
+ # - ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4
46
+ # - ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591
47
+ # - ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa
48
+ # - ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c
49
+
50
+ name: "Fix Bug from Labeled Issue"
51
+ on:
52
+ issues:
53
+ # names: # Label filtering applied via job conditions
54
+ # - bug-fix # Label filtering applied via job conditions
55
+ types:
56
+ - labeled
57
+ # skip-bots: # Skip-bots processed as bot check in pre-activation job
58
+ # - github-actions # Skip-bots processed as bot check in pre-activation job
59
+ # - copilot # Skip-bots processed as bot check in pre-activation job
60
+ # - dependabot # Skip-bots processed as bot check in pre-activation job
61
+
62
+ permissions: {}
63
+
64
+ concurrency:
65
+ group: "gh-aw-${{ github.workflow }}-${{ github.event.issue.number || github.run_id }}"
66
+
67
+ run-name: "Fix Bug from Labeled Issue"
68
+
69
+ jobs:
70
+ activation:
71
+ needs: pre_activation
72
+ if: >
73
+ needs.pre_activation.outputs.activated == 'true' && (github.event_name != 'issues' || github.event.action != 'labeled' ||
74
+ github.event.label.name == 'bug-fix')
75
+ runs-on: ubuntu-slim
76
+ permissions:
77
+ actions: read
78
+ contents: read
79
+ env:
80
+ GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }}
81
+ outputs:
82
+ body: ${{ steps.sanitized.outputs.body }}
83
+ comment_id: ""
84
+ comment_repo: ""
85
+ daily_ai_credits_exceeded: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_exceeded == 'true' }}
86
+ daily_ai_credits_threshold: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_threshold || '' }}
87
+ daily_ai_credits_total_effective_tokens: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_total_effective_tokens || '' }}
88
+ engine_id: ${{ steps.generate_aw_info.outputs.engine_id }}
89
+ lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }}
90
+ model: ${{ steps.generate_aw_info.outputs.model }}
91
+ secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }}
92
+ setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }}
93
+ setup-span-id: ${{ steps.setup.outputs.span-id }}
94
+ setup-trace-id: ${{ steps.setup.outputs.trace-id }}
95
+ stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }}
96
+ text: ${{ steps.sanitized.outputs.text }}
97
+ title: ${{ steps.sanitized.outputs.title }}
98
+ steps:
99
+ - name: Setup Scripts
100
+ id: setup
101
+ uses: github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8
102
+ with:
103
+ destination: ${{ runner.temp }}/gh-aw/actions
104
+ job-name: ${{ github.job }}
105
+ trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }}
106
+ parent-span-id: ${{ needs.pre_activation.outputs.setup-parent-span-id || needs.pre_activation.outputs.setup-span-id }}
107
+ safe-output-artifact-client: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }}
108
+ env:
109
+ GH_AW_SETUP_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
110
+ GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/bug-fix.lock.yml@${{ github.ref }}
111
+ GH_AW_INFO_VERSION: "1.0.60"
112
+ GH_AW_INFO_AWF_VERSION: "v0.27.2"
113
+ GH_AW_INFO_ENGINE_ID: "copilot"
114
+ - name: Generate agentic run info
115
+ id: generate_aw_info
116
+ env:
117
+ GH_AW_INFO_ENGINE_ID: "copilot"
118
+ GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI"
119
+ GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'claude-sonnet-4.6' }}
120
+ GH_AW_INFO_VERSION: "1.0.60"
121
+ GH_AW_INFO_AGENT_VERSION: "1.0.60"
122
+ GH_AW_INFO_CLI_VERSION: "v0.79.8"
123
+ GH_AW_INFO_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
124
+ GH_AW_INFO_EXPERIMENTAL: "false"
125
+ GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true"
126
+ GH_AW_INFO_STAGED: "false"
127
+ GH_AW_INFO_ALLOWED_DOMAINS: '["defaults"]'
128
+ GH_AW_INFO_FIREWALL_ENABLED: "true"
129
+ GH_AW_INFO_AWF_VERSION: "v0.27.2"
130
+ GH_AW_INFO_AWMG_VERSION: ""
131
+ GH_AW_INFO_FIREWALL_TYPE: "squid"
132
+ GH_AW_INFO_FRONTMATTER_EMOJI: "🛠️"
133
+ GH_AW_COMPILED_STRICT: "true"
134
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
135
+ with:
136
+ script: |
137
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
138
+ setupGlobals(core, github, context, exec, io, getOctokit);
139
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_aw_info.cjs');
140
+ await main(core, context);
141
+ - name: Check daily workflow token guardrail
142
+ id: daily-effective-workflow-guardrail
143
+ if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }}
144
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
145
+ env:
146
+ GH_AW_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
147
+ GH_AW_WORKFLOW_ID: "bug-fix"
148
+ GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
149
+ GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT: ${{ github.event.inputs.aw_context || '' }}
150
+ GH_AW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
151
+ GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }}
152
+ with:
153
+ github-token: ${{ secrets.GITHUB_TOKEN }}
154
+ script: |
155
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
156
+ setupGlobals(core, github, context, exec, io, getOctokit);
157
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_daily_aic_workflow_guardrail.cjs');
158
+ await main();
159
+ - name: Validate COPILOT_GITHUB_TOKEN secret
160
+ id: validate-secret
161
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_multi_secret.sh" COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default
162
+ env:
163
+ COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
164
+ - name: Checkout .github and .agents folders
165
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
166
+ with:
167
+ persist-credentials: false
168
+ sparse-checkout: |
169
+ .github
170
+ .agents
171
+ .antigravity
172
+ .claude
173
+ .codex
174
+ .crush
175
+ .gemini
176
+ .opencode
177
+ .pi
178
+ sparse-checkout-cone-mode: true
179
+ fetch-depth: 1
180
+ - name: Save agent config folders for base branch restoration
181
+ env:
182
+ GH_AW_AGENT_FOLDERS: ".agents .antigravity .claude .codex .crush .gemini .github .opencode .pi"
183
+ GH_AW_AGENT_FILES: ".crush.json AGENTS.md ANTIGRAVITY.md CLAUDE.md GEMINI.md PI.md opencode.jsonc"
184
+ # poutine:ignore untrusted_checkout_exec
185
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh"
186
+ - name: Check workflow lock file
187
+ id: check-lock-file
188
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
189
+ env:
190
+ GH_AW_WORKFLOW_FILE: "bug-fix.lock.yml"
191
+ GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}"
192
+ with:
193
+ script: |
194
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
195
+ setupGlobals(core, github, context, exec, io, getOctokit);
196
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_workflow_timestamp_api.cjs');
197
+ await main();
198
+ - name: Check compile-agentic version
199
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
200
+ env:
201
+ GH_AW_COMPILED_VERSION: "v0.79.8"
202
+ with:
203
+ script: |
204
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
205
+ setupGlobals(core, github, context, exec, io, getOctokit);
206
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_version_updates.cjs');
207
+ await main();
208
+ - name: Compute current body text
209
+ id: sanitized
210
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
211
+ env:
212
+ GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com"
213
+ with:
214
+ script: |
215
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
216
+ setupGlobals(core, github, context, exec, io, getOctokit);
217
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/compute_text.cjs');
218
+ await main();
219
+ - name: Create prompt with built-in context
220
+ env:
221
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
222
+ GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl
223
+ GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }}
224
+ GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }}
225
+ GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }}
226
+ GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }}
227
+ GH_AW_GITHUB_ACTOR: ${{ github.actor }}
228
+ GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }}
229
+ GH_AW_GITHUB_REPOSITORY: ${{ github.repository }}
230
+ GH_AW_GITHUB_RUN_ID: ${{ github.run_id }}
231
+ GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }}
232
+ # poutine:ignore untrusted_checkout_exec
233
+ run: |
234
+ bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh"
235
+ {
236
+ cat << 'GH_AW_PROMPT_9067e162aa1009dc_EOF'
237
+ <system>
238
+ GH_AW_PROMPT_9067e162aa1009dc_EOF
239
+ cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md"
240
+ cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md"
241
+ cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md"
242
+ cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md"
243
+ cat << 'GH_AW_PROMPT_9067e162aa1009dc_EOF'
244
+ <safe-output-tools>
245
+ Tools: add_comment, create_pull_request, add_labels, missing_tool, missing_data, noop
246
+ GH_AW_PROMPT_9067e162aa1009dc_EOF
247
+ cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_create_pull_request.md"
248
+ cat << 'GH_AW_PROMPT_9067e162aa1009dc_EOF'
249
+ </safe-output-tools>
250
+ GH_AW_PROMPT_9067e162aa1009dc_EOF
251
+ cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md"
252
+ cat << 'GH_AW_PROMPT_9067e162aa1009dc_EOF'
253
+ <github-context>
254
+ The following GitHub context information is available for this workflow:
255
+ {{#if github.actor}}
256
+ - **actor**: __GH_AW_GITHUB_ACTOR__
257
+ {{/if}}
258
+ {{#if github.repository}}
259
+ - **repository**: __GH_AW_GITHUB_REPOSITORY__
260
+ {{/if}}
261
+ {{#if github.workspace}}
262
+ - **workspace**: __GH_AW_GITHUB_WORKSPACE__
263
+ {{/if}}
264
+ {{#if github.event.issue.number || (github.aw.context.item_type == 'issue' && github.aw.context.item_number)}}
265
+ - **issue-number**: #__GH_AW_EXPR_802A9F6A__
266
+ {{/if}}
267
+ {{#if github.event.discussion.number || (github.aw.context.item_type == 'discussion' && github.aw.context.item_number)}}
268
+ - **discussion-number**: #__GH_AW_EXPR_1A3A194A__
269
+ {{/if}}
270
+ {{#if github.event.pull_request.number || (github.aw.context.item_type == 'pull_request' && github.aw.context.item_number)}}
271
+ - **pull-request-number**: #__GH_AW_EXPR_463A214A__
272
+ {{/if}}
273
+ {{#if github.event.comment.id || github.aw.context.comment_id}}
274
+ - **comment-id**: __GH_AW_EXPR_FF1D34CE__
275
+ {{/if}}
276
+ {{#if github.run_id}}
277
+ - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__
278
+ {{/if}}
279
+ - **checkouts**: The following repositories have been checked out and are available in the workspace:
280
+ - repo `__GH_AW_GITHUB_REPOSITORY__` → `$GITHUB_WORKSPACE` (cwd) [full history, all branches available as remote-tracking refs]
281
+ - **Note**: If a branch you need is not in the list above and is not listed as an additional fetched ref, it has NOT been checked out. For private repositories you cannot fetch it. If the branch is required and not available, exit with an error and ask the user to add it to the `fetch:` option of the `checkout:` configuration (e.g., `fetch: ["refs/pulls/open/*"]` for all open PR refs, or `fetch: ["main", "feature/my-branch"]` for specific branches).
282
+ - **Warning: No git credentials are available to the agent.** Credentials are
283
+ intentionally removed after the checkout step for security. This means any git
284
+ operation that needs to authenticate to the remote will fail. In private repositories, that includes:
285
+ - `git fetch`, `git pull`, `git clone`, and `git push` (direct push, not via safe-output tools)
286
+ - Checking out or switching to a remote branch that is not already fetched
287
+ - Deepening a shallow clone (`git fetch --unshallow`)
288
+ - On-demand blob fetches in partial/blobless clones (operations on files not in the initial checkout)
289
+ Do NOT attempt to configure credentials, run `git credential fill`, or modify `.gitconfig` —
290
+ authentication will not succeed. If you encounter credential prompts or authentication errors,
291
+ stop immediately and report the limitation rather than spending turns trying to work around it.
292
+ </github-context>
293
+
294
+ GH_AW_PROMPT_9067e162aa1009dc_EOF
295
+ cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md"
296
+ cat << 'GH_AW_PROMPT_9067e162aa1009dc_EOF'
297
+ </system>
298
+ {{#runtime-import .github/workflows/bug-fix.md}}
299
+ GH_AW_PROMPT_9067e162aa1009dc_EOF
300
+ } > "$GH_AW_PROMPT"
301
+ - name: Interpolate variables and render templates
302
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
303
+ env:
304
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
305
+ GH_AW_ENGINE_ID: "copilot"
306
+ GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }}
307
+ with:
308
+ script: |
309
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
310
+ setupGlobals(core, github, context, exec, io, getOctokit);
311
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/interpolate_prompt.cjs');
312
+ await main();
313
+ - name: Substitute placeholders
314
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
315
+ env:
316
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
317
+ GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }}
318
+ GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }}
319
+ GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }}
320
+ GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }}
321
+ GH_AW_GITHUB_ACTOR: ${{ github.actor }}
322
+ GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }}
323
+ GH_AW_GITHUB_REPOSITORY: ${{ github.repository }}
324
+ GH_AW_GITHUB_RUN_ID: ${{ github.run_id }}
325
+ GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }}
326
+ GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools'
327
+ GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: ${{ needs.pre_activation.outputs.activated }}
328
+ with:
329
+ script: |
330
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
331
+ setupGlobals(core, github, context, exec, io, getOctokit);
332
+
333
+ const substitutePlaceholders = require('${{ runner.temp }}/gh-aw/actions/substitute_placeholders.cjs');
334
+
335
+ // Call the substitution function
336
+ return await substitutePlaceholders({
337
+ file: process.env.GH_AW_PROMPT,
338
+ substitutions: {
339
+ GH_AW_EXPR_1A3A194A: process.env.GH_AW_EXPR_1A3A194A,
340
+ GH_AW_EXPR_463A214A: process.env.GH_AW_EXPR_463A214A,
341
+ GH_AW_EXPR_802A9F6A: process.env.GH_AW_EXPR_802A9F6A,
342
+ GH_AW_EXPR_FF1D34CE: process.env.GH_AW_EXPR_FF1D34CE,
343
+ GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR,
344
+ GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER,
345
+ GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY,
346
+ GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID,
347
+ GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE,
348
+ GH_AW_MCP_CLI_SERVERS_LIST: process.env.GH_AW_MCP_CLI_SERVERS_LIST,
349
+ GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: process.env.GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED
350
+ }
351
+ });
352
+ - name: Validate prompt placeholders
353
+ env:
354
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
355
+ # poutine:ignore untrusted_checkout_exec
356
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_prompt_placeholders.sh"
357
+ - name: Print prompt
358
+ env:
359
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
360
+ # poutine:ignore untrusted_checkout_exec
361
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/print_prompt_summary.sh"
362
+ - name: Upload activation artifact
363
+ if: success()
364
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
365
+ with:
366
+ name: activation
367
+ include-hidden-files: true
368
+ path: |
369
+ /tmp/gh-aw/aw_info.json
370
+ /tmp/gh-aw/models.json
371
+ /tmp/gh-aw/aw-prompts/prompt.txt
372
+ /tmp/gh-aw/aw-prompts/prompt-template.txt
373
+ /tmp/gh-aw/aw-prompts/prompt-import-tree.json
374
+ /tmp/gh-aw/github_rate_limits.jsonl
375
+ /tmp/gh-aw/base
376
+ /tmp/gh-aw/.github/agents
377
+ /tmp/gh-aw/.github/skills
378
+ if-no-files-found: ignore
379
+ retention-days: 1
380
+
381
+ agent:
382
+ needs: activation
383
+ if: needs.activation.outputs.daily_ai_credits_exceeded != 'true'
384
+ runs-on: ubuntu-latest
385
+ permissions:
386
+ contents: read
387
+ issues: read
388
+ env:
389
+ DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
390
+ GH_AW_ASSETS_ALLOWED_EXTS: ""
391
+ GH_AW_ASSETS_BRANCH: ""
392
+ GH_AW_ASSETS_MAX_SIZE_KB: 0
393
+ GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs
394
+ GH_AW_WORKFLOW_ID_SANITIZED: bugfix
395
+ outputs:
396
+ agentic_engine_timeout: ${{ steps.detect-agent-errors.outputs.agentic_engine_timeout || 'false' }}
397
+ ai_credits_rate_limit_error: ${{ steps.parse-mcp-gateway.outputs.ai_credits_rate_limit_error || 'false' }}
398
+ aic: ${{ steps.parse-mcp-gateway.outputs.aic }}
399
+ ambient_context: ${{ steps.parse-mcp-gateway.outputs.ambient_context }}
400
+ checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }}
401
+ effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }}
402
+ has_patch: ${{ steps.collect_output.outputs.has_patch }}
403
+ inference_access_error: ${{ steps.detect-agent-errors.outputs.inference_access_error || 'false' }}
404
+ mcp_policy_error: ${{ steps.detect-agent-errors.outputs.mcp_policy_error || 'false' }}
405
+ model: ${{ needs.activation.outputs.model }}
406
+ model_not_supported_error: ${{ steps.detect-agent-errors.outputs.model_not_supported_error || 'false' }}
407
+ output: ${{ steps.collect_output.outputs.output }}
408
+ output_types: ${{ steps.collect_output.outputs.output_types }}
409
+ setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }}
410
+ setup-span-id: ${{ steps.setup.outputs.span-id }}
411
+ setup-trace-id: ${{ steps.setup.outputs.trace-id }}
412
+ unknown_model_ai_credits: ${{ steps.parse-mcp-gateway.outputs.unknown_model_ai_credits || 'false' }}
413
+ steps:
414
+ - name: Setup Scripts
415
+ id: setup
416
+ uses: github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8
417
+ with:
418
+ destination: ${{ runner.temp }}/gh-aw/actions
419
+ job-name: ${{ github.job }}
420
+ trace-id: ${{ needs.activation.outputs.setup-trace-id }}
421
+ parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }}
422
+ env:
423
+ GH_AW_SETUP_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
424
+ GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/bug-fix.lock.yml@${{ github.ref }}
425
+ GH_AW_INFO_VERSION: "1.0.60"
426
+ GH_AW_INFO_AWF_VERSION: "v0.27.2"
427
+ GH_AW_INFO_ENGINE_ID: "copilot"
428
+ - name: Set runtime paths
429
+ id: set-runtime-paths
430
+ run: |
431
+ {
432
+ echo "GH_AW_SAFE_OUTPUTS=${RUNNER_TEMP}/gh-aw/safeoutputs/outputs.jsonl"
433
+ echo "GH_AW_SAFE_OUTPUTS_CONFIG_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/config.json"
434
+ echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json"
435
+ } >> "$GITHUB_OUTPUT"
436
+ - name: Checkout repository
437
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
438
+ with:
439
+ persist-credentials: false
440
+ fetch-depth: 0
441
+ - name: Create gh-aw temp directory
442
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/create_gh_aw_tmp_dir.sh"
443
+ - name: Configure gh CLI for GitHub Enterprise
444
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_gh_for_ghe.sh"
445
+ env:
446
+ GH_TOKEN: ${{ github.token }}
447
+ - name: Configure Git credentials
448
+ env:
449
+ REPO_NAME: ${{ github.repository }}
450
+ SERVER_URL: ${{ github.server_url }}
451
+ GITHUB_TOKEN: ${{ github.token }}
452
+ run: |
453
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
454
+ git config --global user.name "github-actions[bot]"
455
+ git config --global am.keepcr true
456
+ # Re-authenticate git with GitHub token
457
+ SERVER_URL_STRIPPED="${SERVER_URL#https://}"
458
+ git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git"
459
+ echo "Git configured with standard GitHub Actions identity"
460
+ - name: Checkout PR branch
461
+ id: checkout-pr
462
+ if: |
463
+ github.event.pull_request || github.event.issue.pull_request || github.event_name == 'workflow_dispatch' && fromJSON(github.event.inputs.aw_context || '{}').item_type == 'pull_request'
464
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
465
+ env:
466
+ GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
467
+ with:
468
+ github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
469
+ script: |
470
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
471
+ setupGlobals(core, github, context, exec, io, getOctokit);
472
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs');
473
+ await main();
474
+ - name: Install GitHub Copilot CLI
475
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.60
476
+ env:
477
+ GH_HOST: github.com
478
+ - name: Install AWF binary
479
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.27.2
480
+ - name: Parse integrity filter lists
481
+ id: parse-guard-vars
482
+ env:
483
+ GH_AW_BLOCKED_USERS_VAR: ${{ vars.GH_AW_GITHUB_BLOCKED_USERS || '' }}
484
+ GH_AW_TRUSTED_USERS_VAR: ${{ vars.GH_AW_GITHUB_TRUSTED_USERS || '' }}
485
+ GH_AW_APPROVAL_LABELS_VAR: ${{ vars.GH_AW_GITHUB_APPROVAL_LABELS || '' }}
486
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/parse_guard_list.sh"
487
+ - name: Download activation artifact
488
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
489
+ with:
490
+ name: activation
491
+ path: /tmp/gh-aw
492
+ - name: Restore agent config folders from base branch
493
+ if: steps.checkout-pr.outcome == 'success'
494
+ env:
495
+ GH_AW_AGENT_FOLDERS: ".agents .antigravity .claude .codex .crush .gemini .github .opencode .pi"
496
+ GH_AW_AGENT_FILES: ".crush.json AGENTS.md ANTIGRAVITY.md CLAUDE.md GEMINI.md PI.md opencode.jsonc"
497
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh"
498
+ - name: Restore inline sub-agents from activation artifact
499
+ env:
500
+ GH_AW_SUB_AGENT_DIR: ".github/agents"
501
+ GH_AW_SUB_AGENT_EXT: ".agent.md"
502
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_sub_agents.sh"
503
+ - name: Restore inline skills from activation artifact
504
+ env:
505
+ GH_AW_SKILL_DIR: ".github/skills"
506
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh"
507
+ - name: Download container images
508
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6 ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4 ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591 ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c
509
+ - name: Generate Safe Outputs Config
510
+ run: |
511
+ mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs"
512
+ mkdir -p /tmp/gh-aw/safeoutputs
513
+ mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs
514
+ cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_c82a0b6123dfe707_EOF'
515
+ {"add_comment":{"max":1},"add_labels":{"allowed":["needs-assessment","needs-reproduction","fix-proposed","fix-blocked"],"max":1},"create_pull_request":{"draft":true,"labels":["bug-fix","automated"],"max":1,"max_patch_files":100,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","CONTRIBUTING.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"],"protected_files_policy":"blocked","title_prefix":"[bug-fix] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"false"},"report_incomplete":{}}
516
+ GH_AW_SAFE_OUTPUTS_CONFIG_c82a0b6123dfe707_EOF
517
+ - name: Generate Safe Outputs Tools
518
+ env:
519
+ GH_AW_TOOLS_META_JSON: |
520
+ {
521
+ "description_suffixes": {
522
+ "add_comment": " CONSTRAINTS: Maximum 1 comment(s) can be added. Supports reply_to_id for discussion threading.",
523
+ "add_labels": " CONSTRAINTS: Maximum 1 label(s) can be added. Only these labels are allowed: [\"needs-assessment\" \"needs-reproduction\" \"fix-proposed\" \"fix-blocked\"].",
524
+ "create_pull_request": " CONSTRAINTS: Maximum 1 pull request(s) can be created. Title will be prefixed with \"[bug-fix] \". Labels [\"bug-fix\" \"automated\"] will be automatically added. PRs will be created as drafts."
525
+ },
526
+ "repo_params": {},
527
+ "dynamic_tools": []
528
+ }
529
+ GH_AW_VALIDATION_JSON: |
530
+ {
531
+ "add_comment": {
532
+ "defaultMax": 1,
533
+ "fields": {
534
+ "body": {
535
+ "required": true,
536
+ "type": "string",
537
+ "sanitize": true,
538
+ "maxLength": 65000
539
+ },
540
+ "item_number": {
541
+ "issueOrPRNumber": true
542
+ },
543
+ "reply_to_id": {
544
+ "type": "string",
545
+ "maxLength": 256
546
+ },
547
+ "repo": {
548
+ "type": "string",
549
+ "maxLength": 256
550
+ }
551
+ }
552
+ },
553
+ "add_labels": {
554
+ "defaultMax": 5,
555
+ "fields": {
556
+ "item_number": {
557
+ "issueNumberOrTemporaryId": true
558
+ },
559
+ "labels": {
560
+ "required": true,
561
+ "type": "array",
562
+ "itemType": "string",
563
+ "itemSanitize": true,
564
+ "itemMaxLength": 128
565
+ },
566
+ "repo": {
567
+ "type": "string",
568
+ "maxLength": 256
569
+ }
570
+ }
571
+ },
572
+ "create_pull_request": {
573
+ "defaultMax": 1,
574
+ "fields": {
575
+ "base": {
576
+ "type": "string",
577
+ "sanitize": true,
578
+ "maxLength": 128
579
+ },
580
+ "body": {
581
+ "required": true,
582
+ "type": "string",
583
+ "sanitize": true,
584
+ "maxLength": 65000
585
+ },
586
+ "branch": {
587
+ "required": true,
588
+ "type": "string",
589
+ "sanitize": true,
590
+ "maxLength": 256
591
+ },
592
+ "draft": {
593
+ "type": "boolean"
594
+ },
595
+ "labels": {
596
+ "type": "array",
597
+ "itemType": "string",
598
+ "itemSanitize": true,
599
+ "itemMaxLength": 128
600
+ },
601
+ "repo": {
602
+ "type": "string",
603
+ "maxLength": 256
604
+ },
605
+ "title": {
606
+ "required": true,
607
+ "type": "string",
608
+ "sanitize": true,
609
+ "maxLength": 128
610
+ }
611
+ }
612
+ },
613
+ "missing_data": {
614
+ "defaultMax": 20,
615
+ "fields": {
616
+ "alternatives": {
617
+ "type": "string",
618
+ "sanitize": true,
619
+ "maxLength": 256
620
+ },
621
+ "context": {
622
+ "type": "string",
623
+ "sanitize": true,
624
+ "maxLength": 256
625
+ },
626
+ "data_type": {
627
+ "type": "string",
628
+ "sanitize": true,
629
+ "maxLength": 128
630
+ },
631
+ "reason": {
632
+ "type": "string",
633
+ "sanitize": true,
634
+ "maxLength": 256
635
+ }
636
+ }
637
+ },
638
+ "missing_tool": {
639
+ "defaultMax": 20,
640
+ "fields": {
641
+ "alternatives": {
642
+ "type": "string",
643
+ "sanitize": true,
644
+ "maxLength": 512
645
+ },
646
+ "reason": {
647
+ "required": true,
648
+ "type": "string",
649
+ "sanitize": true,
650
+ "maxLength": 256
651
+ },
652
+ "tool": {
653
+ "type": "string",
654
+ "sanitize": true,
655
+ "maxLength": 128
656
+ }
657
+ }
658
+ },
659
+ "noop": {
660
+ "defaultMax": 1,
661
+ "fields": {
662
+ "message": {
663
+ "required": true,
664
+ "type": "string",
665
+ "sanitize": true,
666
+ "maxLength": 65000
667
+ }
668
+ }
669
+ },
670
+ "report_incomplete": {
671
+ "defaultMax": 5,
672
+ "fields": {
673
+ "details": {
674
+ "type": "string",
675
+ "sanitize": true,
676
+ "maxLength": 65000
677
+ },
678
+ "reason": {
679
+ "required": true,
680
+ "type": "string",
681
+ "sanitize": true,
682
+ "maxLength": 1024
683
+ }
684
+ }
685
+ }
686
+ }
687
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
688
+ with:
689
+ script: |
690
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
691
+ setupGlobals(core, github, context, exec, io, getOctokit);
692
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_safe_outputs_tools.cjs');
693
+ await main();
694
+ - name: Generate Safe Outputs MCP Server Config
695
+ id: safe-outputs-config
696
+ run: |
697
+ # Generate a secure random API key (360 bits of entropy, 40+ chars)
698
+ # Mask immediately to prevent timing vulnerabilities
699
+ API_KEY=$(openssl rand -base64 45 | tr -d '/+=')
700
+ echo "::add-mask::${API_KEY}"
701
+
702
+ PORT=3001
703
+
704
+ # Set outputs for next steps
705
+ {
706
+ echo "safe_outputs_api_key=${API_KEY}"
707
+ echo "safe_outputs_port=${PORT}"
708
+ } >> "$GITHUB_OUTPUT"
709
+
710
+ echo "Safe Outputs MCP server will run on port ${PORT}"
711
+
712
+ - name: Start Safe Outputs MCP HTTP Server
713
+ id: safe-outputs-start
714
+ env:
715
+ DEBUG: '*'
716
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
717
+ GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }}
718
+ GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }}
719
+ GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/tools.json
720
+ GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/config.json
721
+ GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs
722
+ run: |
723
+ # Environment variables are set above to prevent template injection
724
+ export DEBUG
725
+ export GH_AW_SAFE_OUTPUTS
726
+ export GH_AW_SAFE_OUTPUTS_PORT
727
+ export GH_AW_SAFE_OUTPUTS_API_KEY
728
+ export GH_AW_SAFE_OUTPUTS_TOOLS_PATH
729
+ export GH_AW_SAFE_OUTPUTS_CONFIG_PATH
730
+ export GH_AW_MCP_LOG_DIR
731
+
732
+ bash "${RUNNER_TEMP}/gh-aw/actions/start_safe_outputs_server.sh"
733
+
734
+ - name: Start MCP Gateway
735
+ id: start-mcp-gateway
736
+ env:
737
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
738
+ GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }}
739
+ GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }}
740
+ GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
741
+ run: |
742
+ set -eo pipefail
743
+ mkdir -p "${RUNNER_TEMP}/gh-aw/mcp-config"
744
+
745
+ # Export gateway environment variables for MCP config and gateway script
746
+ export MCP_GATEWAY_PORT="8080"
747
+ export MCP_GATEWAY_DOMAIN="host.docker.internal"
748
+ export MCP_GATEWAY_HOST_DOMAIN="localhost"
749
+ MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=')
750
+ echo "::add-mask::${MCP_GATEWAY_API_KEY}"
751
+ export MCP_GATEWAY_API_KEY
752
+ export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads"
753
+ mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}"
754
+ export MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD="524288"
755
+ export DEBUG="*"
756
+
757
+ export GH_AW_ENGINE="copilot"
758
+ MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0')
759
+ MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0')
760
+ case "${DOCKER_HOST:-}" in
761
+ unix://* ) DOCKER_SOCK_PATH="${DOCKER_HOST#unix://}" ;;
762
+ /* ) DOCKER_SOCK_PATH="$DOCKER_HOST" ;;
763
+ * ) DOCKER_SOCK_PATH=/var/run/docker.sock ;;
764
+ esac
765
+ DOCKER_SOCK_GID=$(stat -c '%g' "$DOCKER_SOCK_PATH" 2>/dev/null || echo '0')
766
+ export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.25'
767
+
768
+ mkdir -p "$HOME/.copilot"
769
+ GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node)
770
+ cat << GH_AW_MCP_CONFIG_e6668539766ebde6_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs"
771
+ {
772
+ "mcpServers": {
773
+ "github": {
774
+ "type": "stdio",
775
+ "container": "ghcr.io/github/github-mcp-server:v1.1.2",
776
+ "env": {
777
+ "GITHUB_HOST": "\${GITHUB_SERVER_URL}",
778
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}",
779
+ "GITHUB_READ_ONLY": "1",
780
+ "GITHUB_TOOLSETS": "issues,repos"
781
+ },
782
+ "guard-policies": {
783
+ "allow-only": {
784
+ "approval-labels": ${{ steps.parse-guard-vars.outputs.approval_labels }},
785
+ "blocked-users": ${{ steps.parse-guard-vars.outputs.blocked_users }},
786
+ "min-integrity": "none",
787
+ "repos": "all",
788
+ "trusted-users": ${{ steps.parse-guard-vars.outputs.trusted_users }}
789
+ }
790
+ }
791
+ },
792
+ "safeoutputs": {
793
+ "type": "http",
794
+ "url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT",
795
+ "headers": {
796
+ "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}"
797
+ },
798
+ "guard-policies": {
799
+ "write-sink": {
800
+ "accept": [
801
+ "*"
802
+ ]
803
+ }
804
+ }
805
+ }
806
+ },
807
+ "gateway": {
808
+ "port": $MCP_GATEWAY_PORT,
809
+ "domain": "${MCP_GATEWAY_DOMAIN}",
810
+ "apiKey": "${MCP_GATEWAY_API_KEY}",
811
+ "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}"
812
+ }
813
+ }
814
+ GH_AW_MCP_CONFIG_e6668539766ebde6_EOF
815
+ - name: Mount MCP servers as CLIs
816
+ id: mount-mcp-clis
817
+ continue-on-error: true
818
+ env:
819
+ MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }}
820
+ MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }}
821
+ MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }}
822
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
823
+ with:
824
+ script: |
825
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
826
+ setupGlobals(core, github, context, exec, io);
827
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/mount_mcp_as_cli.cjs');
828
+ await main();
829
+ - name: Clean credentials
830
+ continue-on-error: true
831
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh"
832
+ - name: Audit pre-agent workspace
833
+ id: pre_agent_audit
834
+ continue-on-error: true
835
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh"
836
+ - name: Execute GitHub Copilot CLI
837
+ id: agentic_execution
838
+ # Copilot CLI tool arguments (sorted):
839
+ # --allow-tool github
840
+ # --allow-tool safeoutputs
841
+ # --allow-tool shell(cargo:*)
842
+ # --allow-tool shell(cat)
843
+ # --allow-tool shell(date)
844
+ # --allow-tool shell(dotnet:*)
845
+ # --allow-tool shell(echo)
846
+ # --allow-tool shell(find)
847
+ # --allow-tool shell(git add:*)
848
+ # --allow-tool shell(git branch:*)
849
+ # --allow-tool shell(git checkout:*)
850
+ # --allow-tool shell(git commit:*)
851
+ # --allow-tool shell(git merge:*)
852
+ # --allow-tool shell(git rm:*)
853
+ # --allow-tool shell(git status)
854
+ # --allow-tool shell(git switch:*)
855
+ # --allow-tool shell(go:*)
856
+ # --allow-tool shell(grep)
857
+ # --allow-tool shell(head)
858
+ # --allow-tool shell(jq)
859
+ # --allow-tool shell(ls)
860
+ # --allow-tool shell(npm:*)
861
+ # --allow-tool shell(printf)
862
+ # --allow-tool shell(pwd)
863
+ # --allow-tool shell(pytest)
864
+ # --allow-tool shell(python3)
865
+ # --allow-tool shell(safeoutputs:*)
866
+ # --allow-tool shell(sort)
867
+ # --allow-tool shell(tail)
868
+ # --allow-tool shell(uniq)
869
+ # --allow-tool shell(wc)
870
+ # --allow-tool shell(yq)
871
+ # --allow-tool web_fetch
872
+ # --allow-tool write
873
+ timeout-minutes: 20
874
+ run: |
875
+ set -o pipefail
876
+ printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt
877
+ trap 'rm -f "$HOME/.copilot/settings.json"' EXIT
878
+ mkdir -p "$HOME/.copilot"
879
+ printf '%s' '{"builtInAgents":{"rubberDuck":false}}' > "$HOME/.copilot/settings.json"
880
+ export XDG_CONFIG_HOME="$HOME"
881
+ export GH_AW_MCP_CONFIG="$HOME/.copilot/mcp-config.json"
882
+ touch /tmp/gh-aw/agent-step-summary.md
883
+ GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true)
884
+ export GH_AW_NODE_BIN
885
+ export COPILOT_API_KEY="$COPILOT_DUMMY_BYOK"
886
+ (umask 177 && touch /tmp/gh-aw/agent-stdio.log)
887
+ GH_AW_MAX_AI_CREDITS="${{ vars.GH_AW_DEFAULT_MAX_AI_CREDITS || '1000' }}"
888
+ printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.27.2/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"api.business.githubcopilot.com\",\"api.enterprise.githubcopilot.com\",\"api.github.com\",\"api.githubcopilot.com\",\"api.individual.githubcopilot.com\",\"api.snapcraft.io\",\"archive.ubuntu.com\",\"azure.archive.ubuntu.com\",\"crl.geotrust.com\",\"crl.globalsign.com\",\"crl.identrust.com\",\"crl.sectigo.com\",\"crl.thawte.com\",\"crl.usertrust.com\",\"crl.verisign.com\",\"crl3.digicert.com\",\"crl4.digicert.com\",\"crls.ssl.com\",\"github.com\",\"host.docker.internal\",\"json-schema.org\",\"json.schemastore.org\",\"keyserver.ubuntu.com\",\"ocsp.digicert.com\",\"ocsp.geotrust.com\",\"ocsp.globalsign.com\",\"ocsp.identrust.com\",\"ocsp.sectigo.com\",\"ocsp.ssl.com\",\"ocsp.thawte.com\",\"ocsp.usertrust.com\",\"ocsp.verisign.com\",\"packagecloud.io\",\"packages.cloud.google.com\",\"packages.microsoft.com\",\"ppa.launchpad.net\",\"raw.githubusercontent.com\",\"registry.npmjs.org\",\"s.symcb.com\",\"s.symcd.com\",\"security.ubuntu.com\",\"telemetry.enterprise.githubcopilot.com\",\"ts-crl.ws.symantec.com\",\"ts-ocsp.ws.symantec.com\",\"www.googleapis.com\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"large\":[\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"vision\":[\"copilot/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"container\":{\"imageTag\":\"0.27.2,squid=sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591,agent=sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6,api-proxy=sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4,cli-proxy=sha256:02f3ec08f32dc26c5427920c6a2e2f3036238fce44802f2f11ef49ed8621b5d0\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json"
889
+ cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json
890
+ export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json"
891
+ GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS=""
892
+ if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then
893
+ GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS="--docker-host-path-prefix /tmp/gh-aw"
894
+ fi
895
+ GH_AW_TOOL_CACHE_MOUNT=""
896
+ GH_AW_TOOL_CACHE="${RUNNER_TOOL_CACHE:-/opt/hostedtoolcache}"
897
+ if [ -d "$GH_AW_TOOL_CACHE" ]; then
898
+ if [[ "$GH_AW_TOOL_CACHE" != /opt/* ]]; then
899
+ GH_AW_TOOL_CACHE_MOUNT="$GH_AW_TOOL_CACHE:$GH_AW_TOOL_CACHE:ro"
900
+ fi
901
+ elif [ -d "/home/runner/work/_tool" ]; then
902
+ GH_AW_TOOL_CACHE_MOUNT="/home/runner/work/_tool:/home/runner/work/_tool:ro"
903
+ fi
904
+ # shellcheck disable=SC1003
905
+ sudo -E awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS} --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --skip-pull \
906
+ -- /bin/bash -c 'set +o histexpand; export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && GH_AW_TOOL_CACHE="${RUNNER_TOOL_CACHE:-/opt/hostedtoolcache}"; export PATH="$(find "$GH_AW_TOOL_CACHE" /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-tool github --allow-tool safeoutputs --allow-tool '\''shell(cargo:*)'\'' --allow-tool '\''shell(cat)'\'' --allow-tool '\''shell(date)'\'' --allow-tool '\''shell(dotnet:*)'\'' --allow-tool '\''shell(echo)'\'' --allow-tool '\''shell(find)'\'' --allow-tool '\''shell(git add:*)'\'' --allow-tool '\''shell(git branch:*)'\'' --allow-tool '\''shell(git checkout:*)'\'' --allow-tool '\''shell(git commit:*)'\'' --allow-tool '\''shell(git merge:*)'\'' --allow-tool '\''shell(git rm:*)'\'' --allow-tool '\''shell(git status)'\'' --allow-tool '\''shell(git switch:*)'\'' --allow-tool '\''shell(go:*)'\'' --allow-tool '\''shell(grep)'\'' --allow-tool '\''shell(head)'\'' --allow-tool '\''shell(jq)'\'' --allow-tool '\''shell(ls)'\'' --allow-tool '\''shell(npm:*)'\'' --allow-tool '\''shell(printf)'\'' --allow-tool '\''shell(pwd)'\'' --allow-tool '\''shell(pytest)'\'' --allow-tool '\''shell(python3)'\'' --allow-tool '\''shell(safeoutputs:*)'\'' --allow-tool '\''shell(sort)'\'' --allow-tool '\''shell(tail)'\'' --allow-tool '\''shell(uniq)'\'' --allow-tool '\''shell(wc)'\'' --allow-tool '\''shell(yq)'\'' --allow-tool web_fetch --allow-tool write --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
907
+ env:
908
+ AWF_REFLECT_ENABLED: 1
909
+ COPILOT_AGENT_RUNNER_TYPE: STANDALONE
910
+ COPILOT_DUMMY_BYOK: dummy-byok-key-for-offline-mode
911
+ COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
912
+ COPILOT_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'claude-sonnet-4.6' }}
913
+ GH_AW_MAX_TURNS: ${{ vars.GH_AW_DEFAULT_MAX_TURNS || '' }}
914
+ GH_AW_PHASE: agent
915
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
916
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
917
+ GH_AW_TIMEOUT_MINUTES: 20
918
+ GH_AW_VERSION: v0.79.8
919
+ GITHUB_API_URL: ${{ github.api_url }}
920
+ GITHUB_AW: true
921
+ GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows
922
+ GITHUB_HEAD_REF: ${{ github.head_ref }}
923
+ GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
924
+ GITHUB_REF_NAME: ${{ github.ref_name }}
925
+ GITHUB_SERVER_URL: ${{ github.server_url }}
926
+ GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md
927
+ GITHUB_WORKSPACE: ${{ github.workspace }}
928
+ GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com
929
+ GIT_AUTHOR_NAME: github-actions[bot]
930
+ GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com
931
+ GIT_COMMITTER_NAME: github-actions[bot]
932
+ RUNNER_TEMP: ${{ runner.temp }}
933
+ - name: Detect agent errors
934
+ if: always()
935
+ id: detect-agent-errors
936
+ continue-on-error: true
937
+ run: node "${RUNNER_TEMP}/gh-aw/actions/detect_agent_errors.cjs"
938
+ - name: Configure Git credentials
939
+ env:
940
+ REPO_NAME: ${{ github.repository }}
941
+ SERVER_URL: ${{ github.server_url }}
942
+ GITHUB_TOKEN: ${{ github.token }}
943
+ run: |
944
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
945
+ git config --global user.name "github-actions[bot]"
946
+ git config --global am.keepcr true
947
+ # Re-authenticate git with GitHub token
948
+ SERVER_URL_STRIPPED="${SERVER_URL#https://}"
949
+ git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git"
950
+ echo "Git configured with standard GitHub Actions identity"
951
+ - name: Copy Copilot session state files to logs
952
+ if: always()
953
+ continue-on-error: true
954
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh"
955
+ - name: Stop MCP Gateway
956
+ if: always()
957
+ continue-on-error: true
958
+ env:
959
+ MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }}
960
+ MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }}
961
+ GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }}
962
+ run: |
963
+ bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID"
964
+ - name: Redact secrets in logs
965
+ if: always()
966
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
967
+ with:
968
+ script: |
969
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
970
+ setupGlobals(core, github, context, exec, io, getOctokit);
971
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/redact_secrets.cjs');
972
+ await main();
973
+ env:
974
+ GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN'
975
+ SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
976
+ SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }}
977
+ SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }}
978
+ SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
979
+ - name: Append agent step summary
980
+ if: always()
981
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/append_agent_step_summary.sh"
982
+ - name: Copy Safe Outputs
983
+ if: always()
984
+ env:
985
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
986
+ run: |
987
+ mkdir -p /tmp/gh-aw
988
+ cp "$GH_AW_SAFE_OUTPUTS" /tmp/gh-aw/safeoutputs.jsonl 2>/dev/null || true
989
+ - name: Ingest agent output
990
+ id: collect_output
991
+ if: always()
992
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
993
+ env:
994
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
995
+ GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com"
996
+ GITHUB_SERVER_URL: ${{ github.server_url }}
997
+ GITHUB_API_URL: ${{ github.api_url }}
998
+ with:
999
+ script: |
1000
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1001
+ setupGlobals(core, github, context, exec, io, getOctokit);
1002
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/collect_ndjson_output.cjs');
1003
+ await main();
1004
+ - name: Parse agent logs for step summary
1005
+ if: always()
1006
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1007
+ env:
1008
+ GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/
1009
+ with:
1010
+ script: |
1011
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1012
+ setupGlobals(core, github, context, exec, io, getOctokit);
1013
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_copilot_log.cjs');
1014
+ await main();
1015
+ - name: Parse MCP Gateway logs for step summary
1016
+ if: always()
1017
+ id: parse-mcp-gateway
1018
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1019
+ with:
1020
+ script: |
1021
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1022
+ setupGlobals(core, github, context, exec, io, getOctokit);
1023
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_mcp_gateway_log.cjs');
1024
+ await main();
1025
+ - name: Print firewall logs
1026
+ if: always()
1027
+ continue-on-error: true
1028
+ env:
1029
+ AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs
1030
+ run: |
1031
+ # Fix permissions on firewall logs/audit dirs so they can be uploaded as artifacts
1032
+ # AWF runs with sudo, creating files owned by root
1033
+ sudo chmod -R a+rX /tmp/gh-aw/sandbox/firewall 2>/dev/null || true
1034
+ # Only run awf logs summary if awf command exists (it may not be installed if workflow failed before install step)
1035
+ if command -v awf &> /dev/null; then
1036
+ awf logs summary | tee -a "$GITHUB_STEP_SUMMARY"
1037
+ else
1038
+ echo 'AWF binary not installed, skipping firewall log summary'
1039
+ fi
1040
+ - name: Parse token usage for step summary
1041
+ if: always()
1042
+ continue-on-error: true
1043
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1044
+ with:
1045
+ script: |
1046
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1047
+ setupGlobals(core, github, context, exec, io, getOctokit);
1048
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_token_usage.cjs');
1049
+ await main();
1050
+ - name: Print AWF reflect summary
1051
+ if: always()
1052
+ continue-on-error: true
1053
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1054
+ with:
1055
+ script: |
1056
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1057
+ setupGlobals(core, github, context, exec, io, getOctokit);
1058
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/awf_reflect_summary.cjs');
1059
+ await main();
1060
+ - name: Write agent output placeholder if missing
1061
+ if: always()
1062
+ run: |
1063
+ if [ ! -f /tmp/gh-aw/agent_output.json ]; then
1064
+ echo '{"items":[]}' > /tmp/gh-aw/agent_output.json
1065
+ fi
1066
+ - name: Upload agent artifacts
1067
+ if: always()
1068
+ continue-on-error: true
1069
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
1070
+ with:
1071
+ name: agent
1072
+ path: |
1073
+ /tmp/gh-aw/aw-prompts/prompt.txt
1074
+ /tmp/gh-aw/sandbox/agent/logs/
1075
+ /tmp/gh-aw/redacted-urls.log
1076
+ /tmp/gh-aw/mcp-logs/
1077
+ /tmp/gh-aw/proxy-logs/
1078
+ !/tmp/gh-aw/proxy-logs/proxy-tls/
1079
+ /tmp/gh-aw/agent_usage.json
1080
+ /tmp/gh-aw/agent-stdio.log
1081
+ /tmp/gh-aw/pre-agent-audit.txt
1082
+ /tmp/gh-aw/agent/
1083
+ /tmp/gh-aw/github_rate_limits.jsonl
1084
+ /tmp/gh-aw/safeoutputs.jsonl
1085
+ /tmp/gh-aw/agent_output.json
1086
+ /tmp/gh-aw/aw-*.patch
1087
+ /tmp/gh-aw/aw-*.bundle
1088
+ /tmp/gh-aw/awf-config.json
1089
+ /tmp/gh-aw/sandbox/firewall/logs/
1090
+ /tmp/gh-aw/sandbox/firewall/audit/
1091
+ /tmp/gh-aw/sandbox/firewall/awf-reflect.json
1092
+ if-no-files-found: ignore
1093
+
1094
+ conclusion:
1095
+ needs:
1096
+ - activation
1097
+ - agent
1098
+ - detection
1099
+ - safe_outputs
1100
+ if: >
1101
+ always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true' ||
1102
+ needs.activation.outputs.stale_lock_file_failed == 'true' || needs.activation.outputs.daily_ai_credits_exceeded == 'true')
1103
+ runs-on: ubuntu-slim
1104
+ permissions:
1105
+ contents: write
1106
+ discussions: write
1107
+ issues: write
1108
+ pull-requests: write
1109
+ concurrency:
1110
+ group: "gh-aw-conclusion-bug-fix"
1111
+ cancel-in-progress: false
1112
+ queue: max
1113
+ outputs:
1114
+ incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }}
1115
+ noop_message: ${{ steps.noop.outputs.noop_message }}
1116
+ tools_reported: ${{ steps.missing_tool.outputs.tools_reported }}
1117
+ total_count: ${{ steps.missing_tool.outputs.total_count }}
1118
+ steps:
1119
+ - name: Setup Scripts
1120
+ id: setup
1121
+ uses: github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8
1122
+ with:
1123
+ destination: ${{ runner.temp }}/gh-aw/actions
1124
+ job-name: ${{ github.job }}
1125
+ trace-id: ${{ needs.activation.outputs.setup-trace-id }}
1126
+ parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }}
1127
+ env:
1128
+ GH_AW_SETUP_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1129
+ GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/bug-fix.lock.yml@${{ github.ref }}
1130
+ GH_AW_INFO_VERSION: "1.0.60"
1131
+ GH_AW_INFO_AWF_VERSION: "v0.27.2"
1132
+ GH_AW_INFO_ENGINE_ID: "copilot"
1133
+ - name: Download agent output artifact
1134
+ id: download-agent-output
1135
+ continue-on-error: true
1136
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
1137
+ with:
1138
+ name: agent
1139
+ path: /tmp/gh-aw/
1140
+ - name: Setup agent output environment variable
1141
+ id: setup-agent-output-env
1142
+ if: steps.download-agent-output.outcome == 'success'
1143
+ run: |
1144
+ mkdir -p /tmp/gh-aw/
1145
+ find "/tmp/gh-aw/" -type f -print
1146
+ echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT"
1147
+ - name: Collect usage artifact files
1148
+ if: always()
1149
+ continue-on-error: true
1150
+ run: |
1151
+ mkdir -p /tmp/gh-aw/usage/agent /tmp/gh-aw/usage/detection
1152
+ echo "Usage artifact source file status:"
1153
+ for file in /tmp/gh-aw/aw-info.jsonl /tmp/gh-aw/agent_usage.jsonl /tmp/gh-aw/detection_usage.jsonl /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl; do
1154
+ [ -f "$file" ] && echo "FOUND: $file" || echo "MISSING: $file"
1155
+ done
1156
+ [ -f /tmp/gh-aw/aw-info.jsonl ] && cp /tmp/gh-aw/aw-info.jsonl /tmp/gh-aw/usage/aw-info.jsonl || true
1157
+ [ -f /tmp/gh-aw/agent_usage.jsonl ] && cp /tmp/gh-aw/agent_usage.jsonl /tmp/gh-aw/usage/agent_usage.jsonl || true
1158
+ [ -f /tmp/gh-aw/detection_usage.jsonl ] && cp /tmp/gh-aw/detection_usage.jsonl /tmp/gh-aw/usage/detection_usage.jsonl || true
1159
+ [ -f /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true
1160
+ [ -f /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true
1161
+ [ -f /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true
1162
+ [ -f /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true
1163
+ [ -f /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true
1164
+ [ -f /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true
1165
+ [ -f /tmp/gh-aw/usage/agent/token_usage.jsonl ] || : > /tmp/gh-aw/usage/agent/token_usage.jsonl
1166
+ [ -f /tmp/gh-aw/usage/detection/token_usage.jsonl ] || : > /tmp/gh-aw/usage/detection/token_usage.jsonl
1167
+ find /tmp/gh-aw/usage -type f -print | sort
1168
+ - name: Upload usage artifact
1169
+ if: always()
1170
+ continue-on-error: true
1171
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
1172
+ with:
1173
+ name: usage
1174
+ path: |
1175
+ /tmp/gh-aw/usage/aw-info.jsonl
1176
+ /tmp/gh-aw/usage/agent_usage.jsonl
1177
+ /tmp/gh-aw/usage/detection_usage.jsonl
1178
+ /tmp/gh-aw/usage/agent/token_usage.jsonl
1179
+ /tmp/gh-aw/usage/detection/token_usage.jsonl
1180
+ if-no-files-found: ignore
1181
+ - name: Process no-op messages
1182
+ id: noop
1183
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1184
+ env:
1185
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
1186
+ GH_AW_NOOP_MAX: "1"
1187
+ GH_AW_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1188
+ GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/bug-fix.md"
1189
+ GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
1190
+ GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }}
1191
+ GH_AW_NOOP_REPORT_AS_ISSUE: "false"
1192
+ GH_AW_AIC: ${{ needs.agent.outputs.aic }}
1193
+ GH_AW_THREAT_DETECTION_AIC: ${{ needs.detection.outputs.aic }}
1194
+ GH_AW_AMBIENT_CONTEXT: ${{ needs.agent.outputs.ambient_context }}
1195
+ GH_AW_WORKFLOW_ID: "bug-fix"
1196
+ with:
1197
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1198
+ script: |
1199
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1200
+ setupGlobals(core, github, context, exec, io, getOctokit);
1201
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_noop_message.cjs');
1202
+ await main();
1203
+ - name: Log detection run
1204
+ id: detection_runs
1205
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1206
+ env:
1207
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
1208
+ GH_AW_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1209
+ GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/bug-fix.md"
1210
+ GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
1211
+ GH_AW_DETECTION_CONCLUSION: ${{ needs.detection.outputs.detection_conclusion }}
1212
+ GH_AW_DETECTION_REASON: ${{ needs.detection.outputs.detection_reason }}
1213
+ with:
1214
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1215
+ script: |
1216
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1217
+ setupGlobals(core, github, context, exec, io, getOctokit);
1218
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_detection_runs.cjs');
1219
+ await main();
1220
+ - name: Record missing tool
1221
+ id: missing_tool
1222
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1223
+ env:
1224
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
1225
+ GH_AW_MISSING_TOOL_CREATE_ISSUE: "true"
1226
+ GH_AW_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1227
+ GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/bug-fix.md"
1228
+ with:
1229
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1230
+ script: |
1231
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1232
+ setupGlobals(core, github, context, exec, io, getOctokit);
1233
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/missing_tool.cjs');
1234
+ await main();
1235
+ - name: Record incomplete
1236
+ id: report_incomplete
1237
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1238
+ env:
1239
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
1240
+ GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true"
1241
+ GH_AW_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1242
+ GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/bug-fix.md"
1243
+ with:
1244
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1245
+ script: |
1246
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1247
+ setupGlobals(core, github, context, exec, io, getOctokit);
1248
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/report_incomplete_handler.cjs');
1249
+ await main();
1250
+ - name: Handle agent failure
1251
+ id: handle_agent_failure
1252
+ if: always()
1253
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1254
+ env:
1255
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
1256
+ GH_AW_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1257
+ GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/bug-fix.md"
1258
+ GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
1259
+ GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }}
1260
+ GH_AW_WORKFLOW_ID: "bug-fix"
1261
+ GH_AW_ACTION_FAILURE_ISSUE_EXPIRES_HOURS: "168"
1262
+ GH_AW_ENGINE_ID: "copilot"
1263
+ GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.activation.outputs.secret_verification_result }}
1264
+ GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }}
1265
+ GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens || '' }}
1266
+ GH_AW_AI_CREDITS_RATE_LIMIT_ERROR: ${{ needs.agent.outputs.ai_credits_rate_limit_error || 'false' }}
1267
+ GH_AW_UNKNOWN_MODEL_AI_CREDITS: ${{ needs.agent.outputs.unknown_model_ai_credits || 'false' }}
1268
+ GH_AW_AIC: ${{ needs.agent.outputs.aic }}
1269
+ GH_AW_THREAT_DETECTION_AIC: ${{ needs.detection.outputs.aic }}
1270
+ GH_AW_MAX_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_AI_CREDITS || '1000' }}
1271
+ GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }}
1272
+ GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }}
1273
+ GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }}
1274
+ GH_AW_MODEL_NOT_SUPPORTED_ERROR: ${{ needs.agent.outputs.model_not_supported_error }}
1275
+ GH_AW_ENGINE_API_HOSTS: "api.enterprise.githubcopilot.com,api.githubcopilot.com,api.business.githubcopilot.com,api.individual.githubcopilot.com"
1276
+ GH_AW_CODE_PUSH_FAILURE_ERRORS: ${{ needs.safe_outputs.outputs.code_push_failure_errors }}
1277
+ GH_AW_CODE_PUSH_FAILURE_COUNT: ${{ needs.safe_outputs.outputs.code_push_failure_count }}
1278
+ GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }}
1279
+ GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }}
1280
+ GH_AW_DAILY_AI_CREDITS_EXCEEDED: ${{ needs.activation.outputs.daily_ai_credits_exceeded }}
1281
+ GH_AW_DAILY_AI_CREDITS_TOTAL_EFFECTIVE_TOKENS: ${{ needs.activation.outputs.daily_ai_credits_total_effective_tokens }}
1282
+ GH_AW_DAILY_AI_CREDITS_THRESHOLD: ${{ needs.activation.outputs.daily_ai_credits_threshold }}
1283
+ GH_AW_GROUP_REPORTS: "false"
1284
+ GH_AW_FAILURE_REPORT_AS_ISSUE: "true"
1285
+ GH_AW_MISSING_TOOL_REPORT_AS_FAILURE: "true"
1286
+ GH_AW_MISSING_DATA_REPORT_AS_FAILURE: "true"
1287
+ GH_AW_TIMEOUT_MINUTES: "20"
1288
+ with:
1289
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1290
+ script: |
1291
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1292
+ setupGlobals(core, github, context, exec, io, getOctokit);
1293
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs');
1294
+ await main();
1295
+
1296
+ detection:
1297
+ needs:
1298
+ - activation
1299
+ - agent
1300
+ if: >
1301
+ always() && needs.agent.result != 'skipped' && (needs.agent.outputs.output_types != '' || needs.agent.outputs.has_patch == 'true')
1302
+ runs-on: ubuntu-latest
1303
+ permissions:
1304
+ contents: read
1305
+ outputs:
1306
+ aic: ${{ steps.parse_detection_token_usage.outputs.aic }}
1307
+ detection_conclusion: ${{ steps.detection_conclusion.outputs.conclusion }}
1308
+ detection_reason: ${{ steps.detection_conclusion.outputs.reason }}
1309
+ detection_success: ${{ steps.detection_conclusion.outputs.success }}
1310
+ steps:
1311
+ - name: Setup Scripts
1312
+ id: setup
1313
+ uses: github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8
1314
+ with:
1315
+ destination: ${{ runner.temp }}/gh-aw/actions
1316
+ job-name: ${{ github.job }}
1317
+ trace-id: ${{ needs.activation.outputs.setup-trace-id }}
1318
+ parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }}
1319
+ env:
1320
+ GH_AW_SETUP_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1321
+ GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/bug-fix.lock.yml@${{ github.ref }}
1322
+ GH_AW_INFO_VERSION: "1.0.60"
1323
+ GH_AW_INFO_AWF_VERSION: "v0.27.2"
1324
+ GH_AW_INFO_ENGINE_ID: "copilot"
1325
+ - name: Download agent output artifact
1326
+ id: download-agent-output
1327
+ continue-on-error: true
1328
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
1329
+ with:
1330
+ name: agent
1331
+ path: /tmp/gh-aw/
1332
+ - name: Setup agent output environment variable
1333
+ id: setup-agent-output-env
1334
+ if: steps.download-agent-output.outcome == 'success'
1335
+ run: |
1336
+ mkdir -p /tmp/gh-aw/
1337
+ find "/tmp/gh-aw/" -type f -print
1338
+ echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT"
1339
+ - name: Checkout repository for patch context
1340
+ if: needs.agent.outputs.has_patch == 'true'
1341
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
1342
+ with:
1343
+ persist-credentials: false
1344
+ # --- Threat Detection ---
1345
+ - name: Clean stale firewall files from agent artifact
1346
+ run: |
1347
+ rm -rf /tmp/gh-aw/sandbox/firewall/logs
1348
+ rm -rf /tmp/gh-aw/sandbox/firewall/audit
1349
+ - name: Download container images
1350
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6 ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4 ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591
1351
+ - name: Check if detection needed
1352
+ id: detection_guard
1353
+ if: always()
1354
+ env:
1355
+ OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }}
1356
+ HAS_PATCH: ${{ needs.agent.outputs.has_patch }}
1357
+ run: |
1358
+ if [[ -n "$OUTPUT_TYPES" || "$HAS_PATCH" == "true" ]]; then
1359
+ echo "run_detection=true" >> "$GITHUB_OUTPUT"
1360
+ echo "Detection will run: output_types=$OUTPUT_TYPES, has_patch=$HAS_PATCH"
1361
+ else
1362
+ echo "run_detection=false" >> "$GITHUB_OUTPUT"
1363
+ echo "Detection skipped: no agent outputs or patches to analyze"
1364
+ fi
1365
+ - name: Clear MCP Config for detection
1366
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
1367
+ run: |
1368
+ rm -f "${RUNNER_TEMP}/gh-aw/mcp-config/mcp-servers.json"
1369
+ rm -f "$HOME/.copilot/mcp-config.json"
1370
+ rm -f "$GITHUB_WORKSPACE/.gemini/settings.json"
1371
+ - name: Prepare threat detection files
1372
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
1373
+ run: |
1374
+ mkdir -p /tmp/gh-aw/threat-detection/aw-prompts
1375
+ rm -f /tmp/gh-aw/agent_usage.json
1376
+ cp /tmp/gh-aw/aw-prompts/prompt.txt /tmp/gh-aw/threat-detection/aw-prompts/prompt.txt 2>/dev/null || true
1377
+ if [ ! -s /tmp/gh-aw/threat-detection/aw-prompts/prompt.txt ]; then
1378
+ echo "::warning::ERR_VALIDATION: Missing or empty detection context prompt at /tmp/gh-aw/threat-detection/aw-prompts/prompt.txt. Ensure the agent artifact includes /tmp/gh-aw/aw-prompts/prompt.txt. Detection will continue with fallback workflow context."
1379
+ fi
1380
+ cp /tmp/gh-aw/agent_output.json /tmp/gh-aw/threat-detection/agent_output.json 2>/dev/null || true
1381
+ for f in /tmp/gh-aw/aw-*.patch; do
1382
+ [ -f "$f" ] && cp "$f" /tmp/gh-aw/threat-detection/ 2>/dev/null || true
1383
+ done
1384
+ for f in /tmp/gh-aw/aw-*.bundle; do
1385
+ [ -f "$f" ] && cp "$f" /tmp/gh-aw/threat-detection/ 2>/dev/null || true
1386
+ done
1387
+ echo "Prepared threat detection files:"
1388
+ ls -la /tmp/gh-aw/threat-detection/ 2>/dev/null || true
1389
+ - name: Setup threat detection
1390
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
1391
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1392
+ env:
1393
+ WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1394
+ WORKFLOW_DESCRIPTION: "Apply the remediation from a prior bug assessment to a bug-fix-labeled issue and open a draft PR for human review"
1395
+ HAS_PATCH: ${{ needs.agent.outputs.has_patch }}
1396
+ with:
1397
+ script: |
1398
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1399
+ setupGlobals(core, github, context, exec, io, getOctokit);
1400
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/setup_threat_detection.cjs');
1401
+ await main();
1402
+ - name: Ensure threat-detection directory and log
1403
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
1404
+ run: |
1405
+ mkdir -p /tmp/gh-aw/threat-detection
1406
+ touch /tmp/gh-aw/threat-detection/detection.log
1407
+ - name: Setup Node.js
1408
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
1409
+ with:
1410
+ node-version: '24'
1411
+ package-manager-cache: false
1412
+ - name: Install GitHub Copilot CLI
1413
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.60
1414
+ env:
1415
+ GH_HOST: github.com
1416
+ - name: Install AWF binary
1417
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.27.2
1418
+ - name: Execute GitHub Copilot CLI
1419
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
1420
+ continue-on-error: true
1421
+ id: detection_agentic_execution
1422
+ # Copilot CLI tool arguments (sorted):
1423
+ timeout-minutes: 20
1424
+ run: |
1425
+ set -o pipefail
1426
+ printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt
1427
+ trap 'rm -f "$HOME/.copilot/settings.json"' EXIT
1428
+ mkdir -p "$HOME/.copilot"
1429
+ printf '%s' '{"builtInAgents":{"rubberDuck":false}}' > "$HOME/.copilot/settings.json"
1430
+ export XDG_CONFIG_HOME="$HOME"
1431
+ touch /tmp/gh-aw/agent-step-summary.md
1432
+ GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true)
1433
+ export GH_AW_NODE_BIN
1434
+ export COPILOT_API_KEY="$COPILOT_DUMMY_BYOK"
1435
+ (umask 177 && touch /tmp/gh-aw/threat-detection/detection.log)
1436
+ GH_AW_MAX_AI_CREDITS="${{ vars.GH_AW_DEFAULT_DETECTION_MAX_AI_CREDITS || '400' }}"
1437
+ printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.27.2/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"api.business.githubcopilot.com\",\"api.enterprise.githubcopilot.com\",\"api.github.com\",\"api.githubcopilot.com\",\"api.individual.githubcopilot.com\",\"github.com\",\"host.docker.internal\",\"registry.npmjs.org\",\"telemetry.enterprise.githubcopilot.com\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS}},\"container\":{\"imageTag\":\"0.27.2,squid=sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591,agent=sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6,api-proxy=sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4,cli-proxy=sha256:02f3ec08f32dc26c5427920c6a2e2f3036238fce44802f2f11ef49ed8621b5d0\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json"
1438
+ cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json
1439
+ export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json"
1440
+ GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS=""
1441
+ if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then
1442
+ GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS="--docker-host-path-prefix /tmp/gh-aw"
1443
+ fi
1444
+ GH_AW_TOOL_CACHE_MOUNT=""
1445
+ GH_AW_TOOL_CACHE="${RUNNER_TOOL_CACHE:-/opt/hostedtoolcache}"
1446
+ if [ -d "$GH_AW_TOOL_CACHE" ]; then
1447
+ if [[ "$GH_AW_TOOL_CACHE" != /opt/* ]]; then
1448
+ GH_AW_TOOL_CACHE_MOUNT="$GH_AW_TOOL_CACHE:$GH_AW_TOOL_CACHE:ro"
1449
+ fi
1450
+ elif [ -d "/home/runner/work/_tool" ]; then
1451
+ GH_AW_TOOL_CACHE_MOUNT="/home/runner/work/_tool:/home/runner/work/_tool:ro"
1452
+ fi
1453
+ # shellcheck disable=SC1003
1454
+ sudo -E awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS} --env-all --exclude-env COPILOT_GITHUB_TOKEN --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --skip-pull \
1455
+ -- /bin/bash -c 'set +o histexpand; GH_AW_TOOL_CACHE="${RUNNER_TOOL_CACHE:-/opt/hostedtoolcache}"; export PATH="$(find "$GH_AW_TOOL_CACHE" /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/threat-detection/detection.log
1456
+ env:
1457
+ AWF_REFLECT_ENABLED: 1
1458
+ COPILOT_AGENT_RUNNER_TYPE: STANDALONE
1459
+ COPILOT_DUMMY_BYOK: dummy-byok-key-for-offline-mode
1460
+ COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
1461
+ COPILOT_MODEL: ${{ vars.GH_AW_MODEL_DETECTION_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'claude-sonnet-4.6' }}
1462
+ GH_AW_MAX_TURNS: ${{ vars.GH_AW_DEFAULT_MAX_TURNS || '' }}
1463
+ GH_AW_PHASE: detection
1464
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
1465
+ GH_AW_TIMEOUT_MINUTES: 20
1466
+ GH_AW_VERSION: v0.79.8
1467
+ GITHUB_API_URL: ${{ github.api_url }}
1468
+ GITHUB_AW: true
1469
+ GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows
1470
+ GITHUB_HEAD_REF: ${{ github.head_ref }}
1471
+ GITHUB_REF_NAME: ${{ github.ref_name }}
1472
+ GITHUB_SERVER_URL: ${{ github.server_url }}
1473
+ GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md
1474
+ GITHUB_WORKSPACE: ${{ github.workspace }}
1475
+ GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com
1476
+ GIT_AUTHOR_NAME: github-actions[bot]
1477
+ GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com
1478
+ GIT_COMMITTER_NAME: github-actions[bot]
1479
+ RUNNER_TEMP: ${{ runner.temp }}
1480
+ - name: Parse threat detection token usage for step summary
1481
+ id: parse_detection_token_usage
1482
+ if: always()
1483
+ continue-on-error: true
1484
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1485
+ env:
1486
+ GH_AW_TOKEN_USAGE_SUMMARY_TITLE: Threat Detection Token Usage
1487
+ with:
1488
+ script: |
1489
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1490
+ setupGlobals(core, github, context, exec, io, getOctokit);
1491
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_token_usage.cjs');
1492
+ await main();
1493
+ - name: Upload threat detection log
1494
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
1495
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
1496
+ with:
1497
+ name: detection
1498
+ path: /tmp/gh-aw/threat-detection/detection.log
1499
+ if-no-files-found: ignore
1500
+ - name: Parse and conclude threat detection
1501
+ id: detection_conclusion
1502
+ if: always()
1503
+ continue-on-error: true
1504
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1505
+ env:
1506
+ RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }}
1507
+ DETECTION_AGENTIC_EXECUTION_OUTCOME: ${{ steps.detection_agentic_execution.outcome }}
1508
+ GH_AW_DETECTION_CONTINUE_ON_ERROR: "true"
1509
+ with:
1510
+ script: |
1511
+ try {
1512
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1513
+ setupGlobals(core, github, context, exec, io, getOctokit);
1514
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_threat_detection_results.cjs');
1515
+ await main();
1516
+ } catch (loadErr) {
1517
+ const continueOnError = process.env.GH_AW_DETECTION_CONTINUE_ON_ERROR !== 'false';
1518
+ const detectionExecutionFailed = process.env.DETECTION_AGENTIC_EXECUTION_OUTCOME === 'failure';
1519
+ const msg = 'ERR_SYSTEM: \u274C Unexpected error loading threat detection module: ' + (loadErr && loadErr.message ? loadErr.message : String(loadErr));
1520
+ core.error(msg);
1521
+ core.setOutput('reason', 'parse_error');
1522
+ if (continueOnError && !detectionExecutionFailed) {
1523
+ core.warning('\u26A0\uFE0F ' + msg);
1524
+ core.setOutput('conclusion', 'warning');
1525
+ core.setOutput('success', 'false');
1526
+ } else {
1527
+ core.setOutput('conclusion', 'failure');
1528
+ core.setOutput('success', 'false');
1529
+ core.setFailed(msg);
1530
+ }
1531
+ }
1532
+
1533
+ pre_activation:
1534
+ if: github.event_name != 'issues' || github.event.action != 'labeled' || github.event.label.name == 'bug-fix'
1535
+ runs-on: ubuntu-slim
1536
+ outputs:
1537
+ activated: ${{ steps.check_membership.outputs.is_team_member == 'true' && steps.check_skip_bots.outputs.skip_bots_ok == 'true' }}
1538
+ matched_command: ''
1539
+ setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }}
1540
+ setup-span-id: ${{ steps.setup.outputs.span-id }}
1541
+ setup-trace-id: ${{ steps.setup.outputs.trace-id }}
1542
+ steps:
1543
+ - name: Setup Scripts
1544
+ id: setup
1545
+ uses: github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8
1546
+ with:
1547
+ destination: ${{ runner.temp }}/gh-aw/actions
1548
+ job-name: ${{ github.job }}
1549
+ env:
1550
+ GH_AW_SETUP_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1551
+ GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/bug-fix.lock.yml@${{ github.ref }}
1552
+ GH_AW_INFO_VERSION: "1.0.60"
1553
+ GH_AW_INFO_AWF_VERSION: "v0.27.2"
1554
+ GH_AW_INFO_ENGINE_ID: "copilot"
1555
+ - name: Check team membership for workflow
1556
+ id: check_membership
1557
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1558
+ env:
1559
+ GH_AW_REQUIRED_ROLES: "admin,maintainer,write"
1560
+ with:
1561
+ github-token: ${{ secrets.GITHUB_TOKEN }}
1562
+ script: |
1563
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1564
+ setupGlobals(core, github, context, exec, io, getOctokit);
1565
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_membership.cjs');
1566
+ await main();
1567
+ - name: Check skip-bots
1568
+ id: check_skip_bots
1569
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1570
+ env:
1571
+ GH_AW_SKIP_BOTS: "github-actions,copilot-swe-agent,Copilot,copilot,@app/copilot-swe-agent,dependabot"
1572
+ GH_AW_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1573
+ with:
1574
+ script: |
1575
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1576
+ setupGlobals(core, github, context, exec, io, getOctokit);
1577
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_skip_bots.cjs');
1578
+ await main();
1579
+
1580
+ safe_outputs:
1581
+ needs:
1582
+ - activation
1583
+ - agent
1584
+ - detection
1585
+ if: (!cancelled()) && needs.agent.result != 'skipped' && needs.detection.result == 'success'
1586
+ runs-on: ubuntu-slim
1587
+ permissions:
1588
+ contents: write
1589
+ discussions: write
1590
+ issues: write
1591
+ pull-requests: write
1592
+ timeout-minutes: 45
1593
+ env:
1594
+ GH_AW_AGENT_AIC: ${{ needs.agent.outputs.aic }}
1595
+ GH_AW_AIC: ${{ needs.agent.outputs.aic }}
1596
+ GH_AW_AMBIENT_CONTEXT: ${{ needs.agent.outputs.ambient_context }}
1597
+ GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/bug-fix"
1598
+ GH_AW_DETECTION_CONCLUSION: ${{ needs.detection.outputs.detection_conclusion }}
1599
+ GH_AW_DETECTION_REASON: ${{ needs.detection.outputs.detection_reason }}
1600
+ GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }}
1601
+ GH_AW_ENGINE_ID: "copilot"
1602
+ GH_AW_ENGINE_MODEL: ${{ needs.agent.outputs.model }}
1603
+ GH_AW_ENGINE_VERSION: "1.0.60"
1604
+ GH_AW_THREAT_DETECTION_AIC: ${{ needs.detection.outputs.aic }}
1605
+ GH_AW_WORKFLOW_EMOJI: "🛠️"
1606
+ GH_AW_WORKFLOW_ID: "bug-fix"
1607
+ GH_AW_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1608
+ GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/bug-fix.md"
1609
+ outputs:
1610
+ code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }}
1611
+ code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }}
1612
+ comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }}
1613
+ comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }}
1614
+ create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }}
1615
+ create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }}
1616
+ created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }}
1617
+ created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }}
1618
+ process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }}
1619
+ process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }}
1620
+ steps:
1621
+ - name: Setup Scripts
1622
+ id: setup
1623
+ uses: github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8
1624
+ with:
1625
+ destination: ${{ runner.temp }}/gh-aw/actions
1626
+ job-name: ${{ github.job }}
1627
+ trace-id: ${{ needs.activation.outputs.setup-trace-id }}
1628
+ parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }}
1629
+ env:
1630
+ GH_AW_SETUP_WORKFLOW_NAME: "Fix Bug from Labeled Issue"
1631
+ GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/bug-fix.lock.yml@${{ github.ref }}
1632
+ GH_AW_INFO_VERSION: "1.0.60"
1633
+ GH_AW_INFO_AWF_VERSION: "v0.27.2"
1634
+ GH_AW_INFO_ENGINE_ID: "copilot"
1635
+ - name: Download agent output artifact
1636
+ id: download-agent-output
1637
+ continue-on-error: true
1638
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
1639
+ with:
1640
+ name: agent
1641
+ path: /tmp/gh-aw/
1642
+ - name: Setup agent output environment variable
1643
+ id: setup-agent-output-env
1644
+ if: steps.download-agent-output.outcome == 'success'
1645
+ run: |
1646
+ mkdir -p /tmp/gh-aw/
1647
+ find "/tmp/gh-aw/" -type f -print
1648
+ echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT"
1649
+ - name: Download patch artifact
1650
+ continue-on-error: true
1651
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
1652
+ with:
1653
+ name: agent
1654
+ path: /tmp/gh-aw/
1655
+ - name: Extract base branch from agent output
1656
+ id: extract-base-branch
1657
+ if: steps.download-agent-output.outcome == 'success'
1658
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1659
+ with:
1660
+ script: |
1661
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1662
+ setupGlobals(core, github, context, exec, io, getOctokit);
1663
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/extract_base_branch_from_agent_output.cjs');
1664
+ await main();
1665
+ - name: Checkout repository (trusted default branch for comment events)
1666
+ if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') && (github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment')
1667
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
1668
+ with:
1669
+ ref: ${{ github.event.repository.default_branch }}
1670
+ token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1671
+ persist-credentials: false
1672
+ fetch-depth: 0
1673
+ - name: Checkout repository
1674
+ if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') && github.event_name != 'issue_comment' && github.event_name != 'pull_request_review_comment'
1675
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
1676
+ with:
1677
+ ref: ${{ steps.extract-base-branch.outputs.base-branch || github.base_ref || github.event.pull_request.base.ref || github.ref_name || github.event.repository.default_branch }}
1678
+ token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1679
+ persist-credentials: false
1680
+ fetch-depth: 0
1681
+ - name: Configure Git credentials
1682
+ if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request')
1683
+ env:
1684
+ REPO_NAME: ${{ github.repository }}
1685
+ SERVER_URL: ${{ github.server_url }}
1686
+ GIT_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1687
+ run: |
1688
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
1689
+ git config --global user.name "github-actions[bot]"
1690
+ git config --global am.keepcr true
1691
+ # Re-authenticate git with GitHub token
1692
+ SERVER_URL_STRIPPED="${SERVER_URL#https://}"
1693
+ git remote set-url origin "https://x-access-token:${GIT_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git"
1694
+ echo "Git configured with standard GitHub Actions identity"
1695
+ - name: Configure GH_HOST for enterprise compatibility
1696
+ id: ghes-host-config
1697
+ shell: bash
1698
+ # zizmor: ignore[github-env] - GITHUB_SERVER_URL is set by GitHub Actions, not user input.
1699
+ run: |
1700
+ # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct
1701
+ # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op.
1702
+ GH_HOST="${GITHUB_SERVER_URL#https://}"
1703
+ GH_HOST="${GH_HOST#http://}"
1704
+ echo "GH_HOST=${GH_HOST}" >> "$GITHUB_ENV"
1705
+ - name: Process Safe Outputs
1706
+ id: process_safe_outputs
1707
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
1708
+ env:
1709
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
1710
+ GH_AW_COMMENT_ID: ${{ needs.activation.outputs.comment_id }}
1711
+ GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com"
1712
+ GITHUB_SERVER_URL: ${{ github.server_url }}
1713
+ GITHUB_API_URL: ${{ github.api_url }}
1714
+ GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":1},\"add_labels\":{\"allowed\":[\"needs-assessment\",\"needs-reproduction\",\"fix-proposed\",\"fix-blocked\"],\"max\":1},\"create_pull_request\":{\"draft\":true,\"labels\":[\"bug-fix\",\"automated\"],\"max\":1,\"max_patch_files\":100,\"max_patch_size\":1024,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"CONTRIBUTING.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\",\"CLAUDE.md\",\"GEMINI.md\"],\"protected_files_policy\":\"blocked\",\"title_prefix\":\"[bug-fix] \"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}"
1715
+ GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }}
1716
+ with:
1717
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
1718
+ script: |
1719
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
1720
+ setupGlobals(core, github, context, exec, io, getOctokit);
1721
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/safe_output_handler_manager.cjs');
1722
+ await main();
1723
+ - name: Upload Safe Outputs Items
1724
+ if: always()
1725
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
1726
+ with:
1727
+ name: safe-outputs-items
1728
+ path: |
1729
+ /tmp/gh-aw/safe-output-items.jsonl
1730
+ /tmp/gh-aw/temporary-id-map.json
1731
+ if-no-files-found: ignore
1732
+