{"record":{"id":"5fb82bc0869a0c4d","repo":"eyaltoledano/claude-task-master","slug":"shell-executor-not-yet-implemented","errorCode":null,"errorMessage":"Shell executor not yet implemented","messagePattern":"Shell executor not yet implemented","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/tm-core/src/modules/execution/executors/executor-factory.ts","lineNumber":24,"sourceCode":"import { ClaudeExecutor } from '../executors/claude-executor.js';\nimport type { ExecutorOptions, ExecutorType, ITaskExecutor } from '../types.js';\n\nexport class ExecutorFactory {\n\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);","sourceCodeStart":6,"sourceCodeEnd":42,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/packages/tm-core/src/modules/execution/executors/executor-factory.ts#L6-L42","documentation":"Plain Error thrown by ExecutorFactory.create when options.type is 'shell'. The shell executor is a declared but unimplemented placeholder in the factory switch, so requesting it always throws. It is a library capability gap, not a runtime fault.","triggerScenarios":"Calling ExecutorFactory.create({ type: 'shell', projectRoot }) (with or without config) — every such call throws unconditionally until the executor is implemented.","commonSituations":"Constructing an execution request with a hardcoded or config-driven executor type of 'shell'; following docs/examples that mention shell execution before the feature shipped; a user config file specifying shell as the preferred executor.","solutions":["Use type: 'claude' which is the implemented executor","Omit options.type and let the factory pick the default via getDefaultExecutorType()","Check the installed @tm/core version / changelog for shell executor availability and upgrade when it ships","If you need shell semantics, wrap your command in a script the Claude executor can run, or contribute a ShellExecutor implementing the Executor interface","Validate user/config-supplied executor type against the supported set before calling create"],"exampleFix":"// before\nconst exec = ExecutorFactory.create({ type: 'shell', 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: 'shell', 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":["Only pass executor types confirmed implemented in your installed version","Check the changelog for shell/custom executor availability","Never forward raw user config values as executor type without whitelisting","Default to omitting type so the factory chooses a working executor"],"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"}