From d119bad82251fc3a3de007b52bef248d800a4e02 Mon Sep 17 00:00:00 2001 From: Efra Espada Date: Tue, 15 Sep 2026 23:20:52 +0200 Subject: [PATCH 1/2] codex-remove-deprecated-image-configuration: Remove decorative image configuration --- README.md | 2 +- _agent/docs/architecture.md | 4 +- action.yml | 72 ---- build/cli/index.js | 357 +---------------- build/github_action/index.js | 365 +----------------- docs/configuration.mdx | 16 +- docs/development/architecture.mdx | 4 +- docs/features.mdx | 4 +- docs/index.mdx | 2 +- docs/issues/configuration.mdx | 39 -- docs/issues/index.mdx | 2 +- docs/issues/notifications-and-auto-close.mdx | 2 +- docs/issues/type/bugfix.mdx | 5 +- docs/issues/type/chore.mdx | 5 +- docs/issues/type/docs.mdx | 5 +- docs/issues/type/feature.mdx | 5 +- docs/issues/type/hotfix.mdx | 5 +- docs/issues/type/release.mdx | 5 +- docs/pull-requests/capabilities.mdx | 4 +- docs/pull-requests/configuration.mdx | 13 - docs/pull-requests/examples.mdx | 16 - docs/pull-requests/index.mdx | 4 +- docs/pull-requests/workflow-setup.mdx | 2 +- package.json | 2 - pnpm-lock.yaml | 16 - specs/configurable-release-orchestration.md | 5 +- ...tic-github-publication-and-notification.md | 86 ++--- .../__tests__/configuration_builders.test.ts | 21 +- .../github_action_completion.test.ts | 18 - .../image_configuration_builder.test.ts | 19 - src/actions/__tests__/local_action.test.ts | 22 -- src/actions/configuration_builders.ts | 49 --- src/actions/default_image_config.ts | 175 --------- src/actions/github_action_execution.ts | 5 +- src/actions/github_action_image_inputs.ts | 7 - src/actions/image_configuration_builder.ts | 72 ---- .../local_action_configuration_sections.ts | 2 - src/actions/local_action_execution.ts | 12 +- .../__tests__/architecture_boundaries.test.ts | 1 - src/application/contracts/input_keys.ts | 26 -- .../__tests__/commit_use_case.test.ts | 19 +- .../__tests__/issue_comment_use_case.test.ts | 1 - ...ll_request_review_comment_use_case.test.ts | 1 - .../push_single_action_contexts.test.ts | 44 +-- .../__tests__/single_action_use_case.test.ts | 8 +- .../__tests__/initial_setup_use_case.test.ts | 1 - .../usecases/push_single_action_contexts.ts | 46 +-- ...otify_new_commit_on_issue_use_case.test.ts | 13 +- ...ared_capability_context_projection.test.ts | 23 -- .../steps/common/publish_resume_workflow.ts | 2 +- src/data/model/__tests__/execution.test.ts | 33 -- src/data/model/execution.ts | 3 - src/data/model/execution_components.ts | 2 - src/data/model/images.ts | 80 ---- .../validate_workflow_contract.test.ts | 13 +- src/utils/__tests__/list_utils.test.ts | 38 -- src/utils/list_utils.ts | 19 - 57 files changed, 84 insertions(+), 1738 deletions(-) delete mode 100644 src/actions/__tests__/image_configuration_builder.test.ts delete mode 100644 src/actions/default_image_config.ts delete mode 100644 src/actions/github_action_image_inputs.ts delete mode 100644 src/actions/image_configuration_builder.ts delete mode 100644 src/data/model/images.ts delete mode 100644 src/utils/__tests__/list_utils.test.ts delete mode 100644 src/utils/list_utils.ts diff --git a/README.md b/README.md index ebadf3d75..5b4a5eb62 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Full documentation: **[docs.page/vypdev/copilot](https://docs.page/vypdev/copilo | [How to use](https://docs.page/vypdev/copilot/how-to-use) | Step-by-step setup: PAT, `copilot setup`, workflows | | [Features & capabilities](https://docs.page/vypdev/copilot/features) | Workflow triggers, single actions, agent execution, and concurrency | | [Authentication](https://docs.page/vypdev/copilot/authentication) | PAT setup, permissions, token best practices | -| [Configuration](https://docs.page/vypdev/copilot/configuration) | All inputs: branches, labels, projects, images, etc. | +| [Configuration](https://docs.page/vypdev/copilot/configuration) | All inputs: branches, labels, projects, locale, agents, and more | | [Release orchestration](https://docs.page/vypdev/copilot/issues/deployment-orchestration) | Production-first release/hotfix flow, npm OIDC, reconciliation, and recovery | | [Agents](https://docs.page/vypdev/copilot/agents) | Runtime, model, CLI, policy, and failure behavior | | [Security & Operations](https://docs.page/vypdev/copilot/security-operations) | Credentials, trust boundaries, provisioning, verification, upgrades, and rollback | diff --git a/_agent/docs/architecture.md b/_agent/docs/architecture.md index d78e10013..e953ec445 100644 --- a/_agent/docs/architecture.md +++ b/_agent/docs/architecture.md @@ -60,8 +60,8 @@ These lifecycles remain independent and share only provider-neutral contracts. that their capability needs. - Setup configuration is split into focused defaults, plan, validation, and storage policies. Resource provisioning is isolated from setup orchestration. -- Input keys, Bugbot constants, workflow statuses, image defaults, and CLI - errors are owned by their consuming layer instead of a global constants file. +- Input keys, Bugbot constants, workflow statuses, and CLI errors are owned by + their consuming layer instead of a global constants file. - Architecture tests verify cycle freedom, import resolution, pure-core isolation, application outer-layer isolation, and composition boundaries. diff --git a/action.yml b/action.yml index a8cae5db4..b97f900fb 100644 --- a/action.yml +++ b/action.yml @@ -342,78 +342,6 @@ inputs: release-tree: description: "Naming convention for release branches." default: "release" - images-on-issue: - description: "Deprecated compatibility input. Semantic issue messages do not include decorative images." - default: "false" - images-on-pull-request: - description: "Deprecated compatibility input. Semantic pull request messages do not include decorative images." - default: "false" - images-on-commit: - description: "Deprecated compatibility input. Push events do not include decorative images." - default: "false" - images-issue-automatic: - description: "Deprecated issue image URL pool retained for input compatibility." - default: "" - images-issue-feature: - description: "Deprecated issue image URL pool retained for input compatibility." - default: "" - images-issue-bugfix: - description: "Deprecated issue image URL pool retained for input compatibility." - default: "" - images-issue-docs: - description: "Deprecated issue image URL pool retained for input compatibility." - default: "" - images-issue-chore: - description: "Deprecated issue image URL pool retained for input compatibility." - default: "" - images-issue-hotfix: - description: "Deprecated issue image URL pool retained for input compatibility." - default: "" - images-issue-release: - description: "Deprecated issue image URL pool retained for input compatibility." - default: "" - images-pull-request-automatic: - description: "Deprecated pull request image URL pool retained for input compatibility." - default: "" - images-pull-request-feature: - description: "Deprecated pull request image URL pool retained for input compatibility." - default: "" - images-pull-request-bugfix: - description: "Deprecated pull request image URL pool retained for input compatibility." - default: "" - images-pull-request-docs: - description: "Deprecated pull request image URL pool retained for input compatibility." - default: "" - images-pull-request-chore: - description: "Deprecated pull request image URL pool retained for input compatibility." - default: "" - images-pull-request-hotfix: - description: "Deprecated pull request image URL pool retained for input compatibility." - default: "" - images-pull-request-release: - description: "Deprecated pull request image URL pool retained for input compatibility." - default: "" - images-commit-feature: - description: "Deprecated commit image URL pool retained for input compatibility." - default: "" - images-commit-bugfix: - description: "Deprecated commit image URL pool retained for input compatibility." - default: "" - images-commit-release: - description: "Deprecated commit image URL pool retained for input compatibility." - default: "" - images-commit-automatic: - description: "Deprecated commit image URL pool retained for input compatibility." - default: "" - images-commit-docs: - description: "Deprecated commit image URL pool retained for input compatibility." - default: "" - images-commit-chore: - description: "Deprecated commit image URL pool retained for input compatibility." - default: "" - images-commit-hotfix: - description: "Deprecated commit image URL pool retained for input compatibility." - default: "" commit-prefix-transforms: description: "List of transformations to apply sequentially for commit prefix generation. Options: replace-slash, replace-all, lowercase, uppercase, kebab-case, snake-case, camel-case, trim, remove-numbers, clean-dashes, etc." default: "replace-slash" diff --git a/build/cli/index.js b/build/cli/index.js index dee7a087b..9be5bd7f7 100755 --- a/build/cli/index.js +++ b/build/cli/index.js @@ -37702,10 +37702,8 @@ exports.buildEmoji = buildEmoji; exports.buildTokens = buildTokens; exports.buildLabels = buildLabels; exports.buildIssueTypes = buildIssueTypes; -exports.buildImages = buildImages; const emoji_1 = __nccwpck_require__(24146); const issue_1 = __nccwpck_require__(46760); -const images_1 = __nccwpck_require__(76625); const issue_types_1 = __nccwpck_require__(27357); const labels_1 = __nccwpck_require__(79463); const locale_1 = __nccwpck_require__(9832); @@ -37740,195 +37738,6 @@ function buildLabels(values) { function buildIssueTypes(values) { return new issue_types_1.IssueTypes(values.task.name, values.task.description, values.task.color, values.bug.name, values.bug.description, values.bug.color, values.feature.name, values.feature.description, values.feature.color, values.documentation.name, values.documentation.description, values.documentation.color, values.maintenance.name, values.maintenance.description, values.maintenance.color, values.hotfix.name, values.hotfix.description, values.hotfix.color, values.release.name, values.release.description, values.release.color, values.question.name, values.question.description, values.question.color, values.help.name, values.help.description, values.help.color); } -function buildImages(values) { - return new images_1.Images(values.onIssue, values.onPullRequest, values.onCommit, values.issue.automatic, values.issue.feature, values.issue.bugfix, values.issue.docs, values.issue.chore, values.issue.release, values.issue.hotfix, values.pullRequest.automatic, values.pullRequest.feature, values.pullRequest.bugfix, values.pullRequest.release, values.pullRequest.hotfix, values.pullRequest.docs, values.pullRequest.chore, values.commit.automatic, values.commit.feature, values.commit.bugfix, values.commit.release, values.commit.hotfix, values.commit.docs, values.commit.chore); -} - - -/***/ }), - -/***/ 14387: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DEFAULT_IMAGE_CONFIG = void 0; -/** Default illustration URLs used when an action does not receive custom images. */ -exports.DEFAULT_IMAGE_CONFIG = { - issue: { - automatic: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzRsNGFicndqMXgzMTVwdnhpeXNyZGsydXVxamV4eGxndWhna291OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ktcUyw6mBlMVa/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjkyeWVubngzM28xODFrbXZ4Nng3Y2hubmM4cXJqNGpic3Bheml0NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/M11UVCRrc0LUk/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenQwNDJmZnZraDBzNXBoNjUwZjEzMzFlanMxcHVodmF4b3l3bDl2biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/zrdUjl6N99nLq/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp" - ], - feature: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYmc4YWplZWs0Y2c3ZXNtbGpwZnQzdWpncmNjNXpodjg3MHdtbnJ5NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OMK7LRBedcnhm/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHBrYXpmd2poeGU5cWswbjRqNmJlZ2U2dWc0ejVpY3RpcXVuYTY3dSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/llKJGxQ1ESmac/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMnFleXV0MXZteGN6c2s2b3R3ZGc2cWY1aXB0Y3ZzNmpvZHhyNDVmNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10FwycrnAkpshW/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExcHo0MjIzaGIycTRmeWFwZmp6bGExczJicXcyZTQxemsxaTY1b3V1NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QKkV58ufpV4ksJ1Okh/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExazc3OWszenA5c2FlemE3a25oNnlmZDBra3liMWRqMW82NzM2b2FveCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xPGkOAdiIO3Is/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3liaGF2NzI3bzM1YjRmdHFsaGdyenp4b3o3M3dqM3F0bGN5MHZtNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/npUpB306c3EStRK6qP/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExZWh6d3Nld3E0MTF1eTk2YXFibnI3MTBhbGtpamJiemRwejl3YmkzMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/gU25raLP4pUu4/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp" - ], - hotfix: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExd2R0cjNxbXBjZjRjNmg4NmN3MGlhazVkNHJsaDkxMHZkY2hweGRtZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/pCU4bC7kC6sxy/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenkyZTc3aDlweWl0MnI0cXJsZGptY3g0bzE2NTY1aWMyaHd4Y201ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dbtDDSvWErdf2/giphy.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExM25ndGd2d3Uya3g3dnlnenJ1bjh0Y2NtNHdwZHY3Mjh2NnBmZDJpbyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2xF8gHUf085aNyyAQR/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjU3bHdsc3FtamlyazBlbWppNHc3MTV3MW4xdHd2cWo4b2tzbTkwcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1EghTrigJJhq8/200.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp" - ], - release: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2NxcHEzam92enRtd29xc21pMHhmbHozMWljamF1cmt4cjhwZTI0ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/PApUm1HPVYlDNLoMmr/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNXU4dnhwOWVqZzc4NXVsdTY3c2I4Mm9lOHF1c253MDJya25zNXU0ZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dxn6fRlTIShoeBr69N/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExbXN2bjJob3pxazE2NDJhbGE3ZWY5d2dzbDM4czgwZnA4ejlxY3ZqeCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/9D37RaHngWP7ZmmsEt/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExZnI0YTM2N2hwamd2dXYwNmN2MjRpYXIyN203cnNpbW13YjNhZGRhdyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LYWPXVUNz30ze/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdW1jZ3F4ZGRwMWkyc3ZocHJ3aXhyb2FuZGppcnMyMWtsYXpjbDY2ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tXLpxypfSXvUc/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHRianpoOW51MzZ4Yjk3MmNpbmdseTJlb3o3dWVpYzJpazc5ZHNoayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/b85mPT4Usz7fq/giphy.gif", - ], - docs: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGRpZHJqYzRvZ25xcjR3ZXcwbzVudXF2Z2hsaHoyc2g1ZjZuam81YiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/eDArHBLT4aATKEKtCd/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2NubXR1b2M1dDQ2Z2UxYmk5bzltbHdudWI1emVzOGFlbDNsOGU1bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/wpgYasZ0tBrP4lCgS3/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmEyNzc3M2V0anp4d2JtOTJuMTZ2dXNnMmEyN3A4MmE0ZGpiaDhnNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orifaQEOagjYJ1EXe/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZjUyenc2eG5pZ3NjYzcyZXg2dDFndm5qZHRqMHk5amNoYjhhNnNvZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/7E8lI6TkLrvvAcPXso/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExaWFxcXZ3MTMxM3Bjd2IwNG43ZDJjdndreXNmdTVvZ2g3Z2Q4NjczMCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3tJdi9wQQ10BD2H47g/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFrejZmaHQ2Z2o1Y3B2MDl6cmU5bzNybG84eXFrYjBjZjV0dGFpeSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fsXOS3oBboiYf6fSsY/giphy.gif", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHdhOHRianU1YmtrNHE0c2R2M2I2MTBzNnZhdnBrMW5ueG02eHF6OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieOEBYMAwTClHqM/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFtNXY0ZXdmdGxkdno2Nm5odGk3Nzd3aTRuYnJtbDA4MXIxdHFhdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10zsjaH4g0GgmY/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZG1sNXB6eTZvdDNtNzJwNXVxenNjendwaGgxb2xzNWI1dGNpdTVmZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NHHYRm7mAUQ6Y/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHd4bDJrc216YWpicDQ5emczdWF3bTk0dXYzeGQ4ajg2a3IyYjV6diZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/FHEjBpiqMwSuA/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExM3d5b2U1Z3Jic3AxY2llYjQwNW5wODFpNWp5NHY0dGV5Z2cxdThkdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/kLZNLNqUZ6bC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTNpZ2w0c3NrMmc0cmZobTd2eTM3YTRlM2lnbWpoZDUzNnRjdnNmZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NV4cSrRYXXwfUcYnua/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmFzZHNuODg0dDRheGt0aGU2bjVvd2xiNDI1bWFmYTVsbHJ2eHI2dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XaAbmtzzz35IgW3Ntn/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWM2OHkzYmNkajZxa204Njg0bmQzaWp1M3NobnJjbWxyYWJrbDNnciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OiwOPq0fFqqyainyMu/giphy.gif", - ], - }, - pullRequest: { - automatic: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzRsNGFicndqMXgzMTVwdnhpeXNyZGsydXVxamV4eGxndWhna291OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ktcUyw6mBlMVa/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjkyeWVubngzM28xODFrbXZ4Nng3Y2hubmM4cXJqNGpic3Bheml0NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/M11UVCRrc0LUk/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenQwNDJmZnZraDBzNXBoNjUwZjEzMzFlanMxcHVodmF4b3l3bDl2biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/zrdUjl6N99nLq/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - ], - feature: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYmc4YWplZWs0Y2c3ZXNtbGpwZnQzdWpncmNjNXpodjg3MHdtbnJ5NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OMK7LRBedcnhm/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHBrYXpmd2poeGU5cWswbjRqNmJlZ2U2dWc0ejVpY3RpcXVuYTY3dSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/llKJGxQ1ESmac/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMnFleXV0MXZteGN6c2s2b3R3ZGc2cWY1aXB0Y3ZzNmpvZHhyNDVmNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10FwycrnAkpshW/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExcHo0MjIzaGIycTRmeWFwZmp6bGExczJicXcyZTQxemsxaTY1b3V1NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QKkV58ufpV4ksJ1Okh/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExazc3OWszenA5c2FlemE3a25oNnlmZDBra3liMWRqMW82NzM2b2FveCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xPGkOAdiIO3Is/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3liaGF2NzI3bzM1YjRmdHFsaGdyenp4b3o3M3dqM3F0bGN5MHZtNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/npUpB306c3EStRK6qP/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExZWh6d3Nld3E0MTF1eTk2YXFibnI3MTBhbGtpamJiemRwejl3YmkzMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/gU25raLP4pUu4/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp", - ], - hotfix: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExd2R0cjNxbXBjZjRjNmg4NmN3MGlhazVkNHJsaDkxMHZkY2hweGRtZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/pCU4bC7kC6sxy/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenkyZTc3aDlweWl0MnI0cXJsZGptY3g0bzE2NTY1aWMyaHd4Y201ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dbtDDSvWErdf2/giphy.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExM25ndGd2d3Uya3g3dnlnenJ1bjh0Y2NtNHdwZHY3Mjh2NnBmZDJpbyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2xF8gHUf085aNyyAQR/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjU3bHdsc3FtamlyazBlbWppNHc3MTV3MW4xdHd2cWo4b2tzbTkwcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1EghTrigJJhq8/200.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp", - ], - release: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2NxcHEzam92enRtd29xc21pMHhmbHozMWljamF1cmt4cjhwZTI0ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/PApUm1HPVYlDNLoMmr/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNXU4dnhwOWVqZzc4NXVsdTY3c2I4Mm9lOHF1c253MDJya25zNXU0ZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dxn6fRlTIShoeBr69N/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExbXN2bjJob3pxazE2NDJhbGE3ZWY5d2dzbDM4czgwZnA4ejlxY3ZqeCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/9D37RaHngWP7ZmmsEt/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExZnI0YTM2N2hwamd2dXYwNmN2MjRpYXIyN203cnNpbW13YjNhZGRhdyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LYWPXVUNz30ze/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdW1jZ3F4ZGRwMWkyc3ZocHJ3aXhyb2FuZGppcnMyMWtsYXpjbDY2ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tXLpxypfSXvUc/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHRianpoOW51MzZ4Yjk3MmNpbmdseTJlb3o3dWVpYzJpazc5ZHNoayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/b85mPT4Usz7fq/giphy.gif", - ], - docs: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGRpZHJqYzRvZ25xcjR3ZXcwbzVudXF2Z2hsaHoyc2g1ZjZuam81YiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/eDArHBLT4aATKEKtCd/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2NubXR1b2M1dDQ2Z2UxYmk5bzltbHdudWI1emVzOGFlbDNsOGU1bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/wpgYasZ0tBrP4lCgS3/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmEyNzc3M2V0anp4d2JtOTJuMTZ2dXNnMmEyN3A4MmE0ZGpiaDhnNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orifaQEOagjYJ1EXe/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZjUyenc2eG5pZ3NjYzcyZXg2dDFndm5qZHRqMHk5amNoYjhhNnNvZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/7E8lI6TkLrvvAcPXso/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExaWFxcXZ3MTMxM3Bjd2IwNG43ZDJjdndreXNmdTVvZ2g3Z2Q4NjczMCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3tJdi9wQQ10BD2H47g/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFrejZmaHQ2Z2o1Y3B2MDl6cmU5bzNybG84eXFrYjBjZjV0dGFpeSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fsXOS3oBboiYf6fSsY/giphy.gif", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHdhOHRianU1YmtrNHE0c2R2M2I2MTBzNnZhdnBrMW5ueG02eHF6OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieOEBYMAwTClHqM/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFtNXY0ZXdmdGxkdno2Nm5odGk3Nzd3aTRuYnJtbDA4MXIxdHFhdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10zsjaH4g0GgmY/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZG1sNXB6eTZvdDNtNzJwNXVxenNjendwaGgxb2xzNWI1dGNpdTVmZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NHHYRm7mAUQ6Y/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHd4bDJrc216YWpicDQ5emczdWF3bTk0dXYzeGQ4ajg2a3IyYjV6diZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/FHEjBpiqMwSuA/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExM3d5b2U1Z3Jic3AxY2llYjQwNW5wODFpNWp5NHY0dGV5Z2cxdThkdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/kLZNLNqUZ6bC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTNpZ2w0c3NrMmc0cmZobTd2eTM3YTRlM2lnbWpoZDUzNnRjdnNmZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NV4cSrRYXXwfUcYnua/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmFzZHNuODg0dDRheGt0aGU2bjVvd2xiNDI1bWFmYTVsbHJ2eHI2dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XaAbmtzzz35IgW3Ntn/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWM2OHkzYmNkajZxa204Njg0bmQzaWp1M3NobnJjbWxyYWJrbDNnciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OiwOPq0fFqqyainyMu/giphy.gif", - ], - }, - commit: { - automatic: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - feature: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - hotfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - release: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - docs: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ] - } -}; /***/ }), @@ -38009,69 +37818,6 @@ function buildExecution(components) { } -/***/ }), - -/***/ 9246: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.buildImageConfiguration = buildImageConfiguration; -const default_image_config_1 = __nccwpck_require__(14387); -const input_keys_1 = __nccwpck_require__(88539); -const input_boolean_policy_1 = __nccwpck_require__(18330); -const input_values_policy_1 = __nccwpck_require__(68841); -const imageInputKeys = { - issue: { - automatic: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_AUTOMATIC, - feature: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_FEATURE, - bugfix: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_BUGFIX, - release: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_RELEASE, - hotfix: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_HOTFIX, - docs: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_DOCS, - chore: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_CHORE, - }, - pullRequest: { - automatic: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_AUTOMATIC, - feature: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_FEATURE, - bugfix: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_BUGFIX, - release: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_RELEASE, - hotfix: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_HOTFIX, - docs: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_DOCS, - chore: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_CHORE, - }, - commit: { - automatic: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_AUTOMATIC, - feature: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_FEATURE, - bugfix: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_BUGFIX, - release: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_RELEASE, - hotfix: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_HOTFIX, - docs: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_DOCS, - chore: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_CHORE, - }, -}; -function buildImageConfiguration(read) { - const groups = {}; - for (const group of Object.keys(imageInputKeys)) { - const variants = {}; - for (const variant of Object.keys(imageInputKeys[group])) { - const configured = (0, input_values_policy_1.parseDelimitedValues)(read(imageInputKeys[group][variant])); - variants[variant] = configured.length > 0 - ? configured - : [...default_image_config_1.DEFAULT_IMAGE_CONFIG[group][variant]]; - } - groups[group] = variants; - } - return { - onIssue: (0, input_boolean_policy_1.isEnabledInput)(read(input_keys_1.INPUT_KEYS.IMAGES_ON_ISSUE)), - onPullRequest: (0, input_boolean_policy_1.isEnabledInput)(read(input_keys_1.INPUT_KEYS.IMAGES_ON_PULL_REQUEST)), - onCommit: (0, input_boolean_policy_1.isEnabledInput)(read(input_keys_1.INPUT_KEYS.IMAGES_ON_COMMIT)), - ...groups, - }; -} - - /***/ }), /***/ 18330: @@ -38235,7 +37981,6 @@ const project_details_loader_1 = __nccwpck_require__(73448); const input_number_policy_1 = __nccwpck_require__(47165); const input_values_policy_1 = __nccwpck_require__(68841); const agent_input_builder_1 = __nccwpck_require__(71404); -const image_configuration_builder_1 = __nccwpck_require__(9246); const pull_request_description_1 = __nccwpck_require__(45315); const issue_inactivity_1 = __nccwpck_require__(38572); const review_configuration_1 = __nccwpck_require__(3994); @@ -38444,7 +38189,6 @@ function readLocalWorkflowConfiguration(additionalParams, actionInputs) { const hotfixTree = read(input_keys_1.INPUT_KEYS.HOTFIX_TREE); const locale = new locale_1.Locale(read(input_keys_1.INPUT_KEYS.REPOSITORY_LOCALE) || locale_1.Locale.DEFAULT, read(input_keys_1.INPUT_KEYS.ISSUES_LOCALE) || '', read(input_keys_1.INPUT_KEYS.PULL_REQUESTS_LOCALE) || ''); return { - imageConfiguration: (0, image_configuration_builder_1.buildImageConfiguration)((key) => additionalParams[key] ?? actionInputs[key]), releaseWorkflow: read(input_keys_1.INPUT_KEYS.RELEASE_WORKFLOW), hotfixWorkflow: read(input_keys_1.INPUT_KEYS.HOTFIX_WORKFLOW), titleEmoji: read(input_keys_1.INPUT_KEYS.EMOJI_LABELED_TITLE) === 'true', @@ -38496,7 +38240,7 @@ const configuration_builders_1 = __nccwpck_require__(19094); const branches_builder_1 = __nccwpck_require__(30085); const size_threshold_builder_1 = __nccwpck_require__(39757); function buildLocalActionExecution(configuration, additionalParams) { - const { debug, singleAction, singleActionIssue, singleActionVersion, singleActionTitle, singleActionChangelog, singleActionMessage, singleActionCommentId, singleActionCommentMode, singleActionOperationId, inactivityThresholdHours, commitPrefixBuilder, branchManagementAlways, reopenIssueOnPush, issueDesiredAssigneesCount, pullRequestDesiredAssigneesCount, pullRequestDesiredReviewersCount, titleEmoji, branchManagementEmoji, imageConfiguration, token, agentModel, aiPullRequestDescriptionMode, aiMembersOnly, aiIgnoreFiles, aiIncludeReasoning, bugbotSeverity, bugbotCommentLimit, bugbotFixVerifyCommands, bugbotReviewConfiguration, agentTasks, branchManagementLauncherLabel, bugLabel, bugfixLabel, hotfixLabel, enhancementLabel, featureLabel, releaseLabel, questionLabel, helpLabel, deployLabel, deployedLabel, docsLabel, documentationLabel, choreLabel, maintenanceLabel, priorityHighLabel, priorityMediumLabel, priorityLowLabel, priorityNoneLabel, sizeXxlLabel, sizeXlLabel, sizeLLabel, sizeMLabel, sizeSLabel, sizeXsLabel, lifecycle, issueTypeTask, issueTypeTaskDescription, issueTypeTaskColor, issueTypeBug, issueTypeBugDescription, issueTypeBugColor, issueTypeFeature, issueTypeFeatureDescription, issueTypeFeatureColor, issueTypeDocumentation, issueTypeDocumentationDescription, issueTypeDocumentationColor, issueTypeMaintenance, issueTypeMaintenanceDescription, issueTypeMaintenanceColor, issueTypeHotfix, issueTypeHotfixDescription, issueTypeHotfixColor, issueTypeRelease, issueTypeReleaseDescription, issueTypeReleaseColor, issueTypeQuestion, issueTypeQuestionDescription, issueTypeQuestionColor, issueTypeHelp, issueTypeHelpDescription, issueTypeHelpColor, repositoryLocale, issueLocale, pullRequestLocale, sizeXxlThresholdLines, sizeXxlThresholdFiles, sizeXxlThresholdCommits, sizeXlThresholdLines, sizeXlThresholdFiles, sizeXlThresholdCommits, sizeLThresholdLines, sizeLThresholdFiles, sizeLThresholdCommits, sizeMThresholdLines, sizeMThresholdFiles, sizeMThresholdCommits, sizeSThresholdLines, sizeSThresholdFiles, sizeSThresholdCommits, sizeXsThresholdLines, sizeXsThresholdFiles, sizeXsThresholdCommits, mainBranch, developmentBranch, featureTree, bugfixTree, hotfixTree, releaseTree, docsTree, choreTree, releaseWorkflow, hotfixWorkflow, projects, projectColumnIssueCreated, projectColumnPullRequestCreated, projectColumnIssueInProgress, projectColumnPullRequestInProgress, welcomeTitle, welcomeMessages, deployment, } = configuration; + const { debug, singleAction, singleActionIssue, singleActionVersion, singleActionTitle, singleActionChangelog, singleActionMessage, singleActionCommentId, singleActionCommentMode, singleActionOperationId, inactivityThresholdHours, commitPrefixBuilder, branchManagementAlways, reopenIssueOnPush, issueDesiredAssigneesCount, pullRequestDesiredAssigneesCount, pullRequestDesiredReviewersCount, titleEmoji, branchManagementEmoji, token, agentModel, aiPullRequestDescriptionMode, aiMembersOnly, aiIgnoreFiles, aiIncludeReasoning, bugbotSeverity, bugbotCommentLimit, bugbotFixVerifyCommands, bugbotReviewConfiguration, agentTasks, branchManagementLauncherLabel, bugLabel, bugfixLabel, hotfixLabel, enhancementLabel, featureLabel, releaseLabel, questionLabel, helpLabel, deployLabel, deployedLabel, docsLabel, documentationLabel, choreLabel, maintenanceLabel, priorityHighLabel, priorityMediumLabel, priorityLowLabel, priorityNoneLabel, sizeXxlLabel, sizeXlLabel, sizeLLabel, sizeMLabel, sizeSLabel, sizeXsLabel, lifecycle, issueTypeTask, issueTypeTaskDescription, issueTypeTaskColor, issueTypeBug, issueTypeBugDescription, issueTypeBugColor, issueTypeFeature, issueTypeFeatureDescription, issueTypeFeatureColor, issueTypeDocumentation, issueTypeDocumentationDescription, issueTypeDocumentationColor, issueTypeMaintenance, issueTypeMaintenanceDescription, issueTypeMaintenanceColor, issueTypeHotfix, issueTypeHotfixDescription, issueTypeHotfixColor, issueTypeRelease, issueTypeReleaseDescription, issueTypeReleaseColor, issueTypeQuestion, issueTypeQuestionDescription, issueTypeQuestionColor, issueTypeHelp, issueTypeHelpDescription, issueTypeHelpColor, repositoryLocale, issueLocale, pullRequestLocale, sizeXxlThresholdLines, sizeXxlThresholdFiles, sizeXxlThresholdCommits, sizeXlThresholdLines, sizeXlThresholdFiles, sizeXlThresholdCommits, sizeLThresholdLines, sizeLThresholdFiles, sizeLThresholdCommits, sizeMThresholdLines, sizeMThresholdFiles, sizeMThresholdCommits, sizeSThresholdLines, sizeSThresholdFiles, sizeSThresholdCommits, sizeXsThresholdLines, sizeXsThresholdFiles, sizeXsThresholdCommits, mainBranch, developmentBranch, featureTree, bugfixTree, hotfixTree, releaseTree, docsTree, choreTree, releaseWorkflow, hotfixWorkflow, projects, projectColumnIssueCreated, projectColumnPullRequestCreated, projectColumnIssueInProgress, projectColumnPullRequestInProgress, welcomeTitle, welcomeMessages, deployment, } = configuration; return (0, execution_builder_1.buildExecution)({ debug, inactivityThresholdHours, @@ -38505,14 +38249,6 @@ function buildLocalActionExecution(configuration, additionalParams) { issue: (0, configuration_builders_1.buildIssue)(branchManagementAlways, reopenIssueOnPush, issueDesiredAssigneesCount, additionalParams), pullRequest: (0, configuration_builders_1.buildPullRequest)(pullRequestDesiredAssigneesCount, pullRequestDesiredReviewersCount, additionalParams), emoji: (0, configuration_builders_1.buildEmoji)(titleEmoji, branchManagementEmoji), - images: (0, configuration_builders_1.buildImages)({ - onIssue: imageConfiguration.onIssue, - onPullRequest: imageConfiguration.onPullRequest, - onCommit: imageConfiguration.onCommit, - issue: imageConfiguration.issue, - pullRequest: imageConfiguration.pullRequest, - commit: imageConfiguration.commit, - }), tokens: (0, configuration_builders_1.buildTokens)(token), ai: new ai_1.Ai('', agentModel, aiMembersOnly, aiIgnoreFiles, aiIncludeReasoning, bugbotSeverity, bugbotCommentLimit, bugbotFixVerifyCommands, agentTasks, aiPullRequestDescriptionMode, bugbotReviewConfiguration), labels: (0, configuration_builders_1.buildLabels)({ @@ -39144,31 +38880,6 @@ exports.INPUT_KEYS = { PROJECT_COLUMN_PULL_REQUEST_CREATED: 'project-column-pull-request-created', PROJECT_COLUMN_ISSUE_IN_PROGRESS: 'project-column-issue-in-progress', PROJECT_COLUMN_PULL_REQUEST_IN_PROGRESS: 'project-column-pull-request-in-progress', - // Images - IMAGES_ON_ISSUE: 'images-on-issue', - IMAGES_ON_PULL_REQUEST: 'images-on-pull-request', - IMAGES_ON_COMMIT: 'images-on-commit', - IMAGES_ISSUE_AUTOMATIC: 'images-issue-automatic', - IMAGES_ISSUE_FEATURE: 'images-issue-feature', - IMAGES_ISSUE_BUGFIX: 'images-issue-bugfix', - IMAGES_ISSUE_DOCS: 'images-issue-docs', - IMAGES_ISSUE_CHORE: 'images-issue-chore', - IMAGES_ISSUE_RELEASE: 'images-issue-release', - IMAGES_ISSUE_HOTFIX: 'images-issue-hotfix', - IMAGES_PULL_REQUEST_AUTOMATIC: 'images-pull-request-automatic', - IMAGES_PULL_REQUEST_FEATURE: 'images-pull-request-feature', - IMAGES_PULL_REQUEST_BUGFIX: 'images-pull-request-bugfix', - IMAGES_PULL_REQUEST_RELEASE: 'images-pull-request-release', - IMAGES_PULL_REQUEST_HOTFIX: 'images-pull-request-hotfix', - IMAGES_PULL_REQUEST_DOCS: 'images-pull-request-docs', - IMAGES_PULL_REQUEST_CHORE: 'images-pull-request-chore', - IMAGES_COMMIT_AUTOMATIC: 'images-commit-automatic', - IMAGES_COMMIT_FEATURE: 'images-commit-feature', - IMAGES_COMMIT_BUGFIX: 'images-commit-bugfix', - IMAGES_COMMIT_RELEASE: 'images-commit-release', - IMAGES_COMMIT_HOTFIX: 'images-commit-hotfix', - IMAGES_COMMIT_DOCS: 'images-commit-docs', - IMAGES_COMMIT_CHORE: 'images-commit-chore', // Workflows RELEASE_WORKFLOW: 'release-workflow', HOTFIX_WORKFLOW: 'hotfix-workflow', @@ -52636,19 +52347,9 @@ function projectBranchSyncContext(source) { }); } function projectCommitNotificationContext(source) { - const theme = commitTheme(source); return Object.freeze({ issueNumber: source.issueNumber, - branch: source.commit.branch, - commits: Object.freeze(source.commit.commits.map(commit => Object.freeze({ - ...commit, - ...(commit.author ? { author: Object.freeze({ ...commit.author }) } : {}), - }))), - commitPrefixBuilder: source.commitPrefixBuilder, reopenOnPush: source.issue.reopenOnPush, - theme: theme.kind, - imagesOnCommit: source.images.imagesOnCommit, - themeImages: Object.freeze([...theme.images]), }); } function projectChangeSizeContext(source) { @@ -52709,21 +52410,6 @@ function projectAgentActivityContext(source) { activityLabel: source.labels.lifecycle.aiProcessing, }); } -function commitTheme(source) { - if (source.release.active) - return { kind: 'release', images: source.images.commitReleaseGifs }; - if (source.hotfix.active) - return { kind: 'hotfix', images: source.images.commitHotfixGifs }; - if (source.isBugfix) - return { kind: 'bugfix', images: source.images.commitBugfixGifs }; - if (source.isFeature) - return { kind: 'feature', images: source.images.commitFeatureGifs }; - if (source.isDocs) - return { kind: 'docs', images: source.images.commitDocsGifs }; - if (source.isChore) - return { kind: 'chore', images: source.images.commitChoreGifs }; - return { kind: 'automatic', images: source.images.commitAutomaticActions }; -} function copyInitialLabels(source) { const keys = [ 'branchManagementLauncherLabel', @@ -64629,7 +64315,6 @@ class Execution { this.commitPrefixBuilder = components.commitPrefixBuilder; this.issue = components.issue; this.pullRequest = components.pullRequest; - this.images = components.images; this.tokens = components.tokens; this.ai = components.ai; this.emoji = components.emoji; @@ -64670,46 +64355,6 @@ class Hotfix { exports.Hotfix = Hotfix; -/***/ }), - -/***/ 76625: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Images = void 0; -class Images { - constructor(imagesOnIssue, imagesOnPullRequest, imagesOnCommit, cleanUpGifs, featureGifs, bugfixGifs, docsGifs, choreGifs, releaseGifs, hotfixGifs, prLinkGifs, prFeatureGifs, prBugfixGifs, prReleaseGifs, prHotfixGifs, prDocsGifs, prChoreGifs, commitAutomaticActions, commitFeatureGifs, commitBugfixGifs, commitReleaseGifs, commitHotfixGifs, commitDocsGifs, commitChoreGifs) { - this.imagesOnIssue = imagesOnIssue; - this.imagesOnPullRequest = imagesOnPullRequest; - this.imagesOnCommit = imagesOnCommit; - this.issueAutomaticActions = cleanUpGifs; - this.issueFeatureGifs = featureGifs; - this.issueBugfixGifs = bugfixGifs; - this.issueReleaseGifs = releaseGifs; - this.issueHotfixGifs = hotfixGifs; - this.issueDocsGifs = docsGifs; - this.issueChoreGifs = choreGifs; - this.pullRequestAutomaticActions = prLinkGifs; - this.pullRequestFeatureGifs = prFeatureGifs; - this.pullRequestBugfixGifs = prBugfixGifs; - this.pullRequestReleaseGifs = prReleaseGifs; - this.pullRequestHotfixGifs = prHotfixGifs; - this.pullRequestDocsGifs = prDocsGifs; - this.pullRequestChoreGifs = prChoreGifs; - this.commitAutomaticActions = commitAutomaticActions; - this.commitFeatureGifs = commitFeatureGifs; - this.commitBugfixGifs = commitBugfixGifs; - this.commitReleaseGifs = commitReleaseGifs; - this.commitHotfixGifs = commitHotfixGifs; - this.commitDocsGifs = commitDocsGifs; - this.commitChoreGifs = commitChoreGifs; - } -} -exports.Images = Images; - - /***/ }), /***/ 50293: diff --git a/build/github_action/index.js b/build/github_action/index.js index a9bc6a9e4..c90dc76a1 100644 --- a/build/github_action/index.js +++ b/build/github_action/index.js @@ -38997,10 +38997,8 @@ exports.buildEmoji = buildEmoji; exports.buildTokens = buildTokens; exports.buildLabels = buildLabels; exports.buildIssueTypes = buildIssueTypes; -exports.buildImages = buildImages; const emoji_1 = __nccwpck_require__(24146); const issue_1 = __nccwpck_require__(46760); -const images_1 = __nccwpck_require__(76625); const issue_types_1 = __nccwpck_require__(27357); const labels_1 = __nccwpck_require__(79463); const locale_1 = __nccwpck_require__(9832); @@ -39035,195 +39033,6 @@ function buildLabels(values) { function buildIssueTypes(values) { return new issue_types_1.IssueTypes(values.task.name, values.task.description, values.task.color, values.bug.name, values.bug.description, values.bug.color, values.feature.name, values.feature.description, values.feature.color, values.documentation.name, values.documentation.description, values.documentation.color, values.maintenance.name, values.maintenance.description, values.maintenance.color, values.hotfix.name, values.hotfix.description, values.hotfix.color, values.release.name, values.release.description, values.release.color, values.question.name, values.question.description, values.question.color, values.help.name, values.help.description, values.help.color); } -function buildImages(values) { - return new images_1.Images(values.onIssue, values.onPullRequest, values.onCommit, values.issue.automatic, values.issue.feature, values.issue.bugfix, values.issue.docs, values.issue.chore, values.issue.release, values.issue.hotfix, values.pullRequest.automatic, values.pullRequest.feature, values.pullRequest.bugfix, values.pullRequest.release, values.pullRequest.hotfix, values.pullRequest.docs, values.pullRequest.chore, values.commit.automatic, values.commit.feature, values.commit.bugfix, values.commit.release, values.commit.hotfix, values.commit.docs, values.commit.chore); -} - - -/***/ }), - -/***/ 14387: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DEFAULT_IMAGE_CONFIG = void 0; -/** Default illustration URLs used when an action does not receive custom images. */ -exports.DEFAULT_IMAGE_CONFIG = { - issue: { - automatic: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzRsNGFicndqMXgzMTVwdnhpeXNyZGsydXVxamV4eGxndWhna291OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ktcUyw6mBlMVa/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjkyeWVubngzM28xODFrbXZ4Nng3Y2hubmM4cXJqNGpic3Bheml0NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/M11UVCRrc0LUk/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenQwNDJmZnZraDBzNXBoNjUwZjEzMzFlanMxcHVodmF4b3l3bDl2biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/zrdUjl6N99nLq/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp" - ], - feature: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYmc4YWplZWs0Y2c3ZXNtbGpwZnQzdWpncmNjNXpodjg3MHdtbnJ5NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OMK7LRBedcnhm/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHBrYXpmd2poeGU5cWswbjRqNmJlZ2U2dWc0ejVpY3RpcXVuYTY3dSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/llKJGxQ1ESmac/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMnFleXV0MXZteGN6c2s2b3R3ZGc2cWY1aXB0Y3ZzNmpvZHhyNDVmNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10FwycrnAkpshW/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExcHo0MjIzaGIycTRmeWFwZmp6bGExczJicXcyZTQxemsxaTY1b3V1NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QKkV58ufpV4ksJ1Okh/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExazc3OWszenA5c2FlemE3a25oNnlmZDBra3liMWRqMW82NzM2b2FveCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xPGkOAdiIO3Is/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3liaGF2NzI3bzM1YjRmdHFsaGdyenp4b3o3M3dqM3F0bGN5MHZtNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/npUpB306c3EStRK6qP/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExZWh6d3Nld3E0MTF1eTk2YXFibnI3MTBhbGtpamJiemRwejl3YmkzMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/gU25raLP4pUu4/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp" - ], - hotfix: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExd2R0cjNxbXBjZjRjNmg4NmN3MGlhazVkNHJsaDkxMHZkY2hweGRtZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/pCU4bC7kC6sxy/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenkyZTc3aDlweWl0MnI0cXJsZGptY3g0bzE2NTY1aWMyaHd4Y201ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dbtDDSvWErdf2/giphy.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExM25ndGd2d3Uya3g3dnlnenJ1bjh0Y2NtNHdwZHY3Mjh2NnBmZDJpbyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2xF8gHUf085aNyyAQR/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjU3bHdsc3FtamlyazBlbWppNHc3MTV3MW4xdHd2cWo4b2tzbTkwcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1EghTrigJJhq8/200.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp" - ], - release: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2NxcHEzam92enRtd29xc21pMHhmbHozMWljamF1cmt4cjhwZTI0ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/PApUm1HPVYlDNLoMmr/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNXU4dnhwOWVqZzc4NXVsdTY3c2I4Mm9lOHF1c253MDJya25zNXU0ZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dxn6fRlTIShoeBr69N/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExbXN2bjJob3pxazE2NDJhbGE3ZWY5d2dzbDM4czgwZnA4ejlxY3ZqeCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/9D37RaHngWP7ZmmsEt/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExZnI0YTM2N2hwamd2dXYwNmN2MjRpYXIyN203cnNpbW13YjNhZGRhdyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LYWPXVUNz30ze/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdW1jZ3F4ZGRwMWkyc3ZocHJ3aXhyb2FuZGppcnMyMWtsYXpjbDY2ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tXLpxypfSXvUc/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHRianpoOW51MzZ4Yjk3MmNpbmdseTJlb3o3dWVpYzJpazc5ZHNoayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/b85mPT4Usz7fq/giphy.gif", - ], - docs: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGRpZHJqYzRvZ25xcjR3ZXcwbzVudXF2Z2hsaHoyc2g1ZjZuam81YiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/eDArHBLT4aATKEKtCd/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2NubXR1b2M1dDQ2Z2UxYmk5bzltbHdudWI1emVzOGFlbDNsOGU1bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/wpgYasZ0tBrP4lCgS3/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmEyNzc3M2V0anp4d2JtOTJuMTZ2dXNnMmEyN3A4MmE0ZGpiaDhnNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orifaQEOagjYJ1EXe/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZjUyenc2eG5pZ3NjYzcyZXg2dDFndm5qZHRqMHk5amNoYjhhNnNvZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/7E8lI6TkLrvvAcPXso/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExaWFxcXZ3MTMxM3Bjd2IwNG43ZDJjdndreXNmdTVvZ2g3Z2Q4NjczMCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3tJdi9wQQ10BD2H47g/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFrejZmaHQ2Z2o1Y3B2MDl6cmU5bzNybG84eXFrYjBjZjV0dGFpeSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fsXOS3oBboiYf6fSsY/giphy.gif", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHdhOHRianU1YmtrNHE0c2R2M2I2MTBzNnZhdnBrMW5ueG02eHF6OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieOEBYMAwTClHqM/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFtNXY0ZXdmdGxkdno2Nm5odGk3Nzd3aTRuYnJtbDA4MXIxdHFhdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10zsjaH4g0GgmY/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZG1sNXB6eTZvdDNtNzJwNXVxenNjendwaGgxb2xzNWI1dGNpdTVmZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NHHYRm7mAUQ6Y/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHd4bDJrc216YWpicDQ5emczdWF3bTk0dXYzeGQ4ajg2a3IyYjV6diZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/FHEjBpiqMwSuA/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExM3d5b2U1Z3Jic3AxY2llYjQwNW5wODFpNWp5NHY0dGV5Z2cxdThkdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/kLZNLNqUZ6bC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTNpZ2w0c3NrMmc0cmZobTd2eTM3YTRlM2lnbWpoZDUzNnRjdnNmZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NV4cSrRYXXwfUcYnua/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmFzZHNuODg0dDRheGt0aGU2bjVvd2xiNDI1bWFmYTVsbHJ2eHI2dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XaAbmtzzz35IgW3Ntn/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWM2OHkzYmNkajZxa204Njg0bmQzaWp1M3NobnJjbWxyYWJrbDNnciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OiwOPq0fFqqyainyMu/giphy.gif", - ], - }, - pullRequest: { - automatic: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzRsNGFicndqMXgzMTVwdnhpeXNyZGsydXVxamV4eGxndWhna291OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ktcUyw6mBlMVa/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjkyeWVubngzM28xODFrbXZ4Nng3Y2hubmM4cXJqNGpic3Bheml0NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/M11UVCRrc0LUk/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenQwNDJmZnZraDBzNXBoNjUwZjEzMzFlanMxcHVodmF4b3l3bDl2biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/zrdUjl6N99nLq/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - ], - feature: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYmc4YWplZWs0Y2c3ZXNtbGpwZnQzdWpncmNjNXpodjg3MHdtbnJ5NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OMK7LRBedcnhm/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHBrYXpmd2poeGU5cWswbjRqNmJlZ2U2dWc0ejVpY3RpcXVuYTY3dSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/llKJGxQ1ESmac/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMnFleXV0MXZteGN6c2s2b3R3ZGc2cWY1aXB0Y3ZzNmpvZHhyNDVmNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10FwycrnAkpshW/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExcHo0MjIzaGIycTRmeWFwZmp6bGExczJicXcyZTQxemsxaTY1b3V1NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QKkV58ufpV4ksJ1Okh/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExazc3OWszenA5c2FlemE3a25oNnlmZDBra3liMWRqMW82NzM2b2FveCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xPGkOAdiIO3Is/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3liaGF2NzI3bzM1YjRmdHFsaGdyenp4b3o3M3dqM3F0bGN5MHZtNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/npUpB306c3EStRK6qP/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExZWh6d3Nld3E0MTF1eTk2YXFibnI3MTBhbGtpamJiemRwejl3YmkzMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/gU25raLP4pUu4/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp", - ], - hotfix: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExd2R0cjNxbXBjZjRjNmg4NmN3MGlhazVkNHJsaDkxMHZkY2hweGRtZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/pCU4bC7kC6sxy/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenkyZTc3aDlweWl0MnI0cXJsZGptY3g0bzE2NTY1aWMyaHd4Y201ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dbtDDSvWErdf2/giphy.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExM25ndGd2d3Uya3g3dnlnenJ1bjh0Y2NtNHdwZHY3Mjh2NnBmZDJpbyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2xF8gHUf085aNyyAQR/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjU3bHdsc3FtamlyazBlbWppNHc3MTV3MW4xdHd2cWo4b2tzbTkwcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1EghTrigJJhq8/200.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp", - ], - release: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2NxcHEzam92enRtd29xc21pMHhmbHozMWljamF1cmt4cjhwZTI0ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/PApUm1HPVYlDNLoMmr/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNXU4dnhwOWVqZzc4NXVsdTY3c2I4Mm9lOHF1c253MDJya25zNXU0ZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dxn6fRlTIShoeBr69N/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExbXN2bjJob3pxazE2NDJhbGE3ZWY5d2dzbDM4czgwZnA4ejlxY3ZqeCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/9D37RaHngWP7ZmmsEt/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExZnI0YTM2N2hwamd2dXYwNmN2MjRpYXIyN203cnNpbW13YjNhZGRhdyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LYWPXVUNz30ze/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdW1jZ3F4ZGRwMWkyc3ZocHJ3aXhyb2FuZGppcnMyMWtsYXpjbDY2ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tXLpxypfSXvUc/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHRianpoOW51MzZ4Yjk3MmNpbmdseTJlb3o3dWVpYzJpazc5ZHNoayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/b85mPT4Usz7fq/giphy.gif", - ], - docs: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGRpZHJqYzRvZ25xcjR3ZXcwbzVudXF2Z2hsaHoyc2g1ZjZuam81YiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/eDArHBLT4aATKEKtCd/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2NubXR1b2M1dDQ2Z2UxYmk5bzltbHdudWI1emVzOGFlbDNsOGU1bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/wpgYasZ0tBrP4lCgS3/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmEyNzc3M2V0anp4d2JtOTJuMTZ2dXNnMmEyN3A4MmE0ZGpiaDhnNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orifaQEOagjYJ1EXe/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZjUyenc2eG5pZ3NjYzcyZXg2dDFndm5qZHRqMHk5amNoYjhhNnNvZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/7E8lI6TkLrvvAcPXso/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExaWFxcXZ3MTMxM3Bjd2IwNG43ZDJjdndreXNmdTVvZ2g3Z2Q4NjczMCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3tJdi9wQQ10BD2H47g/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFrejZmaHQ2Z2o1Y3B2MDl6cmU5bzNybG84eXFrYjBjZjV0dGFpeSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fsXOS3oBboiYf6fSsY/giphy.gif", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHdhOHRianU1YmtrNHE0c2R2M2I2MTBzNnZhdnBrMW5ueG02eHF6OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieOEBYMAwTClHqM/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFtNXY0ZXdmdGxkdno2Nm5odGk3Nzd3aTRuYnJtbDA4MXIxdHFhdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10zsjaH4g0GgmY/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZG1sNXB6eTZvdDNtNzJwNXVxenNjendwaGgxb2xzNWI1dGNpdTVmZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NHHYRm7mAUQ6Y/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHd4bDJrc216YWpicDQ5emczdWF3bTk0dXYzeGQ4ajg2a3IyYjV6diZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/FHEjBpiqMwSuA/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExM3d5b2U1Z3Jic3AxY2llYjQwNW5wODFpNWp5NHY0dGV5Z2cxdThkdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/kLZNLNqUZ6bC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTNpZ2w0c3NrMmc0cmZobTd2eTM3YTRlM2lnbWpoZDUzNnRjdnNmZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NV4cSrRYXXwfUcYnua/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmFzZHNuODg0dDRheGt0aGU2bjVvd2xiNDI1bWFmYTVsbHJ2eHI2dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XaAbmtzzz35IgW3Ntn/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWM2OHkzYmNkajZxa204Njg0bmQzaWp1M3NobnJjbWxyYWJrbDNnciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OiwOPq0fFqqyainyMu/giphy.gif", - ], - }, - commit: { - automatic: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - feature: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - hotfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - release: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - docs: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ] - } -}; /***/ }), @@ -39857,7 +39666,6 @@ const input_number_policy_1 = __nccwpck_require__(47165); const input_values_policy_1 = __nccwpck_require__(68841); const github_action_ai_inputs_1 = __nccwpck_require__(27640); const github_action_runtime_1 = __nccwpck_require__(96382); -const github_action_image_inputs_1 = __nccwpck_require__(75380); const github_action_locale_inputs_1 = __nccwpck_require__(58893); const size_threshold_builder_1 = __nccwpck_require__(39757); const github_action_threshold_inputs_1 = __nccwpck_require__(48578); @@ -39888,7 +39696,6 @@ async function buildGithubActionExecution(input) { } const projects = await (0, project_details_loader_1.loadProjectDetails)(projectQuery, (0, input_values_policy_1.parseDelimitedValues)(getInput(input_keys_1.INPUT_KEYS.PROJECT_IDS)), eventInputs.repo.owner, token); const projectInputs = (0, github_action_project_inputs_1.readGithubActionProjectInputs)(getInput, projects); - const imageConfiguration = (0, github_action_image_inputs_1.readGithubActionImageInputs)(getInput); const workflowInputs = (0, github_action_workflow_inputs_1.readGithubActionWorkflowInputs)(getInput); const labelInputs = (0, github_action_label_inputs_1.readGithubActionLabelInputs)(getInput); const issueTypeInputs = (0, github_action_issue_type_inputs_1.readGithubActionIssueTypeInputs)(getInput); @@ -39908,7 +39715,6 @@ async function buildGithubActionExecution(input) { issue: (0, configuration_builders_1.buildIssue)((0, input_boolean_policy_1.isEnabledInput)(getInput(input_keys_1.INPUT_KEYS.BRANCH_MANAGEMENT_ALWAYS)), (0, input_boolean_policy_1.isEnabledInput)(getInput(input_keys_1.INPUT_KEYS.REOPEN_ISSUE_ON_PUSH)), (0, input_number_policy_1.parseIntegerInput)(getInput(input_keys_1.INPUT_KEYS.DESIRED_ASSIGNEES_COUNT), 0), eventInputs), pullRequest: (0, configuration_builders_1.buildPullRequest)((0, input_number_policy_1.parseIntegerInput)(getInput(input_keys_1.INPUT_KEYS.PULL_REQUEST_DESIRED_ASSIGNEES_COUNT), 0), (0, input_number_policy_1.parseIntegerInput)(getInput(input_keys_1.INPUT_KEYS.PULL_REQUEST_DESIRED_REVIEWERS_COUNT), 0), eventInputs), emoji: (0, configuration_builders_1.buildEmoji)(getInput(input_keys_1.INPUT_KEYS.EMOJI_LABELED_TITLE) === 'true', getInput(input_keys_1.INPUT_KEYS.BRANCH_MANAGEMENT_EMOJI)), - images: (0, configuration_builders_1.buildImages)(imageConfiguration), tokens: (0, configuration_builders_1.buildTokens)(token), ai: new ai_1.Ai('', aiInputs.requestedAgentTasks.findings.model, aiInputs.membersOnly, aiInputs.ignoreFiles, aiInputs.includeReasoning, aiInputs.bugbotSeverity, aiInputs.bugbotCommentLimit, aiInputs.bugbotFixVerifyCommands, agentTasks, aiInputs.pullRequestDescriptionMode, aiInputs.bugbotReviewConfiguration), labels: (0, configuration_builders_1.buildLabels)(labelInputs), @@ -39939,21 +39745,6 @@ function getCommitPrefixBuilder(getInput) { } -/***/ }), - -/***/ 75380: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.readGithubActionImageInputs = readGithubActionImageInputs; -const image_configuration_builder_1 = __nccwpck_require__(9246); -function readGithubActionImageInputs(getInput) { - return (0, image_configuration_builder_1.buildImageConfiguration)(getInput); -} - - /***/ }), /***/ 8824: @@ -40285,69 +40076,6 @@ function requireNonEmptyContextValue(value, label) { } -/***/ }), - -/***/ 9246: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.buildImageConfiguration = buildImageConfiguration; -const default_image_config_1 = __nccwpck_require__(14387); -const input_keys_1 = __nccwpck_require__(88539); -const input_boolean_policy_1 = __nccwpck_require__(18330); -const input_values_policy_1 = __nccwpck_require__(68841); -const imageInputKeys = { - issue: { - automatic: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_AUTOMATIC, - feature: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_FEATURE, - bugfix: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_BUGFIX, - release: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_RELEASE, - hotfix: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_HOTFIX, - docs: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_DOCS, - chore: input_keys_1.INPUT_KEYS.IMAGES_ISSUE_CHORE, - }, - pullRequest: { - automatic: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_AUTOMATIC, - feature: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_FEATURE, - bugfix: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_BUGFIX, - release: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_RELEASE, - hotfix: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_HOTFIX, - docs: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_DOCS, - chore: input_keys_1.INPUT_KEYS.IMAGES_PULL_REQUEST_CHORE, - }, - commit: { - automatic: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_AUTOMATIC, - feature: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_FEATURE, - bugfix: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_BUGFIX, - release: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_RELEASE, - hotfix: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_HOTFIX, - docs: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_DOCS, - chore: input_keys_1.INPUT_KEYS.IMAGES_COMMIT_CHORE, - }, -}; -function buildImageConfiguration(read) { - const groups = {}; - for (const group of Object.keys(imageInputKeys)) { - const variants = {}; - for (const variant of Object.keys(imageInputKeys[group])) { - const configured = (0, input_values_policy_1.parseDelimitedValues)(read(imageInputKeys[group][variant])); - variants[variant] = configured.length > 0 - ? configured - : [...default_image_config_1.DEFAULT_IMAGE_CONFIG[group][variant]]; - } - groups[group] = variants; - } - return { - onIssue: (0, input_boolean_policy_1.isEnabledInput)(read(input_keys_1.INPUT_KEYS.IMAGES_ON_ISSUE)), - onPullRequest: (0, input_boolean_policy_1.isEnabledInput)(read(input_keys_1.INPUT_KEYS.IMAGES_ON_PULL_REQUEST)), - onCommit: (0, input_boolean_policy_1.isEnabledInput)(read(input_keys_1.INPUT_KEYS.IMAGES_ON_COMMIT)), - ...groups, - }; -} - - /***/ }), /***/ 18330: @@ -40910,31 +40638,6 @@ exports.INPUT_KEYS = { PROJECT_COLUMN_PULL_REQUEST_CREATED: 'project-column-pull-request-created', PROJECT_COLUMN_ISSUE_IN_PROGRESS: 'project-column-issue-in-progress', PROJECT_COLUMN_PULL_REQUEST_IN_PROGRESS: 'project-column-pull-request-in-progress', - // Images - IMAGES_ON_ISSUE: 'images-on-issue', - IMAGES_ON_PULL_REQUEST: 'images-on-pull-request', - IMAGES_ON_COMMIT: 'images-on-commit', - IMAGES_ISSUE_AUTOMATIC: 'images-issue-automatic', - IMAGES_ISSUE_FEATURE: 'images-issue-feature', - IMAGES_ISSUE_BUGFIX: 'images-issue-bugfix', - IMAGES_ISSUE_DOCS: 'images-issue-docs', - IMAGES_ISSUE_CHORE: 'images-issue-chore', - IMAGES_ISSUE_RELEASE: 'images-issue-release', - IMAGES_ISSUE_HOTFIX: 'images-issue-hotfix', - IMAGES_PULL_REQUEST_AUTOMATIC: 'images-pull-request-automatic', - IMAGES_PULL_REQUEST_FEATURE: 'images-pull-request-feature', - IMAGES_PULL_REQUEST_BUGFIX: 'images-pull-request-bugfix', - IMAGES_PULL_REQUEST_RELEASE: 'images-pull-request-release', - IMAGES_PULL_REQUEST_HOTFIX: 'images-pull-request-hotfix', - IMAGES_PULL_REQUEST_DOCS: 'images-pull-request-docs', - IMAGES_PULL_REQUEST_CHORE: 'images-pull-request-chore', - IMAGES_COMMIT_AUTOMATIC: 'images-commit-automatic', - IMAGES_COMMIT_FEATURE: 'images-commit-feature', - IMAGES_COMMIT_BUGFIX: 'images-commit-bugfix', - IMAGES_COMMIT_RELEASE: 'images-commit-release', - IMAGES_COMMIT_HOTFIX: 'images-commit-hotfix', - IMAGES_COMMIT_DOCS: 'images-commit-docs', - IMAGES_COMMIT_CHORE: 'images-commit-chore', // Workflows RELEASE_WORKFLOW: 'release-workflow', HOTFIX_WORKFLOW: 'hotfix-workflow', @@ -54598,19 +54301,9 @@ function projectBranchSyncContext(source) { }); } function projectCommitNotificationContext(source) { - const theme = commitTheme(source); return Object.freeze({ issueNumber: source.issueNumber, - branch: source.commit.branch, - commits: Object.freeze(source.commit.commits.map(commit => Object.freeze({ - ...commit, - ...(commit.author ? { author: Object.freeze({ ...commit.author }) } : {}), - }))), - commitPrefixBuilder: source.commitPrefixBuilder, reopenOnPush: source.issue.reopenOnPush, - theme: theme.kind, - imagesOnCommit: source.images.imagesOnCommit, - themeImages: Object.freeze([...theme.images]), }); } function projectChangeSizeContext(source) { @@ -54671,21 +54364,6 @@ function projectAgentActivityContext(source) { activityLabel: source.labels.lifecycle.aiProcessing, }); } -function commitTheme(source) { - if (source.release.active) - return { kind: 'release', images: source.images.commitReleaseGifs }; - if (source.hotfix.active) - return { kind: 'hotfix', images: source.images.commitHotfixGifs }; - if (source.isBugfix) - return { kind: 'bugfix', images: source.images.commitBugfixGifs }; - if (source.isFeature) - return { kind: 'feature', images: source.images.commitFeatureGifs }; - if (source.isDocs) - return { kind: 'docs', images: source.images.commitDocsGifs }; - if (source.isChore) - return { kind: 'chore', images: source.images.commitChoreGifs }; - return { kind: 'automatic', images: source.images.commitAutomaticActions }; -} function copyInitialLabels(source) { const keys = [ 'branchManagementLauncherLabel', @@ -60250,7 +59928,7 @@ function projectPublishResultContext(source) { } /** * Semantic publication boundary. Only explicitly mapped payloads may reach - * GitHub; steps, reminders, errors, images, and debug logs remain operator + * GitHub; steps, reminders, errors, and debug logs remain operator * evidence in the Job Summary and logs. */ async function runPublishResume(param, taskId, comments, catalogResolver, sourceQuery) { @@ -63982,7 +63660,6 @@ class Execution { this.commitPrefixBuilder = components.commitPrefixBuilder; this.issue = components.issue; this.pullRequest = components.pullRequest; - this.images = components.images; this.tokens = components.tokens; this.ai = components.ai; this.emoji = components.emoji; @@ -64023,46 +63700,6 @@ class Hotfix { exports.Hotfix = Hotfix; -/***/ }), - -/***/ 76625: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Images = void 0; -class Images { - constructor(imagesOnIssue, imagesOnPullRequest, imagesOnCommit, cleanUpGifs, featureGifs, bugfixGifs, docsGifs, choreGifs, releaseGifs, hotfixGifs, prLinkGifs, prFeatureGifs, prBugfixGifs, prReleaseGifs, prHotfixGifs, prDocsGifs, prChoreGifs, commitAutomaticActions, commitFeatureGifs, commitBugfixGifs, commitReleaseGifs, commitHotfixGifs, commitDocsGifs, commitChoreGifs) { - this.imagesOnIssue = imagesOnIssue; - this.imagesOnPullRequest = imagesOnPullRequest; - this.imagesOnCommit = imagesOnCommit; - this.issueAutomaticActions = cleanUpGifs; - this.issueFeatureGifs = featureGifs; - this.issueBugfixGifs = bugfixGifs; - this.issueReleaseGifs = releaseGifs; - this.issueHotfixGifs = hotfixGifs; - this.issueDocsGifs = docsGifs; - this.issueChoreGifs = choreGifs; - this.pullRequestAutomaticActions = prLinkGifs; - this.pullRequestFeatureGifs = prFeatureGifs; - this.pullRequestBugfixGifs = prBugfixGifs; - this.pullRequestReleaseGifs = prReleaseGifs; - this.pullRequestHotfixGifs = prHotfixGifs; - this.pullRequestDocsGifs = prDocsGifs; - this.pullRequestChoreGifs = prChoreGifs; - this.commitAutomaticActions = commitAutomaticActions; - this.commitFeatureGifs = commitFeatureGifs; - this.commitBugfixGifs = commitBugfixGifs; - this.commitReleaseGifs = commitReleaseGifs; - this.commitHotfixGifs = commitHotfixGifs; - this.commitDocsGifs = commitDocsGifs; - this.commitChoreGifs = commitChoreGifs; - } -} -exports.Images = Images; - - /***/ }), /***/ 50293: diff --git a/docs/configuration.mdx b/docs/configuration.mdx index 2020648d0..686bf5f6c 100644 --- a/docs/configuration.mdx +++ b/docs/configuration.mdx @@ -148,7 +148,7 @@ Copilot provides extensive configuration options to customize your workflow. Use overrides a workflow proven to lack `merge_group: checks_requested`. - + ## Single Actions - `single-action`: Single action to run (e.g. `check_progress_action` or `think_action`). See [Single Actions](/single-actions). @@ -161,20 +161,6 @@ Copilot provides extensive configuration options to customize your workflow. Use - `single-action-comment-mode`: `create`, `replace`, or `append`; defaults to `create` without an ID and `replace` with an ID - `inactivity-threshold-hours`: Inactivity window for `close_inactive_issues_action` (default: `168` hours; valid range: `1`–`8760`) - ## Deprecated image compatibility - - `images-on-issue`, `images-on-pull-request`, and `images-on-commit` now - default to `false`. Semantic plans, progress cards, Bugbot status, branch - synchronization, lifecycle explanations, and push handling never add a - decorative image. The booleans and URL pools remain accepted for one - compatibility window so existing workflows do not fail schema validation; - new configurations should omit them. - - **Deprecated issue pools:** `images-issue-automatic`, `images-issue-feature`, `images-issue-bugfix`, `images-issue-docs`, `images-issue-chore`, `images-issue-hotfix`, `images-issue-release` - - **Deprecated pull-request pools:** `images-pull-request-automatic`, `images-pull-request-feature`, `images-pull-request-bugfix`, `images-pull-request-docs`, `images-pull-request-chore`, `images-pull-request-hotfix`, `images-pull-request-release` - - **Deprecated commit pools:** `images-commit-automatic`, `images-commit-feature`, `images-commit-bugfix`, `images-commit-docs`, `images-commit-chore`, `images-commit-hotfix`, `images-commit-release` diff --git a/docs/development/architecture.mdx b/docs/development/architecture.mdx index e042f3ecb..d8a257ae3 100644 --- a/docs/development/architecture.mdx +++ b/docs/development/architecture.mdx @@ -8,8 +8,8 @@ The repository separates semantic application ports from provider-specific adapt GitHub conversation output crosses a closed publication boundary. Capabilities produce typed `none`, `reply`, `status`, `transition`, or `inline-finding` -intents; the compatibility layer maps only reviewed semantic payloads and can -never render `Result.steps`, reminders, errors, images, or debug logs. Status +intents; the publication layer maps only reviewed semantic payloads and can +never render `Result.steps`, reminders, errors, or debug logs. Status and reply workflows validate exact bot ownership, stable correlation or topic identity, and semantic digests before creating or updating a comment. The checked-in publication mutation inventory fails CI if a new application use diff --git a/docs/features.mdx b/docs/features.mdx index 0b8609e39..72dea862e 100644 --- a/docs/features.mdx +++ b/docs/features.mdx @@ -156,8 +156,8 @@ and before every progress-card mutation. This also applies to the on-demand Action and repository-aware CLI because both snapshot the authoritative remote branch before analysis. Hidden markers provide stable identity and are trusted only when the comment is -authored by the configured bot. Decorative image inputs default to `false` and -are deprecated. +authored by the configured bot. Generated conversation surfaces do not include +decorative media or expose configuration for it. --- diff --git a/docs/index.mdx b/docs/index.mdx index e4658d436..44fa437a2 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -26,7 +26,7 @@ Experience seamless project management, automated branch handling, and enhanced PAT setup, permissions, and token best practices. - All inputs: branches, labels, projects, images, and more. + All inputs: branches, labels, projects, locale, agents, and more. Production-first release and hotfix promotion, publication, reconciliation, and recovery. diff --git a/docs/issues/configuration.mdx b/docs/issues/configuration.mdx index 06cb133ef..7f19dc179 100644 --- a/docs/issues/configuration.mdx +++ b/docs/issues/configuration.mdx @@ -105,45 +105,6 @@ stable fallback reason without storing message bodies. - `desired-assignees-count`: Number of assignees desired for the issue (default: "1", max: 10) - `desired-reviewers-count`: Number of reviewers desired for pull requests (default: "1", max: 15) -#### Deprecated Image Compatibility -- `images-on-issue`: Deprecated compatibility toggle (default: `false`) -- `images-on-pull-request`: Deprecated compatibility toggle (default: `false`) -- `images-on-commit`: Deprecated compatibility toggle (default: `false`) - -Semantic comments and cards do not render decorative images. The following URL -pools remain accepted during the compatibility window, but new workflows should -omit them. - -##### Deprecated issue image pools -- `images-issue-automatic` -- `images-issue-feature` -- `images-issue-bugfix` -- `images-issue-docs` -- `images-issue-chore` -- `images-issue-hotfix` -- `images-issue-release` - -##### Deprecated pull-request image pools -- `images-pull-request-automatic` -- `images-pull-request-feature` -- `images-pull-request-bugfix` -- `images-pull-request-docs` -- `images-pull-request-chore` -- `images-pull-request-hotfix` -- `images-pull-request-release` - -##### Deprecated commit image pools -- `images-commit-automatic` -- `images-commit-feature` -- `images-commit-bugfix` -- `images-commit-docs` -- `images-commit-chore` -- `images-commit-hotfix` -- `images-commit-release` - -All URL-pool inputs above are ignored by semantic publication. They remain in -the action schema only so an existing workflow does not fail while migrating. - #### AI agent selection The workflow can select one provider for both findings and fixer operations. The selected transport is resolved before execution; unsupported combinations fail instead of silently falling back to OpenCode. diff --git a/docs/issues/index.mdx b/docs/issues/index.mdx index 8026dbe08..9fcabe4ef 100644 --- a/docs/issues/index.mdx +++ b/docs/issues/index.mdx @@ -24,7 +24,7 @@ Copilot automates **issue tracking** so that labels, branch creation, project li Commit notifications on the issue, reopen on push, and auto-close when merged or inactive. - All issue-related inputs: labels, branches, size, images, workflow. + All issue-related inputs: labels, branches, size, locale, and workflow. Full workflow YAML and label examples. diff --git a/docs/issues/notifications-and-auto-close.mdx b/docs/issues/notifications-and-auto-close.mdx index f368ed26a..e83db42da 100644 --- a/docs/issues/notifications-and-auto-close.mdx +++ b/docs/issues/notifications-and-auto-close.mdx @@ -142,5 +142,5 @@ the missing context matters. ## Next steps - **[Workflow setup](/issues/workflow-setup)** — Issue workflow events and scheduled inactivity cleanup. -- **[Configuration](/issues/configuration)** — `reopen-issue-on-push`, locale, and deprecated image compatibility. +- **[Configuration](/issues/configuration)** — `reopen-issue-on-push`, locale, and lifecycle policy. - [How to use](/how-to-use) — Full setup including Commit workflow. diff --git a/docs/issues/type/bugfix.mdx b/docs/issues/type/bugfix.mdx index d16fca4ec..2fda266f9 100644 --- a/docs/issues/type/bugfix.mdx +++ b/docs/issues/type/bugfix.mdx @@ -64,9 +64,8 @@ jobs: ## Conversation presentation Bugfix issues receive semantic plan and progress cards only when those states -are useful. Routine automation does not create an “Actions” summary or a -decorative image. The legacy `images-issue-bugfix` input remains accepted only -for configuration compatibility. +are useful. Routine automation does not create an “Actions” summary or add +decorative media. ## Template diff --git a/docs/issues/type/chore.mdx b/docs/issues/type/chore.mdx index 6c2a3c23f..47ed87849 100644 --- a/docs/issues/type/chore.mdx +++ b/docs/issues/type/chore.mdx @@ -64,9 +64,8 @@ jobs: ## Conversation presentation Chore issues receive semantic plan and progress cards only when those states -are useful. Routine automation does not create an “Actions” summary or a -decorative image. The legacy `images-issue-chore` input remains accepted only -for configuration compatibility. +are useful. Routine automation does not create an “Actions” summary or add +decorative media. ## Template diff --git a/docs/issues/type/docs.mdx b/docs/issues/type/docs.mdx index 3c1af80b7..19a05182a 100644 --- a/docs/issues/type/docs.mdx +++ b/docs/issues/type/docs.mdx @@ -64,9 +64,8 @@ jobs: ## Conversation presentation Documentation issues receive semantic plan and progress cards only when those -states are useful. Routine automation does not create an “Actions” summary or a -decorative image. The legacy `images-issue-docs` input remains accepted only -for configuration compatibility. +states are useful. Routine automation does not create an “Actions” summary or +add decorative media. ## Template diff --git a/docs/issues/type/feature.mdx b/docs/issues/type/feature.mdx index cb92afd1e..e3886bff6 100644 --- a/docs/issues/type/feature.mdx +++ b/docs/issues/type/feature.mdx @@ -64,9 +64,8 @@ jobs: ## Conversation presentation Feature issues receive semantic plan and progress cards only when those states -are useful. Routine automation does not create an “Actions” summary or a -decorative image. The legacy `images-issue-feature` input remains accepted only -for configuration compatibility. +are useful. Routine automation does not create an “Actions” summary or add +decorative media. ## Template diff --git a/docs/issues/type/hotfix.mdx b/docs/issues/type/hotfix.mdx index 9c1705698..37905a16e 100644 --- a/docs/issues/type/hotfix.mdx +++ b/docs/issues/type/hotfix.mdx @@ -144,9 +144,8 @@ jobs: ## Conversation presentation The durable hotfix dashboard owns the issue presentation. Routine orchestration -does not create an “Actions” summary or a decorative image. The legacy -`images-issue-hotfix` input remains accepted only for configuration -compatibility. The dashboard uses the effective issue locale, managed PRs use +does not create an “Actions” summary or add decorative media. The dashboard +uses the effective issue locale, managed PRs use the pull-request locale, and the Actions summary uses the English-default repository locale; see the orchestration guide for inheritance and fallback. diff --git a/docs/issues/type/release.mdx b/docs/issues/type/release.mdx index 3a26c937e..4176c083f 100644 --- a/docs/issues/type/release.mdx +++ b/docs/issues/type/release.mdx @@ -140,9 +140,8 @@ jobs: ## Conversation presentation The durable release dashboard owns the issue presentation. Routine -orchestration does not create an “Actions” summary or a decorative image. The -legacy `images-issue-release` input remains accepted only for configuration -compatibility. The dashboard uses the effective issue locale, managed PRs use +orchestration does not create an “Actions” summary or add decorative media. The +dashboard uses the effective issue locale, managed PRs use the pull-request locale, and the Actions summary uses the English-default repository locale; see the orchestration guide for inheritance and fallback. diff --git a/docs/pull-requests/capabilities.mdx b/docs/pull-requests/capabilities.mdx index ceee97f68..f315c390c 100644 --- a/docs/pull-requests/capabilities.mdx +++ b/docs/pull-requests/capabilities.mdx @@ -81,8 +81,8 @@ refreshes, and merge/close success do not create generic comments. Useful state is shown in its owning surface: the PR description, native metadata, one Bugbot status card, bounded inline findings, Checks, and the workflow Job Summary. -The old image toggles and URL pools default to `false` and are deprecated. -Semantic PR messages never include decorative images. +Semantic PR messages never include decorative media, and the action exposes no +configuration for adding it. ## Bugbot on PRs diff --git a/docs/pull-requests/configuration.mdx b/docs/pull-requests/configuration.mdx index edfbc2a35..a3465a2c5 100644 --- a/docs/pull-requests/configuration.mdx +++ b/docs/pull-requests/configuration.mdx @@ -29,19 +29,6 @@ See [AI PR description](/pull-requests/ai-description) for how the description i Copilot preserves the original review comment byte-for-byte. For an addressed request in another language it performs one bounded adaptation before domain work, keeps commands and technical operands intact, and adds escaped translation context to the bot-owned response only when translation occurred. -## Deprecated image inputs - -| Input | Description | Default | -|-------|-------------|---------| -| `images-on-pull-request` | Deprecated compatibility toggle; semantic PR messages do not render decorative images | `false` | -| `images-pull-request-automatic` | Deprecated URL pool | empty | -| `images-pull-request-feature` | Deprecated URL pool | empty | -| `images-pull-request-bugfix` | Deprecated URL pool | empty | -| … | Same deprecated pattern for `docs`, `chore`, `hotfix`, `release` | empty | - -New workflows should omit these inputs. They remain accepted temporarily for -configuration compatibility. - ## Other | Input | Description | Default | diff --git a/docs/pull-requests/examples.mdx b/docs/pull-requests/examples.mdx index 6f824f56f..38725b104 100644 --- a/docs/pull-requests/examples.mdx +++ b/docs/pull-requests/examples.mdx @@ -168,22 +168,6 @@ Link PRs to a board and assign two reviewers: Ensure the project has a column named **"In Review"** (or use your actual column name). -## Deprecated image compatibility - -Existing workflows may still contain image inputs such as: - -```yaml -- uses: vypdev/copilot@v3 - with: - token: ${{ secrets.PAT }} - images-on-pull-request: false - images-pull-request-feature: "https://example.com/images/feature-pr.png" -``` - -These inputs are accepted temporarily, but semantic comments do not use them. -New workflows should omit the toggle and all image pools. See -[Configuration](/configuration). - ## Next steps - **[Workflow setup](/pull-requests/workflow-setup)** — Events and what runs when. diff --git a/docs/pull-requests/index.mdx b/docs/pull-requests/index.mdx index f0b8ed930..ce38b9141 100644 --- a/docs/pull-requests/index.mdx +++ b/docs/pull-requests/index.mdx @@ -12,13 +12,13 @@ When your workflow runs on **`pull_request`** code and lifecycle events, Copilot Enable the action for pull_request events and minimal workflow YAML. - PR–issue linking, project linking, reviewers, size and priority, AI description, comments and images. + PR–issue linking, projects, reviewers, size and priority, AI description, and semantic messages. How the configured agent writes a concise body from optional issue context and the branch diff. - PR-specific inputs: project columns, reviewers, images, AI. + PR-specific inputs: project columns, reviewers, locale, and AI. Full workflow YAML and common configurations. diff --git a/docs/pull-requests/workflow-setup.mdx b/docs/pull-requests/workflow-setup.mdx index c232f86fa..933b69aef 100644 --- a/docs/pull-requests/workflow-setup.mdx +++ b/docs/pull-requests/workflow-setup.mdx @@ -125,7 +125,7 @@ branch key with a `review-state` suffix. 6. **AI PR description:** When `ai-pull-request-description-mode` is not `disabled` and the selected agent CLI is configured, the action can generate or update the PR description from the issue and the branch diff according to the selected policy. See [AI PR description](/pull-requests/ai-description). -7. **Conversation UX:** The action publishes only purpose-specific replies, one current Bugbot card, and bounded inline findings. Routine metadata changes do not post a generic action summary, and decorative image inputs are deprecated. See [Capabilities](/pull-requests/capabilities). +7. **Conversation UX:** The action publishes only purpose-specific replies, one current Bugbot card, and bounded inline findings. Routine metadata changes do not post a generic action summary or add decorative media. See [Capabilities](/pull-requests/capabilities). 8. **Bugbot review:** On `opened` and `reopened`, the reviewer role analyzes the full PR. On `synchronize`, this workflow exclusively owns Bugbot for the new commit range and reconciles every open finding against current code; the paired Commit run still updates issue progress but skips its Bugbot pass. Metadata-only edits do not invoke the agent. Active findings move the PR to `state:changes-requested` and `state:awaiting-issue-author`; a clean review moves it to `state:ready` and `state:awaiting-maintainer`. During the run, `state:ai-processing` may coexist with those labels and is removed when the agent finishes. Configure `reviewer-provider`, `reviewer-model-provider`, `reviewer-model`, `reviewer-effort`, and `reviewer-executable` only when the reviewer should differ from the base agent. diff --git a/package.json b/package.json index b77775b57..82d3c1ab0 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "@actions/github": "^8.0.1", "boxen": "^8.0.1", "chalk": "^5.4.1", - "chance": "^1.1.12", "commander": "^12.0.0", "js-yaml": "^5.4.1", "shell-quote": "^1.8.3", @@ -84,7 +83,6 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", - "@types/chance": "^1.1.6", "@types/jest": "^30.0.0", "@types/node": "^22.9.1", "@vercel/ncc": "^0.36.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6372d02d..77da4790a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,9 +26,6 @@ importers: chalk: specifier: ^5.4.1 version: 5.6.2 - chance: - specifier: ^1.1.12 - version: 1.1.13 commander: specifier: ^12.0.0 version: 12.1.0 @@ -45,9 +42,6 @@ importers: '@eslint/js': specifier: ^10.0.1 version: 10.0.1(eslint@10.10.0) - '@types/chance': - specifier: ^1.1.6 - version: 1.1.8 '@types/jest': specifier: ^30.0.0 version: 30.0.0 @@ -635,9 +629,6 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/chance@1.1.8': - resolution: {integrity: sha512-isycXjm4a88/zl3n9lfgMcEClR9wUi+m72lkE9MvEbkgZDQrKzolWbonBiUqDNAJFIwO9GKjzmJFq79qtKVTAQ==} - '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -990,9 +981,6 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chance@1.1.13: - resolution: {integrity: sha512-V6lQCljcLznE7tUYUM9EOAnnKXbctE6j/rdQkYOHIWbfGQbrzTsAXNW9CdU5XCo4ArXQCj/rb6HgxPlmGJcaUg==} - char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -2687,8 +2675,6 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@types/chance@1.1.8': {} - '@types/esrecurse@4.3.1': {} '@types/estree@1.0.9': {} @@ -3051,8 +3037,6 @@ snapshots: chalk@5.6.2: {} - chance@1.1.13: {} - char-regex@1.0.2: {} ci-info@4.4.0: {} diff --git a/specs/configurable-release-orchestration.md b/specs/configurable-release-orchestration.md index 5af57e672..1130b48ff 100644 --- a/specs/configurable-release-orchestration.md +++ b/specs/configurable-release-orchestration.md @@ -1074,9 +1074,8 @@ facts are not translated. node style. - Images and diagrams have concise alternative text or an adjacent textual equivalent. -- Decorative GIFs are omitted from the durable control center by default; they - may appear only outside the operational status block when existing image - configuration enables them. +- Decorative GIFs are omitted from every orchestration surface; no image + configuration is exposed. - Primary status and required action are never hidden inside `
`. - Tables use at most four columns and avoid long unbroken full SHAs. - Full SHAs and verbose provider facts remain available in technical details. diff --git a/specs/semantic-github-publication-and-notification.md b/specs/semantic-github-publication-and-notification.md index 5a5ee1f66..4cf4944d6 100644 --- a/specs/semantic-github-publication-and-notification.md +++ b/specs/semantic-github-publication-and-notification.md @@ -461,42 +461,34 @@ last valid card and exposes publication degradation in the Job Summary. ## 7. User-facing configuration The semantic notification rules are intentionally mostly fixed. Configuration -may choose a legitimate release presentation or temporarily preserve onboarding -media, but it cannot restore generic step dumps or debug-in-comments. +may choose a legitimate release presentation, but it cannot restore generic +step dumps, debug-in-comments, or decorative media. | Input | Type | Recommended default | Allowed values/range | Scope/persistence | |---|---|---|---|---| | `orchestration-comment-mode` | enum | `update` — one dashboard | existing `update`, `milestones` | snapshotted by release operation | | `orchestration-presentation-mode` | enum | `guided` | existing `guided`, `compact`, `quiet` | snapshotted by release operation | -| `images-on-issue` | deprecated boolean | `false` | `false`; `true` accepted during compatibility window only | repository/run | -| `images-on-pull-request` | deprecated boolean | `false` | `false`; `true` accepted during compatibility window only | repository/run | -| `images-on-commit` | deprecated boolean | `false` | `false`; `true` accepted during compatibility window only | repository/run | | locale inputs | BCP-47 profile | see companion SDD | bounded by localization contract | repository/run or operation snapshot | -During one minor-release compatibility window, `images-on-issue=true` MAY render -one configured image only in the one-time welcome state when no feature-owned -card or answer exists. It MUST have descriptive alt text. PR, commit, status, -finding, warning, error, progress, plan, and release messages never render -decorative images. All image pool inputs are deprecated with the same window and -are removed in the next major release. +PR, commit, status, finding, warning, error, progress, plan, welcome, and release +messages never render decorative media. The public action schema exposes no +image toggle or URL-pool input. Because the project has no consumers, retired +image configuration is removed outright rather than parsed, ignored, warned +about, or migrated. `debug` remains supported for operator logs and Job Summary evidence. It has no conversation-publication effect. No inputs are added for generic titles, footer text, raw-step publication, -status-card multiplicity, failure deduplication, or notification limits. Unknown -or retired image values follow the setup/doctor deprecation policy. Release -configuration precedence and snapshot semantics remain as specified by the -release orchestration SDD. +status-card multiplicity, failure deduplication, notification limits, or +decorative media. Release configuration precedence and snapshot semantics +remain as specified by the release orchestration SDD. Recommended configuration: ```yaml with: repository-locale: en-US - images-on-issue: false - images-on-pull-request: false - images-on-commit: false orchestration-comment-mode: update ``` @@ -519,7 +511,7 @@ does not increase generic publication or expose debug output. | Layer/boundary | Owns | Must not own/import | |---|---|---| | Domain/pure policy | semantic identity, outcome/action states, fingerprinting, publication and noise decisions | Octokit, Actions context, Markdown, locale catalogs, logs | -| Application | capability outcomes, publication coordinator, stale guards, semantic ports, operator evidence | concrete GitHub SDK calls, random images, raw event DTOs | +| Application | capability outcomes, publication coordinator, stale guards, semantic ports, operator evidence | concrete GitHub SDK calls, decorative-media selection, raw event DTOs | | Adapters/data | list/create/update/delete owned comments, reviews, Checks, provider error mapping | deciding whether a comment is useful or selecting copy | | Infrastructure/composition | bind ports and feature publishers; wire Job Summary and localization | branch/lifecycle product decisions | | Entrypoints | validate/project input, route event, invoke completion | building comments from results | @@ -857,8 +849,7 @@ facts, and recovery links before optional detail. permitted in a title, and removing it must not change meaning. - Comments MUST remain readable at narrow widths. Use lists before wide tables; tables are limited to four columns and require a prose status sentence. -- Decorative images are absent after the compatibility window. Any temporary - welcome image has useful alt text and no text embedded solely in the image. +- Decorative media is absent from every generated conversation surface. - Heading levels are logical. Comments start at `##`; nested sections use `###`. - Every link is descriptive and independently understandable. - All copy and user-supplied content follows the companion locale, atomic @@ -952,14 +943,15 @@ generic output is left intact. - Existing progress labels remain authoritative during progress-card adoption. - Human-authored and third-party comments are never migrated. -### 13.2 Configuration and deprecation +### 13.2 Greenfield configuration boundary -- Image toggles change default from `true` to `false` in `action.yml`, setup - templates, CLI defaults, examples, and generated bundles together. -- One minor release accepts deprecated image inputs and limits their effect to a - one-time welcome. Setup and doctor display one deprecation warning. -- The next major removes image pool inputs and all random-image selection code. -- No compatibility flag restores generic result comments or debug disclosure. +- Image toggles, URL pools, random-image selection, and their dependencies are + absent from `action.yml`, runtime configuration, setup, CLI, documentation, + and generated bundles. +- There is no compatibility alias, ignored-value reader, warning, migration + path, feature flag, or delayed removal window. +- No configuration restores generic result comments, decorative media, or debug + disclosure. ### 13.3 Implementation sequence (completed) @@ -972,8 +964,8 @@ generic output is left intact. publication. 4. Adopt the shared marker/localization envelope in branch sync, Bugbot, and release without changing their domain behavior. -5. Change image defaults, update setup/doctor/docs, regenerate bundles, and run - a controlled GitHub UX acceptance matrix. +5. Remove decorative-media configuration and runtime code, update docs, + regenerate bundles, and run a controlled GitHub UX acceptance matrix. 6. Remove the legacy generic renderer after one release with zero observed fallback use. @@ -1126,7 +1118,7 @@ expansion, and narrow-layout states are retained as deterministic renderer and terminal fixtures so validation does not mutate repository-wide locale settings. No remote product flag is required. Each phase must be independently releasable -and its compatibility adapter must fail closed to Job Summary, not fall back to +and its publication boundary must fail closed to Job Summary, not fall back to generic comments. ### 13.4 Rollback @@ -1151,7 +1143,7 @@ Its files are disjoint from the localization allocation and are enforced by | Area | Minimum distinct cases | Behaviors/risks covered | |---|---:|---| -| Domain/configuration/pure planning | 26 | intent decision matrix, identity, digest, transition fingerprint, size/noise rules, image deprecation | +| Domain/configuration/pure planning | 26 | intent decision matrix, identity, digest, transition fingerprint, size/noise rules, decorative-media exclusion | | State/application/idempotency/races | 30 | create/update/unchanged, stale source, out-of-order revision, duplicate create healing, partial publication, per-feature coordination | | Adapters/provider contracts | 18 | ownership filtering, pagination, create/update/delete, review threads, rate-limit/error mapping, trusted URLs | | Workflows/setup/schema | 16 | issue/PR/push/single-action routes, completion omission, setup defaults, doctor warnings, marker/workflow contracts | @@ -1188,17 +1180,15 @@ Required quality gates: | Issue author | `docs/issues/comment-commands.mdx`, `docs/issues/branch-management.mdx` | direct replies, plan/progress cards, branch-sync action | command contract fixture | | PR author | `docs/pull-requests/capabilities.mdx`, Bugbot publication docs | status card vs inline finding vs Check; close/merge behavior | review fixture matrix | | Release operator | `docs/issues/deployment-orchestration.mdx` | one dashboard, opt-in milestones, partial-success wording | operation-state fixture links | -| Setup owner | `docs/configuration.mdx`, issue/PR configuration pages, checklist | image default/deprecation and immutable noise limits | action/setup schema test | +| Setup owner | `docs/configuration.mdx`, issue/PR configuration pages, checklist | public inputs and immutable noise limits | action/setup schema test | | Operator | troubleshooting, error reference, quality observability | Job Summary ownership, publication degradation, cleanup | decision tree and error-code test | | CLI/single-action user | single-action available/configuration/workflow pages | requested comment is not wrapped; plan/progress identity | CLI/action parity test | | Contributor | `docs/development/architecture.mdx`, specification catalog | outcome/evidence split, ports, markers, forbidden call sites | architecture/source inventory tests | Every before/after example in user documentation MUST be sourced from or checked against the same semantic fixtures as the renderer tests. Documentation MUST not -state that images, debug comments, generic action headings, or per-push commit -comments are the default after rollout. Migration notes identify the exact -minor/major removal window and are deleted when the deprecated inputs are -removed. +state that decorative media, debug comments, generic action headings, or +per-push commit comments are generated after rollout. ## 16. Acceptance scenarios @@ -1244,8 +1234,9 @@ removed. 15. Given hostile model/provider/user Markdown containing mentions, commands, or forged markers, then the visible message is safe and ownership/state cannot be forged. -16. Given image inputs are omitted after rollout, then all configured defaults - are false and no generated conversation contains decorative image Markdown. +16. Given the public action contract, then no image toggle or URL-pool input is + present, no runtime image configuration exists, and no generated + conversation contains decorative image Markdown. 17. Given an action explicitly publishes caller-supplied issue content, then exactly that bounded create/update/append occurs without a generic wrapper; existing authorization and sanitization contracts remain in force. @@ -1275,7 +1266,7 @@ removed. | §6.4 one canonical card | owned query/mutation ports and reconciler | duplicate/race/pagination tests | operator recovery guide | | §6.5 freshness | source guard and feature revisions | stale/out-of-order/replay tests | observability guide | | §6.5.1 event ownership | distinct push/PR groups + exact-head preflight and ownership policy | workflow contract, push-shaped preflight integration test, policy matrix, PR #367 paired-event evidence | workflow setup and Bugbot guides | -| §7 quiet/image defaults | action/setup configuration policies | action schema, setup, doctor, migration tests | configuration and upgrade pages | +| §7 quiet/decorative-media boundary | action and runtime configuration policies | action-schema absence and source-inventory tests | configuration pages | | §8 clean boundaries | architecture and source-inventory checks | executable boundary tests | contributor architecture | | §9 message hierarchy/examples | localized feature renderers | semantic golden fixtures and manual UX matrix | user journeys | | §9.4 notification budget | notification budget policy | per-event/per-lifecycle count assertions | notifications page | @@ -1283,7 +1274,7 @@ removed. | §10 partial/recovery | error presentation and publication-only retry | failure/partial/irreversible cases | error/troubleshooting pages | | §11 trust/ownership | marker parser, sanitizer, authorization | forged marker/mention/secret tests | security operations | | §12 evidence/metrics | Job Summary and telemetry ports | summary/metric assertions | quality observability | -| §13 migration | legacy marker readers and deprecated inputs | adoption/rollback/deprecation tests | migration guide | +| §13 adoption | marker adoption and greenfield input removal | adoption, rollback, and schema-absence tests | architecture and configuration guides | | §14 quality budget | coverage scripts and disjoint communication test ledger | 160 allocated semantic cases plus CI coverage evidence | contributor testing guide | ## 18. Implementation sequence @@ -1303,8 +1294,9 @@ removed. inactivity, access-policy, and single actions with end-to-end tests. 7. Adopt shared contracts in branch sync, Bugbot, and release while retaining their feature state and safety policies. -8. Change image defaults, add setup/doctor migration, regenerate action/setup - bundles, and remove visible watermarks/footers from generated messages. +8. Remove image inputs, image runtime code, and random-selection dependencies; + regenerate action/setup bundles and remove visible watermarks/footers from + generated messages. 9. Update every named user/operator/contributor page and bind examples to renderer fixtures. 10. Run typecheck, lint, unit/integration/coverage, workflow, documentation, @@ -1321,7 +1313,7 @@ removed. - [x] Plans, progress, branch sync, Bugbot, releases, lifecycle, failures, explicit replies, and single actions implement the representative contract. - [x] No new conversation contains retired generic headings, debug logs, - decorative media by default, “Happy coding”, or the visible default + decorative media, “Happy coding”, or the visible default marketplace watermark. - [x] Job Summary and logs retain bounded, masked operator evidence and link from actionable UI. @@ -1329,8 +1321,8 @@ removed. enforced. - [x] The 128-case numeric budget and changed-module coverage gates pass without double counting localization tests. -- [x] Configuration defaults, deprecated image window, setup, doctor, action - schema, and generated bundles agree. +- [x] Action schema, runtime configuration, setup, CLI, docs, dependencies, and + generated bundles contain no decorative-image configuration surface. - [x] English-default and configured-locale output passes the companion SDD. - [x] User, setup, operator, security, migration, and contributor documentation is complete, discoverable, fixture-backed, and contains no stale behavior. @@ -1392,5 +1384,3 @@ implementation change so current and proposed documentation cannot be confused. - Measuring reader comprehension or notification-open rates requires product analytics and user consent not currently available. -- Removing deprecated image inputs occurs in the next major after the specified - compatibility window; it is not silently accelerated. diff --git a/src/actions/__tests__/configuration_builders.test.ts b/src/actions/__tests__/configuration_builders.test.ts index f145aad06..c8f9b51e9 100644 --- a/src/actions/__tests__/configuration_builders.test.ts +++ b/src/actions/__tests__/configuration_builders.test.ts @@ -1,4 +1,4 @@ -import { buildEmoji, buildImages, buildIssue, buildIssueTypes, buildLabels, buildLocale, buildProjects, buildPullRequest, buildTokens, buildWorkflows } from '../configuration_builders'; +import { buildEmoji, buildIssue, buildIssueTypes, buildLabels, buildLocale, buildProjects, buildPullRequest, buildTokens, buildWorkflows } from '../configuration_builders'; describe('configuration builders', () => { it('builds locale and workflows', () => { @@ -39,25 +39,6 @@ describe('configuration builders', () => { expect(buildTokens('token')).toMatchObject({ token: 'token' }); }); - it('maps image configuration by scope without positional ambiguity', () => { - const scope = (prefix: string) => ({ - automatic: [`${prefix}-automatic`], - feature: [`${prefix}-feature`], - bugfix: [`${prefix}-bugfix`], - release: [`${prefix}-release`], - hotfix: [`${prefix}-hotfix`], - docs: [`${prefix}-docs`], - chore: [`${prefix}-chore`], - }); - const images = buildImages({ onIssue: true, onPullRequest: false, onCommit: true, issue: scope('issue'), pullRequest: scope('pr'), commit: scope('commit') }); - - expect(images.imagesOnIssue).toBe(true); - expect(images.imagesOnPullRequest).toBe(false); - expect(images.issueFeatureGifs).toEqual(['issue-feature']); - expect(images.pullRequestAutomaticActions).toEqual(['pr-automatic']); - expect(images.commitChoreGifs).toEqual(['commit-chore']); - }); - it('maps labels by branching, workflow, priority, and size groups', () => { const labels = buildLabels({ branching: { launcher: 'branched' }, diff --git a/src/actions/__tests__/github_action_completion.test.ts b/src/actions/__tests__/github_action_completion.test.ts index 7e7489c10..673df1bff 100644 --- a/src/actions/__tests__/github_action_completion.test.ts +++ b/src/actions/__tests__/github_action_completion.test.ts @@ -104,24 +104,6 @@ function execution(): Execution { release: { active: false }, hotfix: { active: false }, debug: false, - images: { - imagesOnIssue: false, - issueAutomaticActions: [], - issueFeatureGifs: [], - issueBugfixGifs: [], - issueReleaseGifs: [], - issueHotfixGifs: [], - issueDocsGifs: [], - issueChoreGifs: [], - imagesOnPullRequest: false, - pullRequestAutomaticActions: [], - pullRequestFeatureGifs: [], - pullRequestBugfixGifs: [], - pullRequestReleaseGifs: [], - pullRequestHotfixGifs: [], - pullRequestDocsGifs: [], - pullRequestChoreGifs: [], - }, tokens: { token: 'product-pat' }, ai: new Ai('', 'model', false, [], false, 'low', 20), } as unknown as Execution; diff --git a/src/actions/__tests__/image_configuration_builder.test.ts b/src/actions/__tests__/image_configuration_builder.test.ts deleted file mode 100644 index 01d56bdbf..000000000 --- a/src/actions/__tests__/image_configuration_builder.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { DEFAULT_IMAGE_CONFIG } from '../default_image_config'; -import { INPUT_KEYS } from '../../application/contracts/input_keys'; -import { buildImageConfiguration } from '../image_configuration_builder'; - -describe('buildImageConfiguration', () => { - it('uses configured values and defaults independently per group/variant', () => { - const config = buildImageConfiguration(key => { - if (key === INPUT_KEYS.IMAGES_ON_ISSUE) return 'true'; - if (key === INPUT_KEYS.IMAGES_ISSUE_FEATURE) return ' custom-a, custom-b '; - return ''; - }); - - expect(config.onIssue).toBe(true); - expect(config.onPullRequest).toBe(false); - expect(config.issue.feature).toEqual(['custom-a', 'custom-b']); - expect(config.issue.automatic).toEqual(DEFAULT_IMAGE_CONFIG.issue.automatic); - expect(config.pullRequest.docs).toEqual(DEFAULT_IMAGE_CONFIG.pullRequest.docs); - }); -}); diff --git a/src/actions/__tests__/local_action.test.ts b/src/actions/__tests__/local_action.test.ts index 0506e4a82..abb8c9322 100644 --- a/src/actions/__tests__/local_action.test.ts +++ b/src/actions/__tests__/local_action.test.ts @@ -368,28 +368,6 @@ describe('runLocalAction', () => { expect(content).not.toContain('El proveedor no estaba disponible'); }); - it('uses custom image URLs when provided so default image arrays are not pushed', async () => { - const params: Record = { - [INPUT_KEYS.TOKEN]: 't', - [INPUT_KEYS.IMAGES_ISSUE_AUTOMATIC]: 'https://custom-auto.example.com', - [INPUT_KEYS.IMAGES_ISSUE_FEATURE]: 'https://custom-feature.example.com', - [INPUT_KEYS.IMAGES_ISSUE_BUGFIX]: 'https://custom-bugfix.example.com', - [INPUT_KEYS.IMAGES_ISSUE_DOCS]: 'https://custom-docs.example.com', - repo: { owner: 'o', repo: 'r' }, - eventName: 'push', - commits: { ref: 'refs/heads/main' }, - }; - - await runLocalAction(params); - - const execution = mockMainRun.mock.calls[0][0]; - expect(execution.images).toBeDefined(); - expect(execution.images.issueAutomaticActions).toContain('https://custom-auto.example.com'); - expect(execution.images.issueFeatureGifs).toContain('https://custom-feature.example.com'); - expect(execution.images.issueBugfixGifs).toContain('https://custom-bugfix.example.com'); - expect(execution.images.issueDocsGifs).toContain('https://custom-docs.example.com'); - }); - it('uses actionInputs when additionalParams omit token and opencode url', async () => { mockGetActionInputsWithDefaults.mockReturnValue({ ...minimalActionInputs(), diff --git a/src/actions/configuration_builders.ts b/src/actions/configuration_builders.ts index 20e5537e7..d9feca810 100644 --- a/src/actions/configuration_builders.ts +++ b/src/actions/configuration_builders.ts @@ -1,6 +1,5 @@ import { Emoji } from '../data/model/emoji'; import { Issue } from '../data/model/issue'; -import { Images } from '../data/model/images'; import { IssueTypes } from '../data/model/issue_types'; import { Labels } from '../data/model/labels'; import { Locale } from '../data/model/locale'; @@ -12,25 +11,6 @@ import { Workflows } from '../data/model/workflows'; import type { ExecutionInputs } from '../data/model/execution_inputs'; import type { CopilotLifecycleLabels } from '../domain/copilot_lifecycle'; -export interface ImageScopeValues { - automatic: string[]; - feature: string[]; - bugfix: string[]; - release: string[]; - hotfix: string[]; - docs: string[]; - chore: string[]; -} - -export interface ImageConfigurationValues { - onIssue: boolean; - onPullRequest: boolean; - onCommit: boolean; - issue: ImageScopeValues; - pullRequest: ImageScopeValues; - commit: ImageScopeValues; -} - export interface LabelValues { branching: { launcher: string }; workflow: { bug: string; bugfix: string; hotfix: string; enhancement: string; feature: string; release: string; question: string; help: string; deploy: string; deployed: string; docs: string; documentation: string; chore: string; maintenance: string }; @@ -133,32 +113,3 @@ export function buildIssueTypes(values: IssueTypeConfigurationValues): IssueType values.help.name, values.help.description, values.help.color, ); } - -export function buildImages(values: ImageConfigurationValues): Images { - return new Images( - values.onIssue, - values.onPullRequest, - values.onCommit, - values.issue.automatic, - values.issue.feature, - values.issue.bugfix, - values.issue.docs, - values.issue.chore, - values.issue.release, - values.issue.hotfix, - values.pullRequest.automatic, - values.pullRequest.feature, - values.pullRequest.bugfix, - values.pullRequest.release, - values.pullRequest.hotfix, - values.pullRequest.docs, - values.pullRequest.chore, - values.commit.automatic, - values.commit.feature, - values.commit.bugfix, - values.commit.release, - values.commit.hotfix, - values.commit.docs, - values.commit.chore, - ); -} diff --git a/src/actions/default_image_config.ts b/src/actions/default_image_config.ts deleted file mode 100644 index 51232f26e..000000000 --- a/src/actions/default_image_config.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** Default illustration URLs used when an action does not receive custom images. */ -export const DEFAULT_IMAGE_CONFIG = { - issue: { - automatic: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzRsNGFicndqMXgzMTVwdnhpeXNyZGsydXVxamV4eGxndWhna291OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ktcUyw6mBlMVa/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjkyeWVubngzM28xODFrbXZ4Nng3Y2hubmM4cXJqNGpic3Bheml0NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/M11UVCRrc0LUk/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenQwNDJmZnZraDBzNXBoNjUwZjEzMzFlanMxcHVodmF4b3l3bDl2biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/zrdUjl6N99nLq/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp" - ], - feature: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYmc4YWplZWs0Y2c3ZXNtbGpwZnQzdWpncmNjNXpodjg3MHdtbnJ5NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OMK7LRBedcnhm/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHBrYXpmd2poeGU5cWswbjRqNmJlZ2U2dWc0ejVpY3RpcXVuYTY3dSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/llKJGxQ1ESmac/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMnFleXV0MXZteGN6c2s2b3R3ZGc2cWY1aXB0Y3ZzNmpvZHhyNDVmNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10FwycrnAkpshW/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExcHo0MjIzaGIycTRmeWFwZmp6bGExczJicXcyZTQxemsxaTY1b3V1NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QKkV58ufpV4ksJ1Okh/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExazc3OWszenA5c2FlemE3a25oNnlmZDBra3liMWRqMW82NzM2b2FveCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xPGkOAdiIO3Is/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3liaGF2NzI3bzM1YjRmdHFsaGdyenp4b3o3M3dqM3F0bGN5MHZtNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/npUpB306c3EStRK6qP/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExZWh6d3Nld3E0MTF1eTk2YXFibnI3MTBhbGtpamJiemRwejl3YmkzMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/gU25raLP4pUu4/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp" - ], - hotfix: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExd2R0cjNxbXBjZjRjNmg4NmN3MGlhazVkNHJsaDkxMHZkY2hweGRtZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/pCU4bC7kC6sxy/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenkyZTc3aDlweWl0MnI0cXJsZGptY3g0bzE2NTY1aWMyaHd4Y201ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dbtDDSvWErdf2/giphy.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExM25ndGd2d3Uya3g3dnlnenJ1bjh0Y2NtNHdwZHY3Mjh2NnBmZDJpbyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2xF8gHUf085aNyyAQR/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjU3bHdsc3FtamlyazBlbWppNHc3MTV3MW4xdHd2cWo4b2tzbTkwcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1EghTrigJJhq8/200.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp" - ], - release: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2NxcHEzam92enRtd29xc21pMHhmbHozMWljamF1cmt4cjhwZTI0ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/PApUm1HPVYlDNLoMmr/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNXU4dnhwOWVqZzc4NXVsdTY3c2I4Mm9lOHF1c253MDJya25zNXU0ZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dxn6fRlTIShoeBr69N/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExbXN2bjJob3pxazE2NDJhbGE3ZWY5d2dzbDM4czgwZnA4ejlxY3ZqeCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/9D37RaHngWP7ZmmsEt/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExZnI0YTM2N2hwamd2dXYwNmN2MjRpYXIyN203cnNpbW13YjNhZGRhdyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LYWPXVUNz30ze/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdW1jZ3F4ZGRwMWkyc3ZocHJ3aXhyb2FuZGppcnMyMWtsYXpjbDY2ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tXLpxypfSXvUc/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHRianpoOW51MzZ4Yjk3MmNpbmdseTJlb3o3dWVpYzJpazc5ZHNoayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/b85mPT4Usz7fq/giphy.gif", - ], - docs: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGRpZHJqYzRvZ25xcjR3ZXcwbzVudXF2Z2hsaHoyc2g1ZjZuam81YiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/eDArHBLT4aATKEKtCd/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2NubXR1b2M1dDQ2Z2UxYmk5bzltbHdudWI1emVzOGFlbDNsOGU1bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/wpgYasZ0tBrP4lCgS3/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmEyNzc3M2V0anp4d2JtOTJuMTZ2dXNnMmEyN3A4MmE0ZGpiaDhnNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orifaQEOagjYJ1EXe/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZjUyenc2eG5pZ3NjYzcyZXg2dDFndm5qZHRqMHk5amNoYjhhNnNvZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/7E8lI6TkLrvvAcPXso/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExaWFxcXZ3MTMxM3Bjd2IwNG43ZDJjdndreXNmdTVvZ2g3Z2Q4NjczMCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3tJdi9wQQ10BD2H47g/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFrejZmaHQ2Z2o1Y3B2MDl6cmU5bzNybG84eXFrYjBjZjV0dGFpeSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fsXOS3oBboiYf6fSsY/giphy.gif", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHdhOHRianU1YmtrNHE0c2R2M2I2MTBzNnZhdnBrMW5ueG02eHF6OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieOEBYMAwTClHqM/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFtNXY0ZXdmdGxkdno2Nm5odGk3Nzd3aTRuYnJtbDA4MXIxdHFhdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10zsjaH4g0GgmY/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZG1sNXB6eTZvdDNtNzJwNXVxenNjendwaGgxb2xzNWI1dGNpdTVmZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NHHYRm7mAUQ6Y/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHd4bDJrc216YWpicDQ5emczdWF3bTk0dXYzeGQ4ajg2a3IyYjV6diZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/FHEjBpiqMwSuA/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExM3d5b2U1Z3Jic3AxY2llYjQwNW5wODFpNWp5NHY0dGV5Z2cxdThkdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/kLZNLNqUZ6bC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTNpZ2w0c3NrMmc0cmZobTd2eTM3YTRlM2lnbWpoZDUzNnRjdnNmZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NV4cSrRYXXwfUcYnua/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmFzZHNuODg0dDRheGt0aGU2bjVvd2xiNDI1bWFmYTVsbHJ2eHI2dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XaAbmtzzz35IgW3Ntn/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWM2OHkzYmNkajZxa204Njg0bmQzaWp1M3NobnJjbWxyYWJrbDNnciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OiwOPq0fFqqyainyMu/giphy.gif", - ], - }, - pullRequest: { - automatic: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzRsNGFicndqMXgzMTVwdnhpeXNyZGsydXVxamV4eGxndWhna291OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ktcUyw6mBlMVa/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjkyeWVubngzM28xODFrbXZ4Nng3Y2hubmM4cXJqNGpic3Bheml0NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/M11UVCRrc0LUk/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenQwNDJmZnZraDBzNXBoNjUwZjEzMzFlanMxcHVodmF4b3l3bDl2biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/zrdUjl6N99nLq/200.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - ], - feature: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMm5iZHJydTJ4NGticXdxd3ZxYnZqNXdvaDQwOHdtb3o5NTRhdnRhOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LSX49vHf7JHGyGjrC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYmc4YWplZWs0Y2c3ZXNtbGpwZnQzdWpncmNjNXpodjg3MHdtbnJ5NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OMK7LRBedcnhm/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHBrYXpmd2poeGU5cWswbjRqNmJlZ2U2dWc0ejVpY3RpcXVuYTY3dSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/llKJGxQ1ESmac/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExMnFleXV0MXZteGN6c2s2b3R3ZGc2cWY1aXB0Y3ZzNmpvZHhyNDVmNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10FwycrnAkpshW/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExcHo0MjIzaGIycTRmeWFwZmp6bGExczJicXcyZTQxemsxaTY1b3V1NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QKkV58ufpV4ksJ1Okh/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExazc3OWszenA5c2FlemE3a25oNnlmZDBra3liMWRqMW82NzM2b2FveCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xPGkOAdiIO3Is/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3liaGF2NzI3bzM1YjRmdHFsaGdyenp4b3o3M3dqM3F0bGN5MHZtNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/npUpB306c3EStRK6qP/200.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExZWh6d3Nld3E0MTF1eTk2YXFibnI3MTBhbGtpamJiemRwejl3YmkzMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/gU25raLP4pUu4/giphy.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp", - ], - hotfix: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmozN3plMWNiYjZoemh6N2RmeTB1MG9ieHlqYTJsb3BrZmNoY3h0dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/stv1Dliu5TrMs/giphy.webp", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExd2R0cjNxbXBjZjRjNmg4NmN3MGlhazVkNHJsaDkxMHZkY2hweGRtZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/pCU4bC7kC6sxy/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExenkyZTc3aDlweWl0MnI0cXJsZGptY3g0bzE2NTY1aWMyaHd4Y201ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dbtDDSvWErdf2/giphy.webp", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExM25ndGd2d3Uya3g3dnlnenJ1bjh0Y2NtNHdwZHY3Mjh2NnBmZDJpbyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2xF8gHUf085aNyyAQR/200.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjU3bHdsc3FtamlyazBlbWppNHc3MTV3MW4xdHd2cWo4b2tzbTkwcSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1EghTrigJJhq8/200.webp", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmM1OWR0cnk5eXI0dXpoNWRzbmVseTVyd2l3MzdrOHZueHJ6bjhjMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12yjKJaLB7DuG4/giphy.webp", - ], - release: [ - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2NxcHEzam92enRtd29xc21pMHhmbHozMWljamF1cmt4cjhwZTI0ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/PApUm1HPVYlDNLoMmr/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNXU4dnhwOWVqZzc4NXVsdTY3c2I4Mm9lOHF1c253MDJya25zNXU0ZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dxn6fRlTIShoeBr69N/giphy.webp", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExbXN2bjJob3pxazE2NDJhbGE3ZWY5d2dzbDM4czgwZnA4ejlxY3ZqeCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/9D37RaHngWP7ZmmsEt/giphy.webp", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExZnI0YTM2N2hwamd2dXYwNmN2MjRpYXIyN203cnNpbW13YjNhZGRhdyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LYWPXVUNz30ze/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdW1jZ3F4ZGRwMWkyc3ZocHJ3aXhyb2FuZGppcnMyMWtsYXpjbDY2ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tXLpxypfSXvUc/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHRianpoOW51MzZ4Yjk3MmNpbmdseTJlb3o3dWVpYzJpazc5ZHNoayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/b85mPT4Usz7fq/giphy.gif", - ], - docs: [ - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGRpZHJqYzRvZ25xcjR3ZXcwbzVudXF2Z2hsaHoyc2g1ZjZuam81YiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/eDArHBLT4aATKEKtCd/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2NubXR1b2M1dDQ2Z2UxYmk5bzltbHdudWI1emVzOGFlbDNsOGU1bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/wpgYasZ0tBrP4lCgS3/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmEyNzc3M2V0anp4d2JtOTJuMTZ2dXNnMmEyN3A4MmE0ZGpiaDhnNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orifaQEOagjYJ1EXe/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZjUyenc2eG5pZ3NjYzcyZXg2dDFndm5qZHRqMHk5amNoYjhhNnNvZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/7E8lI6TkLrvvAcPXso/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExaWFxcXZ3MTMxM3Bjd2IwNG43ZDJjdndreXNmdTVvZ2g3Z2Q4NjczMCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3tJdi9wQQ10BD2H47g/giphy.gif", - "https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFrejZmaHQ2Z2o1Y3B2MDl6cmU5bzNybG84eXFrYjBjZjV0dGFpeSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fsXOS3oBboiYf6fSsY/giphy.gif", - "https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHdhOHRianU1YmtrNHE0c2R2M2I2MTBzNnZhdnBrMW5ueG02eHF6OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieOEBYMAwTClHqM/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjFtNXY0ZXdmdGxkdno2Nm5odGk3Nzd3aTRuYnJtbDA4MXIxdHFhdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10zsjaH4g0GgmY/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZG1sNXB6eTZvdDNtNzJwNXVxenNjendwaGgxb2xzNWI1dGNpdTVmZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NHHYRm7mAUQ6Y/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExNHd4bDJrc216YWpicDQ5emczdWF3bTk0dXYzeGQ4ajg2a3IyYjV6diZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/FHEjBpiqMwSuA/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExM3d5b2U1Z3Jic3AxY2llYjQwNW5wODFpNWp5NHY0dGV5Z2cxdThkdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/kLZNLNqUZ6bC0/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbTNpZ2w0c3NrMmc0cmZobTd2eTM3YTRlM2lnbWpoZDUzNnRjdnNmZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/NV4cSrRYXXwfUcYnua/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmFzZHNuODg0dDRheGt0aGU2bjVvd2xiNDI1bWFmYTVsbHJ2eHI2dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XaAbmtzzz35IgW3Ntn/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWM2OHkzYmNkajZxa204Njg0bmQzaWp1M3NobnJjbWxyYWJrbDNnciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OiwOPq0fFqqyainyMu/giphy.gif", - ], - }, - commit: { - automatic: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - feature: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - bugfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - hotfix: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - release: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - docs: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ], - chore: [ - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExdWp2OGJ5ZmczaGhiMmVxdjRxMWZnYnRrNW5uemlmd2Ewam1nNGd0aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2XflxzEtr4EPIEzioLu/giphy.gif", - "https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExaTkzeTFveHd6N3Fubm8yZDlpYTVuMnp0bm1rODQyZDdpbTF4YzAxaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/n2IPMYMthV0m4/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3BmNXV1YzZod2NkYjZ3aTE1Z3BwMWJ0ZG9uMXN0bm5pbDQ4ajBvaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3WxRbhsvQjYw8/giphy.gif", - "https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWs5YXEyajhoNWI1aHdxeHNwcmt2czY2NW1mNjZrbnViYm9reXJsZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/loLqo6AzjUcMdjS1Jj/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExdHh5MndyMzBmY3c3bDRxeGhpanF2ZjIycGpmbzlkMDV5cDJkeXhjMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3orieQDBZVlki2mJLW/giphy.gif", - "https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExNGdkaHFsMTlzM2ZuY3R5ZXJpZmo3cHRqZWJieXVlOHQwc2F3eGVrdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tELuxgGsoL62ihEtQs/giphy.gif", - ] - } -}; diff --git a/src/actions/github_action_execution.ts b/src/actions/github_action_execution.ts index 392bed581..28bf34eee 100644 --- a/src/actions/github_action_execution.ts +++ b/src/actions/github_action_execution.ts @@ -11,7 +11,6 @@ import { parseBoundedPositiveIntegerInput, parseIntegerInput } from './input_num import { parseDelimitedValues } from './input_values_policy'; import { readGithubActionAiInputs } from './github_action_ai_inputs'; import { prepareGithubAgentRuntime } from './github_action_runtime'; -import { readGithubActionImageInputs } from './github_action_image_inputs'; import { readGithubActionLocaleInputs } from './github_action_locale_inputs'; import { buildSizeThresholds } from './size_threshold_builder'; import { readGithubActionThresholdInputs } from './github_action_threshold_inputs'; @@ -22,7 +21,7 @@ import { readGithubActionWorkflowInputs } from './github_action_workflow_inputs' import { readGithubActionIssueTypeInputs } from './github_action_issue_type_inputs'; import { readGithubActionProjectInputs } from './github_action_project_inputs'; import { buildExecution } from './execution_builder'; -import { buildEmoji, buildImages, buildIssue, buildIssueTypes, buildLabels, buildLocale, buildProjects, buildPullRequest, buildTokens, buildWorkflows } from './configuration_builders'; +import { buildEmoji, buildIssue, buildIssueTypes, buildLabels, buildLocale, buildProjects, buildPullRequest, buildTokens, buildWorkflows } from './configuration_builders'; import { loadProjectDetails } from './project_details_loader'; import type { buildGithubActionEventInputs } from './github_event_inputs'; import { DEFAULT_INACTIVITY_THRESHOLD_HOURS, MAX_INACTIVITY_THRESHOLD_HOURS } from '../domain/issue_inactivity'; @@ -75,7 +74,6 @@ export async function buildGithubActionExecution( token, ); const projectInputs = readGithubActionProjectInputs(getInput, projects); - const imageConfiguration = readGithubActionImageInputs(getInput); const workflowInputs = readGithubActionWorkflowInputs(getInput); const labelInputs = readGithubActionLabelInputs(getInput); const issueTypeInputs = readGithubActionIssueTypeInputs(getInput); @@ -112,7 +110,6 @@ export async function buildGithubActionExecution( getInput(INPUT_KEYS.EMOJI_LABELED_TITLE) === 'true', getInput(INPUT_KEYS.BRANCH_MANAGEMENT_EMOJI), ), - images: buildImages(imageConfiguration), tokens: buildTokens(token), ai: new Ai( '', diff --git a/src/actions/github_action_image_inputs.ts b/src/actions/github_action_image_inputs.ts deleted file mode 100644 index ca16f458c..000000000 --- a/src/actions/github_action_image_inputs.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { buildImageConfiguration, type ResolvedImageConfiguration } from './image_configuration_builder'; - -export function readGithubActionImageInputs( - getInput: (key: string) => unknown, -): ResolvedImageConfiguration { - return buildImageConfiguration(getInput); -} diff --git a/src/actions/image_configuration_builder.ts b/src/actions/image_configuration_builder.ts deleted file mode 100644 index cf967004f..000000000 --- a/src/actions/image_configuration_builder.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { DEFAULT_IMAGE_CONFIG } from './default_image_config'; -import { INPUT_KEYS } from '../application/contracts/input_keys'; -import { isEnabledInput } from './input_boolean_policy'; -import { parseDelimitedValues } from './input_values_policy'; - -export type ImageConfigurationReader = (key: string) => unknown; - -type ImageGroup = keyof typeof DEFAULT_IMAGE_CONFIG; -type ImageVariant = keyof (typeof DEFAULT_IMAGE_CONFIG)[ImageGroup]; - -export interface ResolvedImageConfiguration { - onIssue: boolean; - onPullRequest: boolean; - onCommit: boolean; - issue: Record; - pullRequest: Record; - commit: Record; -} - -const imageInputKeys: Record> = { - issue: { - automatic: INPUT_KEYS.IMAGES_ISSUE_AUTOMATIC, - feature: INPUT_KEYS.IMAGES_ISSUE_FEATURE, - bugfix: INPUT_KEYS.IMAGES_ISSUE_BUGFIX, - release: INPUT_KEYS.IMAGES_ISSUE_RELEASE, - hotfix: INPUT_KEYS.IMAGES_ISSUE_HOTFIX, - docs: INPUT_KEYS.IMAGES_ISSUE_DOCS, - chore: INPUT_KEYS.IMAGES_ISSUE_CHORE, - }, - pullRequest: { - automatic: INPUT_KEYS.IMAGES_PULL_REQUEST_AUTOMATIC, - feature: INPUT_KEYS.IMAGES_PULL_REQUEST_FEATURE, - bugfix: INPUT_KEYS.IMAGES_PULL_REQUEST_BUGFIX, - release: INPUT_KEYS.IMAGES_PULL_REQUEST_RELEASE, - hotfix: INPUT_KEYS.IMAGES_PULL_REQUEST_HOTFIX, - docs: INPUT_KEYS.IMAGES_PULL_REQUEST_DOCS, - chore: INPUT_KEYS.IMAGES_PULL_REQUEST_CHORE, - }, - commit: { - automatic: INPUT_KEYS.IMAGES_COMMIT_AUTOMATIC, - feature: INPUT_KEYS.IMAGES_COMMIT_FEATURE, - bugfix: INPUT_KEYS.IMAGES_COMMIT_BUGFIX, - release: INPUT_KEYS.IMAGES_COMMIT_RELEASE, - hotfix: INPUT_KEYS.IMAGES_COMMIT_HOTFIX, - docs: INPUT_KEYS.IMAGES_COMMIT_DOCS, - chore: INPUT_KEYS.IMAGES_COMMIT_CHORE, - }, -}; - -export function buildImageConfiguration( - read: ImageConfigurationReader, -): ResolvedImageConfiguration { - const groups = {} as Pick; - - for (const group of Object.keys(imageInputKeys) as ImageGroup[]) { - const variants = {} as Record; - for (const variant of Object.keys(imageInputKeys[group]) as ImageVariant[]) { - const configured = parseDelimitedValues(read(imageInputKeys[group][variant])); - variants[variant] = configured.length > 0 - ? configured - : [...DEFAULT_IMAGE_CONFIG[group][variant]]; - } - groups[group] = variants; - } - - return { - onIssue: isEnabledInput(read(INPUT_KEYS.IMAGES_ON_ISSUE)), - onPullRequest: isEnabledInput(read(INPUT_KEYS.IMAGES_ON_PULL_REQUEST)), - onCommit: isEnabledInput(read(INPUT_KEYS.IMAGES_ON_COMMIT)), - ...groups, - }; -} diff --git a/src/actions/local_action_configuration_sections.ts b/src/actions/local_action_configuration_sections.ts index fd9996c72..0c2d99b36 100644 --- a/src/actions/local_action_configuration_sections.ts +++ b/src/actions/local_action_configuration_sections.ts @@ -10,7 +10,6 @@ import { loadProjectDetails } from './project_details_loader'; import { parseBoundedPositiveIntegerInput, parseIntegerInput } from './input_number_policy'; import { parseDelimitedValues } from './input_values_policy'; import { buildAgentTasksFromValues } from './agent_input_builder'; -import { buildImageConfiguration } from './image_configuration_builder'; import { normalizePullRequestDescriptionMode } from '../domain/pull_request_description'; import { DEFAULT_INACTIVITY_THRESHOLD_HOURS, MAX_INACTIVITY_THRESHOLD_HOURS } from '../domain/issue_inactivity'; import { normalizeBugbotReviewEffort, parseBugbotOrganizationRules } from '../domain/bugbot/review_configuration'; @@ -265,7 +264,6 @@ export function readLocalWorkflowConfiguration( read(INPUT_KEYS.PULL_REQUESTS_LOCALE) || '', ); return { - imageConfiguration: buildImageConfiguration((key) => additionalParams[key] ?? actionInputs[key]), releaseWorkflow: read(INPUT_KEYS.RELEASE_WORKFLOW), hotfixWorkflow: read(INPUT_KEYS.HOTFIX_WORKFLOW), titleEmoji: read(INPUT_KEYS.EMOJI_LABELED_TITLE) === 'true', diff --git a/src/actions/local_action_execution.ts b/src/actions/local_action_execution.ts index 3b67aa05d..884058782 100644 --- a/src/actions/local_action_execution.ts +++ b/src/actions/local_action_execution.ts @@ -4,7 +4,7 @@ import { Release } from '../data/model/release'; import { SingleAction } from '../data/model/single_action'; import { Welcome } from '../data/model/welcome'; import { buildExecution } from './execution_builder'; -import { buildEmoji, buildImages, buildIssue, buildIssueTypes, buildLabels, buildLocale, buildProjects, buildPullRequest, buildTokens, buildWorkflows } from './configuration_builders'; +import { buildEmoji, buildIssue, buildIssueTypes, buildLabels, buildLocale, buildProjects, buildPullRequest, buildTokens, buildWorkflows } from './configuration_builders'; import { buildBranches } from './branches_builder'; import { buildSizeThresholds } from './size_threshold_builder'; import type { LocalActionConfiguration } from './local_action_configuration'; @@ -19,7 +19,7 @@ export function buildLocalActionExecution( inactivityThresholdHours, commitPrefixBuilder, branchManagementAlways, reopenIssueOnPush, issueDesiredAssigneesCount, pullRequestDesiredAssigneesCount, pullRequestDesiredReviewersCount, - titleEmoji, branchManagementEmoji, imageConfiguration, token, agentModel, + titleEmoji, branchManagementEmoji, token, agentModel, aiPullRequestDescriptionMode, aiMembersOnly, aiIgnoreFiles, aiIncludeReasoning, bugbotSeverity, bugbotCommentLimit, bugbotFixVerifyCommands, bugbotReviewConfiguration, agentTasks, branchManagementLauncherLabel, bugLabel, bugfixLabel, hotfixLabel, enhancementLabel, featureLabel, releaseLabel, questionLabel, helpLabel, @@ -59,14 +59,6 @@ export function buildLocalActionExecution( issue: buildIssue(branchManagementAlways, reopenIssueOnPush, issueDesiredAssigneesCount, additionalParams), pullRequest: buildPullRequest(pullRequestDesiredAssigneesCount, pullRequestDesiredReviewersCount, additionalParams), emoji: buildEmoji(titleEmoji, branchManagementEmoji), - images: buildImages({ - onIssue: imageConfiguration.onIssue, - onPullRequest: imageConfiguration.onPullRequest, - onCommit: imageConfiguration.onCommit, - issue: imageConfiguration.issue, - pullRequest: imageConfiguration.pullRequest, - commit: imageConfiguration.commit, - }), tokens: buildTokens(token), ai: new Ai( '', diff --git a/src/application/__tests__/architecture_boundaries.test.ts b/src/application/__tests__/architecture_boundaries.test.ts index 1899fc5e1..57057b3a7 100644 --- a/src/application/__tests__/architecture_boundaries.test.ts +++ b/src/application/__tests__/architecture_boundaries.test.ts @@ -97,7 +97,6 @@ describe('application architecture boundaries', () => { const allowedUtilities = new Set([ 'comment_watermark', 'content_utils', - 'list_utils', 'project_context_instruction', 'secret_redaction', 'task_emoji', diff --git a/src/application/contracts/input_keys.ts b/src/application/contracts/input_keys.ts index 12b739780..ff0e34098 100644 --- a/src/application/contracts/input_keys.ts +++ b/src/application/contracts/input_keys.ts @@ -81,32 +81,6 @@ export const INPUT_KEYS = { PROJECT_COLUMN_ISSUE_IN_PROGRESS: 'project-column-issue-in-progress', PROJECT_COLUMN_PULL_REQUEST_IN_PROGRESS: 'project-column-pull-request-in-progress', - // Images - IMAGES_ON_ISSUE: 'images-on-issue', - IMAGES_ON_PULL_REQUEST: 'images-on-pull-request', - IMAGES_ON_COMMIT: 'images-on-commit', - IMAGES_ISSUE_AUTOMATIC: 'images-issue-automatic', - IMAGES_ISSUE_FEATURE: 'images-issue-feature', - IMAGES_ISSUE_BUGFIX: 'images-issue-bugfix', - IMAGES_ISSUE_DOCS: 'images-issue-docs', - IMAGES_ISSUE_CHORE: 'images-issue-chore', - IMAGES_ISSUE_RELEASE: 'images-issue-release', - IMAGES_ISSUE_HOTFIX: 'images-issue-hotfix', - IMAGES_PULL_REQUEST_AUTOMATIC: 'images-pull-request-automatic', - IMAGES_PULL_REQUEST_FEATURE: 'images-pull-request-feature', - IMAGES_PULL_REQUEST_BUGFIX: 'images-pull-request-bugfix', - IMAGES_PULL_REQUEST_RELEASE: 'images-pull-request-release', - IMAGES_PULL_REQUEST_HOTFIX: 'images-pull-request-hotfix', - IMAGES_PULL_REQUEST_DOCS: 'images-pull-request-docs', - IMAGES_PULL_REQUEST_CHORE: 'images-pull-request-chore', - IMAGES_COMMIT_AUTOMATIC: 'images-commit-automatic', - IMAGES_COMMIT_FEATURE: 'images-commit-feature', - IMAGES_COMMIT_BUGFIX: 'images-commit-bugfix', - IMAGES_COMMIT_RELEASE: 'images-commit-release', - IMAGES_COMMIT_HOTFIX: 'images-commit-hotfix', - IMAGES_COMMIT_DOCS: 'images-commit-docs', - IMAGES_COMMIT_CHORE: 'images-commit-chore', - // Workflows RELEASE_WORKFLOW: 'release-workflow', HOTFIX_WORKFLOW: 'hotfix-workflow', diff --git a/src/application/usecases/__tests__/commit_use_case.test.ts b/src/application/usecases/__tests__/commit_use_case.test.ts index 4a4d3b16e..726822d5a 100644 --- a/src/application/usecases/__tests__/commit_use_case.test.ts +++ b/src/application/usecases/__tests__/commit_use_case.test.ts @@ -76,23 +76,6 @@ function minimalExecution(overrides: Record = {}): Execution { sizeThresholds: Object.fromEntries(['xxl', 'xl', 'l', 'm', 's', 'xs'].map(key => [key, { lines: 1, files: 1, commits: 1 }])), project: { getProjects: () => [] }, issue: { number: 123, reopenOnPush: false }, - release: { active: false }, - hotfix: { active: false }, - images: { - imagesOnCommit: false, - commitAutomaticActions: [], - commitFeatureGifs: [], - commitBugfixGifs: [], - commitReleaseGifs: [], - commitHotfixGifs: [], - commitDocsGifs: [], - commitChoreGifs: [], - }, - isBugfix: false, - isFeature: true, - isDocs: false, - isChore: false, - commitPrefixBuilder: '', pullRequest: { number: -1, head: '', action: '' }, ai: new Ai('', 'model', false, [], false, 'low', 20), ...overrides, @@ -142,7 +125,7 @@ describe('CommitUseCase', () => { const param = minimalExecution(); const results = await useCase.invoke(param); - expect(mockNotifyInvoke).toHaveBeenCalledWith(expect.objectContaining({ issueNumber: 123, branch: 'feature/123' })); + expect(mockNotifyInvoke).toHaveBeenCalledWith({ issueNumber: 123, reopenOnPush: false }); expect(mockCheckChangesInvoke).toHaveBeenCalledWith(expect.objectContaining({ issueNumber: 123, headBranch: 'feature/123' })); expect(mockCheckProgressInvoke).toHaveBeenCalledWith(expect.objectContaining({ issueNumber: 123, pushedBranch: 'feature/123' })); expect(mockDetectProblemsInvoke).toHaveBeenCalledWith(expect.objectContaining({ diff --git a/src/application/usecases/__tests__/issue_comment_use_case.test.ts b/src/application/usecases/__tests__/issue_comment_use_case.test.ts index 49ffb1fb8..bdcd50a7f 100644 --- a/src/application/usecases/__tests__/issue_comment_use_case.test.ts +++ b/src/application/usecases/__tests__/issue_comment_use_case.test.ts @@ -133,7 +133,6 @@ function baseExecution(overrides: Partial = {}): Execution { commitPrefixBuilder: "", commitPrefixBuilderParams: {}, emoji: {} as Execution["emoji"], - images: {} as Execution["images"], ...overrides, } as Execution; } diff --git a/src/application/usecases/__tests__/pull_request_review_comment_use_case.test.ts b/src/application/usecases/__tests__/pull_request_review_comment_use_case.test.ts index 782c0fd90..2e06008e2 100644 --- a/src/application/usecases/__tests__/pull_request_review_comment_use_case.test.ts +++ b/src/application/usecases/__tests__/pull_request_review_comment_use_case.test.ts @@ -133,7 +133,6 @@ function baseExecution(overrides: Partial = {}): Execution { commitPrefixBuilder: "", commitPrefixBuilderParams: {}, emoji: {} as Execution["emoji"], - images: {} as Execution["images"], ...overrides, } as Execution; } diff --git a/src/application/usecases/__tests__/push_single_action_contexts.test.ts b/src/application/usecases/__tests__/push_single_action_contexts.test.ts index b4a45322e..ae6bb3654 100644 --- a/src/application/usecases/__tests__/push_single_action_contexts.test.ts +++ b/src/application/usecases/__tests__/push_single_action_contexts.test.ts @@ -57,7 +57,6 @@ function source(): DeepMutable { }, commit: { branch: 'feature/42-contexts', - commits: [{ id: 'abc', message: 'feat: context', author: { name: 'A', username: 'a' } }], }, currentConfiguration: { parentBranch: 'develop', deploymentOrchestration: operation }, previousConfiguration: { @@ -113,19 +112,6 @@ function source(): DeepMutable { }] }, issue: { number: 42, reopenOnPush: true }, pullRequest: { number: 99 }, - release: { active: false }, - hotfix: { active: false }, - images: { - imagesOnCommit: true, - commitAutomaticActions: ['automatic.gif'], commitFeatureGifs: ['feature.gif'], - commitBugfixGifs: ['bugfix.gif'], commitReleaseGifs: ['release.gif'], - commitHotfixGifs: ['hotfix.gif'], commitDocsGifs: ['docs.gif'], commitChoreGifs: ['chore.gif'], - }, - isBugfix: false, - isFeature: true, - isDocs: false, - isChore: false, - commitPrefixBuilder: 'replace-slash', issueTypes: {} as never, }; } @@ -306,48 +292,24 @@ describe('push and single-action context projection', () => { expect(Object.isFrozen(projected.verifyCommands)).toBe(true); }); - it.each([ - ['release', { release: true }], - ['hotfix', { hotfix: true }], - ['bugfix', { bugfix: true }], - ['feature', { feature: true }], - ['docs', { docs: true }], - ['chore', { chore: true }], - ['automatic', {}], - ] as const)('projects %s commit presentation facts', (theme, flags) => { - const input = source(); - input.release.active = Boolean('release' in flags && flags.release); - input.hotfix.active = Boolean('hotfix' in flags && flags.hotfix); - input.isBugfix = Boolean('bugfix' in flags && flags.bugfix); - input.isFeature = Boolean('feature' in flags && flags.feature); - input.isDocs = Boolean('docs' in flags && flags.docs); - input.isChore = Boolean('chore' in flags && flags.chore); - - expect(projectCommitNotificationContext(input).theme).toBe(theme); - }); - - it('deep-copies commits, thresholds, labels, and project facts', () => { + it('projects only the facts required to reopen an issue and isolates size facts', () => { const input = source(); const notification = projectCommitNotificationContext(input); const size = projectChangeSizeContext(input); - input.commit.commits[0].message = 'mutated'; input.sizeThresholds.xxl.lines = 0; - expect(notification.commits[0].message).toBe('feat: context'); + expect(notification).toEqual({ issueNumber: 42, reopenOnPush: true }); expect(size.thresholds.xxl.lines).toBe(100); expect(size.labels).toEqual({ xxl: 'size: XXL', xl: 'size: XL', l: 'size: L', m: 'size: M', s: 'size: S', xs: 'size: XS' }); expect(Object.isFrozen(size.projects)).toBe(true); }); - it('supports commits without author metadata and omits an absent current size', () => { + it('omits an absent current size', () => { const input = source(); - input.commit.commits = [{ id: 'abc', message: 'feat: context' }]; delete input.labels.sizedLabelOnIssue; - const notification = projectCommitNotificationContext(input); const size = projectChangeSizeContext(input); - expect(notification.commits).toEqual([{ id: 'abc', message: 'feat: context' }]); expect(size).not.toHaveProperty('currentSize'); }); diff --git a/src/application/usecases/__tests__/single_action_use_case.test.ts b/src/application/usecases/__tests__/single_action_use_case.test.ts index 1549ac0ce..43de3d842 100644 --- a/src/application/usecases/__tests__/single_action_use_case.test.ts +++ b/src/application/usecases/__tests__/single_action_use_case.test.ts @@ -97,13 +97,7 @@ function minimalExecution(singleAction: { inactivityThresholdHours: 48, sizeThresholds: Object.fromEntries(['xxl', 'xl', 'l', 'm', 's', 'xs'].map(key => [key, { lines: 1, files: 1, commits: 1 }])), project: { getProjects: () => [] }, - release: { active: false }, hotfix: { active: false }, - images: { - imagesOnCommit: false, commitAutomaticActions: [], commitFeatureGifs: [], commitBugfixGifs: [], - commitReleaseGifs: [], commitHotfixGifs: [], commitDocsGifs: [], commitChoreGifs: [], - }, - isBugfix: false, isFeature: true, isDocs: false, isChore: false, - commitPrefixBuilder: '', issueTypes: {}, + issueTypes: {}, singleAction: { validSingleAction: singleAction.validSingleAction, currentSingleAction: singleAction.currentSingleAction, diff --git a/src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts b/src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts index 75c355cfa..37e1630a1 100644 --- a/src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts +++ b/src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts @@ -66,7 +66,6 @@ function baseParam(overrides: Record = {}) { commit: {}, commitPrefixBuilder: '', emoji: {}, - images: {}, ai: {}, locale: {}, sizeThresholds: {}, diff --git a/src/application/usecases/push_single_action_contexts.ts b/src/application/usecases/push_single_action_contexts.ts index d7f90efbf..cc1adce55 100644 --- a/src/application/usecases/push_single_action_contexts.ts +++ b/src/application/usecases/push_single_action_contexts.ts @@ -7,7 +7,6 @@ import type { SetupCredentialCollection, SetupRemoteConfiguration, } from '../../domain/setup'; -import type { EventCommitPayload } from '../../data/model/execution_inputs'; import { restoreRecommendationState, type RecommendationState } from '../../data/model/recommendation_state'; import type { ProjectReference } from '../ports/project_board_link_ports'; import type { @@ -90,13 +89,7 @@ export interface BranchSyncContext { export interface CommitNotificationContext { readonly issueNumber: number; - readonly branch: string; - readonly commits: readonly Readonly[]; - readonly commitPrefixBuilder: string; readonly reopenOnPush: boolean; - readonly theme: 'release' | 'hotfix' | 'bugfix' | 'feature' | 'docs' | 'chore' | 'automatic'; - readonly imagesOnCommit: boolean; - readonly themeImages: readonly string[]; } export interface ChangeSizeThreshold { @@ -162,7 +155,7 @@ export interface PushSingleActionContextSource { readonly setupRemoteConfiguration?: unknown; readonly setupWorkflowUpdates?: unknown; }; - readonly commit: { readonly branch: string; readonly commits: readonly EventCommitPayload[] }; + readonly commit: { readonly branch: string }; readonly currentConfiguration: { readonly parentBranch?: string; readonly deploymentOrchestration?: DeploymentOperationSnapshot; @@ -210,23 +203,6 @@ export interface PushSingleActionContextSource { readonly project: { getProjects(): readonly ProjectReference[] }; readonly issue: { readonly number: number; readonly reopenOnPush: boolean }; readonly pullRequest: { readonly number: number }; - readonly release: { readonly active: boolean }; - readonly hotfix: { readonly active: boolean }; - readonly images: { - readonly imagesOnCommit: boolean; - readonly commitAutomaticActions: readonly string[]; - readonly commitFeatureGifs: readonly string[]; - readonly commitBugfixGifs: readonly string[]; - readonly commitReleaseGifs: readonly string[]; - readonly commitHotfixGifs: readonly string[]; - readonly commitDocsGifs: readonly string[]; - readonly commitChoreGifs: readonly string[]; - }; - readonly isBugfix: boolean; - readonly isFeature: boolean; - readonly isDocs: boolean; - readonly isChore: boolean; - readonly commitPrefixBuilder: string; readonly issueTypes: InitialIssueTypeConfiguration; } @@ -355,19 +331,9 @@ export function projectBranchSyncContext(source: PushSingleActionContextSource): } export function projectCommitNotificationContext(source: PushSingleActionContextSource): CommitNotificationContext { - const theme = commitTheme(source); return Object.freeze({ issueNumber: source.issueNumber, - branch: source.commit.branch, - commits: Object.freeze(source.commit.commits.map(commit => Object.freeze({ - ...commit, - ...(commit.author ? { author: Object.freeze({ ...commit.author }) } : {}), - }))), - commitPrefixBuilder: source.commitPrefixBuilder, reopenOnPush: source.issue.reopenOnPush, - theme: theme.kind, - imagesOnCommit: source.images.imagesOnCommit, - themeImages: Object.freeze([...theme.images]), }); } @@ -433,16 +399,6 @@ export function projectAgentActivityContext(source: PushSingleActionContextSourc }); } -function commitTheme(source: PushSingleActionContextSource): { kind: CommitNotificationContext['theme']; images: readonly string[] } { - if (source.release.active) return { kind: 'release', images: source.images.commitReleaseGifs }; - if (source.hotfix.active) return { kind: 'hotfix', images: source.images.commitHotfixGifs }; - if (source.isBugfix) return { kind: 'bugfix', images: source.images.commitBugfixGifs }; - if (source.isFeature) return { kind: 'feature', images: source.images.commitFeatureGifs }; - if (source.isDocs) return { kind: 'docs', images: source.images.commitDocsGifs }; - if (source.isChore) return { kind: 'chore', images: source.images.commitChoreGifs }; - return { kind: 'automatic', images: source.images.commitAutomaticActions }; -} - function copyInitialLabels(source: PushSingleActionContextSource['labels']): InitialLabelConfiguration { const keys = [ 'branchManagementLauncherLabel', diff --git a/src/application/usecases/steps/commit/__tests__/notify_new_commit_on_issue_use_case.test.ts b/src/application/usecases/steps/commit/__tests__/notify_new_commit_on_issue_use_case.test.ts index 4f1aca46a..e8960475d 100644 --- a/src/application/usecases/steps/commit/__tests__/notify_new_commit_on_issue_use_case.test.ts +++ b/src/application/usecases/steps/commit/__tests__/notify_new_commit_on_issue_use_case.test.ts @@ -12,19 +12,8 @@ const openIssue = jest.fn(); function context(reopenOnPush: boolean) { return projectCommitNotificationContext({ issueNumber: 42, - commit: { - branch: 'feature/42-add-login', - commits: [{ id: 'abc', message: 'feat: add button', author: { name: 'Alice', username: 'alice' } }], - }, - commitPrefixBuilder: 'replace-slash', - images: { imagesOnCommit: true, commitFeatureGifs: ['decorative.gif'] }, + commit: { branch: 'feature/42-add-login' }, issue: { reopenOnPush }, - release: { active: false }, - hotfix: { active: false }, - isFeature: true, - isBugfix: false, - isDocs: false, - isChore: false, } as never); } diff --git a/src/application/usecases/steps/common/__tests__/shared_capability_context_projection.test.ts b/src/application/usecases/steps/common/__tests__/shared_capability_context_projection.test.ts index c488bf433..07e89ec65 100644 --- a/src/application/usecases/steps/common/__tests__/shared_capability_context_projection.test.ts +++ b/src/application/usecases/steps/common/__tests__/shared_capability_context_projection.test.ts @@ -50,27 +50,6 @@ function expectDataOnly(value: unknown): void { expect(JSON.stringify(value)).not.toContain('secret-value'); } -function images() { - return { - imagesOnIssue: true, - issueAutomaticActions: ['issue.gif'], - issueFeatureGifs: [], - issueBugfixGifs: [], - issueReleaseGifs: [], - issueHotfixGifs: [], - issueDocsGifs: [], - issueChoreGifs: [], - imagesOnPullRequest: true, - pullRequestAutomaticActions: ['pull-request.gif'], - pullRequestFeatureGifs: [], - pullRequestBugfixGifs: [], - pullRequestReleaseGifs: [], - pullRequestHotfixGifs: [], - pullRequestDocsGifs: [], - pullRequestChoreGifs: [], - }; -} - describe('P2-D shared capability context projections', () => { it('projects immutable issue permission facts without repository authority', () => { const labels = ['feature']; @@ -332,7 +311,6 @@ describe('P2-D shared capability context projections', () => { it('snapshots result publication data and semantic errors without retaining credentials', () => { const results = [new Result({ id: 'step', success: true, executed: true, steps: ['Done'] })]; - const publicationImages = images(); const context = projectPublishResultContext({ debug: false, isSingleAction: false, @@ -351,7 +329,6 @@ describe('P2-D shared capability context projections', () => { locale: { issue: 'en-US', pullRequest: 'en-US' }, release: { active: false }, hotfix: { active: false }, - images: publicationImages, currentConfiguration: { results }, tokens: { token: 'secret-value' }, } as never); diff --git a/src/application/usecases/steps/common/publish_resume_workflow.ts b/src/application/usecases/steps/common/publish_resume_workflow.ts index 45c1ef22b..491db571f 100644 --- a/src/application/usecases/steps/common/publish_resume_workflow.ts +++ b/src/application/usecases/steps/common/publish_resume_workflow.ts @@ -62,7 +62,7 @@ export function projectPublishResultContext(source: PublishResultContextSource): /** * Semantic publication boundary. Only explicitly mapped payloads may reach - * GitHub; steps, reminders, errors, images, and debug logs remain operator + * GitHub; steps, reminders, errors, and debug logs remain operator * evidence in the Job Summary and logs. */ export async function runPublishResume( diff --git a/src/data/model/__tests__/execution.test.ts b/src/data/model/__tests__/execution.test.ts index d87d7c91d..a32def86b 100644 --- a/src/data/model/__tests__/execution.test.ts +++ b/src/data/model/__tests__/execution.test.ts @@ -36,7 +36,6 @@ import { Emoji } from '../emoji'; import type { LatestTagQueryPort } from '../../../application/ports/branch_tag_ports'; import { Execution } from '../execution'; import { Hotfix } from '../hotfix'; -import { Images } from '../images'; import { Issue } from '../issue'; import { IssueTypes } from '../issue_types'; import { Labels } from '../labels'; @@ -106,36 +105,6 @@ function makeBranches(): Branches { ); } -function makeImages(): Images { - const empty: string[] = []; - return new Images( - false, - false, - false, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - empty, - ); -} - function makeIssueTypes(): IssueTypes { return new IssueTypes( 'Task', @@ -195,7 +164,6 @@ function buildExecution(inputs?: Record, overrides?: Partial<{ issue: overrides?.issue ?? makeIssue(inputs), pullRequest: overrides?.pullRequest ?? makePullRequest(inputs), emoji: new Emoji(false, ''), - images: makeImages(), tokens: new Tokens('token'), ai: new Ai('http://localhost', 'model', false, [], false, 'High', 10, []), labels, @@ -436,7 +404,6 @@ describe('Execution', () => { issue, pullRequest, emoji, - images: makeImages(), tokens, ai, labels, diff --git a/src/data/model/execution.ts b/src/data/model/execution.ts index 3896c22a0..d53dfc6f6 100644 --- a/src/data/model/execution.ts +++ b/src/data/model/execution.ts @@ -6,7 +6,6 @@ import { Commit } from "./commit"; import { Config } from "./config"; import { Emoji } from "./emoji"; import { Hotfix } from "./hotfix"; -import { Images } from "./images"; import { Issue } from "./issue"; import { IssueTypes } from "./issue_types"; import { Labels } from "./labels"; @@ -39,7 +38,6 @@ export class Execution { singleAction: SingleAction; commitPrefixBuilder: string; emoji: Emoji; - images: Images; tokens: Tokens; ai: Ai; labels: Labels; @@ -174,7 +172,6 @@ export class Execution { this.commitPrefixBuilder = components.commitPrefixBuilder; this.issue = components.issue; this.pullRequest = components.pullRequest; - this.images = components.images; this.tokens = components.tokens; this.ai = components.ai; this.emoji = components.emoji; diff --git a/src/data/model/execution_components.ts b/src/data/model/execution_components.ts index 9e92238d8..8377dd5c3 100644 --- a/src/data/model/execution_components.ts +++ b/src/data/model/execution_components.ts @@ -2,7 +2,6 @@ import type { Ai } from './ai'; import type { Branches } from './branches'; import type { Emoji } from './emoji'; import type { Hotfix } from './hotfix'; -import type { Images } from './images'; import type { Issue } from './issue'; import type { IssueTypes } from './issue_types'; import type { Labels } from './labels'; @@ -26,7 +25,6 @@ export interface ExecutionComponents { issue: Issue; pullRequest: PullRequest; emoji: Emoji; - images: Images; tokens: Tokens; ai: Ai; labels: Labels; diff --git a/src/data/model/images.ts b/src/data/model/images.ts deleted file mode 100644 index a44b5dfde..000000000 --- a/src/data/model/images.ts +++ /dev/null @@ -1,80 +0,0 @@ -export class Images { - imagesOnIssue: boolean; - issueAutomaticActions: string[]; - issueFeatureGifs: string[]; - issueBugfixGifs: string[]; - issueReleaseGifs: string[]; - issueHotfixGifs: string[]; - issueDocsGifs: string[]; - issueChoreGifs: string[]; - - imagesOnPullRequest: boolean; - pullRequestAutomaticActions: string[]; - pullRequestFeatureGifs: string[]; - pullRequestBugfixGifs: string[]; - pullRequestReleaseGifs: string[]; - pullRequestHotfixGifs: string[]; - pullRequestDocsGifs: string[]; - pullRequestChoreGifs: string[]; - - imagesOnCommit: boolean; - commitAutomaticActions: string[]; - commitFeatureGifs: string[]; - commitBugfixGifs: string[]; - commitReleaseGifs: string[]; - commitHotfixGifs: string[]; - commitDocsGifs: string[]; - commitChoreGifs: string[]; - - constructor( - imagesOnIssue: boolean, - imagesOnPullRequest: boolean, - imagesOnCommit: boolean, - cleanUpGifs: string[], - featureGifs: string[], - bugfixGifs: string[], - docsGifs: string[], - choreGifs: string[], - releaseGifs: string[], - hotfixGifs: string[], - prLinkGifs: string[], - prFeatureGifs: string[], - prBugfixGifs: string[], - prReleaseGifs: string[], - prHotfixGifs: string[], - prDocsGifs: string[], - prChoreGifs: string[], - commitAutomaticActions: string[], - commitFeatureGifs: string[], - commitBugfixGifs: string[], - commitReleaseGifs: string[], - commitHotfixGifs: string[], - commitDocsGifs: string[], - commitChoreGifs: string[], - ) { - this.imagesOnIssue = imagesOnIssue; - this.imagesOnPullRequest = imagesOnPullRequest; - this.imagesOnCommit = imagesOnCommit; - this.issueAutomaticActions = cleanUpGifs; - this.issueFeatureGifs = featureGifs; - this.issueBugfixGifs = bugfixGifs; - this.issueReleaseGifs = releaseGifs; - this.issueHotfixGifs = hotfixGifs; - this.issueDocsGifs = docsGifs; - this.issueChoreGifs = choreGifs; - this.pullRequestAutomaticActions = prLinkGifs; - this.pullRequestFeatureGifs = prFeatureGifs; - this.pullRequestBugfixGifs = prBugfixGifs; - this.pullRequestReleaseGifs = prReleaseGifs; - this.pullRequestHotfixGifs = prHotfixGifs; - this.pullRequestDocsGifs = prDocsGifs; - this.pullRequestChoreGifs = prChoreGifs; - this.commitAutomaticActions = commitAutomaticActions; - this.commitFeatureGifs = commitFeatureGifs; - this.commitBugfixGifs = commitBugfixGifs; - this.commitReleaseGifs = commitReleaseGifs; - this.commitHotfixGifs = commitHotfixGifs; - this.commitDocsGifs = commitDocsGifs; - this.commitChoreGifs = commitChoreGifs; - } -} \ No newline at end of file diff --git a/src/tooling/__tests__/validate_workflow_contract.test.ts b/src/tooling/__tests__/validate_workflow_contract.test.ts index 26bd25ff3..ef4055346 100644 --- a/src/tooling/__tests__/validate_workflow_contract.test.ts +++ b/src/tooling/__tests__/validate_workflow_contract.test.ts @@ -90,23 +90,14 @@ const validWorkflow = { }; describe('workflow contract validator', () => { - it('keeps decorative image inputs disabled and explicitly deprecated', () => { + it('excludes retired decorative image inputs from the public action contract', () => { const manifest = yaml.load( readFileSync(path.join(process.cwd(), 'action.yml'), 'utf8'), ) as { inputs: Record; }; - const toggles = ['images-on-issue', 'images-on-pull-request', 'images-on-commit']; - const pools = Object.keys(manifest.inputs).filter(name => name.startsWith('images-') && !toggles.includes(name)); - for (const name of toggles) { - expect(manifest.inputs[name]).toMatchObject({ default: 'false' }); - expect(manifest.inputs[name].description).toMatch(/^Deprecated compatibility input\./); - } - expect(pools).toHaveLength(21); - for (const name of pools) { - expect(manifest.inputs[name].description).toMatch(/^Deprecated .* image URL pool retained for input compatibility\.$/); - } + expect(Object.keys(manifest.inputs)).not.toContainEqual(expect.stringMatching(/^images-(?:on-|issue-|pull-request-|commit-)/u)); }); it('keeps the repository validation manifest unique and the queue budget synchronized', () => { diff --git a/src/utils/__tests__/list_utils.test.ts b/src/utils/__tests__/list_utils.test.ts deleted file mode 100644 index 018c1f651..000000000 --- a/src/utils/__tests__/list_utils.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { getRandomElement } from '../list_utils'; - -describe('list_utils', () => { - describe('getRandomElement', () => { - it('returns undefined for empty array', () => { - expect(getRandomElement([])).toBeUndefined(); - }); - - it('returns undefined for null/undefined list', () => { - expect(getRandomElement(null as unknown as string[])).toBeUndefined(); - expect(getRandomElement(undefined as unknown as string[])).toBeUndefined(); - }); - - it('returns the only element for single-element array', () => { - expect(getRandomElement([42])).toBe(42); - expect(getRandomElement(['only'])).toBe('only'); - }); - - it('returns an element that is in the list', () => { - const list = [1, 2, 3]; - for (let i = 0; i < 50; i++) { - const el = getRandomElement(list); - expect(list).toContain(el); - } - }); - - it('returns one of the elements for multi-element list', () => { - const list = ['a', 'b', 'c']; - const results = new Set(); - for (let i = 0; i < 100; i++) { - results.add(getRandomElement(list)!); - } - expect(results.size).toBeGreaterThanOrEqual(1); - expect(results.size).toBeLessThanOrEqual(3); - results.forEach((r) => expect(list).toContain(r)); - }); - }); -}); diff --git a/src/utils/list_utils.ts b/src/utils/list_utils.ts deleted file mode 100644 index b6418fcd0..000000000 --- a/src/utils/list_utils.ts +++ /dev/null @@ -1,19 +0,0 @@ -import Chance from 'chance'; - -const chance = new Chance(); - -export const getRandomElement = (list: T[]): T | undefined => { - // Return undefined for empty lists - if (!list?.length) { - return undefined; - } - - // Return first element for single item lists - if (list.length === 1) { - return list[0]; - } - - // Use chance to get a random index - const randomIndex = chance.integer({ min: 0, max: list.length - 1 }); - return list[randomIndex]; -}; \ No newline at end of file From 3924f79a446cdd47ac8110dad353441df81209a6 Mon Sep 17 00:00:00 2001 From: Efra Espada Date: Tue, 15 Sep 2026 23:47:04 +0200 Subject: [PATCH 2/2] codex-remove-deprecated-image-configuration: Harden project and review UX --- build/api/index.js | 6 +- build/cli/index.js | 75 +++++++------- build/github_action/index.js | 75 +++++++------- docs/bugbot/detection.mdx | 2 +- docs/bugbot/examples.mdx | 6 +- docs/bugbot/failure-scenarios.mdx | 2 +- docs/issues/assignees-and-projects.mdx | 5 + docs/pull-requests/ai-description.mdx | 6 ++ docs/pull-requests/capabilities.mdx | 6 +- specs/CATALOG.md | 18 ++-- .../bugbot-context-selection-and-budgeting.md | 13 ++- specs/bugbot-review-state-reconciliation.md | 13 ++- specs/catalog.json | 24 ++++- specs/managed-issue-and-branch-lifecycle.md | 18 +++- .../pull-request-lifecycle-and-enrichment.md | 31 +++++- .../bugbot_review_presentation_policy.test.ts | 7 +- .../policies/bugbot_message_catalog.ts | 4 +- .../ports/project_board_command_ports.ts | 1 + .../ports/project_board_link_ports.ts | 6 +- .../ports/project_board_query_ports.ts | 2 +- .../common/project_content_link_workflow.ts | 22 +---- .../link_issue_project_use_case.test.ts | 98 ++++++++----------- .../issue/link_issue_project_use_case.ts | 7 +- ...link_pull_request_project_use_case.test.ts | 87 +++++++--------- .../link_pull_request_project_use_case.ts | 7 +- .../project_board_link_repository.test.ts | 20 ++-- .../project_board_command_repository.test.ts | 29 ++++++ .../project_board_query_repository.test.ts | 24 ++--- .../project_board_command_repository.ts | 19 +++- .../project/project_board_field_update.ts | 24 ++++- .../project/project_board_item_query.ts | 6 +- .../project/project_board_link_repository.ts | 14 ++- .../project/project_board_query_repository.ts | 8 +- .../lifecycle_capability_port_binding.test.ts | 7 +- .../shared_capability_port_binding.test.ts | 12 +-- .../issue_use_case_composition_root.ts | 7 +- .../pull_request_use_case_composition_root.ts | 5 +- .../shared_capability_port_binding.ts | 6 +- .../update_pull_request_description.test.ts | 2 + .../update_pull_request_description.ts | 2 +- 40 files changed, 411 insertions(+), 315 deletions(-) diff --git a/build/api/index.js b/build/api/index.js index 4cd1de6e7..a57cc9c3b 100644 --- a/build/api/index.js +++ b/build/api/index.js @@ -591,7 +591,7 @@ const ENGLISH_MESSAGES = Object.freeze({ 'bugbot.status.syncFailure': 'Bugbot could not fully synchronize the state of {commit}.', 'bugbot.status.clean': 'No active findings on {commit}.', 'bugbot.status.attention': Object.freeze({ one: '{count} finding requires attention on {commit}.', other: '{count} findings require attention on {commit}.' }), - 'bugbot.status.action.partial': 'Inspect the omitted items or reduce the pull request scope. Rerun the review only after changing the scope, limits, or access.', + 'bugbot.status.action.partial': 'Do not treat this review as complete. Review the sources under Incomplete coverage and manually inspect omitted items; rerun only after reducing the relevant scope or restoring provider access.', 'bugbot.status.action.recheck': 'Correct the reported cause, then run {command} once.', 'bugbot.status.action.findings': 'Review the linked threads or comment {command}.', 'bugbot.status.findingsHeading': 'Findings', @@ -680,7 +680,7 @@ const SPANISH_MESSAGES = Object.freeze({ 'bugbot.status.syncFailure': 'Bugbot no pudo sincronizar por completo el estado de {commit}.', 'bugbot.status.clean': 'No hay hallazgos activos en {commit}.', 'bugbot.status.attention': Object.freeze({ one: '{count} hallazgo requiere atención en {commit}.', many: '{count} hallazgos requieren atención en {commit}.', other: '{count} hallazgos requieren atención en {commit}.' }), - 'bugbot.status.action.partial': 'Revisa los elementos omitidos o reduce el alcance del pull request. Repite la revisión solo después de cambiar el alcance, los límites o el acceso.', + 'bugbot.status.action.partial': 'No consideres completa esta revisión. Revisa las fuentes en Cobertura incompleta e inspecciona manualmente los elementos omitidos; repite la revisión solo después de reducir el alcance relevante o restaurar el acceso al proveedor.', 'bugbot.status.action.recheck': 'Corrige la causa indicada y ejecuta {command} una vez.', 'bugbot.status.action.findings': 'Revisa los hilos enlazados o comenta {command}.', 'bugbot.status.findingsHeading': 'Hallazgos', @@ -6255,7 +6255,7 @@ Write every human-readable sentence in {{targetLocale}}. Preserve code identifie 4. Provide \`overview\` as one to three sentences that state the outcome and why it matters. 5. Provide \`whatChangedHeading\` as the plain-text {{targetLocale}} equivalent of "What changed" and \`changes\` as two to six short, outcome-oriented items. Do not inventory files, use-case names, internal categories, or every implementation step. 6. When execution or manual-verification evidence is available, provide \`validationHeading\` as the plain-text {{targetLocale}} equivalent of "Validation" and \`validation\` with only the supported commands, automated checks, or manual scenarios. Never claim a check passed unless the evidence says it did, and never infer that result from the presence of test files or commands. When no verification evidence is available, set both fields to \`null\`; do not add a “not run” placeholder. -7. Set \`reviewNotesHeading\` and \`reviewNotes\` to \`null\` unless reviewers need material migration, security, performance, compatibility, rollout, manual-verification, risk, or follow-up context. Otherwise use the localized plain-text heading and one to four concise items. {{relatedIssueInstruction}} +7. Set \`reviewNotesHeading\` and \`reviewNotes\` to \`null\` unless reviewers need material migration, security, performance, compatibility, rollout, manual-verification, risk, or follow-up context. Do not infer consumers, compatibility obligations, upgrade steps, migration work, or rollout requirements merely because code, configuration, inputs, or symbols were removed or named deprecated. Include that context only when the issue, diff, repository documentation, or verification evidence identifies a concrete affected consumer or required transition. Otherwise use the localized plain-text heading and one to four concise items. {{relatedIssueInstruction}} 8. Keep the description practical and normally under 4,000 characters. It must never exceed 12,000 characters. Do not use emoji, horizontal separators, generic checklists, empty headings, repeated statements, placeholder text, or unsupported "no impact" claims. 9. Return one JSON object with exactly \`outputLocale\`, \`overview\`, \`whatChangedHeading\`, \`changes\`, \`validationHeading\`, \`validation\`, \`reviewNotesHeading\`, \`reviewNotes\`, and \`closesLinkedIssue\`. Every content field is plain text except Markdown links, code spans, refs, and commands inside content values. The application renders the Markdown structure; do not include headings, bullet prefixes, a preamble, meta-commentary, or code fence in the values. diff --git a/build/cli/index.js b/build/cli/index.js index 9be5bd7f7..81db4bbc5 100755 --- a/build/cli/index.js +++ b/build/cli/index.js @@ -41002,7 +41002,7 @@ const ENGLISH_MESSAGES = Object.freeze({ 'bugbot.status.syncFailure': 'Bugbot could not fully synchronize the state of {commit}.', 'bugbot.status.clean': 'No active findings on {commit}.', 'bugbot.status.attention': Object.freeze({ one: '{count} finding requires attention on {commit}.', other: '{count} findings require attention on {commit}.' }), - 'bugbot.status.action.partial': 'Inspect the omitted items or reduce the pull request scope. Rerun the review only after changing the scope, limits, or access.', + 'bugbot.status.action.partial': 'Do not treat this review as complete. Review the sources under Incomplete coverage and manually inspect omitted items; rerun only after reducing the relevant scope or restoring provider access.', 'bugbot.status.action.recheck': 'Correct the reported cause, then run {command} once.', 'bugbot.status.action.findings': 'Review the linked threads or comment {command}.', 'bugbot.status.findingsHeading': 'Findings', @@ -41091,7 +41091,7 @@ const SPANISH_MESSAGES = Object.freeze({ 'bugbot.status.syncFailure': 'Bugbot no pudo sincronizar por completo el estado de {commit}.', 'bugbot.status.clean': 'No hay hallazgos activos en {commit}.', 'bugbot.status.attention': Object.freeze({ one: '{count} hallazgo requiere atención en {commit}.', many: '{count} hallazgos requieren atención en {commit}.', other: '{count} hallazgos requieren atención en {commit}.' }), - 'bugbot.status.action.partial': 'Revisa los elementos omitidos o reduce el alcance del pull request. Repite la revisión solo después de cambiar el alcance, los límites o el acceso.', + 'bugbot.status.action.partial': 'No consideres completa esta revisión. Revisa las fuentes en Cobertura incompleta e inspecciona manualmente los elementos omitidos; repite la revisión solo después de reducir el alcance relevante o restaurar el acceso al proveedor.', 'bugbot.status.action.recheck': 'Corrige la causa indicada y ejecuta {command} una vez.', 'bugbot.status.action.findings': 'Revisa los hilos enlazados o comenta {command}.', 'bugbot.status.findingsHeading': 'Hallazgos', @@ -58643,8 +58643,8 @@ function projectIssueContentLinkContext(source) { function projectPullRequestContentLinkContext(source) { return projectContext(source, 'pull request', source.pullRequest.number, source.project.getProjectColumnPullRequestCreated(), source.pullRequest.id); } -/** Links issue-like content to each configured project and moves it after propagation. */ -async function runProjectContentLinkWorkflow(param, taskId, port, waitForPropagation) { +/** Links issue-like content to each configured project and updates the returned item directly. */ +async function runProjectContentLinkWorkflow(param, taskId, port) { (0, logging_ports_1.logInfo)(`${(0, task_emoji_1.getTaskEmoji)(taskId)} Executing ${taskId}.`); if (param.projects.length === 0) { (0, logging_ports_1.logDebugInfo)(`Link${capitalize(param.contentType)}: no projects configured; skipping.`); @@ -58654,20 +58654,15 @@ async function runProjectContentLinkWorkflow(param, taskId, port, waitForPropaga const contentId = param.contentId ?? await port.resolveIssueContentId(param.contentNumber); const results = []; for (const project of param.projects) { - const linked = await port.linkContentId(project, contentId); - if (!linked) { - (0, logging_ports_1.logDebugInfo)(`Link${capitalize(param.contentType)}: ${param.contentType} already linked to project "${project.title}" or link failed.`); - continue; - } - await waitForPropagation(); - const moved = await port.moveContent(project, param.contentNumber, param.columnName); + const projectItemId = await port.linkContentId(project, contentId); + const moved = await port.moveContent(project, projectItemId, param.columnName); if (moved) { results.push(new result_1.Result({ id: taskId, success: true, executed: true, steps: [ - `The ${param.contentType} was linked to [**${project.title}**](${project.url}) and moved to the column \`${param.columnName}\`.`, + `The ${param.contentType} is linked to [**${project.title}**](${project.url}) with status \`${param.columnName}\`.`, ], })); } @@ -58707,14 +58702,11 @@ function projectContext(source, contentType, contentNumber, columnName, contentI }); } function moveFailureResult(context, taskId, project) { - if (context.contentType === 'issue') { - return new result_1.Result({ id: taskId, success: true, executed: false, steps: [] }); - } return new result_1.Result({ id: taskId, success: false, executed: true, - steps: [`The ${context.contentType} was linked to [**${project.title}**](${project.url}) but there was an error moving it to the column \`${context.columnName}\`.`], + steps: [`The ${context.contentType} is linked to [**${project.title}**](${project.url}), but its status could not be set to \`${context.columnName}\`.`], }); } function capitalize(value) { @@ -59906,13 +59898,12 @@ exports.LinkIssueProjectUseCase = void 0; const project_content_link_workflow_1 = __nccwpck_require__(89064); /** Application boundary for linking issues to configured ProjectV2 boards. */ class LinkIssueProjectUseCase { - constructor(projectContentPort, eventualConsistencyDelayPort) { + constructor(projectContentPort) { this.projectContentPort = projectContentPort; - this.eventualConsistencyDelayPort = eventualConsistencyDelayPort; this.taskId = 'LinkIssueProjectUseCase'; } async invoke(param) { - return (0, project_content_link_workflow_1.runProjectContentLinkWorkflow)(param, this.taskId, this.projectContentPort, () => this.eventualConsistencyDelayPort.wait(10000)); + return (0, project_content_link_workflow_1.runProjectContentLinkWorkflow)(param, this.taskId, this.projectContentPort); } } exports.LinkIssueProjectUseCase = LinkIssueProjectUseCase; @@ -60963,13 +60954,12 @@ exports.LinkPullRequestProjectUseCase = void 0; const project_content_link_workflow_1 = __nccwpck_require__(89064); /** Application boundary for linking pull requests to configured ProjectV2 boards. */ class LinkPullRequestProjectUseCase { - constructor(projectContentPort, eventualConsistencyDelayPort) { + constructor(projectContentPort) { this.projectContentPort = projectContentPort; - this.eventualConsistencyDelayPort = eventualConsistencyDelayPort; this.taskId = 'LinkPullRequestProjectUseCase'; } async invoke(param) { - return (0, project_content_link_workflow_1.runProjectContentLinkWorkflow)(param, this.taskId, this.projectContentPort, () => this.eventualConsistencyDelayPort.wait(10000)); + return (0, project_content_link_workflow_1.runProjectContentLinkWorkflow)(param, this.taskId, this.projectContentPort); } } exports.LinkPullRequestProjectUseCase = LinkPullRequestProjectUseCase; @@ -70094,6 +70084,7 @@ class ProjectBoardCommandRepository { this.setTaskPriority = (project, owner, repo, issueOrPullRequestNumber, priorityLabel, token) => this.setField(project, owner, repo, issueOrPullRequestNumber, this.priorityField, priorityLabel, token); this.setTaskSize = (project, owner, repo, issueOrPullRequestNumber, sizeLabel, token) => this.setField(project, owner, repo, issueOrPullRequestNumber, this.sizeField, sizeLabel, token); this.moveIssueToColumn = (project, owner, repo, issueOrPullRequestNumber, columnName, token) => this.setField(project, owner, repo, issueOrPullRequestNumber, this.statusField, columnName, token); + this.moveProjectItemToColumn = (project, projectItemId, columnName, token) => (0, project_board_field_update_1.setProjectBoardSingleSelectFieldByItemId)(this.graphqlClient, project, projectItemId, this.statusField, columnName, token); } setField(project, owner, repo, issueOrPullRequestNumber, fieldName, fieldValue, token) { return (0, project_board_field_update_1.setProjectBoardSingleSelectField)(this.projectBoardContentQueryPort, this.graphqlClient, project, owner, repo, issueOrPullRequestNumber, fieldName, fieldValue, token); @@ -70184,6 +70175,7 @@ function validateProjectId(projectId) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setProjectBoardSingleSelectField = setProjectBoardSingleSelectField; +exports.setProjectBoardSingleSelectFieldByItemId = setProjectBoardSingleSelectFieldByItemId; const project_board_provider_limits_1 = __nccwpck_require__(96997); const logger_1 = __nccwpck_require__(91151); const github_pagination_adapter_1 = __nccwpck_require__(2761); @@ -70254,9 +70246,18 @@ async function setProjectBoardSingleSelectField(contentQueryPort, graphqlClient, (0, logger_1.logDebugInfo)(`Field '${fieldName}' is already set to '${fieldValue}'. No update needed.`); return false; } + return updateProjectBoardSingleSelectField(client, project, contentId, target); +} +/** Updates a ProjectV2 item returned by the link mutation without waiting for list propagation. */ +async function setProjectBoardSingleSelectFieldByItemId(graphqlClient, project, projectItemId, fieldName, fieldValue, token) { + const client = graphqlClient.getClient(token); + const target = await findFieldOption(client, project, fieldName, fieldValue); + return updateProjectBoardSingleSelectField(client, project, projectItemId, target); +} +async function updateProjectBoardSingleSelectField(client, project, projectItemId, target) { const mutationResult = await client.graphql(UPDATE_FIELD_MUTATION, { projectId: project.id, - itemId: contentId, + itemId: projectItemId, fieldId: target.fieldId, optionId: target.optionId, }); @@ -70324,7 +70325,7 @@ async function findProjectItem(client, project, itemId, fieldName) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getProjectItemId = getProjectItemId; -exports.isProjectContentLinked = isProjectContentLinked; +exports.getProjectItemIdByContentId = getProjectItemIdByContentId; const project_board_provider_limits_1 = __nccwpck_require__(96997); const logger_1 = __nccwpck_require__(91151); const github_pagination_adapter_1 = __nccwpck_require__(2761); @@ -70370,8 +70371,8 @@ async function getProjectItemId(graphqlClient, project, owner, repo, issueOrPull } return projectItemId; } -async function isProjectContentLinked(graphqlClient, project, contentId) { - return Boolean(await findProjectItemId(graphqlClient, project, contentId)); +async function getProjectItemIdByContentId(graphqlClient, project, contentId) { + return findProjectItemId(graphqlClient, project, contentId); } async function findProjectItemId(client, project, contentId) { for await (const page of (0, github_pagination_adapter_1.paginateCursor)(async (after) => { @@ -70410,19 +70411,19 @@ class ProjectBoardLinkRepository { this.projectBoardQueryPort = projectBoardQueryPort; this.graphqlClient = graphqlClient; this.linkContentId = async (project, contentId, token) => { - if (await this.projectBoardQueryPort.isContentLinked(project, contentId, token)) { + const existingItemId = await this.projectBoardQueryPort.getLinkedContentItemId(project, contentId, token); + if (existingItemId) { (0, logger_1.logDebugInfo)(`Content ${contentId} is already linked to project ${project.id}.`); - return false; + return existingItemId; } const linkMutation = `mutation($projectId: ID!, $contentId: ID!) { addProjectV2ItemById(input: {projectId: $projectId, contentId: $contentId}) { item { id } } }`; const linkResult = await this.graphqlClient.getClient(token).graphql(linkMutation, { projectId: project.id, contentId }); const linkedItemId = linkResult.addProjectV2ItemById?.item?.id; if (!linkedItemId) { - (0, logger_1.logDebugInfo)(`Project link mutation returned no item for content ${contentId} and project ${project.id}.`); - return false; + throw new Error(`GitHub did not return the project item created for content ${contentId} in project ${project.id}.`); } (0, logger_1.logDebugInfo)(`Linked ${contentId} with id ${linkedItemId} to project ${project.id}`); - return true; + return linkedItemId; }; } } @@ -70446,7 +70447,7 @@ class ProjectBoardQueryRepository { this.graphqlClient = graphqlClient; this.getProjectDetail = (projectId, owner, token) => (0, project_board_detail_query_1.getProjectBoardDetail)(this.ownerTypeClient, this.graphqlClient, projectId, owner, token); this.getProjectItemId = async (project, owner, repo, issueOrPullRequestNumber, token) => (0, project_board_item_query_1.getProjectItemId)(this.graphqlClient.getClient(token), project, owner, repo, issueOrPullRequestNumber); - this.isContentLinked = async (project, contentId, token) => (0, project_board_item_query_1.isProjectContentLinked)(this.graphqlClient.getClient(token), project, contentId); + this.getLinkedContentItemId = async (project, contentId, token) => (0, project_board_item_query_1.getProjectItemIdByContentId)(this.graphqlClient.getClient(token), project, contentId); } } exports.ProjectBoardQueryRepository = ProjectBoardQueryRepository; @@ -76137,7 +76138,6 @@ const issue_title_repository_1 = __nccwpck_require__(10121); const issue_type_assignment_repository_1 = __nccwpck_require__(19118); const workflow_dispatch_repository_1 = __nccwpck_require__(29509); const timer_branch_propagation_delay_adapter_1 = __nccwpck_require__(20846); -const timer_delay_adapter_1 = __nccwpck_require__(71942); const agent_capability_composition_root_1 = __nccwpck_require__(85079); const issue_use_case_composition_1 = __nccwpck_require__(21239); const organization_members_composition_root_1 = __nccwpck_require__(50603); @@ -76155,7 +76155,6 @@ function createIssueUseCaseCompositionRoot(binding) { const gitCli = new git_cli_repository_1.GitCliRepository(); const linkedBranch = new linked_branch_repository_1.LinkedBranchRepository((0, github_project_client_factory_1.createGraphqlTransportClient)()); const branchPropagationDelay = new timer_branch_propagation_delay_adapter_1.TimerBranchPropagationDelayAdapter(); - const eventualConsistencyDelay = new timer_delay_adapter_1.TimerDelayAdapter(); const projectBoard = (0, project_board_composition_root_1.createProjectBoardCompositionRoot)(); const issueAssignee = new issue_assignment_repository_1.IssueAssignmentRepository((0, github_issue_client_factory_1.createIssueAssignmentClient)()); const issueClosure = new issue_closure_repository_1.IssueClosureRepository(issueLifecycle, issueContent); @@ -76175,7 +76174,7 @@ function createIssueUseCaseCompositionRoot(binding) { assignMemberToIssue: new assign_members_to_issue_use_case_1.AssignMemberToIssueUseCase(boundIssueAssignee, boundOrganizationMembers), updateTitle: new update_title_use_case_1.UpdateTitleUseCase((0, shared_capability_port_binding_1.bindIssueTitle)(issueTitle, binding)), updateIssueType: new update_issue_type_use_case_1.UpdateIssueTypeUseCase((0, lifecycle_capability_port_binding_1.bindIssueTypeAssignment)(issueTypeAssignment, binding)), - linkIssueProject: new link_issue_project_use_case_1.LinkIssueProjectUseCase(projectContent, eventualConsistencyDelay), + linkIssueProject: new link_issue_project_use_case_1.LinkIssueProjectUseCase(projectContent), checkPriorityIssueSize: new check_priority_issue_size_use_case_1.CheckPriorityIssueSizeUseCase(boundProjectBoard), prepareBranches: new prepare_branches_use_case_1.PrepareBranchesUseCase(boundBranchLifecycle, branchName, gitCli, gitCli, boundLinkedBranch, branchPropagationDelay, moveIssueToInProgress), removeNotNeededBranches: new remove_not_needed_branches_use_case_1.RemoveNotNeededBranchesUseCase(boundBranchLifecycle, branchName), @@ -76661,7 +76660,7 @@ function createPullRequestUseCaseCompositionRoot(binding) { updateTitle: new update_title_use_case_1.UpdateTitleUseCase((0, shared_capability_port_binding_1.bindIssueTitle)(issueTitle, binding)), assignMemberToIssue: new assign_members_to_issue_use_case_1.AssignMemberToIssueUseCase(boundIssueAssignee, boundOrganizationSelection), assignReviewersToIssue: new assign_reviewers_to_issue_use_case_1.AssignReviewersToIssueUseCase(boundIssueAssignee, (0, lifecycle_capability_port_binding_1.bindPullRequestReviewer)(pullRequestReviewer, binding), boundOrganizationSelection), - linkPullRequestProject: new link_pull_request_project_use_case_1.LinkPullRequestProjectUseCase(projectContent, eventualConsistencyDelay), + linkPullRequestProject: new link_pull_request_project_use_case_1.LinkPullRequestProjectUseCase(projectContent), linkPullRequestIssue: new link_pull_request_issue_use_case_1.LinkPullRequestIssueUseCase(boundPullRequestLifecycle, eventualConsistencyDelay), syncSizeAndProgressLabels: new sync_size_and_progress_labels_from_issue_to_pr_use_case_1.SyncSizeAndProgressLabelsFromIssueToPrUseCase((0, lifecycle_capability_port_binding_1.bindIssueLabels)(pullRequestLabels, binding)), checkPriorityPullRequestSize: new check_priority_pull_request_size_use_case_1.CheckPriorityPullRequestSizeUseCase(boundProjectBoard), @@ -77017,7 +77016,7 @@ function bindProjectContent(identity, commands, links, binding) { return { resolveIssueContentId: (issueNumber) => identity.getId(binding.owner, binding.repository, issueNumber, binding.token), linkContentId: (project, contentId) => links.linkContentId(toProjectDetail(project), contentId, binding.token), - moveContent: (project, contentNumber, columnName) => commands.moveIssueToColumn(toProjectDetail(project), binding.owner, binding.repository, contentNumber, columnName, binding.token), + moveContent: (project, projectItemId, columnName) => commands.moveProjectItemToColumn(toProjectDetail(project), projectItemId, columnName, binding.token), }; } function toProjectDetail(project) { @@ -79221,7 +79220,7 @@ Write every human-readable sentence in {{targetLocale}}. Preserve code identifie 4. Provide \`overview\` as one to three sentences that state the outcome and why it matters. 5. Provide \`whatChangedHeading\` as the plain-text {{targetLocale}} equivalent of "What changed" and \`changes\` as two to six short, outcome-oriented items. Do not inventory files, use-case names, internal categories, or every implementation step. 6. When execution or manual-verification evidence is available, provide \`validationHeading\` as the plain-text {{targetLocale}} equivalent of "Validation" and \`validation\` with only the supported commands, automated checks, or manual scenarios. Never claim a check passed unless the evidence says it did, and never infer that result from the presence of test files or commands. When no verification evidence is available, set both fields to \`null\`; do not add a “not run” placeholder. -7. Set \`reviewNotesHeading\` and \`reviewNotes\` to \`null\` unless reviewers need material migration, security, performance, compatibility, rollout, manual-verification, risk, or follow-up context. Otherwise use the localized plain-text heading and one to four concise items. {{relatedIssueInstruction}} +7. Set \`reviewNotesHeading\` and \`reviewNotes\` to \`null\` unless reviewers need material migration, security, performance, compatibility, rollout, manual-verification, risk, or follow-up context. Do not infer consumers, compatibility obligations, upgrade steps, migration work, or rollout requirements merely because code, configuration, inputs, or symbols were removed or named deprecated. Include that context only when the issue, diff, repository documentation, or verification evidence identifies a concrete affected consumer or required transition. Otherwise use the localized plain-text heading and one to four concise items. {{relatedIssueInstruction}} 8. Keep the description practical and normally under 4,000 characters. It must never exceed 12,000 characters. Do not use emoji, horizontal separators, generic checklists, empty headings, repeated statements, placeholder text, or unsupported "no impact" claims. 9. Return one JSON object with exactly \`outputLocale\`, \`overview\`, \`whatChangedHeading\`, \`changes\`, \`validationHeading\`, \`validation\`, \`reviewNotesHeading\`, \`reviewNotes\`, and \`closesLinkedIssue\`. Every content field is plain text except Markdown links, code spans, refs, and commands inside content values. The application renders the Markdown structure; do not include headings, bullet prefixes, a preamble, meta-commentary, or code fence in the values. diff --git a/build/github_action/index.js b/build/github_action/index.js index c90dc76a1..0e0c5c72b 100644 --- a/build/github_action/index.js +++ b/build/github_action/index.js @@ -43355,7 +43355,7 @@ const ENGLISH_MESSAGES = Object.freeze({ 'bugbot.status.syncFailure': 'Bugbot could not fully synchronize the state of {commit}.', 'bugbot.status.clean': 'No active findings on {commit}.', 'bugbot.status.attention': Object.freeze({ one: '{count} finding requires attention on {commit}.', other: '{count} findings require attention on {commit}.' }), - 'bugbot.status.action.partial': 'Inspect the omitted items or reduce the pull request scope. Rerun the review only after changing the scope, limits, or access.', + 'bugbot.status.action.partial': 'Do not treat this review as complete. Review the sources under Incomplete coverage and manually inspect omitted items; rerun only after reducing the relevant scope or restoring provider access.', 'bugbot.status.action.recheck': 'Correct the reported cause, then run {command} once.', 'bugbot.status.action.findings': 'Review the linked threads or comment {command}.', 'bugbot.status.findingsHeading': 'Findings', @@ -43444,7 +43444,7 @@ const SPANISH_MESSAGES = Object.freeze({ 'bugbot.status.syncFailure': 'Bugbot no pudo sincronizar por completo el estado de {commit}.', 'bugbot.status.clean': 'No hay hallazgos activos en {commit}.', 'bugbot.status.attention': Object.freeze({ one: '{count} hallazgo requiere atención en {commit}.', many: '{count} hallazgos requieren atención en {commit}.', other: '{count} hallazgos requieren atención en {commit}.' }), - 'bugbot.status.action.partial': 'Revisa los elementos omitidos o reduce el alcance del pull request. Repite la revisión solo después de cambiar el alcance, los límites o el acceso.', + 'bugbot.status.action.partial': 'No consideres completa esta revisión. Revisa las fuentes en Cobertura incompleta e inspecciona manualmente los elementos omitidos; repite la revisión solo después de reducir el alcance relevante o restaurar el acceso al proveedor.', 'bugbot.status.action.recheck': 'Corrige la causa indicada y ejecuta {command} una vez.', 'bugbot.status.action.findings': 'Revisa los hilos enlazados o comenta {command}.', 'bugbot.status.findingsHeading': 'Hallazgos', @@ -59788,8 +59788,8 @@ function projectIssueContentLinkContext(source) { function projectPullRequestContentLinkContext(source) { return projectContext(source, 'pull request', source.pullRequest.number, source.project.getProjectColumnPullRequestCreated(), source.pullRequest.id); } -/** Links issue-like content to each configured project and moves it after propagation. */ -async function runProjectContentLinkWorkflow(param, taskId, port, waitForPropagation) { +/** Links issue-like content to each configured project and updates the returned item directly. */ +async function runProjectContentLinkWorkflow(param, taskId, port) { (0, logging_ports_1.logInfo)(`${(0, task_emoji_1.getTaskEmoji)(taskId)} Executing ${taskId}.`); if (param.projects.length === 0) { (0, logging_ports_1.logDebugInfo)(`Link${capitalize(param.contentType)}: no projects configured; skipping.`); @@ -59799,20 +59799,15 @@ async function runProjectContentLinkWorkflow(param, taskId, port, waitForPropaga const contentId = param.contentId ?? await port.resolveIssueContentId(param.contentNumber); const results = []; for (const project of param.projects) { - const linked = await port.linkContentId(project, contentId); - if (!linked) { - (0, logging_ports_1.logDebugInfo)(`Link${capitalize(param.contentType)}: ${param.contentType} already linked to project "${project.title}" or link failed.`); - continue; - } - await waitForPropagation(); - const moved = await port.moveContent(project, param.contentNumber, param.columnName); + const projectItemId = await port.linkContentId(project, contentId); + const moved = await port.moveContent(project, projectItemId, param.columnName); if (moved) { results.push(new result_1.Result({ id: taskId, success: true, executed: true, steps: [ - `The ${param.contentType} was linked to [**${project.title}**](${project.url}) and moved to the column \`${param.columnName}\`.`, + `The ${param.contentType} is linked to [**${project.title}**](${project.url}) with status \`${param.columnName}\`.`, ], })); } @@ -59852,14 +59847,11 @@ function projectContext(source, contentType, contentNumber, columnName, contentI }); } function moveFailureResult(context, taskId, project) { - if (context.contentType === 'issue') { - return new result_1.Result({ id: taskId, success: true, executed: false, steps: [] }); - } return new result_1.Result({ id: taskId, success: false, executed: true, - steps: [`The ${context.contentType} was linked to [**${project.title}**](${project.url}) but there was an error moving it to the column \`${context.columnName}\`.`], + steps: [`The ${context.contentType} is linked to [**${project.title}**](${project.url}), but its status could not be set to \`${context.columnName}\`.`], }); } function capitalize(value) { @@ -61530,13 +61522,12 @@ exports.LinkIssueProjectUseCase = void 0; const project_content_link_workflow_1 = __nccwpck_require__(89064); /** Application boundary for linking issues to configured ProjectV2 boards. */ class LinkIssueProjectUseCase { - constructor(projectContentPort, eventualConsistencyDelayPort) { + constructor(projectContentPort) { this.projectContentPort = projectContentPort; - this.eventualConsistencyDelayPort = eventualConsistencyDelayPort; this.taskId = 'LinkIssueProjectUseCase'; } async invoke(param) { - return (0, project_content_link_workflow_1.runProjectContentLinkWorkflow)(param, this.taskId, this.projectContentPort, () => this.eventualConsistencyDelayPort.wait(10000)); + return (0, project_content_link_workflow_1.runProjectContentLinkWorkflow)(param, this.taskId, this.projectContentPort); } } exports.LinkIssueProjectUseCase = LinkIssueProjectUseCase; @@ -62587,13 +62578,12 @@ exports.LinkPullRequestProjectUseCase = void 0; const project_content_link_workflow_1 = __nccwpck_require__(89064); /** Application boundary for linking pull requests to configured ProjectV2 boards. */ class LinkPullRequestProjectUseCase { - constructor(projectContentPort, eventualConsistencyDelayPort) { + constructor(projectContentPort) { this.projectContentPort = projectContentPort; - this.eventualConsistencyDelayPort = eventualConsistencyDelayPort; this.taskId = 'LinkPullRequestProjectUseCase'; } async invoke(param) { - return (0, project_content_link_workflow_1.runProjectContentLinkWorkflow)(param, this.taskId, this.projectContentPort, () => this.eventualConsistencyDelayPort.wait(10000)); + return (0, project_content_link_workflow_1.runProjectContentLinkWorkflow)(param, this.taskId, this.projectContentPort); } } exports.LinkPullRequestProjectUseCase = LinkPullRequestProjectUseCase; @@ -69595,6 +69585,7 @@ class ProjectBoardCommandRepository { this.setTaskPriority = (project, owner, repo, issueOrPullRequestNumber, priorityLabel, token) => this.setField(project, owner, repo, issueOrPullRequestNumber, this.priorityField, priorityLabel, token); this.setTaskSize = (project, owner, repo, issueOrPullRequestNumber, sizeLabel, token) => this.setField(project, owner, repo, issueOrPullRequestNumber, this.sizeField, sizeLabel, token); this.moveIssueToColumn = (project, owner, repo, issueOrPullRequestNumber, columnName, token) => this.setField(project, owner, repo, issueOrPullRequestNumber, this.statusField, columnName, token); + this.moveProjectItemToColumn = (project, projectItemId, columnName, token) => (0, project_board_field_update_1.setProjectBoardSingleSelectFieldByItemId)(this.graphqlClient, project, projectItemId, this.statusField, columnName, token); } setField(project, owner, repo, issueOrPullRequestNumber, fieldName, fieldValue, token) { return (0, project_board_field_update_1.setProjectBoardSingleSelectField)(this.projectBoardContentQueryPort, this.graphqlClient, project, owner, repo, issueOrPullRequestNumber, fieldName, fieldValue, token); @@ -69685,6 +69676,7 @@ function validateProjectId(projectId) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setProjectBoardSingleSelectField = setProjectBoardSingleSelectField; +exports.setProjectBoardSingleSelectFieldByItemId = setProjectBoardSingleSelectFieldByItemId; const project_board_provider_limits_1 = __nccwpck_require__(96997); const logger_1 = __nccwpck_require__(91151); const github_pagination_adapter_1 = __nccwpck_require__(2761); @@ -69755,9 +69747,18 @@ async function setProjectBoardSingleSelectField(contentQueryPort, graphqlClient, (0, logger_1.logDebugInfo)(`Field '${fieldName}' is already set to '${fieldValue}'. No update needed.`); return false; } + return updateProjectBoardSingleSelectField(client, project, contentId, target); +} +/** Updates a ProjectV2 item returned by the link mutation without waiting for list propagation. */ +async function setProjectBoardSingleSelectFieldByItemId(graphqlClient, project, projectItemId, fieldName, fieldValue, token) { + const client = graphqlClient.getClient(token); + const target = await findFieldOption(client, project, fieldName, fieldValue); + return updateProjectBoardSingleSelectField(client, project, projectItemId, target); +} +async function updateProjectBoardSingleSelectField(client, project, projectItemId, target) { const mutationResult = await client.graphql(UPDATE_FIELD_MUTATION, { projectId: project.id, - itemId: contentId, + itemId: projectItemId, fieldId: target.fieldId, optionId: target.optionId, }); @@ -69825,7 +69826,7 @@ async function findProjectItem(client, project, itemId, fieldName) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getProjectItemId = getProjectItemId; -exports.isProjectContentLinked = isProjectContentLinked; +exports.getProjectItemIdByContentId = getProjectItemIdByContentId; const project_board_provider_limits_1 = __nccwpck_require__(96997); const logger_1 = __nccwpck_require__(91151); const github_pagination_adapter_1 = __nccwpck_require__(2761); @@ -69871,8 +69872,8 @@ async function getProjectItemId(graphqlClient, project, owner, repo, issueOrPull } return projectItemId; } -async function isProjectContentLinked(graphqlClient, project, contentId) { - return Boolean(await findProjectItemId(graphqlClient, project, contentId)); +async function getProjectItemIdByContentId(graphqlClient, project, contentId) { + return findProjectItemId(graphqlClient, project, contentId); } async function findProjectItemId(client, project, contentId) { for await (const page of (0, github_pagination_adapter_1.paginateCursor)(async (after) => { @@ -69911,19 +69912,19 @@ class ProjectBoardLinkRepository { this.projectBoardQueryPort = projectBoardQueryPort; this.graphqlClient = graphqlClient; this.linkContentId = async (project, contentId, token) => { - if (await this.projectBoardQueryPort.isContentLinked(project, contentId, token)) { + const existingItemId = await this.projectBoardQueryPort.getLinkedContentItemId(project, contentId, token); + if (existingItemId) { (0, logger_1.logDebugInfo)(`Content ${contentId} is already linked to project ${project.id}.`); - return false; + return existingItemId; } const linkMutation = `mutation($projectId: ID!, $contentId: ID!) { addProjectV2ItemById(input: {projectId: $projectId, contentId: $contentId}) { item { id } } }`; const linkResult = await this.graphqlClient.getClient(token).graphql(linkMutation, { projectId: project.id, contentId }); const linkedItemId = linkResult.addProjectV2ItemById?.item?.id; if (!linkedItemId) { - (0, logger_1.logDebugInfo)(`Project link mutation returned no item for content ${contentId} and project ${project.id}.`); - return false; + throw new Error(`GitHub did not return the project item created for content ${contentId} in project ${project.id}.`); } (0, logger_1.logDebugInfo)(`Linked ${contentId} with id ${linkedItemId} to project ${project.id}`); - return true; + return linkedItemId; }; } } @@ -69947,7 +69948,7 @@ class ProjectBoardQueryRepository { this.graphqlClient = graphqlClient; this.getProjectDetail = (projectId, owner, token) => (0, project_board_detail_query_1.getProjectBoardDetail)(this.ownerTypeClient, this.graphqlClient, projectId, owner, token); this.getProjectItemId = async (project, owner, repo, issueOrPullRequestNumber, token) => (0, project_board_item_query_1.getProjectItemId)(this.graphqlClient.getClient(token), project, owner, repo, issueOrPullRequestNumber); - this.isContentLinked = async (project, contentId, token) => (0, project_board_item_query_1.isProjectContentLinked)(this.graphqlClient.getClient(token), project, contentId); + this.getLinkedContentItemId = async (project, contentId, token) => (0, project_board_item_query_1.getProjectItemIdByContentId)(this.graphqlClient.getClient(token), project, contentId); } } exports.ProjectBoardQueryRepository = ProjectBoardQueryRepository; @@ -75407,7 +75408,6 @@ const issue_title_repository_1 = __nccwpck_require__(10121); const issue_type_assignment_repository_1 = __nccwpck_require__(19118); const workflow_dispatch_repository_1 = __nccwpck_require__(29509); const timer_branch_propagation_delay_adapter_1 = __nccwpck_require__(20846); -const timer_delay_adapter_1 = __nccwpck_require__(71942); const agent_capability_composition_root_1 = __nccwpck_require__(85079); const issue_use_case_composition_1 = __nccwpck_require__(21239); const organization_members_composition_root_1 = __nccwpck_require__(50603); @@ -75425,7 +75425,6 @@ function createIssueUseCaseCompositionRoot(binding) { const gitCli = new git_cli_repository_1.GitCliRepository(); const linkedBranch = new linked_branch_repository_1.LinkedBranchRepository((0, github_project_client_factory_1.createGraphqlTransportClient)()); const branchPropagationDelay = new timer_branch_propagation_delay_adapter_1.TimerBranchPropagationDelayAdapter(); - const eventualConsistencyDelay = new timer_delay_adapter_1.TimerDelayAdapter(); const projectBoard = (0, project_board_composition_root_1.createProjectBoardCompositionRoot)(); const issueAssignee = new issue_assignment_repository_1.IssueAssignmentRepository((0, github_issue_client_factory_1.createIssueAssignmentClient)()); const issueClosure = new issue_closure_repository_1.IssueClosureRepository(issueLifecycle, issueContent); @@ -75445,7 +75444,7 @@ function createIssueUseCaseCompositionRoot(binding) { assignMemberToIssue: new assign_members_to_issue_use_case_1.AssignMemberToIssueUseCase(boundIssueAssignee, boundOrganizationMembers), updateTitle: new update_title_use_case_1.UpdateTitleUseCase((0, shared_capability_port_binding_1.bindIssueTitle)(issueTitle, binding)), updateIssueType: new update_issue_type_use_case_1.UpdateIssueTypeUseCase((0, lifecycle_capability_port_binding_1.bindIssueTypeAssignment)(issueTypeAssignment, binding)), - linkIssueProject: new link_issue_project_use_case_1.LinkIssueProjectUseCase(projectContent, eventualConsistencyDelay), + linkIssueProject: new link_issue_project_use_case_1.LinkIssueProjectUseCase(projectContent), checkPriorityIssueSize: new check_priority_issue_size_use_case_1.CheckPriorityIssueSizeUseCase(boundProjectBoard), prepareBranches: new prepare_branches_use_case_1.PrepareBranchesUseCase(boundBranchLifecycle, branchName, gitCli, gitCli, boundLinkedBranch, branchPropagationDelay, moveIssueToInProgress), removeNotNeededBranches: new remove_not_needed_branches_use_case_1.RemoveNotNeededBranchesUseCase(boundBranchLifecycle, branchName), @@ -75922,7 +75921,7 @@ function createPullRequestUseCaseCompositionRoot(binding) { updateTitle: new update_title_use_case_1.UpdateTitleUseCase((0, shared_capability_port_binding_1.bindIssueTitle)(issueTitle, binding)), assignMemberToIssue: new assign_members_to_issue_use_case_1.AssignMemberToIssueUseCase(boundIssueAssignee, boundOrganizationSelection), assignReviewersToIssue: new assign_reviewers_to_issue_use_case_1.AssignReviewersToIssueUseCase(boundIssueAssignee, (0, lifecycle_capability_port_binding_1.bindPullRequestReviewer)(pullRequestReviewer, binding), boundOrganizationSelection), - linkPullRequestProject: new link_pull_request_project_use_case_1.LinkPullRequestProjectUseCase(projectContent, eventualConsistencyDelay), + linkPullRequestProject: new link_pull_request_project_use_case_1.LinkPullRequestProjectUseCase(projectContent), linkPullRequestIssue: new link_pull_request_issue_use_case_1.LinkPullRequestIssueUseCase(boundPullRequestLifecycle, eventualConsistencyDelay), syncSizeAndProgressLabels: new sync_size_and_progress_labels_from_issue_to_pr_use_case_1.SyncSizeAndProgressLabelsFromIssueToPrUseCase((0, lifecycle_capability_port_binding_1.bindIssueLabels)(pullRequestLabels, binding)), checkPriorityPullRequestSize: new check_priority_pull_request_size_use_case_1.CheckPriorityPullRequestSizeUseCase(boundProjectBoard), @@ -76214,7 +76213,7 @@ function bindProjectContent(identity, commands, links, binding) { return { resolveIssueContentId: (issueNumber) => identity.getId(binding.owner, binding.repository, issueNumber, binding.token), linkContentId: (project, contentId) => links.linkContentId(toProjectDetail(project), contentId, binding.token), - moveContent: (project, contentNumber, columnName) => commands.moveIssueToColumn(toProjectDetail(project), binding.owner, binding.repository, contentNumber, columnName, binding.token), + moveContent: (project, projectItemId, columnName) => commands.moveProjectItemToColumn(toProjectDetail(project), projectItemId, columnName, binding.token), }; } function toProjectDetail(project) { @@ -78090,7 +78089,7 @@ Write every human-readable sentence in {{targetLocale}}. Preserve code identifie 4. Provide \`overview\` as one to three sentences that state the outcome and why it matters. 5. Provide \`whatChangedHeading\` as the plain-text {{targetLocale}} equivalent of "What changed" and \`changes\` as two to six short, outcome-oriented items. Do not inventory files, use-case names, internal categories, or every implementation step. 6. When execution or manual-verification evidence is available, provide \`validationHeading\` as the plain-text {{targetLocale}} equivalent of "Validation" and \`validation\` with only the supported commands, automated checks, or manual scenarios. Never claim a check passed unless the evidence says it did, and never infer that result from the presence of test files or commands. When no verification evidence is available, set both fields to \`null\`; do not add a “not run” placeholder. -7. Set \`reviewNotesHeading\` and \`reviewNotes\` to \`null\` unless reviewers need material migration, security, performance, compatibility, rollout, manual-verification, risk, or follow-up context. Otherwise use the localized plain-text heading and one to four concise items. {{relatedIssueInstruction}} +7. Set \`reviewNotesHeading\` and \`reviewNotes\` to \`null\` unless reviewers need material migration, security, performance, compatibility, rollout, manual-verification, risk, or follow-up context. Do not infer consumers, compatibility obligations, upgrade steps, migration work, or rollout requirements merely because code, configuration, inputs, or symbols were removed or named deprecated. Include that context only when the issue, diff, repository documentation, or verification evidence identifies a concrete affected consumer or required transition. Otherwise use the localized plain-text heading and one to four concise items. {{relatedIssueInstruction}} 8. Keep the description practical and normally under 4,000 characters. It must never exceed 12,000 characters. Do not use emoji, horizontal separators, generic checklists, empty headings, repeated statements, placeholder text, or unsupported "no impact" claims. 9. Return one JSON object with exactly \`outputLocale\`, \`overview\`, \`whatChangedHeading\`, \`changes\`, \`validationHeading\`, \`validation\`, \`reviewNotesHeading\`, \`reviewNotes\`, and \`closesLinkedIssue\`. Every content field is plain text except Markdown links, code spans, refs, and commands inside content values. The application renders the Markdown structure; do not include headings, bullet prefixes, a preamble, meta-commentary, or code fence in the values. diff --git a/docs/bugbot/detection.mdx b/docs/bugbot/detection.mdx index 3debd7416..3e3c5f19a 100644 --- a/docs/bugbot/detection.mdx +++ b/docs/bugbot/detection.mdx @@ -146,7 +146,7 @@ When there are more findings than the limit: - The action publishes the first N findings as individual issue comments for issue-only work, or as inline comments in one PR review. - Overflow is added to the same PR review summary. When no PR exists, one extra issue comment summarizes it. -- On a PR, the canonical **Bugbot status** accounts for every accepted current finding, including overflow. Overflow rows have no thread link because they were deliberately not published individually. Increase the configured limit or reduce the PR scope; rerun only after changing the relevant scope, limit, access, or code. A historical review's mutable block reports its individually tracked findings and explicitly flags historical overflow instead of claiming that untracked entries are resolved. +- On a PR, the canonical **Bugbot status** accounts for every accepted current finding, including overflow. Overflow rows have no thread link because they were deliberately not published individually. Inspect overflow manually; reduce the relevant scope or restore provider access before rerunning. Fixed context safety limits are not configuration knobs, and rerunning unchanged capped evidence cannot improve coverage. A historical review's mutable block reports its individually tracked findings and explicitly flags historical overflow instead of claiming that untracked entries are resolved. So a PR analysis creates one review batch instead of N unrelated reviews and N duplicated conversation comments. diff --git a/docs/bugbot/examples.mdx b/docs/bugbot/examples.mdx index 6a2ce0ecf..e24400005 100644 --- a/docs/bugbot/examples.mdx +++ b/docs/bugbot/examples.mdx @@ -269,8 +269,10 @@ review with work remaining looks conceptually like this: `verification-required` need attention. `unknown` and a partial/failed projection fail closed and expose bounded recovery details. A provider or state error can recommend one `/copilot recheck` after its cause is corrected. Fixed -coverage limits instead tell the reader to change scope, limits, or access; -repeating the same command against unchanged capped evidence is not useful. +coverage limits instead require manual inspection of omitted items; reduce the +relevant scope or restore provider access before rerunning. The limits are not +configuration knobs, and repeating the same command against unchanged capped +evidence is not useful. A superseded run does not edit this card; the newer head owns the next update. --- diff --git a/docs/bugbot/failure-scenarios.mdx b/docs/bugbot/failure-scenarios.mdx index 5523c6361..7288a9812 100644 --- a/docs/bugbot/failure-scenarios.mdx +++ b/docs/bugbot/failure-scenarios.mdx @@ -25,7 +25,7 @@ description: Diagnose terminal failures across detection, publication, autofix, Use the canonical **Bugbot status** card and `Copilot / Review` Check for the aggregate state. Run `/copilot recheck` to repair the generated status block; the historical snapshot text is intentionally retained. - Open **Incomplete coverage**. A fixed context cap is `partial`: retained evidence may produce findings, but Bugbot cannot declare the whole PR clean or resolve omitted history. Inspect the named source, split an oversized PR, increase the applicable limit, or correct access. Rerun only after one of those inputs changes; repeating `/copilot recheck` against the same capped evidence cannot improve coverage. A provider or permission error is `unavailable` and aborts before analysis; correct access or wait for the rate limit before retrying. Every final-read surface is tracked independently, so an empty verified result is not confused with a failed read. A previously observed non-clean finding that disappears remains visible as `unknown`; only fully resolved findings may be omitted safely. + Do not treat the review as complete. Open **Incomplete coverage**, review every named source, and manually inspect omitted items. Reduce the relevant scope when practical or restore provider access before rerunning. The context limits are fixed safety boundaries, not configuration knobs. Retained evidence may produce findings, but Bugbot cannot declare the whole PR clean or resolve omitted history. Repeating `/copilot recheck` against the same capped evidence cannot improve coverage. A provider or permission error is `unavailable` and aborts before analysis; correct access or wait for the rate limit before retrying. Every final-read surface is tracked independently, so an empty verified result is not confused with a failed read. A previously observed non-clean finding that disappears remains visible as `unknown`; only fully resolved findings may be omitted safely. Bugbot rejects the result instead of treating an omitted aggregate or missing, extra, fractional, negative, non-finite, or overflowing state counts as zero. It also rejects duplicate telemetry or a valid snapshot beside a malformed owned sibling; valid zero counts cannot conceal invalid telemetry. `completed`, `no-findings`, `partial`, and `dry-run` outcomes must include all seven canonical counts. The Action and eligible Review Check fail closed, lifecycle stays blocked, and `/copilot status` does not invent counts. Metadata-only, `skipped`, `superseded`, and `failed` results may omit counts because none can claim a clean analysis. Inspect the producing workflow result, correct the result schema or retry the current released Action, then run `/copilot recheck`. diff --git a/docs/issues/assignees-and-projects.mdx b/docs/issues/assignees-and-projects.mdx index a879a286a..d81afc6b7 100644 --- a/docs/issues/assignees-and-projects.mdx +++ b/docs/issues/assignees-and-projects.mdx @@ -39,6 +39,11 @@ Linking issues to **GitHub Project** boards requires a **Personal Access Token ( - **Format:** Comma-separated list of **project IDs** (numeric). You find the project ID in the project URL or via the API; it is **not** the project name. - **Effect:** When the action runs (e.g. on issue opened or edited), it **links the issue** to each of these projects and can **move the issue** to a column (e.g. "Todo", "In Progress") based on **`project-column-issue-created`** and **`project-column-issue-in-progress`** (see [Configuration](/configuration)). +The column update uses the exact ProjectV2 item returned by GitHub when the +issue is added. It does not wait and re-list the board, so normal Project +propagation delay cannot turn a successful link into a failed run. Replays reuse +the existing item and do not create duplicates. + ### How many boards? You can link each issue to **multiple** boards by listing several IDs: diff --git a/docs/pull-requests/ai-description.mdx b/docs/pull-requests/ai-description.mdx index 933331d80..6b3b46f97 100644 --- a/docs/pull-requests/ai-description.mdx +++ b/docs/pull-requests/ai-description.mdx @@ -33,6 +33,12 @@ available, both validation fields are `null` and the entire section is omitted; Copilot does not add a “not run” placeholder. A template can add useful constraints, but it cannot force the agent to reproduce empty boilerplate. +Review notes also require evidence. Removing code, configuration, inputs, or a +symbol named “deprecated” does not by itself prove that consumers exist or that +an upgrade, migration, compatibility, or rollout step is required. Copilot adds +those notes only when the issue, diff, repository documentation, or verification +evidence identifies a concrete affected consumer or transition. + **Recommendation:** Keep the template short. Ask for the outcome, material changes, validation evidence, and conditional reviewer notes. The setup template follows this contract. diff --git a/docs/pull-requests/capabilities.mdx b/docs/pull-requests/capabilities.mdx index f315c390c..63b2349b8 100644 --- a/docs/pull-requests/capabilities.mdx +++ b/docs/pull-requests/capabilities.mdx @@ -35,6 +35,10 @@ The branch name must follow the pattern that includes the issue number (e.g. ` { expect(body).toContain('issue-comments: partial; retained=200, omitted=1'); expect(body).toContain('truncated=2'); expect(body).toContain('provider page limit reached'); - expect(body).toContain('Inspect the omitted items or reduce the pull request scope'); - expect(body).toContain('Rerun the review only after changing'); + expect(body).toContain('Do not treat this review as complete'); + expect(body).toContain('rerun only after reducing the relevant scope or restoring provider access'); expect(body).not.toContain('Run `/copilot recheck`'); expect(body).not.toContain('No active findings'); expect(body).not.toContain('No action required'); @@ -142,7 +142,8 @@ describe('Bugbot review presentation', () => { findings: [], }), 'es-ES', links); expect(spanish).toContain('## Bugbot: revisión incompleta'); - expect(spanish).toContain('Repite la revisión solo después de cambiar'); + expect(spanish).toContain('No consideres completa esta revisión'); + expect(spanish).toContain('repite la revisión solo después de reducir el alcance relevante'); expect(spanish).toContain('Cobertura incompleta'); }); diff --git a/src/application/policies/bugbot_message_catalog.ts b/src/application/policies/bugbot_message_catalog.ts index 7b2bf5453..834443c29 100644 --- a/src/application/policies/bugbot_message_catalog.ts +++ b/src/application/policies/bugbot_message_catalog.ts @@ -112,7 +112,7 @@ const ENGLISH_MESSAGES: Readonly> = Obje 'bugbot.status.syncFailure': 'Bugbot could not fully synchronize the state of {commit}.', 'bugbot.status.clean': 'No active findings on {commit}.', 'bugbot.status.attention': Object.freeze({ one: '{count} finding requires attention on {commit}.', other: '{count} findings require attention on {commit}.' }), - 'bugbot.status.action.partial': 'Inspect the omitted items or reduce the pull request scope. Rerun the review only after changing the scope, limits, or access.', + 'bugbot.status.action.partial': 'Do not treat this review as complete. Review the sources under Incomplete coverage and manually inspect omitted items; rerun only after reducing the relevant scope or restoring provider access.', 'bugbot.status.action.recheck': 'Correct the reported cause, then run {command} once.', 'bugbot.status.action.findings': 'Review the linked threads or comment {command}.', 'bugbot.status.findingsHeading': 'Findings', @@ -202,7 +202,7 @@ const SPANISH_MESSAGES: Readonly> = Obje 'bugbot.status.syncFailure': 'Bugbot no pudo sincronizar por completo el estado de {commit}.', 'bugbot.status.clean': 'No hay hallazgos activos en {commit}.', 'bugbot.status.attention': Object.freeze({ one: '{count} hallazgo requiere atención en {commit}.', many: '{count} hallazgos requieren atención en {commit}.', other: '{count} hallazgos requieren atención en {commit}.' }), - 'bugbot.status.action.partial': 'Revisa los elementos omitidos o reduce el alcance del pull request. Repite la revisión solo después de cambiar el alcance, los límites o el acceso.', + 'bugbot.status.action.partial': 'No consideres completa esta revisión. Revisa las fuentes en Cobertura incompleta e inspecciona manualmente los elementos omitidos; repite la revisión solo después de reducir el alcance relevante o restaurar el acceso al proveedor.', 'bugbot.status.action.recheck': 'Corrige la causa indicada y ejecuta {command} una vez.', 'bugbot.status.action.findings': 'Revisa los hilos enlazados o comenta {command}.', 'bugbot.status.findingsHeading': 'Hallazgos', diff --git a/src/application/ports/project_board_command_ports.ts b/src/application/ports/project_board_command_ports.ts index 76bebe83e..08e7b2205 100644 --- a/src/application/ports/project_board_command_ports.ts +++ b/src/application/ports/project_board_command_ports.ts @@ -5,6 +5,7 @@ export interface ProjectBoardCommandPort { setTaskPriority(project: ProjectDetail, owner: string, repository: string, issueOrPullRequestNumber: number, priorityLabel: string, token: string): Promise; setTaskSize(project: ProjectDetail, owner: string, repository: string, issueOrPullRequestNumber: number, sizeLabel: string, token: string): Promise; moveIssueToColumn(project: ProjectDetail, owner: string, repository: string, issueOrPullRequestNumber: number, columnName: string, token: string): Promise; + moveProjectItemToColumn(project: ProjectDetail, projectItemId: string, columnName: string, token: string): Promise; } /** Repository-credential-bound project mutations for lifecycle steps. */ diff --git a/src/application/ports/project_board_link_ports.ts b/src/application/ports/project_board_link_ports.ts index f9e75583b..ea9c74d2c 100644 --- a/src/application/ports/project_board_link_ports.ts +++ b/src/application/ports/project_board_link_ports.ts @@ -10,12 +10,12 @@ export interface ProjectReference { } export interface ProjectBoardLinkPort { - linkContentId(project: ProjectDetail, contentId: string, token: string): Promise; + linkContentId(project: ProjectDetail, contentId: string, token: string): Promise; } /** Repository-credential-bound project authority for one content-link workflow. */ export interface BoundProjectContentPort { resolveIssueContentId(issueNumber: number): Promise; - linkContentId(project: ProjectReference, contentId: string): Promise; - moveContent(project: ProjectReference, contentNumber: number, columnName: string): Promise; + linkContentId(project: ProjectReference, contentId: string): Promise; + moveContent(project: ProjectReference, projectItemId: string, columnName: string): Promise; } diff --git a/src/application/ports/project_board_query_ports.ts b/src/application/ports/project_board_query_ports.ts index bec7ed2ff..d562e601c 100644 --- a/src/application/ports/project_board_query_ports.ts +++ b/src/application/ports/project_board_query_ports.ts @@ -6,5 +6,5 @@ export interface ProjectBoardContentQueryPort { } export interface ProjectBoardQueryPort extends ProjectDetailQueryPort { - isContentLinked(project: ProjectDetail, contentId: string, token: string): Promise; + getLinkedContentItemId(project: ProjectDetail, contentId: string, token: string): Promise; } diff --git a/src/application/usecases/steps/common/project_content_link_workflow.ts b/src/application/usecases/steps/common/project_content_link_workflow.ts index bac735bd2..a0e764f16 100644 --- a/src/application/usecases/steps/common/project_content_link_workflow.ts +++ b/src/application/usecases/steps/common/project_content_link_workflow.ts @@ -46,12 +46,11 @@ export function projectPullRequestContentLinkContext(source: ProjectContentLinkS ); } -/** Links issue-like content to each configured project and moves it after propagation. */ +/** Links issue-like content to each configured project and updates the returned item directly. */ export async function runProjectContentLinkWorkflow( param: ProjectContentLinkContext, taskId: string, port: BoundProjectContentPort, - waitForPropagation: () => Promise, ): Promise { logInfo(`${getTaskEmoji(taskId)} Executing ${taskId}.`); if (param.projects.length === 0) { @@ -63,23 +62,15 @@ export async function runProjectContentLinkWorkflow( const contentId = param.contentId ?? await port.resolveIssueContentId(param.contentNumber); const results: Result[] = []; for (const project of param.projects) { - const linked = await port.linkContentId(project, contentId); - if (!linked) { - logDebugInfo( - `Link${capitalize(param.contentType)}: ${param.contentType} already linked to project "${project.title}" or link failed.`, - ); - continue; - } - - await waitForPropagation(); - const moved = await port.moveContent(project, param.contentNumber, param.columnName); + const projectItemId = await port.linkContentId(project, contentId); + const moved = await port.moveContent(project, projectItemId, param.columnName); if (moved) { results.push(new Result({ id: taskId, success: true, executed: true, steps: [ - `The ${param.contentType} was linked to [**${project.title}**](${project.url}) and moved to the column \`${param.columnName}\`.`, + `The ${param.contentType} is linked to [**${project.title}**](${project.url}) with status \`${param.columnName}\`.`, ], })); } else { @@ -131,14 +122,11 @@ function moveFailureResult( taskId: string, project: ProjectReference, ): Result { - if (context.contentType === 'issue') { - return new Result({ id: taskId, success: true, executed: false, steps: [] }); - } return new Result({ id: taskId, success: false, executed: true, - steps: [`The ${context.contentType} was linked to [**${project.title}**](${project.url}) but there was an error moving it to the column \`${context.columnName}\`.`], + steps: [`The ${context.contentType} is linked to [**${project.title}**](${project.url}), but its status could not be set to \`${context.columnName}\`.`], }); } diff --git a/src/application/usecases/steps/issue/__tests__/link_issue_project_use_case.test.ts b/src/application/usecases/steps/issue/__tests__/link_issue_project_use_case.test.ts index 737d60123..3249af258 100644 --- a/src/application/usecases/steps/issue/__tests__/link_issue_project_use_case.test.ts +++ b/src/application/usecases/steps/issue/__tests__/link_issue_project_use_case.test.ts @@ -7,19 +7,9 @@ jest.mock('../../../../../utils/logger', () => ({ logWarn: jest.fn(), })); -jest.useFakeTimers(); - const mockGetId = jest.fn(); -const mockWait = jest.fn((milliseconds: number) => new Promise((resolve) => setTimeout(resolve, milliseconds))); - const mockLinkContentId = jest.fn(); -const mockMoveIssueToColumn = jest.fn(); -jest.mock('../../../../../data/repository/project/project_board_query_repository', () => ({ - ProjectBoardQueryRepository: jest.fn().mockImplementation(() => ({ - linkContentId: mockLinkContentId, - moveIssueToColumn: mockMoveIssueToColumn, - })), -})); +const mockMoveContent = jest.fn(); function baseParam(overrides: Record = {}) { return { @@ -35,44 +25,37 @@ describe('LinkIssueProjectUseCase', () => { let useCase: LinkIssueProjectUseCase; beforeEach(() => { - useCase = new LinkIssueProjectUseCase( - { - resolveIssueContentId: mockGetId, - linkContentId: mockLinkContentId, - moveContent: mockMoveIssueToColumn, - }, - { wait: mockWait }, - ); + jest.clearAllMocks(); + useCase = new LinkIssueProjectUseCase({ + resolveIssueContentId: mockGetId, + linkContentId: mockLinkContentId, + moveContent: mockMoveContent, + }); mockGetId.mockResolvedValue('issue-node-1'); - mockLinkContentId.mockResolvedValue(true); - mockMoveIssueToColumn.mockResolvedValue(true); - mockGetId.mockClear(); - mockLinkContentId.mockClear(); - mockMoveIssueToColumn.mockClear(); - mockWait.mockClear(); + mockLinkContentId.mockResolvedValue('project-item-1'); + mockMoveContent.mockResolvedValue(true); }); - afterEach(() => { - jest.useRealTimers(); - }); + it('uses the authoritative project item ID to set the configured status immediately', async () => { + const results = await useCase.invoke(baseParam()); - it('links issue to project and moves to column when linkContentId and moveIssueToColumn succeed', async () => { - const param = baseParam(); - const promise = useCase.invoke(param); - await jest.advanceTimersByTimeAsync(10000); - const results = await promise; expect(mockGetId).toHaveBeenCalledWith(42); - expect(mockLinkContentId).toHaveBeenCalled(); - expect(mockMoveIssueToColumn).toHaveBeenCalledWith(expect.any(Object), 42, 'To Do'); - expect(results.some((r) => r.success && r.steps?.some((s) => s.includes('Backlog')))).toBe(true); + expect(mockLinkContentId).toHaveBeenCalledWith(expect.any(Object), 'issue-node-1'); + expect(mockMoveContent).toHaveBeenCalledWith(expect.any(Object), 'project-item-1', 'To Do'); + expect(results).toEqual([expect.objectContaining({ + success: true, + executed: true, + steps: [expect.stringContaining('with status `To Do`')], + })]); }); - it('returns result with executed false when linkContentId returns false', async () => { - mockLinkContentId.mockResolvedValue(false); - const param = baseParam(); - const results = await useCase.invoke(param); - expect(mockMoveIssueToColumn).not.toHaveBeenCalled(); - expect(results.length).toBeGreaterThanOrEqual(0); + it('returns a failure when linking does not yield a usable project item', async () => { + mockLinkContentId.mockRejectedValue(new Error('GitHub returned no item')); + + const results = await useCase.invoke(baseParam()); + + expect(mockMoveContent).not.toHaveBeenCalled(); + expect(results).toEqual([expect.objectContaining({ success: false, executed: true })]); }); it('skips provider calls when no projects are configured', async () => { @@ -81,25 +64,26 @@ describe('LinkIssueProjectUseCase', () => { expect(results).toEqual([]); expect(mockGetId).not.toHaveBeenCalled(); expect(mockLinkContentId).not.toHaveBeenCalled(); + expect(mockMoveContent).not.toHaveBeenCalled(); }); - it('returns success executed false when linkContentId succeeds but moveIssueToColumn returns false', async () => { - jest.useFakeTimers(); - mockLinkContentId.mockResolvedValue(true); - mockMoveIssueToColumn.mockResolvedValue(false); - const param = baseParam(); - const promise = useCase.invoke(param); - await jest.advanceTimersByTimeAsync(10000); - const results = await promise; - expect(mockMoveIssueToColumn).toHaveBeenCalled(); - expect(results.some((r) => r.success === true && r.executed === false && (r.steps?.length ?? 0) === 0)).toBe(true); - jest.useRealTimers(); + it('reports the retained link when setting the project status fails', async () => { + mockMoveContent.mockResolvedValue(false); + + const results = await useCase.invoke(baseParam()); + + expect(results).toEqual([expect.objectContaining({ + success: false, + executed: true, + steps: [expect.stringContaining('status could not be set')], + })]); }); - it('returns failure on error', async () => { + it('returns failure when resolving the issue content ID fails', async () => { mockGetId.mockRejectedValue(new Error('API error')); - const param = baseParam(); - const results = await useCase.invoke(param); - expect(results.some((r) => r.success === false)).toBe(true); + + const results = await useCase.invoke(baseParam()); + + expect(results).toEqual([expect.objectContaining({ success: false })]); }); }); diff --git a/src/application/usecases/steps/issue/link_issue_project_use_case.ts b/src/application/usecases/steps/issue/link_issue_project_use_case.ts index b220f85b3..b379332c6 100644 --- a/src/application/usecases/steps/issue/link_issue_project_use_case.ts +++ b/src/application/usecases/steps/issue/link_issue_project_use_case.ts @@ -1,6 +1,5 @@ import { Result } from '../../../../data/model/result'; import type { BoundProjectContentPort } from '../../../../application/ports/project_board_link_ports'; -import type { EventualConsistencyDelayPort } from '../../../../application/ports/eventual_consistency_ports'; import { ParamUseCase } from '../../base/param_usecase'; import { runProjectContentLinkWorkflow, type ProjectContentLinkContext } from '../common/project_content_link_workflow'; @@ -8,17 +7,13 @@ import { runProjectContentLinkWorkflow, type ProjectContentLinkContext } from '. export class LinkIssueProjectUseCase implements ParamUseCase { taskId = 'LinkIssueProjectUseCase'; - constructor( - private readonly projectContentPort: BoundProjectContentPort, - private readonly eventualConsistencyDelayPort: EventualConsistencyDelayPort, - ) {} + constructor(private readonly projectContentPort: BoundProjectContentPort) {} async invoke(param: ProjectContentLinkContext): Promise { return runProjectContentLinkWorkflow( param, this.taskId, this.projectContentPort, - () => this.eventualConsistencyDelayPort.wait(10_000), ); } } diff --git a/src/application/usecases/steps/pull_request/__tests__/link_pull_request_project_use_case.test.ts b/src/application/usecases/steps/pull_request/__tests__/link_pull_request_project_use_case.test.ts index ba2913993..ce9e3f888 100644 --- a/src/application/usecases/steps/pull_request/__tests__/link_pull_request_project_use_case.test.ts +++ b/src/application/usecases/steps/pull_request/__tests__/link_pull_request_project_use_case.test.ts @@ -8,14 +8,7 @@ jest.mock('../../../../../utils/logger', () => ({ })); const mockLinkContentId = jest.fn(); -const mockMoveIssueToColumn = jest.fn(); -const mockWait = jest.fn((milliseconds: number) => new Promise((resolve) => setTimeout(resolve, milliseconds))); -jest.mock('../../../../../data/repository/project/project_board_query_repository', () => ({ - ProjectBoardQueryRepository: jest.fn().mockImplementation(() => ({ - linkContentId: mockLinkContentId, - moveIssueToColumn: mockMoveIssueToColumn, - })), -})); +const mockMoveContent = jest.fn(); function baseParam(overrides: Record = {}) { return { @@ -32,60 +25,46 @@ describe('LinkPullRequestProjectUseCase', () => { let useCase: LinkPullRequestProjectUseCase; beforeEach(() => { - jest.useFakeTimers(); - useCase = new LinkPullRequestProjectUseCase( - { - resolveIssueContentId: jest.fn(), - linkContentId: mockLinkContentId, - moveContent: mockMoveIssueToColumn, - }, - { wait: mockWait }, - ); - mockLinkContentId.mockResolvedValue(true); - mockMoveIssueToColumn.mockResolvedValue(true); - mockWait.mockClear(); + jest.clearAllMocks(); + useCase = new LinkPullRequestProjectUseCase({ + resolveIssueContentId: jest.fn(), + linkContentId: mockLinkContentId, + moveContent: mockMoveContent, + }); + mockLinkContentId.mockResolvedValue('project-item-1'); + mockMoveContent.mockResolvedValue(true); }); - afterEach(() => { - jest.useRealTimers(); - }); + it('uses the authoritative project item ID to set the configured status immediately', async () => { + const results = await useCase.invoke(baseParam()); - it('links PR to project and moves to column', async () => { - const param = baseParam(); - const promise = useCase.invoke(param); - await jest.advanceTimersByTimeAsync(10000); - const results = await promise; expect(mockLinkContentId).toHaveBeenCalledWith(expect.any(Object), 'pr-node-1'); - expect(mockMoveIssueToColumn).toHaveBeenCalledWith(expect.any(Object), 10, 'To Do'); - expect(results.some((r) => r.success && r.steps?.some((s) => s.includes('Backlog')))).toBe(true); + expect(mockMoveContent).toHaveBeenCalledWith(expect.any(Object), 'project-item-1', 'To Do'); + expect(results).toEqual([expect.objectContaining({ + success: true, + executed: true, + steps: [expect.stringContaining('with status `To Do`')], + })]); }); - it('returns failure when moveIssueToColumn returns false', async () => { - mockMoveIssueToColumn.mockResolvedValue(false); - const param = baseParam(); - const promise = useCase.invoke(param); - await jest.advanceTimersByTimeAsync(10000); - const results = await promise; - expect(results.some((r) => r.success === false && r.steps?.some((s) => s.includes('error moving')))).toBe(true); - }); + it('reports the retained link when setting the project status fails', async () => { + mockMoveContent.mockResolvedValue(false); - it('pushes no result when linkContentId returns false', async () => { - mockLinkContentId.mockReset(); - mockLinkContentId.mockResolvedValue(false); - mockMoveIssueToColumn.mockClear(); - const param = baseParam(); - const promise = useCase.invoke(param); - await jest.advanceTimersByTimeAsync(10000); - const results = await promise; - expect(mockLinkContentId).toHaveBeenCalled(); - expect(mockMoveIssueToColumn).not.toHaveBeenCalled(); - expect(results).toHaveLength(0); + const results = await useCase.invoke(baseParam()); + + expect(results).toEqual([expect.objectContaining({ + success: false, + executed: true, + steps: [expect.stringContaining('status could not be set')], + })]); }); - it('returns failure on error', async () => { - mockLinkContentId.mockRejectedValue(new Error('API error')); - const param = baseParam(); - const results = await useCase.invoke(param); - expect(results.some((r) => r.success === false)).toBe(true); + it('returns a failure when linking does not yield a usable project item', async () => { + mockLinkContentId.mockRejectedValue(new Error('GitHub returned no item')); + + const results = await useCase.invoke(baseParam()); + + expect(mockMoveContent).not.toHaveBeenCalled(); + expect(results).toEqual([expect.objectContaining({ success: false, executed: true })]); }); }); diff --git a/src/application/usecases/steps/pull_request/link_pull_request_project_use_case.ts b/src/application/usecases/steps/pull_request/link_pull_request_project_use_case.ts index eff1ed179..3bf454597 100644 --- a/src/application/usecases/steps/pull_request/link_pull_request_project_use_case.ts +++ b/src/application/usecases/steps/pull_request/link_pull_request_project_use_case.ts @@ -1,6 +1,5 @@ import { Result } from '../../../../data/model/result'; import type { BoundProjectContentPort } from '../../../ports/project_board_link_ports'; -import type { EventualConsistencyDelayPort } from '../../../ports/eventual_consistency_ports'; import { ParamUseCase } from '../../base/param_usecase'; import { runProjectContentLinkWorkflow, type ProjectContentLinkContext } from '../common/project_content_link_workflow'; @@ -8,17 +7,13 @@ import { runProjectContentLinkWorkflow, type ProjectContentLinkContext } from '. export class LinkPullRequestProjectUseCase implements ParamUseCase { taskId = 'LinkPullRequestProjectUseCase'; - constructor( - private readonly projectContentPort: BoundProjectContentPort, - private readonly eventualConsistencyDelayPort: EventualConsistencyDelayPort, - ) {} + constructor(private readonly projectContentPort: BoundProjectContentPort) {} async invoke(param: ProjectContentLinkContext): Promise { return runProjectContentLinkWorkflow( param, this.taskId, this.projectContentPort, - () => this.eventualConsistencyDelayPort.wait(10_000), ); } } diff --git a/src/data/repository/__tests__/project_board_link_repository.test.ts b/src/data/repository/__tests__/project_board_link_repository.test.ts index e45a4b451..ab3876d29 100644 --- a/src/data/repository/__tests__/project_board_link_repository.test.ts +++ b/src/data/repository/__tests__/project_board_link_repository.test.ts @@ -6,7 +6,7 @@ import type { GithubGraphqlTransportClient } from '../../../infrastructure/githu describe('ProjectBoardLinkRepository', () => { const project = new ProjectDetail({ id: 'project-1' }); - const queryPort = { isContentLinked: jest.fn() } as unknown as ProjectBoardQueryPort; + const queryPort = { getLinkedContentItemId: jest.fn() } as unknown as ProjectBoardQueryPort; const graphql = jest.fn(); const graphqlPort = { getClient: jest.fn(() => ({ graphql })), @@ -16,26 +16,28 @@ describe('ProjectBoardLinkRepository', () => { beforeEach(() => { jest.clearAllMocks(); repository = new ProjectBoardLinkRepository(queryPort, graphqlPort); - (queryPort.isContentLinked as jest.Mock).mockResolvedValue(false); + (queryPort.getLinkedContentItemId as jest.Mock).mockResolvedValue(undefined); }); - it('returns true only when GitHub returns the created project item id', async () => { + it('returns the authoritative item ID from the link mutation', async () => { graphql.mockResolvedValue({ addProjectV2ItemById: { item: { id: 'item-1' } } }); - await expect(repository.linkContentId(project, 'content-1', 'token')).resolves.toBe(true); + await expect(repository.linkContentId(project, 'content-1', 'token')).resolves.toBe('item-1'); expect(graphql).toHaveBeenCalledTimes(1); }); - it('returns false when the mutation response does not contain a created item', async () => { + it('rejects an incomplete mutation response instead of silently skipping status synchronization', async () => { graphql.mockResolvedValue({ addProjectV2ItemById: {} }); - await expect(repository.linkContentId(project, 'content-1', 'token')).resolves.toBe(false); + await expect(repository.linkContentId(project, 'content-1', 'token')).rejects.toThrow( + 'GitHub did not return the project item created for content content-1 in project project-1.', + ); }); - it('does not mutate an already linked content item', async () => { - (queryPort.isContentLinked as jest.Mock).mockResolvedValue(true); + it('returns the existing project item ID without creating a duplicate', async () => { + (queryPort.getLinkedContentItemId as jest.Mock).mockResolvedValue('existing-item'); - await expect(repository.linkContentId(project, 'content-1', 'token')).resolves.toBe(false); + await expect(repository.linkContentId(project, 'content-1', 'token')).resolves.toBe('existing-item'); expect(graphql).not.toHaveBeenCalled(); }); }); diff --git a/src/data/repository/project/__tests__/project_board_command_repository.test.ts b/src/data/repository/project/__tests__/project_board_command_repository.test.ts index 18a722139..1936af615 100644 --- a/src/data/repository/project/__tests__/project_board_command_repository.test.ts +++ b/src/data/repository/project/__tests__/project_board_command_repository.test.ts @@ -156,6 +156,35 @@ describe("ProjectBoardCommandRepository", () => { number: 1, }); + it("updates a newly linked item by mutation ID without querying the project item list", async () => { + const harness = createHarness(); + + await expect( + harness.repository.moveProjectItemToColumn( + project, + "PVTI_created", + "In progress", + "token", + ), + ).resolves.toBe(true); + + expect(harness.contentQuery.getProjectItemId).not.toHaveBeenCalled(); + expect( + harness.graphql.mock.calls.some(([document]) => + String(document).includes("items(first"), + ), + ).toBe(false); + const mutationCall = harness.graphql.mock.calls.find(([document]) => + String(document).includes("mutation("), + ); + expect(mutationCall?.[1]).toMatchObject({ + projectId: "PVT_project", + itemId: "PVTI_created", + fieldId: "PVTSSF_status", + optionId: "option_in_progress", + }); + }); + it("rejects a missing content ID before resolving a GraphQL client", async () => { const harness = createHarness({ contentId: "" }); diff --git a/src/data/repository/project/__tests__/project_board_query_repository.test.ts b/src/data/repository/project/__tests__/project_board_query_repository.test.ts index c21548137..120fbbcdd 100644 --- a/src/data/repository/project/__tests__/project_board_query_repository.test.ts +++ b/src/data/repository/project/__tests__/project_board_query_repository.test.ts @@ -281,8 +281,8 @@ describe("ProjectBoardQueryRepository", () => { const harness = createHarness({ itemPages }); await expect( - harness.repository.isContentLinked(project, "CONTENT_1", "token"), - ).resolves.toBe(true); + harness.repository.getLinkedContentItemId(project, "CONTENT_1", "token"), + ).resolves.toBe("PVTI_item"); }); it("rejects when repository content is not linked after all project pages", async () => { @@ -347,27 +347,27 @@ describe("ProjectBoardQueryRepository", () => { }); await expect( - firstPage.repository.isContentLinked(project, "CONTENT_1", "token"), - ).resolves.toBe(true); + firstPage.repository.getLinkedContentItemId(project, "CONTENT_1", "token"), + ).resolves.toBe("PVTI_item"); await expect( - laterPage.repository.isContentLinked(project, "CONTENT_1", "token"), - ).resolves.toBe(true); + laterPage.repository.getLinkedContentItemId(project, "CONTENT_1", "token"), + ).resolves.toBe("PVTI_item"); }); it("returns false when content is absent after all pages", async () => { const harness = createHarness({ itemPages: [terminalPage([])] }); await expect( - harness.repository.isContentLinked(project, "CONTENT_1", "token"), - ).resolves.toBe(false); + harness.repository.getLinkedContentItemId(project, "CONTENT_1", "token"), + ).resolves.toBeUndefined(); }); it("treats an omitted project items connection as an empty board", async () => { const harness = createHarness({ itemConnection: "missing" }); await expect( - harness.repository.isContentLinked(project, "CONTENT_1", "token"), - ).resolves.toBe(false); + harness.repository.getLinkedContentItemId(project, "CONTENT_1", "token"), + ).resolves.toBeUndefined(); }); it("fails closed on malformed linked-content pagination and null projects", async () => { @@ -379,12 +379,12 @@ describe("ProjectBoardQueryRepository", () => { const nullProject = createHarness({ projectNode: "null" }); await expect( - malformed.repository.isContentLinked(project, "CONTENT_1", "token"), + malformed.repository.getLinkedContentItemId(project, "CONTENT_1", "token"), ).rejects.toThrow( "project board content: hasNextPage is true but endCursor is null (page 1).", ); await expect( - nullProject.repository.isContentLinked(project, "CONTENT_1", "token"), + nullProject.repository.getLinkedContentItemId(project, "CONTENT_1", "token"), ).rejects.toThrow( "Project PVT_project was not found while reading project items.", ); diff --git a/src/data/repository/project/project_board_command_repository.ts b/src/data/repository/project/project_board_command_repository.ts index d335fa9e6..91eae1019 100644 --- a/src/data/repository/project/project_board_command_repository.ts +++ b/src/data/repository/project/project_board_command_repository.ts @@ -3,7 +3,10 @@ import type { ProjectBoardContentQueryPort } from '../../../application/ports/pr import type { GithubClientPort } from '../../../infrastructure/github/ports/github_client_provider_port'; import type { GithubGraphqlTransportClient } from '../../../infrastructure/github/ports/github_graphql_transport_port'; import type { ProjectDetail } from '../../model/project_detail'; -import { setProjectBoardSingleSelectField } from './project_board_field_update'; +import { + setProjectBoardSingleSelectField, + setProjectBoardSingleSelectFieldByItemId, +} from './project_board_field_update'; /** GitHub GraphQL adapter for ProjectV2 field mutations. */ export class ProjectBoardCommandRepository implements ProjectBoardCommandPort { @@ -67,6 +70,20 @@ export class ProjectBoardCommandRepository implements ProjectBoardCommandPort { token, ); + moveProjectItemToColumn = ( + project: ProjectDetail, + projectItemId: string, + columnName: string, + token: string, + ): Promise => setProjectBoardSingleSelectFieldByItemId( + this.graphqlClient, + project, + projectItemId, + this.statusField, + columnName, + token, + ); + private setField( project: ProjectDetail, owner: string, diff --git a/src/data/repository/project/project_board_field_update.ts b/src/data/repository/project/project_board_field_update.ts index 2cd7344c5..bd3c18662 100644 --- a/src/data/repository/project/project_board_field_update.ts +++ b/src/data/repository/project/project_board_field_update.ts @@ -121,12 +121,34 @@ export async function setProjectBoardSingleSelectField( logDebugInfo(`Field '${fieldName}' is already set to '${fieldValue}'. No update needed.`); return false; } + return updateProjectBoardSingleSelectField(client, project, contentId, target); +} + +/** Updates a ProjectV2 item returned by the link mutation without waiting for list propagation. */ +export async function setProjectBoardSingleSelectFieldByItemId( + graphqlClient: GithubClientPort, + project: ProjectDetail, + projectItemId: string, + fieldName: string, + fieldValue: string, + token: string, +): Promise { + const client = graphqlClient.getClient(token); + const target = await findFieldOption(client, project, fieldName, fieldValue); + return updateProjectBoardSingleSelectField(client, project, projectItemId, target); +} +async function updateProjectBoardSingleSelectField( + client: GithubGraphqlTransportClient, + project: ProjectDetail, + projectItemId: string, + target: FieldOption, +): Promise { const mutationResult = await client.graphql<{ updateProjectV2ItemFieldValue?: { projectV2Item?: { id: string } } | null; }>(UPDATE_FIELD_MUTATION, { projectId: project.id, - itemId: contentId, + itemId: projectItemId, fieldId: target.fieldId, optionId: target.optionId, }); diff --git a/src/data/repository/project/project_board_item_query.ts b/src/data/repository/project/project_board_item_query.ts index 63207d80e..5d7908043 100644 --- a/src/data/repository/project/project_board_item_query.ts +++ b/src/data/repository/project/project_board_item_query.ts @@ -67,12 +67,12 @@ export async function getProjectItemId( return projectItemId; } -export async function isProjectContentLinked( +export async function getProjectItemIdByContentId( graphqlClient: GithubGraphqlTransportClient, project: ProjectDetail, contentId: string, -): Promise { - return Boolean(await findProjectItemId(graphqlClient, project, contentId)); +): Promise { + return findProjectItemId(graphqlClient, project, contentId); } async function findProjectItemId( diff --git a/src/data/repository/project/project_board_link_repository.ts b/src/data/repository/project/project_board_link_repository.ts index e05a2347c..1e04c9cc1 100644 --- a/src/data/repository/project/project_board_link_repository.ts +++ b/src/data/repository/project/project_board_link_repository.ts @@ -10,21 +10,19 @@ export class ProjectBoardLinkRepository implements ProjectBoardLinkPort { private readonly projectBoardQueryPort: ProjectBoardQueryPort, private readonly graphqlClient: GithubClientPort, ) {} - - - linkContentId = async (project: ProjectDetail, contentId: string, token: string): Promise => { - if (await this.projectBoardQueryPort.isContentLinked(project, contentId, token)) { + linkContentId = async (project: ProjectDetail, contentId: string, token: string): Promise => { + const existingItemId = await this.projectBoardQueryPort.getLinkedContentItemId(project, contentId, token); + if (existingItemId) { logDebugInfo(`Content ${contentId} is already linked to project ${project.id}.`); - return false; + return existingItemId; } const linkMutation = `mutation($projectId: ID!, $contentId: ID!) { addProjectV2ItemById(input: {projectId: $projectId, contentId: $contentId}) { item { id } } }`; const linkResult = await this.graphqlClient.getClient(token).graphql<{ addProjectV2ItemById?: { item?: { id: string } } }>(linkMutation, { projectId: project.id, contentId }); const linkedItemId = linkResult.addProjectV2ItemById?.item?.id; if (!linkedItemId) { - logDebugInfo(`Project link mutation returned no item for content ${contentId} and project ${project.id}.`); - return false; + throw new Error(`GitHub did not return the project item created for content ${contentId} in project ${project.id}.`); } logDebugInfo(`Linked ${contentId} with id ${linkedItemId} to project ${project.id}`); - return true; + return linkedItemId; }; } diff --git a/src/data/repository/project/project_board_query_repository.ts b/src/data/repository/project/project_board_query_repository.ts index 2a119d9ca..66bdfc01c 100644 --- a/src/data/repository/project/project_board_query_repository.ts +++ b/src/data/repository/project/project_board_query_repository.ts @@ -7,7 +7,7 @@ import type { GithubGraphqlTransportClient } from "../../../infrastructure/githu import type { GithubOwnerTypeClient } from "../../../infrastructure/github/ports/github_identity_provider_ports"; import { ProjectDetail } from "../../model/project_detail"; import { getProjectBoardDetail } from "./project_board_detail_query"; -import { getProjectItemId, isProjectContentLinked } from "./project_board_item_query"; +import { getProjectItemId, getProjectItemIdByContentId } from "./project_board_item_query"; export class ProjectBoardQueryRepository implements ProjectBoardQueryPort, ProjectBoardContentQueryPort @@ -39,10 +39,10 @@ export class ProjectBoardQueryRepository issueOrPullRequestNumber, ); - isContentLinked = async ( + getLinkedContentItemId = async ( project: ProjectDetail, contentId: string, token: string, - ): Promise => - isProjectContentLinked(this.graphqlClient.getClient(token), project, contentId); + ): Promise => + getProjectItemIdByContentId(this.graphqlClient.getClient(token), project, contentId); } diff --git a/src/infrastructure/composition/__tests__/lifecycle_capability_port_binding.test.ts b/src/infrastructure/composition/__tests__/lifecycle_capability_port_binding.test.ts index b3b5eb22e..93165a5d6 100644 --- a/src/infrastructure/composition/__tests__/lifecycle_capability_port_binding.test.ts +++ b/src/infrastructure/composition/__tests__/lifecycle_capability_port_binding.test.ts @@ -83,7 +83,12 @@ describe('lifecycle capability repository bindings', () => { const remove = jest.fn().mockResolvedValue(true); const create = jest.fn().mockResolvedValue([]); const execute = jest.fn().mockResolvedValue(undefined); - const projects = bindProjectBoardCommands({ setTaskPriority, moveIssueToColumn, setTaskSize: jest.fn() }, binding); + const projects = bindProjectBoardCommands({ + setTaskPriority, + moveIssueToColumn, + moveProjectItemToColumn: jest.fn(), + setTaskSize: jest.fn(), + }, binding); await projects.setTaskPriority(project, 7, 'P0'); await projects.moveIssueToColumn(project, 7, 'In progress'); const branches = bindBranchLifecycle({ getListOfBranches: list, removeBranch: remove }, binding); diff --git a/src/infrastructure/composition/__tests__/shared_capability_port_binding.test.ts b/src/infrastructure/composition/__tests__/shared_capability_port_binding.test.ts index 8216fe8e0..85a907ab7 100644 --- a/src/infrastructure/composition/__tests__/shared_capability_port_binding.test.ts +++ b/src/infrastructure/composition/__tests__/shared_capability_port_binding.test.ts @@ -91,8 +91,8 @@ describe('shared capability repository bindings', () => { it('rehydrates project references only inside the bound project adapter', async () => { const getId = jest.fn().mockResolvedValue('ISSUE_10'); - const linkContentId = jest.fn().mockResolvedValue(true); - const moveIssueToColumn = jest.fn().mockResolvedValue(true); + const linkContentId = jest.fn().mockResolvedValue('PVTI_1'); + const moveProjectItemToColumn = jest.fn().mockResolvedValue(true); const project = { id: 'PVT_1', title: 'Delivery', @@ -103,19 +103,19 @@ describe('shared capability repository bindings', () => { }; const port = bindProjectContent( { getId } as never, - { moveIssueToColumn } as never, + { moveProjectItemToColumn } as never, { linkContentId } as never, binding, ); await port.resolveIssueContentId(10); await port.linkContentId(project, 'ISSUE_10'); - await port.moveContent(project, 10, 'In progress'); + await port.moveContent(project, 'PVTI_1', 'In progress'); expect(getId).toHaveBeenCalledWith('acme', 'demo', 10, 'secret'); expect(linkContentId).toHaveBeenCalledWith(expect.objectContaining(project), 'ISSUE_10', 'secret'); - expect(moveIssueToColumn).toHaveBeenCalledWith( - expect.objectContaining(project), 'acme', 'demo', 10, 'In progress', 'secret', + expect(moveProjectItemToColumn).toHaveBeenCalledWith( + expect.objectContaining(project), 'PVTI_1', 'In progress', 'secret', ); }); }); diff --git a/src/infrastructure/composition/issue_use_case_composition_root.ts b/src/infrastructure/composition/issue_use_case_composition_root.ts index e7a8a77e8..3b01407e3 100644 --- a/src/infrastructure/composition/issue_use_case_composition_root.ts +++ b/src/infrastructure/composition/issue_use_case_composition_root.ts @@ -36,7 +36,6 @@ import { IssueTitleRepository } from "../../data/repository/issue/issue_title_re import { IssueTypeAssignmentRepository } from "../../data/repository/issue/issue_type_assignment_repository"; import { WorkflowDispatchRepository } from "../../data/repository/workflow/workflow_dispatch_repository"; import { TimerBranchPropagationDelayAdapter } from "../time/timer_branch_propagation_delay_adapter"; -import { TimerDelayAdapter } from "../time/timer_delay_adapter"; import { createFindingsQueryPort } from "./agent_capability_composition_root"; import { composeIssueUseCase } from "./issue_use_case_composition"; import { createOrganizationMembersCompositionRoot } from "./organization_members_composition_root"; @@ -79,7 +78,6 @@ export function createIssueUseCaseCompositionRoot(binding: RepositoryCredentialB createGraphqlTransportClient(), ); const branchPropagationDelay = new TimerBranchPropagationDelayAdapter(); - const eventualConsistencyDelay = new TimerDelayAdapter(); const projectBoard = createProjectBoardCompositionRoot(); const issueAssignee = new IssueAssignmentRepository(createIssueAssignmentClient()); const issueClosure = new IssueClosureRepository(issueLifecycle, issueContent); @@ -112,10 +110,7 @@ export function createIssueUseCaseCompositionRoot(binding: RepositoryCredentialB ), updateTitle: new UpdateTitleUseCase(bindIssueTitle(issueTitle, binding)), updateIssueType: new UpdateIssueTypeUseCase(bindIssueTypeAssignment(issueTypeAssignment, binding)), - linkIssueProject: new LinkIssueProjectUseCase( - projectContent, - eventualConsistencyDelay, - ), + linkIssueProject: new LinkIssueProjectUseCase(projectContent), checkPriorityIssueSize: new CheckPriorityIssueSizeUseCase(boundProjectBoard), prepareBranches: new PrepareBranchesUseCase( boundBranchLifecycle, diff --git a/src/infrastructure/composition/pull_request_use_case_composition_root.ts b/src/infrastructure/composition/pull_request_use_case_composition_root.ts index 17f637bd6..20201807c 100644 --- a/src/infrastructure/composition/pull_request_use_case_composition_root.ts +++ b/src/infrastructure/composition/pull_request_use_case_composition_root.ts @@ -99,10 +99,7 @@ export function createPullRequestUseCaseCompositionRoot(binding: BugbotScmBindin bindPullRequestReviewer(pullRequestReviewer, binding), boundOrganizationSelection, ), - linkPullRequestProject: new LinkPullRequestProjectUseCase( - projectContent, - eventualConsistencyDelay, - ), + linkPullRequestProject: new LinkPullRequestProjectUseCase(projectContent), linkPullRequestIssue: new LinkPullRequestIssueUseCase( boundPullRequestLifecycle, eventualConsistencyDelay, diff --git a/src/infrastructure/composition/shared_capability_port_binding.ts b/src/infrastructure/composition/shared_capability_port_binding.ts index f7b61b8f6..af922df88 100644 --- a/src/infrastructure/composition/shared_capability_port_binding.ts +++ b/src/infrastructure/composition/shared_capability_port_binding.ts @@ -169,11 +169,9 @@ export function bindProjectContent( contentId, binding.token, ), - moveContent: (project, contentNumber, columnName) => commands.moveIssueToColumn( + moveContent: (project, projectItemId, columnName) => commands.moveProjectItemToColumn( toProjectDetail(project), - binding.owner, - binding.repository, - contentNumber, + projectItemId, columnName, binding.token, ), diff --git a/src/prompts/__tests__/update_pull_request_description.test.ts b/src/prompts/__tests__/update_pull_request_description.test.ts index 8b080a67e..3280dc427 100644 --- a/src/prompts/__tests__/update_pull_request_description.test.ts +++ b/src/prompts/__tests__/update_pull_request_description.test.ts @@ -27,6 +27,8 @@ describe('getUpdatePullRequestDescriptionPrompt', () => { expect(prompt).toContain('normally under 4,000 characters'); expect(prompt).toContain('never exceed 12,000 characters'); expect(prompt).toContain('Never claim a check passed unless the evidence says it did'); + expect(prompt).toContain('Do not infer consumers, compatibility obligations, upgrade steps'); + expect(prompt).toContain('identifies a concrete affected consumer or required transition'); expect(prompt).toContain('Do not reproduce empty placeholder sections'); expect(prompt).not.toContain('full filled template'); expect(prompt).toContain('Do not use emoji, horizontal separators, generic checklists'); diff --git a/src/prompts/update_pull_request_description.ts b/src/prompts/update_pull_request_description.ts index dfcd712c2..720127a30 100644 --- a/src/prompts/update_pull_request_description.ts +++ b/src/prompts/update_pull_request_description.ts @@ -20,7 +20,7 @@ Write every human-readable sentence in {{targetLocale}}. Preserve code identifie 4. Provide \`overview\` as one to three sentences that state the outcome and why it matters. 5. Provide \`whatChangedHeading\` as the plain-text {{targetLocale}} equivalent of "What changed" and \`changes\` as two to six short, outcome-oriented items. Do not inventory files, use-case names, internal categories, or every implementation step. 6. When execution or manual-verification evidence is available, provide \`validationHeading\` as the plain-text {{targetLocale}} equivalent of "Validation" and \`validation\` with only the supported commands, automated checks, or manual scenarios. Never claim a check passed unless the evidence says it did, and never infer that result from the presence of test files or commands. When no verification evidence is available, set both fields to \`null\`; do not add a “not run” placeholder. -7. Set \`reviewNotesHeading\` and \`reviewNotes\` to \`null\` unless reviewers need material migration, security, performance, compatibility, rollout, manual-verification, risk, or follow-up context. Otherwise use the localized plain-text heading and one to four concise items. {{relatedIssueInstruction}} +7. Set \`reviewNotesHeading\` and \`reviewNotes\` to \`null\` unless reviewers need material migration, security, performance, compatibility, rollout, manual-verification, risk, or follow-up context. Do not infer consumers, compatibility obligations, upgrade steps, migration work, or rollout requirements merely because code, configuration, inputs, or symbols were removed or named deprecated. Include that context only when the issue, diff, repository documentation, or verification evidence identifies a concrete affected consumer or required transition. Otherwise use the localized plain-text heading and one to four concise items. {{relatedIssueInstruction}} 8. Keep the description practical and normally under 4,000 characters. It must never exceed 12,000 characters. Do not use emoji, horizontal separators, generic checklists, empty headings, repeated statements, placeholder text, or unsupported "no impact" claims. 9. Return one JSON object with exactly \`outputLocale\`, \`overview\`, \`whatChangedHeading\`, \`changes\`, \`validationHeading\`, \`validation\`, \`reviewNotesHeading\`, \`reviewNotes\`, and \`closesLinkedIssue\`. Every content field is plain text except Markdown links, code spans, refs, and commands inside content values. The application renders the Markdown structure; do not include headings, bullet prefixes, a preamble, meta-commentary, or code fence in the values.