{"record":{"id":"1fded3cc62e2731b","repo":"BloopAI/vibe-kanban","slug":"action-action-id-requires-project-and-issue-s","errorCode":null,"errorMessage":"Action \"${action.id}\" requires project and issue selection","messagePattern":"Action \"(.+?)\" requires project and issue selection","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/web-core/src/shared/providers/ActionsProvider.tsx","lineNumber":303,"sourceCode":"            await action.execute(executorContext, workspaceId);\n            break;\n\n          case ActionTargetType.GIT:\n            if (!workspaceId || !repoIdOrProjectId) {\n              throw new Error(\n                `Action \"${action.id}\" requires both workspace and repository`\n              );\n            }\n            await action.execute(\n              executorContext,\n              workspaceId,\n              repoIdOrProjectId\n            );\n            break;\n\n          case ActionTargetType.ISSUE:\n            if (!repoIdOrProjectId || !issueIds || issueIds.length === 0) {\n              throw new Error(\n                `Action \"${action.id}\" requires project and issue selection`\n              );\n            }\n            await action.execute(executorContext, repoIdOrProjectId, issueIds);\n            break;\n        }\n      } catch (error) {\n        // Show error to user via alert dialog\n        ConfirmDialog.show({\n          title: 'Error',\n          message: error instanceof Error ? error.message : 'An error occurred',\n          confirmText: 'OK',\n          showCancelButton: false,\n          variant: 'destructive',\n        });\n      }\n    },\n    [executorContext]","sourceCodeStart":285,"sourceCodeEnd":321,"githubUrl":"https://github.com/BloopAI/vibe-kanban/blob/4deb7eca8f381f7cbc1f9d15515a9ab8f8009053/packages/web-core/src/shared/providers/ActionsProvider.tsx#L285-L321","documentation":"For actions with requiresTarget === ActionTargetType.ISSUE, executeAction requires a repoIdOrProjectId and a non-empty issueIds array; otherwise it throws 'Action \"<id>\" requires project and issue selection'. Issue actions (assign, status change, etc.) need the target project plus at least one selected issue.","triggerScenarios":"Calling executeAction for an ISSUE action with no project/repo selected, or with issueIds undefined or an empty array (no issues selected in the board/list).","commonSituations":"Keyboard shortcut or bulk-action toolbar firing while the issue selection was cleared (e.g. after filter change); invoking issue actions from a view without an active project; selection state reset by a refetch.","solutions":["Disable issue actions when selectedIssueIds.length === 0 (standard selection-dependent toolbar behavior).","Pass repoIdOrProjectId and the selected issueIds explicitly to executeAction.","Reset/re-derive selection state when the project changes so handlers never see stale empty arrays."],"exampleFix":"// before\nexecuteAction(action);\n// after\nif (!repoIdOrProjectId || selectedIssueIds.length === 0) return;\nexecuteAction(action, repoIdOrProjectId, selectedIssueIds);","handlingStrategy":"validation","validationCode":"if (action.requiresTarget === ActionTargetType.ISSUE && (!repoIdOrProjectId || !issueIds?.length)) {\n  return; // need a project and at least one selected issue\n}\nexecuteAction(action, repoIdOrProjectId, issueIds);","typeGuard":null,"tryCatchPattern":"try {\n  await executeAction(action, repoIdOrProjectId, issueIds);\n} catch (err) {\n  if (err instanceof Error && err.message.includes('requires project and issue selection')) {\n    promptUserToSelectIssues();\n  }\n}","preventionTips":["Disable bulk issue actions when selectedIssueIds.length === 0","Re-derive selection state after project switches or refetches","Route issue actions only through UI surfaces that always have project context"],"tags":["actions","validation","missing-argument","issues"],"backgroundTag":"missing-required-argument","analyzedSha":"4deb7eca8f381f7cbc1f9d15515a9ab8f8009053","analyzedAt":"2026-08-29T09:24:13.446Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}