{"record":{"id":"2649265a42cc7054","repo":"eyaltoledano/claude-task-master","slug":"custom-executor-not-yet-implemented","errorCode":null,"errorMessage":"Custom executor not yet implemented","messagePattern":"Custom executor not yet implemented","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/tm-core/src/modules/execution/executors/executor-factory.ts","lineNumber":28,"sourceCode":"\tprivate static logger = getLogger('ExecutorFactory');\n\n\t/**\n\t * Create an executor based on the provided options\n\t */\n\tstatic create(options: ExecutorOptions): ITaskExecutor {\n\t\tthis.logger.debug(`Creating executor of type: ${options.type}`);\n\n\t\tswitch (options.type) {\n\t\t\tcase 'claude':\n\t\t\t\treturn new ClaudeExecutor(options.projectRoot, options.config);\n\n\t\t\tcase 'shell':\n\t\t\t\t// Placeholder for shell executor\n\t\t\t\tthrow new Error('Shell executor not yet implemented');\n\n\t\t\tcase 'custom':\n\t\t\t\t// Placeholder for custom executor\n\t\t\t\tthrow new Error('Custom executor not yet implemented');\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown executor type: ${options.type}`);\n\t\t}\n\t}\n\n\t/**\n\t * Get the default executor type based on available tools\n\t */\n\tstatic async getDefaultExecutor(\n\t\tprojectRoot: string\n\t): Promise<ExecutorType | null> {\n\t\t// Check for Claude first\n\t\tconst claudeExecutor = new ClaudeExecutor(projectRoot);\n\t\tif (await claudeExecutor.isAvailable()) {\n\t\t\tthis.logger.info('Claude CLI detected as default executor');\n\t\t\treturn 'claude';\n\t\t}","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/packages/tm-core/src/modules/execution/executors/executor-factory.ts#L10-L46","documentation":"Plain Error thrown by ExecutorFactory.create when options.type is 'custom'. Like the shell case, the custom executor is a placeholder branch in the factory switch and always throws. It indicates the requested executor kind exists as an enum-like option but has no implementation yet.","triggerScenarios":"Calling ExecutorFactory.create({ type: 'custom', projectRoot }) — unconditional throw for this exact type value.","commonSituations":"A config or API consumer selecting 'custom' to plug in their own runner; copying an options object with type from an unvalidated source; experimentation with the factory's supported types.","solutions":["Use type: 'claude' (the implemented executor) or omit type to use the default","Implement the Executor interface yourself and instantiate it directly instead of going through the factory","Upgrade @tm/core when a custom executor is released","Pre-validate the executor type in your own code and fall back to a supported value","Map 'custom' to an implemented executor in your config layer"],"exampleFix":"// before\nconst exec = ExecutorFactory.create({ type: 'custom', projectRoot });\n// after\nconst exec = ExecutorFactory.create({ type: 'claude', projectRoot });","handlingStrategy":"validation","validationCode":"type SupportedExecutor = 'claude';\nfunction assertImplemented(t: string): asserts t is SupportedExecutor {\n  if (t !== 'claude') throw new Error(`Executor '${t}' not implemented; use 'claude'`);\n}","typeGuard":"const isImplementedExecutor = (t: unknown): t is 'claude' =>\n  typeof t === 'string' && t === 'claude';","tryCatchPattern":"try {\n  executor = ExecutorFactory.create({ type: 'custom', projectRoot });\n} catch (e) {\n  if (e.message.includes('not yet implemented')) {\n    executor = ExecutorFactory.create({ type: 'claude', projectRoot });\n  } else throw e;\n}","preventionTips":["Whitelist executor types to implemented ones before calling the factory","Instantiate your own Executor-interface implementation directly instead of using type 'custom'","Track @tm/core releases for custom executor support","Centralize executor construction so fallback logic lives in one place"],"tags":["executor","factory","unimplemented","not-supported"],"backgroundTag":"feature-not-implemented","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}