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