@vicoa/cli 1.3.10 → 1.3.11-linux-x64

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 (301) hide show
  1. package/bin/_internal/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so +0 -0
  2. package/bin/_internal/_cffi_backend.cpython-312-x86_64-linux-gnu.so +0 -0
  3. package/bin/_internal/aiofile-3.9.0.dist-info/INSTALLER +1 -0
  4. package/bin/_internal/aiofile-3.9.0.dist-info/LICENCE +195 -0
  5. package/bin/_internal/aiofile-3.9.0.dist-info/LICENCE.md +195 -0
  6. package/bin/_internal/aiofile-3.9.0.dist-info/METADATA +492 -0
  7. package/bin/_internal/aiofile-3.9.0.dist-info/RECORD +15 -0
  8. package/bin/_internal/aiofile-3.9.0.dist-info/WHEEL +4 -0
  9. package/bin/_internal/aiohttp/_http_parser.cpython-312-x86_64-linux-gnu.so +0 -0
  10. package/bin/_internal/aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so +0 -0
  11. package/bin/_internal/aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so +0 -0
  12. package/bin/_internal/aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.so +0 -0
  13. package/bin/_internal/attrs-26.1.0.dist-info/INSTALLER +1 -0
  14. package/bin/_internal/attrs-26.1.0.dist-info/METADATA +199 -0
  15. package/bin/_internal/attrs-26.1.0.dist-info/RECORD +55 -0
  16. package/bin/_internal/attrs-26.1.0.dist-info/WHEEL +4 -0
  17. package/bin/_internal/attrs-26.1.0.dist-info/licenses/LICENSE +21 -0
  18. package/bin/_internal/base_library.zip +0 -0
  19. package/bin/_internal/caio/linux_aio.cpython-312-x86_64-linux-gnu.so +0 -0
  20. package/bin/_internal/caio/thread_aio.cpython-312-x86_64-linux-gnu.so +0 -0
  21. package/bin/_internal/certifi/cacert.pem +4494 -0
  22. package/bin/_internal/certifi/py.typed +0 -0
  23. package/bin/_internal/charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so +0 -0
  24. package/bin/_internal/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so +0 -0
  25. package/bin/_internal/click-8.3.2.dist-info/INSTALLER +1 -0
  26. package/bin/_internal/click-8.3.2.dist-info/METADATA +84 -0
  27. package/bin/_internal/click-8.3.2.dist-info/RECORD +40 -0
  28. package/bin/_internal/click-8.3.2.dist-info/WHEEL +4 -0
  29. package/bin/_internal/click-8.3.2.dist-info/licenses/LICENSE.txt +28 -0
  30. package/bin/_internal/cryptography/hazmat/bindings/_rust.abi3.so +0 -0
  31. package/bin/_internal/cryptography-46.0.7.dist-info/INSTALLER +1 -0
  32. package/bin/_internal/cryptography-46.0.7.dist-info/METADATA +139 -0
  33. package/bin/_internal/cryptography-46.0.7.dist-info/RECORD +180 -0
  34. package/bin/_internal/cryptography-46.0.7.dist-info/WHEEL +5 -0
  35. package/bin/_internal/cryptography-46.0.7.dist-info/licenses/LICENSE +3 -0
  36. package/bin/_internal/cryptography-46.0.7.dist-info/licenses/LICENSE.APACHE +202 -0
  37. package/bin/_internal/cryptography-46.0.7.dist-info/licenses/LICENSE.BSD +27 -0
  38. package/bin/_internal/email_validator-2.3.0.dist-info/INSTALLER +1 -0
  39. package/bin/_internal/email_validator-2.3.0.dist-info/METADATA +466 -0
  40. package/bin/_internal/email_validator-2.3.0.dist-info/RECORD +27 -0
  41. package/bin/_internal/email_validator-2.3.0.dist-info/WHEEL +5 -0
  42. package/bin/_internal/email_validator-2.3.0.dist-info/entry_points.txt +2 -0
  43. package/bin/_internal/email_validator-2.3.0.dist-info/licenses/LICENSE +27 -0
  44. package/bin/_internal/email_validator-2.3.0.dist-info/top_level.txt +1 -0
  45. package/bin/_internal/frozenlist/_frozenlist.cpython-312-x86_64-linux-gnu.so +0 -0
  46. package/bin/_internal/importlib_metadata-8.7.1.dist-info/INSTALLER +1 -0
  47. package/bin/_internal/importlib_metadata-8.7.1.dist-info/METADATA +133 -0
  48. package/bin/_internal/importlib_metadata-8.7.1.dist-info/RECORD +33 -0
  49. package/bin/_internal/importlib_metadata-8.7.1.dist-info/WHEEL +5 -0
  50. package/bin/_internal/importlib_metadata-8.7.1.dist-info/licenses/LICENSE +73 -0
  51. package/bin/_internal/importlib_metadata-8.7.1.dist-info/top_level.txt +1 -0
  52. package/bin/_internal/integrations/cli_wrappers/IMPORTANT_USE_CASES.md +33 -0
  53. package/bin/_internal/integrations/github/claude-code-action/CLAUDE.md +136 -0
  54. package/bin/_internal/integrations/github/claude-code-action/CODE_OF_CONDUCT.md +128 -0
  55. package/bin/_internal/integrations/github/claude-code-action/CONTRIBUTING.md +116 -0
  56. package/bin/_internal/integrations/github/claude-code-action/LICENSE +21 -0
  57. package/bin/_internal/integrations/github/claude-code-action/README.md +53 -0
  58. package/bin/_internal/integrations/github/claude-code-action/ROADMAP.md +20 -0
  59. package/bin/_internal/integrations/github/claude-code-action/SECURITY.md +15 -0
  60. package/bin/_internal/integrations/github/claude-code-action/action.yml +294 -0
  61. package/bin/_internal/integrations/github/claude-code-action/base-action/CLAUDE.md +60 -0
  62. package/bin/_internal/integrations/github/claude-code-action/base-action/CODE_OF_CONDUCT.md +128 -0
  63. package/bin/_internal/integrations/github/claude-code-action/base-action/CONTRIBUTING.md +136 -0
  64. package/bin/_internal/integrations/github/claude-code-action/base-action/LICENSE +21 -0
  65. package/bin/_internal/integrations/github/claude-code-action/base-action/MIRROR_DISCLAIMER.md +11 -0
  66. package/bin/_internal/integrations/github/claude-code-action/base-action/README.md +521 -0
  67. package/bin/_internal/integrations/github/claude-code-action/base-action/action.yml +149 -0
  68. package/bin/_internal/integrations/github/claude-code-action/base-action/bun.lock +54 -0
  69. package/bin/_internal/integrations/github/claude-code-action/base-action/examples/issue-triage.yml +108 -0
  70. package/bin/_internal/integrations/github/claude-code-action/base-action/package.json +23 -0
  71. package/bin/_internal/integrations/github/claude-code-action/base-action/scripts/install-hooks.sh +13 -0
  72. package/bin/_internal/integrations/github/claude-code-action/base-action/scripts/pre-push +46 -0
  73. package/bin/_internal/integrations/github/claude-code-action/base-action/src/index.ts +82 -0
  74. package/bin/_internal/integrations/github/claude-code-action/base-action/src/prepare-prompt.ts +82 -0
  75. package/bin/_internal/integrations/github/claude-code-action/base-action/src/run-claude.ts +257 -0
  76. package/bin/_internal/integrations/github/claude-code-action/base-action/src/run-vicoa.ts +301 -0
  77. package/bin/_internal/integrations/github/claude-code-action/base-action/src/setup-claude-code-settings.ts +68 -0
  78. package/bin/_internal/integrations/github/claude-code-action/base-action/src/validate-env.ts +54 -0
  79. package/bin/_internal/integrations/github/claude-code-action/base-action/test-local.sh +12 -0
  80. package/bin/_internal/integrations/github/claude-code-action/base-action/test-mcp-local.sh +18 -0
  81. package/bin/_internal/integrations/github/claude-code-action/base-action/tsconfig.json +30 -0
  82. package/bin/_internal/integrations/github/claude-code-action/bun.lock +384 -0
  83. package/bin/_internal/integrations/github/claude-code-action/docs/capabilities-and-limitations.md +33 -0
  84. package/bin/_internal/integrations/github/claude-code-action/docs/cloud-providers.md +99 -0
  85. package/bin/_internal/integrations/github/claude-code-action/docs/configuration.md +345 -0
  86. package/bin/_internal/integrations/github/claude-code-action/docs/custom-automations.md +113 -0
  87. package/bin/_internal/integrations/github/claude-code-action/docs/experimental.md +128 -0
  88. package/bin/_internal/integrations/github/claude-code-action/docs/faq.md +205 -0
  89. package/bin/_internal/integrations/github/claude-code-action/docs/migration-guide.md +261 -0
  90. package/bin/_internal/integrations/github/claude-code-action/docs/security.md +38 -0
  91. package/bin/_internal/integrations/github/claude-code-action/docs/setup.md +146 -0
  92. package/bin/_internal/integrations/github/claude-code-action/docs/usage.md +213 -0
  93. package/bin/_internal/integrations/github/claude-code-action/examples/auto-fix-ci/auto-fix-ci.yml +97 -0
  94. package/bin/_internal/integrations/github/claude-code-action/examples/auto-fix-ci/commands/fix-ci.md +127 -0
  95. package/bin/_internal/integrations/github/claude-code-action/examples/auto-fix-ci-signed/auto-fix-ci-signed.yml +97 -0
  96. package/bin/_internal/integrations/github/claude-code-action/examples/auto-fix-ci-signed/commands/fix-ci-signed.md +148 -0
  97. package/bin/_internal/integrations/github/claude-code-action/examples/issue-deduplication.yml +63 -0
  98. package/bin/_internal/integrations/github/claude-code-action/examples/issue-triage.yml +75 -0
  99. package/bin/_internal/integrations/github/claude-code-action/examples/vicoa.yml +75 -0
  100. package/bin/_internal/integrations/github/claude-code-action/package.json +31 -0
  101. package/bin/_internal/integrations/github/claude-code-action/scripts/install-hooks.sh +13 -0
  102. package/bin/_internal/integrations/github/claude-code-action/scripts/pre-commit +46 -0
  103. package/bin/_internal/integrations/github/claude-code-action/scripts/setup-network-restrictions.sh +123 -0
  104. package/bin/_internal/integrations/github/claude-code-action/src/create-prompt/index.ts +799 -0
  105. package/bin/_internal/integrations/github/claude-code-action/src/create-prompt/types.ts +102 -0
  106. package/bin/_internal/integrations/github/claude-code-action/src/entrypoints/collect-inputs.ts +58 -0
  107. package/bin/_internal/integrations/github/claude-code-action/src/entrypoints/format-turns.ts +465 -0
  108. package/bin/_internal/integrations/github/claude-code-action/src/entrypoints/prepare.ts +98 -0
  109. package/bin/_internal/integrations/github/claude-code-action/src/entrypoints/update-comment-link.ts +245 -0
  110. package/bin/_internal/integrations/github/claude-code-action/src/github/api/client.ts +23 -0
  111. package/bin/_internal/integrations/github/claude-code-action/src/github/api/config.ts +4 -0
  112. package/bin/_internal/integrations/github/claude-code-action/src/github/api/queries/github.ts +117 -0
  113. package/bin/_internal/integrations/github/claude-code-action/src/github/context.ts +277 -0
  114. package/bin/_internal/integrations/github/claude-code-action/src/github/data/fetcher.ts +233 -0
  115. package/bin/_internal/integrations/github/claude-code-action/src/github/data/formatter.ts +144 -0
  116. package/bin/_internal/integrations/github/claude-code-action/src/github/operations/branch-cleanup.ts +132 -0
  117. package/bin/_internal/integrations/github/claude-code-action/src/github/operations/branch.ts +163 -0
  118. package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comment-logic.ts +203 -0
  119. package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comments/common.ts +33 -0
  120. package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comments/create-initial.ts +111 -0
  121. package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comments/update-claude-comment.ts +70 -0
  122. package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comments/update-with-branch.ts +57 -0
  123. package/bin/_internal/integrations/github/claude-code-action/src/github/operations/git-config.ts +62 -0
  124. package/bin/_internal/integrations/github/claude-code-action/src/github/token.ts +108 -0
  125. package/bin/_internal/integrations/github/claude-code-action/src/github/types.ts +98 -0
  126. package/bin/_internal/integrations/github/claude-code-action/src/github/utils/image-downloader.ts +246 -0
  127. package/bin/_internal/integrations/github/claude-code-action/src/github/utils/sanitizer.ts +100 -0
  128. package/bin/_internal/integrations/github/claude-code-action/src/github/validation/actor.ts +64 -0
  129. package/bin/_internal/integrations/github/claude-code-action/src/github/validation/permissions.ts +47 -0
  130. package/bin/_internal/integrations/github/claude-code-action/src/github/validation/trigger.ts +148 -0
  131. package/bin/_internal/integrations/github/claude-code-action/src/mcp/github-actions-server.ts +279 -0
  132. package/bin/_internal/integrations/github/claude-code-action/src/mcp/github-comment-server.ts +101 -0
  133. package/bin/_internal/integrations/github/claude-code-action/src/mcp/github-file-ops-server.ts +677 -0
  134. package/bin/_internal/integrations/github/claude-code-action/src/mcp/github-inline-comment-server.ts +184 -0
  135. package/bin/_internal/integrations/github/claude-code-action/src/mcp/install-mcp-server.ts +201 -0
  136. package/bin/_internal/integrations/github/claude-code-action/src/modes/agent/index.ts +152 -0
  137. package/bin/_internal/integrations/github/claude-code-action/src/modes/agent/parse-tools.ts +22 -0
  138. package/bin/_internal/integrations/github/claude-code-action/src/modes/detector.ts +66 -0
  139. package/bin/_internal/integrations/github/claude-code-action/src/modes/registry.ts +54 -0
  140. package/bin/_internal/integrations/github/claude-code-action/src/modes/tag/index.ts +187 -0
  141. package/bin/_internal/integrations/github/claude-code-action/src/modes/types.ts +100 -0
  142. package/bin/_internal/integrations/github/claude-code-action/src/prepare/index.ts +20 -0
  143. package/bin/_internal/integrations/github/claude-code-action/src/prepare/types.ts +20 -0
  144. package/bin/_internal/integrations/github/claude-code-action/src/utils/retry.ts +40 -0
  145. package/bin/_internal/integrations/github/claude-code-action/tsconfig.json +30 -0
  146. package/bin/_internal/integrations/n8n/LICENSE +21 -0
  147. package/bin/_internal/integrations/n8n/README.md +298 -0
  148. package/bin/_internal/integrations/n8n/package-lock.json +2989 -0
  149. package/bin/_internal/integrations/n8n/package.json +68 -0
  150. package/bin/_internal/integrations/n8n/src/credentials/OmnaraApi.credentials.ts +52 -0
  151. package/bin/_internal/integrations/n8n/src/nodes/Omnara/Omnara.node.json +35 -0
  152. package/bin/_internal/integrations/n8n/src/nodes/Omnara/Omnara.node.ts +304 -0
  153. package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/message/index.ts +37 -0
  154. package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/message/send.operation.ts +151 -0
  155. package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/message/sendAndWait.operation.ts +252 -0
  156. package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/session/end.operation.ts +56 -0
  157. package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/session/index.ts +29 -0
  158. package/bin/_internal/integrations/n8n/src/nodes/Omnara/vicoa.png +0 -0
  159. package/bin/_internal/integrations/n8n/src/utils/GenericFunctions.ts +93 -0
  160. package/bin/_internal/integrations/n8n/src/utils/sendAndWait/configureWaitTillDate.ts +42 -0
  161. package/bin/_internal/integrations/n8n/src/utils/sendAndWait/descriptions.ts +20 -0
  162. package/bin/_internal/integrations/n8n/src/utils/sendAndWaitWebhook.ts +72 -0
  163. package/bin/_internal/integrations/n8n/tsconfig.json +20 -0
  164. package/bin/_internal/jiter/jiter.cpython-312-x86_64-linux-gnu.so +0 -0
  165. package/bin/_internal/jsonschema/benchmarks/issue232/issue.json +2653 -0
  166. package/bin/_internal/jsonschema-4.26.0.dist-info/INSTALLER +1 -0
  167. package/bin/_internal/jsonschema-4.26.0.dist-info/METADATA +170 -0
  168. package/bin/_internal/jsonschema-4.26.0.dist-info/RECORD +82 -0
  169. package/bin/_internal/jsonschema-4.26.0.dist-info/WHEEL +4 -0
  170. package/bin/_internal/jsonschema-4.26.0.dist-info/entry_points.txt +2 -0
  171. package/bin/_internal/jsonschema-4.26.0.dist-info/licenses/COPYING +19 -0
  172. package/bin/_internal/jsonschema_specifications/schemas/draft201909/metaschema.json +42 -0
  173. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/applicator +56 -0
  174. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/content +17 -0
  175. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/core +57 -0
  176. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/format +14 -0
  177. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data +37 -0
  178. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/validation +98 -0
  179. package/bin/_internal/jsonschema_specifications/schemas/draft202012/metaschema.json +58 -0
  180. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/applicator +48 -0
  181. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/content +17 -0
  182. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/core +51 -0
  183. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation +14 -0
  184. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion +14 -0
  185. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data +37 -0
  186. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated +15 -0
  187. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/validation +98 -0
  188. package/bin/_internal/jsonschema_specifications/schemas/draft3/metaschema.json +172 -0
  189. package/bin/_internal/jsonschema_specifications/schemas/draft4/metaschema.json +149 -0
  190. package/bin/_internal/jsonschema_specifications/schemas/draft6/metaschema.json +153 -0
  191. package/bin/_internal/jsonschema_specifications/schemas/draft7/metaschema.json +166 -0
  192. package/bin/_internal/libbz2.so.1.0 +0 -0
  193. package/bin/_internal/libcrypto.so.3 +0 -0
  194. package/bin/_internal/libffi.so.8 +0 -0
  195. package/bin/_internal/libgcc_s.so.1 +0 -0
  196. package/bin/_internal/liblzma.so.5 +0 -0
  197. package/bin/_internal/libpython3.12.so.1.0 +0 -0
  198. package/bin/_internal/libreadline.so.8 +0 -0
  199. package/bin/_internal/libssl.so.3 +0 -0
  200. package/bin/_internal/libstdc++.so.6 +0 -0
  201. package/bin/_internal/libtinfo.so.6 +0 -0
  202. package/bin/_internal/libuuid.so.1 +0 -0
  203. package/bin/_internal/libz.so.1 +0 -0
  204. package/bin/_internal/mcp-1.27.0.dist-info/INSTALLER +1 -0
  205. package/bin/_internal/mcp-1.27.0.dist-info/METADATA +230 -0
  206. package/bin/_internal/mcp-1.27.0.dist-info/RECORD +226 -0
  207. package/bin/_internal/mcp-1.27.0.dist-info/WHEEL +4 -0
  208. package/bin/_internal/mcp-1.27.0.dist-info/entry_points.txt +2 -0
  209. package/bin/_internal/mcp-1.27.0.dist-info/licenses/LICENSE +21 -0
  210. package/bin/_internal/multidict/_multidict.cpython-312-x86_64-linux-gnu.so +0 -0
  211. package/bin/_internal/opentelemetry_api-1.41.0.dist-info/INSTALLER +1 -0
  212. package/bin/_internal/opentelemetry_api-1.41.0.dist-info/METADATA +45 -0
  213. package/bin/_internal/opentelemetry_api-1.41.0.dist-info/RECORD +81 -0
  214. package/bin/_internal/opentelemetry_api-1.41.0.dist-info/WHEEL +4 -0
  215. package/bin/_internal/opentelemetry_api-1.41.0.dist-info/entry_points.txt +15 -0
  216. package/bin/_internal/opentelemetry_api-1.41.0.dist-info/licenses/LICENSE +201 -0
  217. package/bin/_internal/propcache/_helpers_c.cpython-312-x86_64-linux-gnu.so +0 -0
  218. package/bin/_internal/pydantic-2.13.2.dist-info/INSTALLER +1 -0
  219. package/bin/_internal/pydantic-2.13.2.dist-info/METADATA +1269 -0
  220. package/bin/_internal/pydantic-2.13.2.dist-info/RECORD +217 -0
  221. package/bin/_internal/pydantic-2.13.2.dist-info/WHEEL +4 -0
  222. package/bin/_internal/pydantic-2.13.2.dist-info/licenses/LICENSE +21 -0
  223. package/bin/_internal/pydantic_core/_pydantic_core.cpython-312-x86_64-linux-gnu.so +0 -0
  224. package/bin/_internal/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so +0 -0
  225. package/bin/_internal/python3.12/lib-dynload/_bisect.cpython-312-x86_64-linux-gnu.so +0 -0
  226. package/bin/_internal/python3.12/lib-dynload/_blake2.cpython-312-x86_64-linux-gnu.so +0 -0
  227. package/bin/_internal/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so +0 -0
  228. package/bin/_internal/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so +0 -0
  229. package/bin/_internal/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so +0 -0
  230. package/bin/_internal/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so +0 -0
  231. package/bin/_internal/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so +0 -0
  232. package/bin/_internal/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so +0 -0
  233. package/bin/_internal/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so +0 -0
  234. package/bin/_internal/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so +0 -0
  235. package/bin/_internal/python3.12/lib-dynload/_csv.cpython-312-x86_64-linux-gnu.so +0 -0
  236. package/bin/_internal/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so +0 -0
  237. package/bin/_internal/python3.12/lib-dynload/_datetime.cpython-312-x86_64-linux-gnu.so +0 -0
  238. package/bin/_internal/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so +0 -0
  239. package/bin/_internal/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so +0 -0
  240. package/bin/_internal/python3.12/lib-dynload/_heapq.cpython-312-x86_64-linux-gnu.so +0 -0
  241. package/bin/_internal/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so +0 -0
  242. package/bin/_internal/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so +0 -0
  243. package/bin/_internal/python3.12/lib-dynload/_md5.cpython-312-x86_64-linux-gnu.so +0 -0
  244. package/bin/_internal/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so +0 -0
  245. package/bin/_internal/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so +0 -0
  246. package/bin/_internal/python3.12/lib-dynload/_opcode.cpython-312-x86_64-linux-gnu.so +0 -0
  247. package/bin/_internal/python3.12/lib-dynload/_pickle.cpython-312-x86_64-linux-gnu.so +0 -0
  248. package/bin/_internal/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so +0 -0
  249. package/bin/_internal/python3.12/lib-dynload/_posixsubprocess.cpython-312-x86_64-linux-gnu.so +0 -0
  250. package/bin/_internal/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so +0 -0
  251. package/bin/_internal/python3.12/lib-dynload/_random.cpython-312-x86_64-linux-gnu.so +0 -0
  252. package/bin/_internal/python3.12/lib-dynload/_sha1.cpython-312-x86_64-linux-gnu.so +0 -0
  253. package/bin/_internal/python3.12/lib-dynload/_sha2.cpython-312-x86_64-linux-gnu.so +0 -0
  254. package/bin/_internal/python3.12/lib-dynload/_sha3.cpython-312-x86_64-linux-gnu.so +0 -0
  255. package/bin/_internal/python3.12/lib-dynload/_socket.cpython-312-x86_64-linux-gnu.so +0 -0
  256. package/bin/_internal/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so +0 -0
  257. package/bin/_internal/python3.12/lib-dynload/_statistics.cpython-312-x86_64-linux-gnu.so +0 -0
  258. package/bin/_internal/python3.12/lib-dynload/_struct.cpython-312-x86_64-linux-gnu.so +0 -0
  259. package/bin/_internal/python3.12/lib-dynload/_uuid.cpython-312-x86_64-linux-gnu.so +0 -0
  260. package/bin/_internal/python3.12/lib-dynload/_zoneinfo.cpython-312-x86_64-linux-gnu.so +0 -0
  261. package/bin/_internal/python3.12/lib-dynload/array.cpython-312-x86_64-linux-gnu.so +0 -0
  262. package/bin/_internal/python3.12/lib-dynload/binascii.cpython-312-x86_64-linux-gnu.so +0 -0
  263. package/bin/_internal/python3.12/lib-dynload/fcntl.cpython-312-x86_64-linux-gnu.so +0 -0
  264. package/bin/_internal/python3.12/lib-dynload/grp.cpython-312-x86_64-linux-gnu.so +0 -0
  265. package/bin/_internal/python3.12/lib-dynload/math.cpython-312-x86_64-linux-gnu.so +0 -0
  266. package/bin/_internal/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so +0 -0
  267. package/bin/_internal/python3.12/lib-dynload/pyexpat.cpython-312-x86_64-linux-gnu.so +0 -0
  268. package/bin/_internal/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so +0 -0
  269. package/bin/_internal/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so +0 -0
  270. package/bin/_internal/python3.12/lib-dynload/select.cpython-312-x86_64-linux-gnu.so +0 -0
  271. package/bin/_internal/python3.12/lib-dynload/syslog.cpython-312-x86_64-linux-gnu.so +0 -0
  272. package/bin/_internal/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so +0 -0
  273. package/bin/_internal/python3.12/lib-dynload/unicodedata.cpython-312-x86_64-linux-gnu.so +0 -0
  274. package/bin/_internal/python3.12/lib-dynload/zlib.cpython-312-x86_64-linux-gnu.so +0 -0
  275. package/bin/_internal/rpds/rpds.cpython-312-x86_64-linux-gnu.so +0 -0
  276. package/bin/_internal/setuptools/_vendor/jaraco/text/Lorem ipsum.txt +2 -0
  277. package/bin/_internal/vicoa/_bin/README.md +28 -0
  278. package/bin/_internal/vicoa-1.3.10.dist-info/INSTALLER +1 -0
  279. package/bin/_internal/vicoa-1.3.10.dist-info/METADATA +311 -0
  280. package/bin/_internal/vicoa-1.3.10.dist-info/RECORD +11 -0
  281. package/bin/_internal/vicoa-1.3.10.dist-info/REQUESTED +0 -0
  282. package/bin/_internal/vicoa-1.3.10.dist-info/WHEEL +5 -0
  283. package/bin/_internal/vicoa-1.3.10.dist-info/direct_url.json +1 -0
  284. package/bin/_internal/vicoa-1.3.10.dist-info/entry_points.txt +2 -0
  285. package/bin/_internal/vicoa-1.3.10.dist-info/licenses/LICENSE +201 -0
  286. package/bin/_internal/vicoa-1.3.10.dist-info/top_level.txt +3 -0
  287. package/bin/_internal/watchfiles/_rust_notify.cpython-312-x86_64-linux-gnu.so +0 -0
  288. package/bin/_internal/websockets/speedups.cpython-312-x86_64-linux-gnu.so +0 -0
  289. package/bin/_internal/websockets-16.0.dist-info/INSTALLER +1 -0
  290. package/bin/_internal/websockets-16.0.dist-info/METADATA +179 -0
  291. package/bin/_internal/websockets-16.0.dist-info/RECORD +108 -0
  292. package/bin/_internal/websockets-16.0.dist-info/WHEEL +7 -0
  293. package/bin/_internal/websockets-16.0.dist-info/entry_points.txt +2 -0
  294. package/bin/_internal/websockets-16.0.dist-info/licenses/LICENSE +24 -0
  295. package/bin/_internal/websockets-16.0.dist-info/top_level.txt +1 -0
  296. package/bin/_internal/yaml/_yaml.cpython-312-x86_64-linux-gnu.so +0 -0
  297. package/bin/_internal/yarl/_quoting_c.cpython-312-x86_64-linux-gnu.so +0 -0
  298. package/bin/vicoa +0 -0
  299. package/package.json +10 -16
  300. package/README.md +0 -82
  301. package/bin/vicoa.js +0 -38
@@ -0,0 +1,257 @@
1
+ import * as core from "@actions/core";
2
+ import { exec } from "child_process";
3
+ import { promisify } from "util";
4
+ import { unlink, writeFile, stat } from "fs/promises";
5
+ import { createWriteStream } from "fs";
6
+ import { spawn } from "child_process";
7
+ import { parse as parseShellArgs } from "shell-quote";
8
+
9
+ const execAsync = promisify(exec);
10
+
11
+ const PIPE_PATH = `${process.env.RUNNER_TEMP}/claude_prompt_pipe`;
12
+ const EXECUTION_FILE = `${process.env.RUNNER_TEMP}/claude-execution-output.json`;
13
+ const BASE_ARGS = ["--verbose", "--output-format", "stream-json"];
14
+
15
+ export type ClaudeOptions = {
16
+ claudeArgs?: string;
17
+ model?: string;
18
+ pathToClaudeCodeExecutable?: string;
19
+ allowedTools?: string;
20
+ disallowedTools?: string;
21
+ maxTurns?: string;
22
+ mcpConfig?: string;
23
+ systemPrompt?: string;
24
+ appendSystemPrompt?: string;
25
+ claudeEnv?: string;
26
+ fallbackModel?: string;
27
+ };
28
+
29
+ type PreparedConfig = {
30
+ claudeArgs: string[];
31
+ promptPath: string;
32
+ env: Record<string, string>;
33
+ };
34
+
35
+ export function prepareRunConfig(
36
+ promptPath: string,
37
+ options: ClaudeOptions,
38
+ ): PreparedConfig {
39
+ // Build Claude CLI arguments:
40
+ // 1. Prompt flag (always first)
41
+ // 2. User's claudeArgs (full control)
42
+ // 3. BASE_ARGS (always last, cannot be overridden)
43
+
44
+ const claudeArgs = ["-p"];
45
+
46
+ // Parse and add user's custom Claude arguments
47
+ if (options.claudeArgs?.trim()) {
48
+ const parsed = parseShellArgs(options.claudeArgs);
49
+ const customArgs = parsed.filter(
50
+ (arg): arg is string => typeof arg === "string",
51
+ );
52
+ claudeArgs.push(...customArgs);
53
+ }
54
+
55
+ // BASE_ARGS are always appended last (cannot be overridden)
56
+ claudeArgs.push(...BASE_ARGS);
57
+
58
+ const customEnv: Record<string, string> = {};
59
+
60
+ if (process.env.INPUT_ACTION_INPUTS_PRESENT) {
61
+ customEnv.GITHUB_ACTION_INPUTS = process.env.INPUT_ACTION_INPUTS_PRESENT;
62
+ }
63
+
64
+ return {
65
+ claudeArgs,
66
+ promptPath,
67
+ env: customEnv,
68
+ };
69
+ }
70
+
71
+ export async function runClaude(promptPath: string, options: ClaudeOptions) {
72
+ const config = prepareRunConfig(promptPath, options);
73
+
74
+ // Create a named pipe
75
+ try {
76
+ await unlink(PIPE_PATH);
77
+ } catch (e) {
78
+ // Ignore if file doesn't exist
79
+ }
80
+
81
+ // Create the named pipe
82
+ await execAsync(`mkfifo "${PIPE_PATH}"`);
83
+
84
+ // Log prompt file size
85
+ let promptSize = "unknown";
86
+ try {
87
+ const stats = await stat(config.promptPath);
88
+ promptSize = stats.size.toString();
89
+ } catch (e) {
90
+ // Ignore error
91
+ }
92
+
93
+ console.log(`Prompt file size: ${promptSize} bytes`);
94
+
95
+ // Log custom environment variables if any
96
+ const customEnvKeys = Object.keys(config.env).filter(
97
+ (key) => key !== "CLAUDE_ACTION_INPUTS_PRESENT",
98
+ );
99
+ if (customEnvKeys.length > 0) {
100
+ console.log(`Custom environment variables: ${customEnvKeys.join(", ")}`);
101
+ }
102
+
103
+ // Log custom arguments if any
104
+ if (options.claudeArgs && options.claudeArgs.trim() !== "") {
105
+ console.log(`Custom Claude arguments: ${options.claudeArgs}`);
106
+ }
107
+
108
+ // Output to console
109
+ console.log(`Running Claude with prompt from file: ${config.promptPath}`);
110
+ console.log(`Full command: claude ${config.claudeArgs.join(" ")}`);
111
+
112
+ // Start sending prompt to pipe in background
113
+ const catProcess = spawn("cat", [config.promptPath], {
114
+ stdio: ["ignore", "pipe", "inherit"],
115
+ });
116
+ const pipeStream = createWriteStream(PIPE_PATH);
117
+ catProcess.stdout.pipe(pipeStream);
118
+
119
+ catProcess.on("error", (error) => {
120
+ console.error("Error reading prompt file:", error);
121
+ pipeStream.destroy();
122
+ });
123
+
124
+ // Use custom executable path if provided, otherwise default to "claude"
125
+ const claudeExecutable = options.pathToClaudeCodeExecutable || "claude";
126
+
127
+ const claudeProcess = spawn(claudeExecutable, config.claudeArgs, {
128
+ stdio: ["pipe", "pipe", "inherit"],
129
+ env: {
130
+ ...process.env,
131
+ ...config.env,
132
+ },
133
+ });
134
+
135
+ // Handle Claude process errors
136
+ claudeProcess.on("error", (error) => {
137
+ console.error("Error spawning Claude process:", error);
138
+ pipeStream.destroy();
139
+ });
140
+
141
+ // Capture output for parsing execution metrics
142
+ let output = "";
143
+ claudeProcess.stdout.on("data", (data) => {
144
+ const text = data.toString();
145
+
146
+ // Try to parse as JSON and pretty print if it's on a single line
147
+ const lines = text.split("\n");
148
+ lines.forEach((line: string, index: number) => {
149
+ if (line.trim() === "") return;
150
+
151
+ try {
152
+ // Check if this line is a JSON object
153
+ const parsed = JSON.parse(line);
154
+ const prettyJson = JSON.stringify(parsed, null, 2);
155
+ process.stdout.write(prettyJson);
156
+ if (index < lines.length - 1 || text.endsWith("\n")) {
157
+ process.stdout.write("\n");
158
+ }
159
+ } catch (e) {
160
+ // Not a JSON object, print as is
161
+ process.stdout.write(line);
162
+ if (index < lines.length - 1 || text.endsWith("\n")) {
163
+ process.stdout.write("\n");
164
+ }
165
+ }
166
+ });
167
+
168
+ output += text;
169
+ });
170
+
171
+ // Handle stdout errors
172
+ claudeProcess.stdout.on("error", (error) => {
173
+ console.error("Error reading Claude stdout:", error);
174
+ });
175
+
176
+ // Pipe from named pipe to Claude
177
+ const pipeProcess = spawn("cat", [PIPE_PATH]);
178
+ pipeProcess.stdout.pipe(claudeProcess.stdin);
179
+
180
+ // Handle pipe process errors
181
+ pipeProcess.on("error", (error) => {
182
+ console.error("Error reading from named pipe:", error);
183
+ claudeProcess.kill("SIGTERM");
184
+ });
185
+
186
+ // Wait for Claude to finish
187
+ const exitCode = await new Promise<number>((resolve) => {
188
+ claudeProcess.on("close", (code) => {
189
+ resolve(code || 0);
190
+ });
191
+
192
+ claudeProcess.on("error", (error) => {
193
+ console.error("Claude process error:", error);
194
+ resolve(1);
195
+ });
196
+ });
197
+
198
+ // Clean up processes
199
+ try {
200
+ catProcess.kill("SIGTERM");
201
+ } catch (e) {
202
+ // Process may already be dead
203
+ }
204
+ try {
205
+ pipeProcess.kill("SIGTERM");
206
+ } catch (e) {
207
+ // Process may already be dead
208
+ }
209
+
210
+ // Clean up pipe file
211
+ try {
212
+ await unlink(PIPE_PATH);
213
+ } catch (e) {
214
+ // Ignore errors during cleanup
215
+ }
216
+
217
+ // Set conclusion based on exit code
218
+ if (exitCode === 0) {
219
+ // Try to process the output and save execution metrics
220
+ try {
221
+ await writeFile("output.txt", output);
222
+
223
+ // Process output.txt into JSON and save to execution file
224
+ // Increase maxBuffer from Node.js default of 1MB to 10MB to handle large Claude outputs
225
+ const { stdout: jsonOutput } = await execAsync("jq -s '.' output.txt", {
226
+ maxBuffer: 10 * 1024 * 1024,
227
+ });
228
+ await writeFile(EXECUTION_FILE, jsonOutput);
229
+
230
+ console.log(`Log saved to ${EXECUTION_FILE}`);
231
+ } catch (e) {
232
+ core.warning(`Failed to process output for execution metrics: ${e}`);
233
+ }
234
+
235
+ core.setOutput("conclusion", "success");
236
+ core.setOutput("execution_file", EXECUTION_FILE);
237
+ } else {
238
+ core.setOutput("conclusion", "failure");
239
+
240
+ // Still try to save execution file if we have output
241
+ if (output) {
242
+ try {
243
+ await writeFile("output.txt", output);
244
+ // Increase maxBuffer from Node.js default of 1MB to 10MB to handle large Claude outputs
245
+ const { stdout: jsonOutput } = await execAsync("jq -s '.' output.txt", {
246
+ maxBuffer: 10 * 1024 * 1024,
247
+ });
248
+ await writeFile(EXECUTION_FILE, jsonOutput);
249
+ core.setOutput("execution_file", EXECUTION_FILE);
250
+ } catch (e) {
251
+ // Ignore errors when processing output during failure
252
+ }
253
+ }
254
+
255
+ process.exit(exitCode);
256
+ }
257
+ }
@@ -0,0 +1,301 @@
1
+ import * as core from "@actions/core";
2
+ import { spawn } from "child_process";
3
+ import { unlink, writeFile, stat, readFile } from "fs/promises";
4
+ import { promisify } from "util";
5
+
6
+ const EXECUTION_FILE = `${process.env.RUNNER_TEMP}/vicoa-execution-output.json`;
7
+
8
+ export type VicoaOptions = {
9
+ allowedTools?: string;
10
+ disallowedTools?: string;
11
+ maxTurns?: string;
12
+ mcpConfig?: string;
13
+ systemPrompt?: string;
14
+ appendSystemPrompt?: string;
15
+ claudeEnv?: string;
16
+ fallbackModel?: string;
17
+ timeoutMinutes?: string;
18
+ model?: string;
19
+ };
20
+
21
+ type PreparedConfig = {
22
+ vicoaArgs: string[];
23
+ promptPath: string;
24
+ env: Record<string, string>;
25
+ };
26
+
27
+ function parseCustomEnvVars(claudeEnv?: string): Record<string, string> {
28
+ if (!claudeEnv || claudeEnv.trim() === "") {
29
+ return {};
30
+ }
31
+
32
+ const customEnv: Record<string, string> = {};
33
+
34
+ // Split by lines and parse each line as KEY: VALUE
35
+ const lines = claudeEnv.split("\n");
36
+
37
+ for (const line of lines) {
38
+ const trimmedLine = line.trim();
39
+ if (trimmedLine === "" || trimmedLine.startsWith("#")) {
40
+ continue; // Skip empty lines and comments
41
+ }
42
+
43
+ const colonIndex = trimmedLine.indexOf(":");
44
+ if (colonIndex === -1) {
45
+ continue; // Skip lines without colons
46
+ }
47
+
48
+ const key = trimmedLine.substring(0, colonIndex).trim();
49
+ const value = trimmedLine.substring(colonIndex + 1).trim();
50
+
51
+ if (key) {
52
+ customEnv[key] = value;
53
+ }
54
+ }
55
+
56
+ return customEnv;
57
+ }
58
+
59
+ export async function prepareRunConfig(
60
+ promptPath: string,
61
+ options: VicoaOptions,
62
+ ): Promise<PreparedConfig> {
63
+ // Build vicoa headless arguments
64
+ const vicoaArgs = ["headless"];
65
+
66
+ // Read prompt content from file to pass as --prompt argument
67
+ let promptContent = '';
68
+ try {
69
+ promptContent = await readFile(promptPath, 'utf8');
70
+ console.log(`Read prompt from file: ${promptPath} (${promptContent.length} characters)`);
71
+ } catch (e) {
72
+ console.error(`Error reading prompt file: ${e}`);
73
+ }
74
+
75
+ // Add required vicoa arguments
76
+ if (promptContent) {
77
+ vicoaArgs.push("--prompt", promptContent);
78
+ }
79
+
80
+ // Session ID from environment or generate
81
+ const sessionId = process.env.VICOA_AGENT_INSTANCE_ID || `gh-action-${Date.now()}`;
82
+ vicoaArgs.push("--session-id", sessionId);
83
+
84
+ // Agent name/type from environment
85
+ const agentType = process.env.VICOA_AGENT_TYPE || "GitHub Action";
86
+ vicoaArgs.push("--name", agentType);
87
+
88
+ // Tool configurations
89
+ if (options.allowedTools) {
90
+ vicoaArgs.push("--allowed-tools", options.allowedTools);
91
+ }
92
+ if (options.disallowedTools) {
93
+ vicoaArgs.push("--disallowed-tools", options.disallowedTools);
94
+ }
95
+
96
+ // Pass max turns as extra arg for Claude SDK within vicoa
97
+ if (options.maxTurns) {
98
+ const maxTurnsNum = parseInt(options.maxTurns, 10);
99
+ if (isNaN(maxTurnsNum) || maxTurnsNum <= 0) {
100
+ throw new Error(
101
+ `maxTurns must be a positive number, got: ${options.maxTurns}`,
102
+ );
103
+ }
104
+ // Pass as extra args for Claude SDK
105
+ vicoaArgs.push("--max-turns", options.maxTurns);
106
+ }
107
+
108
+ // Validate timeout
109
+ if (options.timeoutMinutes) {
110
+ const timeoutMinutesNum = parseInt(options.timeoutMinutes, 10);
111
+ if (isNaN(timeoutMinutesNum) || timeoutMinutesNum <= 0) {
112
+ throw new Error(
113
+ `timeoutMinutes must be a positive number, got: ${options.timeoutMinutes}`,
114
+ );
115
+ }
116
+ }
117
+
118
+ // Parse custom environment variables
119
+ const customEnv = parseCustomEnvVars(options.claudeEnv);
120
+
121
+ if (process.env.INPUT_ACTION_INPUTS_PRESENT) {
122
+ customEnv.GITHUB_ACTION_INPUTS = process.env.INPUT_ACTION_INPUTS_PRESENT;
123
+ }
124
+
125
+ return {
126
+ vicoaArgs,
127
+ promptPath,
128
+ env: customEnv,
129
+ };
130
+ }
131
+
132
+ export async function runVicoa(promptPath: string, options: VicoaOptions) {
133
+ const config = await prepareRunConfig(promptPath, options);
134
+
135
+ // Log configuration for debugging
136
+ console.log("==================================================");
137
+ console.log("Vicoa Configuration:");
138
+ console.log(`Session ID: ${process.env.VICOA_AGENT_INSTANCE_ID || 'auto-generated'}`);
139
+ console.log(`Agent Type: ${process.env.VICOA_AGENT_TYPE || 'GitHub Action'}`);
140
+ console.log(`API Key: ${process.env.VICOA_API_KEY ? 'Present' : 'Missing'}`);
141
+ console.log("==================================================");
142
+
143
+ // Get prompt size
144
+ let promptSize = "unknown";
145
+ try {
146
+ const stats = await stat(config.promptPath);
147
+ promptSize = stats.size.toString();
148
+ } catch (e) {
149
+ // Ignore error
150
+ }
151
+
152
+ console.log(`Prompt file size: ${promptSize} bytes`);
153
+
154
+ // Log custom environment variables if any
155
+ const customEnvKeys = Object.keys(config.env).filter(
156
+ (key) => key !== "GITHUB_ACTION_INPUTS",
157
+ );
158
+ if (customEnvKeys.length > 0) {
159
+ console.log(`Custom environment variables: ${customEnvKeys.join(", ")}`);
160
+ }
161
+
162
+ // Output to console
163
+ console.log(`Running Vicoa with command: vicoa ${config.vicoaArgs.join(' ')}`);
164
+
165
+ // Vicoa headless uses Claude Code under the hood, so we need to ensure
166
+ // Claude authentication is available in the environment
167
+ const vicoaEnv = {
168
+ ...process.env,
169
+ ...config.env,
170
+ // Ensure Vicoa variables are set
171
+ VICOA_API_KEY: process.env.VICOA_API_KEY,
172
+ VICOA_AGENT_INSTANCE_ID: process.env.VICOA_AGENT_INSTANCE_ID,
173
+ VICOA_AGENT_TYPE: process.env.VICOA_AGENT_TYPE,
174
+ // Pass through Claude authentication (vicoa will use these internally)
175
+ ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
176
+ CLAUDE_CODE_OAUTH_TOKEN: process.env.CLAUDE_CODE_OAUTH_TOKEN,
177
+ // Pass through cloud provider credentials if using Bedrock/Vertex
178
+ CLAUDE_CODE_USE_BEDROCK: process.env.CLAUDE_CODE_USE_BEDROCK,
179
+ CLAUDE_CODE_USE_VERTEX: process.env.CLAUDE_CODE_USE_VERTEX,
180
+ AWS_REGION: process.env.AWS_REGION,
181
+ AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID,
182
+ AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY,
183
+ AWS_SESSION_TOKEN: process.env.AWS_SESSION_TOKEN,
184
+ ANTHROPIC_BEDROCK_BASE_URL: process.env.ANTHROPIC_BEDROCK_BASE_URL,
185
+ ANTHROPIC_VERTEX_PROJECT_ID: process.env.ANTHROPIC_VERTEX_PROJECT_ID,
186
+ CLOUD_ML_REGION: process.env.CLOUD_ML_REGION,
187
+ GOOGLE_APPLICATION_CREDENTIALS: process.env.GOOGLE_APPLICATION_CREDENTIALS,
188
+ ANTHROPIC_VERTEX_BASE_URL: process.env.ANTHROPIC_VERTEX_BASE_URL,
189
+ };
190
+
191
+ const vicoaProcess = spawn("vicoa", config.vicoaArgs, {
192
+ stdio: ["inherit", "pipe", "inherit"],
193
+ env: vicoaEnv,
194
+ });
195
+
196
+ // Handle Vicoa process errors
197
+ vicoaProcess.on("error", (error) => {
198
+ console.error("Error spawning Vicoa process:", error);
199
+ console.error("Make sure vicoa is installed: pip install vicoa");
200
+ });
201
+
202
+ // Capture output for parsing execution metrics
203
+ let output = "";
204
+ vicoaProcess.stdout.on("data", (data) => {
205
+ const text = data.toString();
206
+
207
+ // Try to parse as JSON and pretty print if it's on a single line
208
+ const lines = text.split("\n");
209
+ lines.forEach((line: string, index: number) => {
210
+ if (line.trim() === "") return;
211
+
212
+ try {
213
+ // Check if this line is a JSON object
214
+ const parsed = JSON.parse(line);
215
+ const prettyJson = JSON.stringify(parsed, null, 2);
216
+ process.stdout.write(prettyJson);
217
+ if (index < lines.length - 1 || text.endsWith("\n")) {
218
+ process.stdout.write("\n");
219
+ }
220
+ } catch (e) {
221
+ // Not a JSON object, print as is
222
+ process.stdout.write(line);
223
+ if (index < lines.length - 1 || text.endsWith("\n")) {
224
+ process.stdout.write("\n");
225
+ }
226
+ }
227
+ });
228
+
229
+ output += text;
230
+ });
231
+
232
+ // Handle stdout errors
233
+ vicoaProcess.stdout.on("error", (error) => {
234
+ console.error("Error reading Vicoa stdout:", error);
235
+ });
236
+
237
+ // Wait for Vicoa to finish with timeout
238
+ let timeoutMs = 1440 * 60 * 1000; // Default 24 hours
239
+ if (options.timeoutMinutes) {
240
+ timeoutMs = parseInt(options.timeoutMinutes, 10) * 60 * 1000;
241
+ } else if (process.env.INPUT_TIMEOUT_MINUTES) {
242
+ const envTimeout = parseInt(process.env.INPUT_TIMEOUT_MINUTES, 10);
243
+ if (isNaN(envTimeout) || envTimeout <= 0) {
244
+ throw new Error(
245
+ `INPUT_TIMEOUT_MINUTES must be a positive number, got: ${process.env.INPUT_TIMEOUT_MINUTES}`,
246
+ );
247
+ }
248
+ timeoutMs = envTimeout * 60 * 1000;
249
+ }
250
+
251
+ await new Promise<void>((resolve, reject) => {
252
+ const timeout = setTimeout(() => {
253
+ vicoaProcess.kill("SIGTERM");
254
+ reject(
255
+ new Error(
256
+ `Command timed out after ${timeoutMs / 1000 / 60} minutes`,
257
+ ),
258
+ );
259
+ }, timeoutMs);
260
+
261
+ vicoaProcess.on("exit", (code) => {
262
+ clearTimeout(timeout);
263
+ if (code === 0) {
264
+ resolve();
265
+ } else {
266
+ reject(new Error(`Vicoa exited with code ${code}`));
267
+ }
268
+ });
269
+ });
270
+
271
+ // Save output to execution file
272
+ await writeFile(EXECUTION_FILE, output);
273
+
274
+ // Try to extract execution metrics from output
275
+ let executionMetrics = {
276
+ conclusion: "success",
277
+ };
278
+
279
+ try {
280
+ // Try to parse the output as JSON lines
281
+ const lines = output.split("\n");
282
+ for (const line of lines) {
283
+ if (line.trim()) {
284
+ try {
285
+ const parsed = JSON.parse(line);
286
+ if (parsed.metrics) {
287
+ executionMetrics = parsed.metrics;
288
+ }
289
+ } catch (e) {
290
+ // Not JSON, skip
291
+ }
292
+ }
293
+ }
294
+ } catch (error) {
295
+ console.error("Error parsing execution metrics:", error);
296
+ }
297
+
298
+ // Set outputs for GitHub Actions
299
+ core.setOutput("execution_file", EXECUTION_FILE);
300
+ core.setOutput("conclusion", executionMetrics.conclusion);
301
+ }
@@ -0,0 +1,68 @@
1
+ import { $ } from "bun";
2
+ import { homedir } from "os";
3
+ import { readFile } from "fs/promises";
4
+
5
+ export async function setupClaudeCodeSettings(
6
+ settingsInput?: string,
7
+ homeDir?: string,
8
+ ) {
9
+ const home = homeDir ?? homedir();
10
+ const settingsPath = `${home}/.claude/settings.json`;
11
+ console.log(`Setting up Claude settings at: ${settingsPath}`);
12
+
13
+ // Ensure .claude directory exists
14
+ console.log(`Creating .claude directory...`);
15
+ await $`mkdir -p ${home}/.claude`.quiet();
16
+
17
+ let settings: Record<string, unknown> = {};
18
+ try {
19
+ const existingSettings = await $`cat ${settingsPath}`.quiet().text();
20
+ if (existingSettings.trim()) {
21
+ settings = JSON.parse(existingSettings);
22
+ console.log(
23
+ `Found existing settings:`,
24
+ JSON.stringify(settings, null, 2),
25
+ );
26
+ } else {
27
+ console.log(`Settings file exists but is empty`);
28
+ }
29
+ } catch (e) {
30
+ console.log(`No existing settings file found, creating new one`);
31
+ }
32
+
33
+ // Handle settings input (either file path or JSON string)
34
+ if (settingsInput && settingsInput.trim()) {
35
+ console.log(`Processing settings input...`);
36
+ let inputSettings: Record<string, unknown> = {};
37
+
38
+ try {
39
+ // First try to parse as JSON
40
+ inputSettings = JSON.parse(settingsInput);
41
+ console.log(`Parsed settings input as JSON`);
42
+ } catch (e) {
43
+ // If not JSON, treat as file path
44
+ console.log(
45
+ `Settings input is not JSON, treating as file path: ${settingsInput}`,
46
+ );
47
+ try {
48
+ const fileContent = await readFile(settingsInput, "utf-8");
49
+ inputSettings = JSON.parse(fileContent);
50
+ console.log(`Successfully read and parsed settings from file`);
51
+ } catch (fileError) {
52
+ console.error(`Failed to read or parse settings file: ${fileError}`);
53
+ throw new Error(`Failed to process settings input: ${fileError}`);
54
+ }
55
+ }
56
+
57
+ // Merge input settings with existing settings
58
+ settings = { ...settings, ...inputSettings };
59
+ console.log(`Merged settings with input settings`);
60
+ }
61
+
62
+ // Always set enableAllProjectMcpServers to true
63
+ settings.enableAllProjectMcpServers = true;
64
+ console.log(`Updated settings with enableAllProjectMcpServers: true`);
65
+
66
+ await $`echo ${JSON.stringify(settings, null, 2)} > ${settingsPath}`.quiet();
67
+ console.log(`Settings saved successfully`);
68
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Validates the environment variables required for running Claude Code
3
+ * based on the selected provider (Anthropic API, AWS Bedrock, or Google Vertex AI)
4
+ */
5
+ export function validateEnvironmentVariables() {
6
+ const useBedrock = process.env.CLAUDE_CODE_USE_BEDROCK === "1";
7
+ const useVertex = process.env.CLAUDE_CODE_USE_VERTEX === "1";
8
+ const anthropicApiKey = process.env.ANTHROPIC_API_KEY;
9
+ const claudeCodeOAuthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN;
10
+
11
+ const errors: string[] = [];
12
+
13
+ if (useBedrock && useVertex) {
14
+ errors.push(
15
+ "Cannot use both Bedrock and Vertex AI simultaneously. Please set only one provider.",
16
+ );
17
+ }
18
+
19
+ if (!useBedrock && !useVertex) {
20
+ if (!anthropicApiKey && !claudeCodeOAuthToken) {
21
+ errors.push(
22
+ "Either ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN is required when using direct Anthropic API.",
23
+ );
24
+ }
25
+ } else if (useBedrock) {
26
+ const requiredBedrockVars = {
27
+ AWS_REGION: process.env.AWS_REGION,
28
+ AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID,
29
+ AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY,
30
+ };
31
+
32
+ Object.entries(requiredBedrockVars).forEach(([key, value]) => {
33
+ if (!value) {
34
+ errors.push(`${key} is required when using AWS Bedrock.`);
35
+ }
36
+ });
37
+ } else if (useVertex) {
38
+ const requiredVertexVars = {
39
+ ANTHROPIC_VERTEX_PROJECT_ID: process.env.ANTHROPIC_VERTEX_PROJECT_ID,
40
+ CLOUD_ML_REGION: process.env.CLOUD_ML_REGION,
41
+ };
42
+
43
+ Object.entries(requiredVertexVars).forEach(([key, value]) => {
44
+ if (!value) {
45
+ errors.push(`${key} is required when using Google Vertex AI.`);
46
+ }
47
+ });
48
+ }
49
+
50
+ if (errors.length > 0) {
51
+ const errorMessage = `Environment variable validation failed:\n${errors.map((e) => ` - ${e}`).join("\n")}`;
52
+ throw new Error(errorMessage);
53
+ }
54
+ }
@@ -0,0 +1,12 @@
1
+ #!/bin/bash
2
+
3
+ # Install act if not already installed
4
+ if ! command -v act &> /dev/null; then
5
+ echo "Installing act..."
6
+ brew install act
7
+ fi
8
+
9
+ # Run the test workflow locally
10
+ # You'll need to provide your ANTHROPIC_API_KEY
11
+ echo "Running action locally with act..."
12
+ act push --secret ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" -W .github/workflows/test-action.yml --container-architecture linux/amd64