@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.
- package/bin/_internal/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/_cffi_backend.cpython-312-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/aiohttp/_http_writer.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/aiohttp/_websocket/mask.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/aiohttp/_websocket/reader_c.cpython-312-x86_64-linux-gnu.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/linux_aio.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/caio/thread_aio.cpython-312-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/charset_normalizer/md.cpython-312-x86_64-linux-gnu.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 +5 -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-x86_64-linux-gnu.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-x86_64-linux-gnu.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/libbz2.so.1.0 +0 -0
- package/bin/_internal/libcrypto.so.3 +0 -0
- package/bin/_internal/libffi.so.8 +0 -0
- package/bin/_internal/libgcc_s.so.1 +0 -0
- package/bin/_internal/liblzma.so.5 +0 -0
- package/bin/_internal/libpython3.12.so.1.0 +0 -0
- package/bin/_internal/libreadline.so.8 +0 -0
- package/bin/_internal/libssl.so.3 +0 -0
- package/bin/_internal/libstdc++.so.6 +0 -0
- package/bin/_internal/libtinfo.so.6 +0 -0
- package/bin/_internal/libuuid.so.1 +0 -0
- package/bin/_internal/libz.so.1 +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-x86_64-linux-gnu.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-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_bisect.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_blake2.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_csv.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_datetime.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_heapq.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_md5.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_opcode.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_pickle.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_posixsubprocess.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_random.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_sha1.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_sha2.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_sha3.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_socket.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_statistics.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_struct.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_uuid.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_zoneinfo.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/array.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/binascii.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/fcntl.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/grp.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/math.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/pyexpat.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/select.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/syslog.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/unicodedata.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/zlib.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/rpds/rpds.cpython-312-x86_64-linux-gnu.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-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/websockets/speedups.cpython-312-x86_64-linux-gnu.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 +7 -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-x86_64-linux-gnu.so +0 -0
- package/bin/_internal/yarl/_quoting_c.cpython-312-x86_64-linux-gnu.so +0 -0
- package/bin/vicoa +0 -0
- package/package.json +10 -16
- package/README.md +0 -82
- package/bin/vicoa.js +0 -38
package/bin/_internal/integrations/github/claude-code-action/src/github/operations/branch-cleanup.ts
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { Octokits } from "../api/client";
|
|
2
|
+
import { GITHUB_SERVER_URL } from "../api/config";
|
|
3
|
+
import { $ } from "bun";
|
|
4
|
+
|
|
5
|
+
export async function checkAndCommitOrDeleteBranch(
|
|
6
|
+
octokit: Octokits,
|
|
7
|
+
owner: string,
|
|
8
|
+
repo: string,
|
|
9
|
+
claudeBranch: string | undefined,
|
|
10
|
+
baseBranch: string,
|
|
11
|
+
useCommitSigning: boolean,
|
|
12
|
+
): Promise<{ shouldDeleteBranch: boolean; branchLink: string }> {
|
|
13
|
+
let branchLink = "";
|
|
14
|
+
let shouldDeleteBranch = false;
|
|
15
|
+
|
|
16
|
+
if (claudeBranch) {
|
|
17
|
+
// First check if the branch exists remotely
|
|
18
|
+
let branchExistsRemotely = false;
|
|
19
|
+
try {
|
|
20
|
+
await octokit.rest.repos.getBranch({
|
|
21
|
+
owner,
|
|
22
|
+
repo,
|
|
23
|
+
branch: claudeBranch,
|
|
24
|
+
});
|
|
25
|
+
branchExistsRemotely = true;
|
|
26
|
+
} catch (error: any) {
|
|
27
|
+
if (error.status === 404) {
|
|
28
|
+
console.log(`Branch ${claudeBranch} does not exist remotely`);
|
|
29
|
+
} else {
|
|
30
|
+
console.error("Error checking if branch exists:", error);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Only proceed if branch exists remotely
|
|
35
|
+
if (!branchExistsRemotely) {
|
|
36
|
+
console.log(
|
|
37
|
+
`Branch ${claudeBranch} does not exist remotely, no branch link will be added`,
|
|
38
|
+
);
|
|
39
|
+
return { shouldDeleteBranch: false, branchLink: "" };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Check if Claude made any commits to the branch
|
|
43
|
+
try {
|
|
44
|
+
const { data: comparison } =
|
|
45
|
+
await octokit.rest.repos.compareCommitsWithBasehead({
|
|
46
|
+
owner,
|
|
47
|
+
repo,
|
|
48
|
+
basehead: `${baseBranch}...${claudeBranch}`,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// If there are no commits, check for uncommitted changes if not using commit signing
|
|
52
|
+
if (comparison.total_commits === 0) {
|
|
53
|
+
if (!useCommitSigning) {
|
|
54
|
+
console.log(
|
|
55
|
+
`Branch ${claudeBranch} has no commits from Claude, checking for uncommitted changes...`,
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
// Check for uncommitted changes using git status
|
|
59
|
+
try {
|
|
60
|
+
const gitStatus = await $`git status --porcelain`.quiet();
|
|
61
|
+
const hasUncommittedChanges =
|
|
62
|
+
gitStatus.stdout.toString().trim().length > 0;
|
|
63
|
+
|
|
64
|
+
if (hasUncommittedChanges) {
|
|
65
|
+
console.log("Found uncommitted changes, committing them...");
|
|
66
|
+
|
|
67
|
+
// Add all changes
|
|
68
|
+
await $`git add -A`;
|
|
69
|
+
|
|
70
|
+
// Commit with a descriptive message
|
|
71
|
+
const runId = process.env.GITHUB_RUN_ID || "unknown";
|
|
72
|
+
const commitMessage = `Auto-commit: Save uncommitted changes from Claude\n\nRun ID: ${runId}`;
|
|
73
|
+
await $`git commit -m ${commitMessage}`;
|
|
74
|
+
|
|
75
|
+
// Push the changes
|
|
76
|
+
await $`git push origin ${claudeBranch}`;
|
|
77
|
+
|
|
78
|
+
console.log(
|
|
79
|
+
"✅ Successfully committed and pushed uncommitted changes",
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// Set branch link since we now have commits
|
|
83
|
+
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
|
|
84
|
+
branchLink = `\n[View branch](${branchUrl})`;
|
|
85
|
+
} else {
|
|
86
|
+
console.log(
|
|
87
|
+
"No uncommitted changes found, marking branch for deletion",
|
|
88
|
+
);
|
|
89
|
+
shouldDeleteBranch = true;
|
|
90
|
+
}
|
|
91
|
+
} catch (gitError) {
|
|
92
|
+
console.error("Error checking/committing changes:", gitError);
|
|
93
|
+
// If we can't check git status, assume the branch might have changes
|
|
94
|
+
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
|
|
95
|
+
branchLink = `\n[View branch](${branchUrl})`;
|
|
96
|
+
}
|
|
97
|
+
} else {
|
|
98
|
+
console.log(
|
|
99
|
+
`Branch ${claudeBranch} has no commits from Claude, will delete it`,
|
|
100
|
+
);
|
|
101
|
+
shouldDeleteBranch = true;
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
// Only add branch link if there are commits
|
|
105
|
+
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
|
|
106
|
+
branchLink = `\n[View branch](${branchUrl})`;
|
|
107
|
+
}
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error("Error comparing commits on Claude branch:", error);
|
|
110
|
+
// If we can't compare but the branch exists remotely, include the branch link
|
|
111
|
+
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${claudeBranch}`;
|
|
112
|
+
branchLink = `\n[View branch](${branchUrl})`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Delete the branch if it has no commits
|
|
117
|
+
if (shouldDeleteBranch && claudeBranch) {
|
|
118
|
+
try {
|
|
119
|
+
await octokit.rest.git.deleteRef({
|
|
120
|
+
owner,
|
|
121
|
+
repo,
|
|
122
|
+
ref: `heads/${claudeBranch}`,
|
|
123
|
+
});
|
|
124
|
+
console.log(`✅ Deleted empty branch: ${claudeBranch}`);
|
|
125
|
+
} catch (deleteError) {
|
|
126
|
+
console.error(`Failed to delete branch ${claudeBranch}:`, deleteError);
|
|
127
|
+
// Continue even if deletion fails
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return { shouldDeleteBranch, branchLink };
|
|
132
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Setup the appropriate branch based on the event type:
|
|
5
|
+
* - For PRs: Checkout the PR branch
|
|
6
|
+
* - For Issues: Create a new branch
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { $ } from "bun";
|
|
10
|
+
import * as core from "@actions/core";
|
|
11
|
+
import type { ParsedGitHubContext } from "../context";
|
|
12
|
+
import type { GitHubPullRequest } from "../types";
|
|
13
|
+
import type { Octokits } from "../api/client";
|
|
14
|
+
import type { FetchDataResult } from "../data/fetcher";
|
|
15
|
+
|
|
16
|
+
export type BranchInfo = {
|
|
17
|
+
baseBranch: string;
|
|
18
|
+
claudeBranch?: string;
|
|
19
|
+
currentBranch: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export async function setupBranch(
|
|
23
|
+
octokits: Octokits,
|
|
24
|
+
githubData: FetchDataResult,
|
|
25
|
+
context: ParsedGitHubContext,
|
|
26
|
+
): Promise<BranchInfo> {
|
|
27
|
+
const { owner, repo } = context.repository;
|
|
28
|
+
const entityNumber = context.entityNumber;
|
|
29
|
+
const { baseBranch, branchPrefix } = context.inputs;
|
|
30
|
+
const isPR = context.isPR;
|
|
31
|
+
|
|
32
|
+
if (isPR) {
|
|
33
|
+
const prData = githubData.contextData as GitHubPullRequest;
|
|
34
|
+
const prState = prData.state;
|
|
35
|
+
|
|
36
|
+
// Check if PR is closed or merged
|
|
37
|
+
if (prState === "CLOSED" || prState === "MERGED") {
|
|
38
|
+
console.log(
|
|
39
|
+
`PR #${entityNumber} is ${prState}, creating new branch from source...`,
|
|
40
|
+
);
|
|
41
|
+
// Fall through to create a new branch like we do for issues
|
|
42
|
+
} else {
|
|
43
|
+
// Handle open PR: Checkout the PR branch
|
|
44
|
+
console.log("This is an open PR, checking out PR branch...");
|
|
45
|
+
|
|
46
|
+
const branchName = prData.headRefName;
|
|
47
|
+
|
|
48
|
+
// Determine optimal fetch depth based on PR commit count, with a minimum of 20
|
|
49
|
+
const commitCount = prData.commits.totalCount;
|
|
50
|
+
const fetchDepth = Math.max(commitCount, 20);
|
|
51
|
+
|
|
52
|
+
console.log(
|
|
53
|
+
`PR #${entityNumber}: ${commitCount} commits, using fetch depth ${fetchDepth}`,
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// Execute git commands to checkout PR branch (dynamic depth based on PR size)
|
|
57
|
+
await $`git fetch origin --depth=${fetchDepth} ${branchName}`;
|
|
58
|
+
await $`git checkout ${branchName} --`;
|
|
59
|
+
|
|
60
|
+
console.log(`Successfully checked out PR branch for PR #${entityNumber}`);
|
|
61
|
+
|
|
62
|
+
// For open PRs, we need to get the base branch of the PR
|
|
63
|
+
const baseBranch = prData.baseRefName;
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
baseBranch,
|
|
67
|
+
currentBranch: branchName,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Determine source branch - use baseBranch if provided, otherwise fetch default
|
|
73
|
+
let sourceBranch: string;
|
|
74
|
+
|
|
75
|
+
if (baseBranch) {
|
|
76
|
+
// Use provided base branch for source
|
|
77
|
+
sourceBranch = baseBranch;
|
|
78
|
+
} else {
|
|
79
|
+
// No base branch provided, fetch the default branch to use as source
|
|
80
|
+
const repoResponse = await octokits.rest.repos.get({
|
|
81
|
+
owner,
|
|
82
|
+
repo,
|
|
83
|
+
});
|
|
84
|
+
sourceBranch = repoResponse.data.default_branch;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Generate branch name for either an issue or closed/merged PR
|
|
88
|
+
const entityType = isPR ? "pr" : "issue";
|
|
89
|
+
|
|
90
|
+
// Create Kubernetes-compatible timestamp: lowercase, hyphens only, shorter format
|
|
91
|
+
const now = new Date();
|
|
92
|
+
const timestamp = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}-${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}`;
|
|
93
|
+
|
|
94
|
+
// Ensure branch name is Kubernetes-compatible:
|
|
95
|
+
// - Lowercase only
|
|
96
|
+
// - Alphanumeric with hyphens
|
|
97
|
+
// - No underscores
|
|
98
|
+
// - Max 50 chars (to allow for prefixes)
|
|
99
|
+
const branchName = `${branchPrefix}${entityType}-${entityNumber}-${timestamp}`;
|
|
100
|
+
const newBranch = branchName.toLowerCase().substring(0, 50);
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
// Get the SHA of the source branch to verify it exists
|
|
104
|
+
const sourceBranchRef = await octokits.rest.git.getRef({
|
|
105
|
+
owner,
|
|
106
|
+
repo,
|
|
107
|
+
ref: `heads/${sourceBranch}`,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const currentSHA = sourceBranchRef.data.object.sha;
|
|
111
|
+
console.log(`Source branch SHA: ${currentSHA}`);
|
|
112
|
+
|
|
113
|
+
// For commit signing, defer branch creation to the file ops server
|
|
114
|
+
if (context.inputs.useCommitSigning) {
|
|
115
|
+
console.log(
|
|
116
|
+
`Branch name generated: ${newBranch} (will be created by file ops server on first commit)`,
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
// Ensure we're on the source branch
|
|
120
|
+
console.log(`Fetching and checking out source branch: ${sourceBranch}`);
|
|
121
|
+
await $`git fetch origin ${sourceBranch} --depth=1`;
|
|
122
|
+
await $`git checkout ${sourceBranch}`;
|
|
123
|
+
|
|
124
|
+
// Set outputs for GitHub Actions
|
|
125
|
+
core.setOutput("CLAUDE_BRANCH", newBranch);
|
|
126
|
+
core.setOutput("BASE_BRANCH", sourceBranch);
|
|
127
|
+
return {
|
|
128
|
+
baseBranch: sourceBranch,
|
|
129
|
+
claudeBranch: newBranch,
|
|
130
|
+
currentBranch: sourceBranch, // Stay on source branch for now
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// For non-signing case, create and checkout the branch locally only
|
|
135
|
+
console.log(
|
|
136
|
+
`Creating local branch ${newBranch} for ${entityType} #${entityNumber} from source branch: ${sourceBranch}...`,
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
// Fetch and checkout the source branch first to ensure we branch from the correct base
|
|
140
|
+
console.log(`Fetching and checking out source branch: ${sourceBranch}`);
|
|
141
|
+
await $`git fetch origin ${sourceBranch} --depth=1`;
|
|
142
|
+
await $`git checkout ${sourceBranch}`;
|
|
143
|
+
|
|
144
|
+
// Create and checkout the new branch from the source branch
|
|
145
|
+
await $`git checkout -b ${newBranch}`;
|
|
146
|
+
|
|
147
|
+
console.log(
|
|
148
|
+
`Successfully created and checked out local branch: ${newBranch}`,
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
// Set outputs for GitHub Actions
|
|
152
|
+
core.setOutput("CLAUDE_BRANCH", newBranch);
|
|
153
|
+
core.setOutput("BASE_BRANCH", sourceBranch);
|
|
154
|
+
return {
|
|
155
|
+
baseBranch: sourceBranch,
|
|
156
|
+
claudeBranch: newBranch,
|
|
157
|
+
currentBranch: newBranch,
|
|
158
|
+
};
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.error("Error in branch setup:", error);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
}
|
package/bin/_internal/integrations/github/claude-code-action/src/github/operations/comment-logic.ts
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { GITHUB_SERVER_URL } from "../api/config";
|
|
2
|
+
|
|
3
|
+
export type ExecutionDetails = {
|
|
4
|
+
cost_usd?: number;
|
|
5
|
+
duration_ms?: number;
|
|
6
|
+
duration_api_ms?: number;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type CommentUpdateInput = {
|
|
10
|
+
currentBody: string;
|
|
11
|
+
actionFailed: boolean;
|
|
12
|
+
executionDetails: ExecutionDetails | null;
|
|
13
|
+
jobUrl: string;
|
|
14
|
+
branchLink?: string;
|
|
15
|
+
prLink?: string;
|
|
16
|
+
branchName?: string;
|
|
17
|
+
triggerUsername?: string;
|
|
18
|
+
errorDetails?: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export function ensureProperlyEncodedUrl(url: string): string | null {
|
|
22
|
+
try {
|
|
23
|
+
// First, try to parse the URL to see if it's already properly encoded
|
|
24
|
+
new URL(url);
|
|
25
|
+
if (url.includes(" ")) {
|
|
26
|
+
const [baseUrl, queryString] = url.split("?");
|
|
27
|
+
if (queryString) {
|
|
28
|
+
// Parse query parameters and re-encode them properly
|
|
29
|
+
const params = new URLSearchParams();
|
|
30
|
+
const pairs = queryString.split("&");
|
|
31
|
+
for (const pair of pairs) {
|
|
32
|
+
const [key, value = ""] = pair.split("=");
|
|
33
|
+
if (key) {
|
|
34
|
+
// Decode first in case it's partially encoded, then encode properly
|
|
35
|
+
params.set(key, decodeURIComponent(value));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return `${baseUrl}?${params.toString()}`;
|
|
39
|
+
}
|
|
40
|
+
// If no query string, just encode spaces
|
|
41
|
+
return url.replace(/ /g, "%20");
|
|
42
|
+
}
|
|
43
|
+
return url;
|
|
44
|
+
} catch (e) {
|
|
45
|
+
// If URL parsing fails, try basic fixes
|
|
46
|
+
try {
|
|
47
|
+
// Replace spaces with %20
|
|
48
|
+
let fixedUrl = url.replace(/ /g, "%20");
|
|
49
|
+
|
|
50
|
+
// Ensure colons in parameter values are encoded (but not in http:// or after domain)
|
|
51
|
+
const urlParts = fixedUrl.split("?");
|
|
52
|
+
if (urlParts.length > 1 && urlParts[1]) {
|
|
53
|
+
const [baseUrl, queryString] = urlParts;
|
|
54
|
+
// Encode colons in the query string that aren't already encoded
|
|
55
|
+
const fixedQuery = queryString.replace(/([^%]|^):(?!%2F%2F)/g, "$1%3A");
|
|
56
|
+
fixedUrl = `${baseUrl}?${fixedQuery}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Try to validate the fixed URL
|
|
60
|
+
new URL(fixedUrl);
|
|
61
|
+
return fixedUrl;
|
|
62
|
+
} catch {
|
|
63
|
+
// If we still can't create a valid URL, return null
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function updateCommentBody(input: CommentUpdateInput): string {
|
|
70
|
+
const originalBody = input.currentBody;
|
|
71
|
+
const {
|
|
72
|
+
executionDetails,
|
|
73
|
+
jobUrl,
|
|
74
|
+
branchLink,
|
|
75
|
+
prLink,
|
|
76
|
+
actionFailed,
|
|
77
|
+
branchName,
|
|
78
|
+
triggerUsername,
|
|
79
|
+
errorDetails,
|
|
80
|
+
} = input;
|
|
81
|
+
|
|
82
|
+
// Extract content from the original comment body
|
|
83
|
+
// First, remove the "Claude Code is working…" or "Claude Code is working..." message
|
|
84
|
+
const workingPattern = /Claude Code is working[…\.]{1,3}(?:\s*<img[^>]*>)?/i;
|
|
85
|
+
let bodyContent = originalBody.replace(workingPattern, "").trim();
|
|
86
|
+
|
|
87
|
+
// Check if there's a PR link in the content
|
|
88
|
+
let prLinkFromContent = "";
|
|
89
|
+
|
|
90
|
+
// Match the entire markdown link structure
|
|
91
|
+
const prLinkPattern = /\[Create .* PR\]\((.*)\)$/m;
|
|
92
|
+
const prLinkMatch = bodyContent.match(prLinkPattern);
|
|
93
|
+
|
|
94
|
+
if (prLinkMatch && prLinkMatch[1]) {
|
|
95
|
+
const encodedUrl = ensureProperlyEncodedUrl(prLinkMatch[1]);
|
|
96
|
+
if (encodedUrl) {
|
|
97
|
+
prLinkFromContent = encodedUrl;
|
|
98
|
+
// Remove the PR link from the content
|
|
99
|
+
bodyContent = bodyContent.replace(prLinkMatch[0], "").trim();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Calculate duration string if available
|
|
104
|
+
let durationStr = "";
|
|
105
|
+
if (executionDetails?.duration_ms !== undefined) {
|
|
106
|
+
const totalSeconds = Math.round(executionDetails.duration_ms / 1000);
|
|
107
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
108
|
+
const seconds = totalSeconds % 60;
|
|
109
|
+
durationStr = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Build the header
|
|
113
|
+
let header = "";
|
|
114
|
+
|
|
115
|
+
if (actionFailed) {
|
|
116
|
+
header = "**Claude encountered an error";
|
|
117
|
+
if (durationStr) {
|
|
118
|
+
header += ` after ${durationStr}`;
|
|
119
|
+
}
|
|
120
|
+
header += "**";
|
|
121
|
+
} else {
|
|
122
|
+
// Get the username from triggerUsername or extract from content
|
|
123
|
+
const usernameMatch = bodyContent.match(/@([a-zA-Z0-9-]+)/);
|
|
124
|
+
const username =
|
|
125
|
+
triggerUsername || (usernameMatch ? usernameMatch[1] : "user");
|
|
126
|
+
|
|
127
|
+
header = `**Claude finished @${username}'s task`;
|
|
128
|
+
if (durationStr) {
|
|
129
|
+
header += ` in ${durationStr}`;
|
|
130
|
+
}
|
|
131
|
+
header += "**";
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Add links section
|
|
135
|
+
let links = ` —— [View job](${jobUrl})`;
|
|
136
|
+
|
|
137
|
+
// Add branch name with link
|
|
138
|
+
if (branchName || branchLink) {
|
|
139
|
+
let finalBranchName = branchName;
|
|
140
|
+
let branchUrl = "";
|
|
141
|
+
|
|
142
|
+
if (branchLink) {
|
|
143
|
+
// Extract the branch URL from the link
|
|
144
|
+
const urlMatch = branchLink.match(/\((https:\/\/.*)\)/);
|
|
145
|
+
if (urlMatch && urlMatch[1]) {
|
|
146
|
+
branchUrl = urlMatch[1];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Extract branch name from link if not provided
|
|
150
|
+
if (!finalBranchName) {
|
|
151
|
+
const branchNameMatch = branchLink.match(/tree\/([^"'\)]+)/);
|
|
152
|
+
if (branchNameMatch) {
|
|
153
|
+
finalBranchName = branchNameMatch[1];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// If we don't have a URL yet but have a branch name, construct it
|
|
159
|
+
if (!branchUrl && finalBranchName) {
|
|
160
|
+
// Extract owner/repo from jobUrl
|
|
161
|
+
const repoMatch = jobUrl.match(/github\.com\/([^\/]+)\/([^\/]+)\//);
|
|
162
|
+
if (repoMatch) {
|
|
163
|
+
branchUrl = `${GITHUB_SERVER_URL}/${repoMatch[1]}/${repoMatch[2]}/tree/${finalBranchName}`;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (finalBranchName && branchUrl) {
|
|
168
|
+
links += ` • [\`${finalBranchName}\`](${branchUrl})`;
|
|
169
|
+
} else if (finalBranchName) {
|
|
170
|
+
links += ` • \`${finalBranchName}\``;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Add PR link (either from content or provided)
|
|
175
|
+
const prUrl =
|
|
176
|
+
prLinkFromContent || (prLink ? prLink.match(/\(([^)]+)\)/)?.[1] : "");
|
|
177
|
+
if (prUrl) {
|
|
178
|
+
links += ` • [Create PR ➔](${prUrl})`;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Build the new body with blank line between header and separator
|
|
182
|
+
let newBody = `${header}${links}`;
|
|
183
|
+
|
|
184
|
+
// Add error details if available
|
|
185
|
+
if (actionFailed && errorDetails) {
|
|
186
|
+
newBody += `\n\n\`\`\`\n${errorDetails}\n\`\`\``;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
newBody += `\n\n---\n`;
|
|
190
|
+
|
|
191
|
+
// Clean up the body content
|
|
192
|
+
// Remove any existing View job run, branch links from the bottom
|
|
193
|
+
bodyContent = bodyContent.replace(/\n?\[View job run\]\([^\)]+\)/g, "");
|
|
194
|
+
bodyContent = bodyContent.replace(/\n?\[View branch\]\([^\)]+\)/g, "");
|
|
195
|
+
|
|
196
|
+
// Remove any existing duration info at the bottom
|
|
197
|
+
bodyContent = bodyContent.replace(/\n*---\n*Duration: [0-9]+m? [0-9]+s/g, "");
|
|
198
|
+
|
|
199
|
+
// Add the cleaned body content
|
|
200
|
+
newBody += bodyContent;
|
|
201
|
+
|
|
202
|
+
return newBody.trim();
|
|
203
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { GITHUB_SERVER_URL } from "../../api/config";
|
|
2
|
+
|
|
3
|
+
export const SPINNER_HTML =
|
|
4
|
+
'<img src="https://github.com/user-attachments/assets/5ac382c7-e004-429b-8e35-7feb3e8f9c6f" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" />';
|
|
5
|
+
|
|
6
|
+
export function createJobRunLink(
|
|
7
|
+
owner: string,
|
|
8
|
+
repo: string,
|
|
9
|
+
runId: string,
|
|
10
|
+
): string {
|
|
11
|
+
const jobRunUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/actions/runs/${runId}`;
|
|
12
|
+
return `[View job run](${jobRunUrl})`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function createBranchLink(
|
|
16
|
+
owner: string,
|
|
17
|
+
repo: string,
|
|
18
|
+
branchName: string,
|
|
19
|
+
): string {
|
|
20
|
+
const branchUrl = `${GITHUB_SERVER_URL}/${owner}/${repo}/tree/${branchName}`;
|
|
21
|
+
return `\n[View branch](${branchUrl})`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function createCommentBody(
|
|
25
|
+
jobRunLink: string,
|
|
26
|
+
branchLink: string = "",
|
|
27
|
+
): string {
|
|
28
|
+
return `Claude Code is working… ${SPINNER_HTML}
|
|
29
|
+
|
|
30
|
+
I'll analyze this and get back to you.
|
|
31
|
+
|
|
32
|
+
${jobRunLink}${branchLink}`;
|
|
33
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Create the initial tracking comment when Claude Code starts working
|
|
5
|
+
* This comment shows the working status and includes a link to the job run
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { appendFileSync } from "fs";
|
|
9
|
+
import { createJobRunLink, createCommentBody } from "./common";
|
|
10
|
+
import {
|
|
11
|
+
isPullRequestReviewCommentEvent,
|
|
12
|
+
isPullRequestEvent,
|
|
13
|
+
type ParsedGitHubContext,
|
|
14
|
+
} from "../../context";
|
|
15
|
+
import type { Octokit } from "@octokit/rest";
|
|
16
|
+
|
|
17
|
+
const CLAUDE_APP_BOT_ID = 209825114;
|
|
18
|
+
|
|
19
|
+
export async function createInitialComment(
|
|
20
|
+
octokit: Octokit,
|
|
21
|
+
context: ParsedGitHubContext,
|
|
22
|
+
) {
|
|
23
|
+
const { owner, repo } = context.repository;
|
|
24
|
+
|
|
25
|
+
const jobRunLink = createJobRunLink(owner, repo, context.runId);
|
|
26
|
+
const initialBody = createCommentBody(jobRunLink);
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
let response;
|
|
30
|
+
|
|
31
|
+
if (
|
|
32
|
+
context.inputs.useStickyComment &&
|
|
33
|
+
context.isPR &&
|
|
34
|
+
isPullRequestEvent(context)
|
|
35
|
+
) {
|
|
36
|
+
const comments = await octokit.rest.issues.listComments({
|
|
37
|
+
owner,
|
|
38
|
+
repo,
|
|
39
|
+
issue_number: context.entityNumber,
|
|
40
|
+
});
|
|
41
|
+
const existingComment = comments.data.find((comment) => {
|
|
42
|
+
const idMatch = comment.user?.id === CLAUDE_APP_BOT_ID;
|
|
43
|
+
const botNameMatch =
|
|
44
|
+
comment.user?.type === "Bot" &&
|
|
45
|
+
comment.user?.login.toLowerCase().includes("claude");
|
|
46
|
+
const bodyMatch = comment.body === initialBody;
|
|
47
|
+
|
|
48
|
+
return idMatch || botNameMatch || bodyMatch;
|
|
49
|
+
});
|
|
50
|
+
if (existingComment) {
|
|
51
|
+
response = await octokit.rest.issues.updateComment({
|
|
52
|
+
owner,
|
|
53
|
+
repo,
|
|
54
|
+
comment_id: existingComment.id,
|
|
55
|
+
body: initialBody,
|
|
56
|
+
});
|
|
57
|
+
} else {
|
|
58
|
+
// Create new comment if no existing one found
|
|
59
|
+
response = await octokit.rest.issues.createComment({
|
|
60
|
+
owner,
|
|
61
|
+
repo,
|
|
62
|
+
issue_number: context.entityNumber,
|
|
63
|
+
body: initialBody,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
} else if (isPullRequestReviewCommentEvent(context)) {
|
|
67
|
+
// Only use createReplyForReviewComment if it's a PR review comment AND we have a comment_id
|
|
68
|
+
response = await octokit.rest.pulls.createReplyForReviewComment({
|
|
69
|
+
owner,
|
|
70
|
+
repo,
|
|
71
|
+
pull_number: context.entityNumber,
|
|
72
|
+
comment_id: context.payload.comment.id,
|
|
73
|
+
body: initialBody,
|
|
74
|
+
});
|
|
75
|
+
} else {
|
|
76
|
+
// For all other cases (issues, issue comments, or missing comment_id)
|
|
77
|
+
response = await octokit.rest.issues.createComment({
|
|
78
|
+
owner,
|
|
79
|
+
repo,
|
|
80
|
+
issue_number: context.entityNumber,
|
|
81
|
+
body: initialBody,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Output the comment ID for downstream steps using GITHUB_OUTPUT
|
|
86
|
+
const githubOutput = process.env.GITHUB_OUTPUT!;
|
|
87
|
+
appendFileSync(githubOutput, `claude_comment_id=${response.data.id}\n`);
|
|
88
|
+
console.log(`✅ Created initial comment with ID: ${response.data.id}`);
|
|
89
|
+
return response.data;
|
|
90
|
+
} catch (error) {
|
|
91
|
+
console.error("Error in initial comment:", error);
|
|
92
|
+
|
|
93
|
+
// Always fall back to regular issue comment if anything fails
|
|
94
|
+
try {
|
|
95
|
+
const response = await octokit.rest.issues.createComment({
|
|
96
|
+
owner,
|
|
97
|
+
repo,
|
|
98
|
+
issue_number: context.entityNumber,
|
|
99
|
+
body: initialBody,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const githubOutput = process.env.GITHUB_OUTPUT!;
|
|
103
|
+
appendFileSync(githubOutput, `claude_comment_id=${response.data.id}\n`);
|
|
104
|
+
console.log(`✅ Created fallback comment with ID: ${response.data.id}`);
|
|
105
|
+
return response.data;
|
|
106
|
+
} catch (fallbackError) {
|
|
107
|
+
console.error("Error creating fallback comment:", fallbackError);
|
|
108
|
+
throw fallbackError;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|