@vicoa/cli 1.3.10 → 1.3.11-darwin-arm64
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.
- package/bin/_internal/81d243bd2c585b0f4821__mypyc.cpython-312-darwin.so +0 -0
- package/bin/_internal/Python +0 -0
- package/bin/_internal/Python.framework/Python +0 -0
- package/bin/_internal/Python.framework/Resources/Info.plist +30 -0
- package/bin/_internal/Python.framework/Versions/3.12/Python +0 -0
- package/bin/_internal/Python.framework/Versions/3.12/Resources/Info.plist +30 -0
- package/bin/_internal/Python.framework/Versions/Current/Python +0 -0
- package/bin/_internal/Python.framework/Versions/Current/Resources/Info.plist +30 -0
- package/bin/_internal/_cffi_backend.cpython-312-darwin.so +0 -0
- package/bin/_internal/aiofile-3.9.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/aiofile-3.9.0.dist-info/LICENCE +195 -0
- package/bin/_internal/aiofile-3.9.0.dist-info/LICENCE.md +195 -0
- package/bin/_internal/aiofile-3.9.0.dist-info/METADATA +492 -0
- package/bin/_internal/aiofile-3.9.0.dist-info/RECORD +15 -0
- package/bin/_internal/aiofile-3.9.0.dist-info/WHEEL +4 -0
- package/bin/_internal/aiohttp/_http_parser.cpython-312-darwin.so +0 -0
- package/bin/_internal/aiohttp/_http_writer.cpython-312-darwin.so +0 -0
- package/bin/_internal/aiohttp/_websocket/mask.cpython-312-darwin.so +0 -0
- package/bin/_internal/aiohttp/_websocket/reader_c.cpython-312-darwin.so +0 -0
- package/bin/_internal/attrs-26.1.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/attrs-26.1.0.dist-info/METADATA +199 -0
- package/bin/_internal/attrs-26.1.0.dist-info/RECORD +55 -0
- package/bin/_internal/attrs-26.1.0.dist-info/WHEEL +4 -0
- package/bin/_internal/attrs-26.1.0.dist-info/licenses/LICENSE +21 -0
- package/bin/_internal/base_library.zip +0 -0
- package/bin/_internal/caio/thread_aio.cpython-312-darwin.so +0 -0
- package/bin/_internal/certifi/cacert.pem +4494 -0
- package/bin/_internal/certifi/py.typed +0 -0
- package/bin/_internal/charset_normalizer/cd.cpython-312-darwin.so +0 -0
- package/bin/_internal/charset_normalizer/md.cpython-312-darwin.so +0 -0
- package/bin/_internal/click-8.3.2.dist-info/INSTALLER +1 -0
- package/bin/_internal/click-8.3.2.dist-info/METADATA +84 -0
- package/bin/_internal/click-8.3.2.dist-info/RECORD +40 -0
- package/bin/_internal/click-8.3.2.dist-info/WHEEL +4 -0
- package/bin/_internal/click-8.3.2.dist-info/licenses/LICENSE.txt +28 -0
- package/bin/_internal/cryptography/hazmat/bindings/_rust.abi3.so +0 -0
- package/bin/_internal/cryptography-46.0.7.dist-info/INSTALLER +1 -0
- package/bin/_internal/cryptography-46.0.7.dist-info/METADATA +139 -0
- package/bin/_internal/cryptography-46.0.7.dist-info/RECORD +180 -0
- package/bin/_internal/cryptography-46.0.7.dist-info/WHEEL +4 -0
- package/bin/_internal/cryptography-46.0.7.dist-info/licenses/LICENSE +3 -0
- package/bin/_internal/cryptography-46.0.7.dist-info/licenses/LICENSE.APACHE +202 -0
- package/bin/_internal/cryptography-46.0.7.dist-info/licenses/LICENSE.BSD +27 -0
- package/bin/_internal/email_validator-2.3.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/email_validator-2.3.0.dist-info/METADATA +466 -0
- package/bin/_internal/email_validator-2.3.0.dist-info/RECORD +27 -0
- package/bin/_internal/email_validator-2.3.0.dist-info/WHEEL +5 -0
- package/bin/_internal/email_validator-2.3.0.dist-info/entry_points.txt +2 -0
- package/bin/_internal/email_validator-2.3.0.dist-info/licenses/LICENSE +27 -0
- package/bin/_internal/email_validator-2.3.0.dist-info/top_level.txt +1 -0
- package/bin/_internal/frozenlist/_frozenlist.cpython-312-darwin.so +0 -0
- package/bin/_internal/importlib_metadata-8.7.1.dist-info/INSTALLER +1 -0
- package/bin/_internal/importlib_metadata-8.7.1.dist-info/METADATA +133 -0
- package/bin/_internal/importlib_metadata-8.7.1.dist-info/RECORD +33 -0
- package/bin/_internal/importlib_metadata-8.7.1.dist-info/WHEEL +5 -0
- package/bin/_internal/importlib_metadata-8.7.1.dist-info/licenses/LICENSE +73 -0
- package/bin/_internal/importlib_metadata-8.7.1.dist-info/top_level.txt +1 -0
- package/bin/_internal/integrations/cli_wrappers/IMPORTANT_USE_CASES.md +33 -0
- package/bin/_internal/integrations/github/claude-code-action/CLAUDE.md +136 -0
- package/bin/_internal/integrations/github/claude-code-action/CODE_OF_CONDUCT.md +128 -0
- package/bin/_internal/integrations/github/claude-code-action/CONTRIBUTING.md +116 -0
- package/bin/_internal/integrations/github/claude-code-action/LICENSE +21 -0
- package/bin/_internal/integrations/github/claude-code-action/README.md +53 -0
- package/bin/_internal/integrations/github/claude-code-action/ROADMAP.md +20 -0
- package/bin/_internal/integrations/github/claude-code-action/SECURITY.md +15 -0
- package/bin/_internal/integrations/github/claude-code-action/action.yml +294 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/CLAUDE.md +60 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/CODE_OF_CONDUCT.md +128 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/CONTRIBUTING.md +136 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/LICENSE +21 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/MIRROR_DISCLAIMER.md +11 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/README.md +521 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/action.yml +149 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/bun.lock +54 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/examples/issue-triage.yml +108 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/package.json +23 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/scripts/install-hooks.sh +13 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/scripts/pre-push +46 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/src/index.ts +82 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/src/prepare-prompt.ts +82 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/src/run-claude.ts +257 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/src/run-vicoa.ts +301 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/src/setup-claude-code-settings.ts +68 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/src/validate-env.ts +54 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/test-local.sh +12 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/test-mcp-local.sh +18 -0
- package/bin/_internal/integrations/github/claude-code-action/base-action/tsconfig.json +30 -0
- package/bin/_internal/integrations/github/claude-code-action/bun.lock +384 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/capabilities-and-limitations.md +33 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/cloud-providers.md +99 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/configuration.md +345 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/custom-automations.md +113 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/experimental.md +128 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/faq.md +205 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/migration-guide.md +261 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/security.md +38 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/setup.md +146 -0
- package/bin/_internal/integrations/github/claude-code-action/docs/usage.md +213 -0
- package/bin/_internal/integrations/github/claude-code-action/examples/auto-fix-ci/auto-fix-ci.yml +97 -0
- package/bin/_internal/integrations/github/claude-code-action/examples/auto-fix-ci/commands/fix-ci.md +127 -0
- package/bin/_internal/integrations/github/claude-code-action/examples/auto-fix-ci-signed/auto-fix-ci-signed.yml +97 -0
- package/bin/_internal/integrations/github/claude-code-action/examples/auto-fix-ci-signed/commands/fix-ci-signed.md +148 -0
- package/bin/_internal/integrations/github/claude-code-action/examples/issue-deduplication.yml +63 -0
- package/bin/_internal/integrations/github/claude-code-action/examples/issue-triage.yml +75 -0
- package/bin/_internal/integrations/github/claude-code-action/examples/vicoa.yml +75 -0
- package/bin/_internal/integrations/github/claude-code-action/package.json +31 -0
- package/bin/_internal/integrations/github/claude-code-action/scripts/install-hooks.sh +13 -0
- package/bin/_internal/integrations/github/claude-code-action/scripts/pre-commit +46 -0
- package/bin/_internal/integrations/github/claude-code-action/scripts/setup-network-restrictions.sh +123 -0
- package/bin/_internal/integrations/github/claude-code-action/src/create-prompt/index.ts +799 -0
- package/bin/_internal/integrations/github/claude-code-action/src/create-prompt/types.ts +102 -0
- package/bin/_internal/integrations/github/claude-code-action/src/entrypoints/collect-inputs.ts +58 -0
- package/bin/_internal/integrations/github/claude-code-action/src/entrypoints/format-turns.ts +465 -0
- package/bin/_internal/integrations/github/claude-code-action/src/entrypoints/prepare.ts +98 -0
- package/bin/_internal/integrations/github/claude-code-action/src/entrypoints/update-comment-link.ts +245 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/api/client.ts +23 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/api/config.ts +4 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/api/queries/github.ts +117 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/context.ts +277 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/data/fetcher.ts +233 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/data/formatter.ts +144 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/operations/branch-cleanup.ts +132 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/operations/branch.ts +163 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comment-logic.ts +203 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comments/common.ts +33 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comments/create-initial.ts +111 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comments/update-claude-comment.ts +70 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comments/update-with-branch.ts +57 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/operations/git-config.ts +62 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/token.ts +108 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/types.ts +98 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/utils/image-downloader.ts +246 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/utils/sanitizer.ts +100 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/validation/actor.ts +64 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/validation/permissions.ts +47 -0
- package/bin/_internal/integrations/github/claude-code-action/src/github/validation/trigger.ts +148 -0
- package/bin/_internal/integrations/github/claude-code-action/src/mcp/github-actions-server.ts +279 -0
- package/bin/_internal/integrations/github/claude-code-action/src/mcp/github-comment-server.ts +101 -0
- package/bin/_internal/integrations/github/claude-code-action/src/mcp/github-file-ops-server.ts +677 -0
- package/bin/_internal/integrations/github/claude-code-action/src/mcp/github-inline-comment-server.ts +184 -0
- package/bin/_internal/integrations/github/claude-code-action/src/mcp/install-mcp-server.ts +201 -0
- package/bin/_internal/integrations/github/claude-code-action/src/modes/agent/index.ts +152 -0
- package/bin/_internal/integrations/github/claude-code-action/src/modes/agent/parse-tools.ts +22 -0
- package/bin/_internal/integrations/github/claude-code-action/src/modes/detector.ts +66 -0
- package/bin/_internal/integrations/github/claude-code-action/src/modes/registry.ts +54 -0
- package/bin/_internal/integrations/github/claude-code-action/src/modes/tag/index.ts +187 -0
- package/bin/_internal/integrations/github/claude-code-action/src/modes/types.ts +100 -0
- package/bin/_internal/integrations/github/claude-code-action/src/prepare/index.ts +20 -0
- package/bin/_internal/integrations/github/claude-code-action/src/prepare/types.ts +20 -0
- package/bin/_internal/integrations/github/claude-code-action/src/utils/retry.ts +40 -0
- package/bin/_internal/integrations/github/claude-code-action/tsconfig.json +30 -0
- package/bin/_internal/integrations/n8n/LICENSE +21 -0
- package/bin/_internal/integrations/n8n/README.md +298 -0
- package/bin/_internal/integrations/n8n/package-lock.json +2989 -0
- package/bin/_internal/integrations/n8n/package.json +68 -0
- package/bin/_internal/integrations/n8n/src/credentials/OmnaraApi.credentials.ts +52 -0
- package/bin/_internal/integrations/n8n/src/nodes/Omnara/Omnara.node.json +35 -0
- package/bin/_internal/integrations/n8n/src/nodes/Omnara/Omnara.node.ts +304 -0
- package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/message/index.ts +37 -0
- package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/message/send.operation.ts +151 -0
- package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/message/sendAndWait.operation.ts +252 -0
- package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/session/end.operation.ts +56 -0
- package/bin/_internal/integrations/n8n/src/nodes/Omnara/actions/session/index.ts +29 -0
- package/bin/_internal/integrations/n8n/src/nodes/Omnara/vicoa.png +0 -0
- package/bin/_internal/integrations/n8n/src/utils/GenericFunctions.ts +93 -0
- package/bin/_internal/integrations/n8n/src/utils/sendAndWait/configureWaitTillDate.ts +42 -0
- package/bin/_internal/integrations/n8n/src/utils/sendAndWait/descriptions.ts +20 -0
- package/bin/_internal/integrations/n8n/src/utils/sendAndWaitWebhook.ts +72 -0
- package/bin/_internal/integrations/n8n/tsconfig.json +20 -0
- package/bin/_internal/jiter/jiter.cpython-312-darwin.so +0 -0
- package/bin/_internal/jsonschema/benchmarks/issue232/issue.json +2653 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/METADATA +170 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/RECORD +82 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/WHEEL +4 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/entry_points.txt +2 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/licenses/COPYING +19 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/metaschema.json +42 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/applicator +56 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/content +17 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/core +57 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/format +14 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data +37 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/validation +98 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/metaschema.json +58 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/applicator +48 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/content +17 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/core +51 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation +14 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion +14 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data +37 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated +15 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/validation +98 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft3/metaschema.json +172 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft4/metaschema.json +149 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft6/metaschema.json +153 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft7/metaschema.json +166 -0
- package/bin/_internal/libcrypto.3.dylib +0 -0
- package/bin/_internal/libssl.3.dylib +0 -0
- package/bin/_internal/mcp-1.27.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/mcp-1.27.0.dist-info/METADATA +230 -0
- package/bin/_internal/mcp-1.27.0.dist-info/RECORD +226 -0
- package/bin/_internal/mcp-1.27.0.dist-info/WHEEL +4 -0
- package/bin/_internal/mcp-1.27.0.dist-info/entry_points.txt +2 -0
- package/bin/_internal/mcp-1.27.0.dist-info/licenses/LICENSE +21 -0
- package/bin/_internal/multidict/_multidict.cpython-312-darwin.so +0 -0
- package/bin/_internal/opentelemetry_api-1.41.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/opentelemetry_api-1.41.0.dist-info/METADATA +45 -0
- package/bin/_internal/opentelemetry_api-1.41.0.dist-info/RECORD +81 -0
- package/bin/_internal/opentelemetry_api-1.41.0.dist-info/WHEEL +4 -0
- package/bin/_internal/opentelemetry_api-1.41.0.dist-info/entry_points.txt +15 -0
- package/bin/_internal/opentelemetry_api-1.41.0.dist-info/licenses/LICENSE +201 -0
- package/bin/_internal/propcache/_helpers_c.cpython-312-darwin.so +0 -0
- package/bin/_internal/pydantic-2.13.2.dist-info/INSTALLER +1 -0
- package/bin/_internal/pydantic-2.13.2.dist-info/METADATA +1269 -0
- package/bin/_internal/pydantic-2.13.2.dist-info/RECORD +217 -0
- package/bin/_internal/pydantic-2.13.2.dist-info/WHEEL +4 -0
- package/bin/_internal/pydantic-2.13.2.dist-info/licenses/LICENSE +21 -0
- package/bin/_internal/pydantic_core/_pydantic_core.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_asyncio.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_bisect.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_blake2.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_bz2.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_cn.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_hk.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_iso2022.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_jp.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_kr.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_tw.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_contextvars.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_csv.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_ctypes.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_datetime.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_decimal.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_hashlib.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_heapq.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_json.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_lzma.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_md5.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_multibytecodec.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_multiprocessing.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_opcode.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_pickle.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_posixshmem.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_posixsubprocess.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_queue.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_random.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_scproxy.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_sha1.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_sha2.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_sha3.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_socket.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_ssl.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_statistics.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_struct.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_uuid.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_zoneinfo.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/array.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/binascii.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/fcntl.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/grp.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/math.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/mmap.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/pyexpat.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/readline.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/resource.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/select.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/syslog.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/termios.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/unicodedata.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/zlib.cpython-312-darwin.so +0 -0
- package/bin/_internal/rpds/rpds.cpython-312-darwin.so +0 -0
- package/bin/_internal/setuptools/_vendor/jaraco/text/Lorem ipsum.txt +2 -0
- package/bin/_internal/vicoa/_bin/README.md +28 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/INSTALLER +1 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/METADATA +311 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/RECORD +11 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/REQUESTED +0 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/WHEEL +5 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/direct_url.json +1 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/entry_points.txt +2 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/licenses/LICENSE +201 -0
- package/bin/_internal/vicoa-1.3.10.dist-info/top_level.txt +3 -0
- package/bin/_internal/watchfiles/_rust_notify.cpython-312-darwin.so +0 -0
- package/bin/_internal/websockets/speedups.cpython-312-darwin.so +0 -0
- package/bin/_internal/websockets-16.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/websockets-16.0.dist-info/METADATA +179 -0
- package/bin/_internal/websockets-16.0.dist-info/RECORD +108 -0
- package/bin/_internal/websockets-16.0.dist-info/WHEEL +6 -0
- package/bin/_internal/websockets-16.0.dist-info/entry_points.txt +2 -0
- package/bin/_internal/websockets-16.0.dist-info/licenses/LICENSE +24 -0
- package/bin/_internal/websockets-16.0.dist-info/top_level.txt +1 -0
- package/bin/_internal/yaml/_yaml.cpython-312-darwin.so +0 -0
- package/bin/_internal/yarl/_quoting_c.cpython-312-darwin.so +0 -0
- package/bin/vicoa +0 -0
- package/package.json +10 -16
- package/README.md +0 -82
- 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
|