# Task Master generateObject Migration - Sequential Implementation Tasks ## Architecture Review Summary As a system architect, I've reviewed the migration plan and confirm: 1. **Technical Feasibility**: ✅ All infrastructure is in place 2. **Risk Assessment**: ✅ Low risk with high reward 3. **Implementation Approach**: ✅ Phased migration is optimal 4. **Provider Compatibility**: ✅ Verified all providers support generateObject ## Sequential Task Implementation Plan ### Prerequisites - All tasks should be executed in order - Each task includes specific success criteria - Test each task before proceeding to the next --- ## Task Group 1: Schema Infrastructure (Tasks 1-10) ### Task 1: Create Schema Directory Structure **File**: Create directory `src/schemas/` **Action**: ```bash mkdir -p src/schemas ``` **Success Criteria**: Directory exists at `src/schemas/` ### Task 2: Define Base Task Schema **File**: `src/schemas/base-schemas.js` **Action**: Create reusable base schemas ```javascript import { z } from 'zod'; // Base schemas that will be reused across commands export const TaskStatusSchema = z.enum(['pending', 'in-progress', 'blocked', 'done', 'cancelled', 'deferred']); export const BaseTaskSchema = z.object({ id: z.number().int().positive(), title: z.string().min(1).max(200), description: z.string().min(1), status: TaskStatusSchema, dependencies: z.array(z.union([z.number().int(), z.string()])).default([]), priority: z.enum(['low', 'medium', 'high', 'critical']).nullable().default(null), details: z.string().nullable().default(null), testStrategy: z.string().nullable().default(null) }); export const SubtaskSchema = z.object({ id: z.number().int().positive(), title: z.string().min(5).max(200), description: z.string().min(10), dependencies: z.array(z.number().int()).default([]), details: z.string().min(20), status: z.enum(['pending', 'done', 'completed']).default('pending'), testStrategy: z.string().nullable().default(null) }); ``` **Success Criteria**: File created with working imports ### Task 3: Create Update Tasks Schema **File**: `src/schemas/update-tasks.js` **Action**: Define schema for update-tasks command ```javascript import { z } from 'zod'; import { BaseTaskSchema } from './base-schemas.js'; export const UpdatedTaskSchema = BaseTaskSchema.extend({ subtasks: z.array(z.any()).nullable().default(null) }); export const UpdateTasksResponseSchema = z.object({ tasks: z.array(UpdatedTaskSchema) }); ``` **Success Criteria**: Schema validates sample task data correctly ### Task 4: Create Expand Task Schema **File**: `src/schemas/expand-task.js` **Action**: Define schema for expand-task command ```javascript import { z } from 'zod'; import { SubtaskSchema } from './base-schemas.js'; export const ExpandTaskResponseSchema = z.object({ subtasks: z.array(SubtaskSchema) }); ``` **Success Criteria**: Schema validates subtask array structure ### Task 5: Create Complexity Analysis Schema **File**: `src/schemas/analyze-complexity.js` **Action**: Define schema for analyze-complexity command ```javascript import { z } from 'zod'; export const ComplexityAnalysisItemSchema = z.object({ taskId: z.number().int().positive(), taskTitle: z.string(), complexityScore: z.number().min(1).max(10), recommendedSubtasks: z.number().int().positive(), expansionPrompt: z.string(), reasoning: z.string() }); export const ComplexityAnalysisResponseSchema = z.object({ complexityAnalysis: z.array(ComplexityAnalysisItemSchema) }); ``` **Success Criteria**: Schema validates complexity analysis data ### Task 6: Create Update Subtask Schema **File**: `src/schemas/update-subtask.js` **Action**: Define schema for update-subtask-by-id command ```javascript import { z } from 'zod'; import { SubtaskSchema } from './base-schemas.js'; export const UpdateSubtaskResponseSchema = z.object({ subtask: SubtaskSchema }); ``` **Success Criteria**: Schema validates single subtask update ### Task 7: Create Update Task Schema **File**: `src/schemas/update-task.js` **Action**: Define schema for update-task-by-id command ```javascript import { z } from 'zod'; import { UpdatedTaskSchema } from './update-tasks.js'; export const UpdateTaskResponseSchema = z.object({ task: UpdatedTaskSchema }); ``` **Success Criteria**: Schema validates single task update ### Task 8: Create Add Task Schema **File**: `src/schemas/add-task.js` **Action**: Define schema for add-task command ```javascript import { z } from 'zod'; import { BaseTaskSchema } from './base-schemas.js'; export const NewTaskSchema = BaseTaskSchema.omit({ id: true }).extend({ subtasks: z.array(z.any()).optional().default([]) }); export const AddTaskResponseSchema = z.object({ task: BaseTaskSchema.extend({ subtasks: z.array(z.any()).optional().default([]) }) }); ``` **Success Criteria**: Schema validates new task creation ### Task 9: Create Parse PRD Schema **File**: `src/schemas/parse-prd.js` **Action**: Define schema for parse-prd command ```javascript import { z } from 'zod'; import { BaseTaskSchema } from './base-schemas.js'; export const ParsedTaskSchema = BaseTaskSchema.omit({ id: true, status: true }).extend({ status: z.literal('pending').default('pending') }); export const ParsePRDResponseSchema = z.object({ tasks: z.array(ParsedTaskSchema), projectName: z.string().optional(), summary: z.string().optional() }); ``` **Success Criteria**: Schema validates PRD parsing output ### Task 10: Create Schema Registry **File**: `src/schemas/registry.js` **Action**: Create central schema registry ```javascript import { UpdateTasksResponseSchema } from './update-tasks.js'; import { ExpandTaskResponseSchema } from './expand-task.js'; import { ComplexityAnalysisResponseSchema } from './analyze-complexity.js'; import { UpdateSubtaskResponseSchema } from './update-subtask.js'; import { UpdateTaskResponseSchema } from './update-task.js'; import { AddTaskResponseSchema } from './add-task.js'; import { ParsePRDResponseSchema } from './parse-prd.js'; export const COMMAND_SCHEMAS = { 'update-tasks': UpdateTasksResponseSchema, 'expand-task': ExpandTaskResponseSchema, 'analyze-complexity': ComplexityAnalysisResponseSchema, 'update-subtask-by-id': UpdateSubtaskResponseSchema, 'update-task-by-id': UpdateTaskResponseSchema, 'add-task': AddTaskResponseSchema, 'parse-prd': ParsePRDResponseSchema }; // Export individual schemas for direct access export * from './update-tasks.js'; export * from './expand-task.js'; export * from './analyze-complexity.js'; export * from './update-subtask.js'; export * from './update-task.js'; export * from './add-task.js'; export * from './parse-prd.js'; export * from './base-schemas.js'; ``` **Success Criteria**: All schemas imported and accessible via registry --- ## Task Group 2: Prompt Template Updates (Tasks 11-17) ### Task 11: Update analyze-complexity Prompt **File**: `src/prompts/analyze-complexity.json` **Action**: Remove JSON formatting instructions from user prompt ```json { "prompts": { "default": { "system": "You are an expert software architect and project manager analyzing task complexity. Your analysis should consider implementation effort, technical challenges, dependencies, and testing requirements.", "user": "Analyze the following tasks to determine their complexity (1-10 scale) and recommend the number of subtasks for expansion. Provide a brief reasoning and an initial expansion prompt for each.{{#if useResearch}} Consider current best practices, common implementation patterns, and industry standards in your analysis.{{/if}}\n\nTasks:\n{{{json tasks}}}{{#if gatheredContext}}\n\n# Project Context\n\n{{gatheredContext}}{{/if}}" } } } ``` **Success Criteria**: Prompt no longer contains "Respond ONLY with JSON" type instructions ### Task 12: Update expand-task Prompt **File**: `src/prompts/expand-task.json` **Action**: Remove JSON formatting instructions, update all variants ```json { "prompts": { "complexity-report": { "condition": "expansionPrompt", "system": "You are an AI assistant helping with task breakdown. Generate {{#if (gt subtaskCount 0)}}exactly {{subtaskCount}}{{else}}an appropriate number of{{/if}} subtasks based on the provided prompt and context.", "user": "{{expansionPrompt}}{{#if additionalContext}}\n\n{{additionalContext}}{{/if}}{{#if complexityReasoningContext}}\n\n{{complexityReasoningContext}}{{/if}}{{#if gatheredContext}}\n\n# Project Context\n\n{{gatheredContext}}{{/if}}" }, "research": { "condition": "useResearch === true && !expansionPrompt", "system": "You are an AI assistant with research capabilities analyzing and breaking down software development tasks.", "user": "Analyze the following task and break it down into {{#if (gt subtaskCount 0)}}exactly {{subtaskCount}}{{else}}an appropriate number of{{/if}} specific subtasks. Each subtask should be actionable and well-defined.\n\nParent Task:\nID: {{task.id}}\nTitle: {{task.title}}\nDescription: {{task.description}}\nCurrent details: {{#if task.details}}{{task.details}}{{else}}None{{/if}}{{#if additionalContext}}\nConsider this context: {{additionalContext}}{{/if}}{{#if complexityReasoningContext}}\nComplexity Analysis Reasoning: {{complexityReasoningContext}}{{/if}}{{#if gatheredContext}}\n\n# Project Context\n\n{{gatheredContext}}{{/if}}" }, "default": { "system": "You are an AI assistant helping with task breakdown for software development. Break down high-level tasks into specific, actionable subtasks that can be implemented sequentially.", "user": "Break down this task into {{#if (gt subtaskCount 0)}}exactly {{subtaskCount}}{{else}}an appropriate number of{{/if}} specific subtasks:\n\nTask ID: {{task.id}}\nTitle: {{task.title}}\nDescription: {{task.description}}\nCurrent details: {{#if task.details}}{{task.details}}{{else}}None{{/if}}{{#if additionalContext}}\nAdditional context: {{additionalContext}}{{/if}}{{#if complexityReasoningContext}}\nComplexity Analysis Reasoning: {{complexityReasoningContext}}{{/if}}{{#if gatheredContext}}\n\n# Project Context\n\n{{gatheredContext}}{{/if}}" } } } ``` **Success Criteria**: All prompt variants updated without JSON instructions ### Task 13: Update update-tasks Prompt **File**: `src/prompts/update-tasks.json` **Action**: Remove JSON formatting instructions ```json { "prompts": { "default": { "system": "You are an AI assistant helping to update software development tasks based on new context.\nYou will be given a set of tasks and a prompt describing changes or new implementation details.\nYour job is to update the tasks to reflect these changes, while preserving their basic structure.\n\nGuidelines:\n1. Maintain the same IDs, statuses, and dependencies unless specifically mentioned in the prompt\n2. Update titles, descriptions, details, and test strategies to reflect the new information\n3. Do not change anything unnecessarily - just adapt what needs to change based on the prompt\n4. Return ALL the tasks in order, not just the modified ones\n5. VERY IMPORTANT: Preserve all subtasks marked as \"done\" or \"completed\" - do not modify their content\n6. For tasks with completed subtasks, build upon what has already been done rather than rewriting everything\n7. If an existing completed subtask needs to be changed/undone based on the new context, DO NOT modify it directly\n8. Instead, add a new subtask that clearly indicates what needs to be changed or replaced\n9. Use the existence of completed subtasks as an opportunity to make new subtasks more specific and targeted", "user": "Here are the tasks to update:\n{{{json tasks}}}\n\nPlease update these tasks based on the following new context:\n{{updatePrompt}}\n\nIMPORTANT: In the tasks above, any subtasks with \"status\": \"done\" or \"status\": \"completed\" should be preserved exactly as is. Build your changes around these completed items.{{#if projectContext}}\n\n# Project Context\n\n{{projectContext}}{{/if}}" } } } ``` **Success Criteria**: Prompt updated without "Return only JSON" instructions ### Task 14: Update Remaining Command Prompts **Files**: - `src/prompts/update-subtask.json` - `src/prompts/update-task.json` - `src/prompts/add-task.json` - `src/prompts/parse-prd.json` **Action**: Remove all JSON formatting instructions from each file **Success Criteria**: All prompts updated consistently ### Task 15: Create Prompt Migration Test **File**: `tests/unit/prompts/prompt-migration.test.js` **Action**: Create test to ensure no JSON instructions remain ```javascript import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const promptsDir = path.join(__dirname, '../../../src/prompts'); describe('Prompt Migration Validation', () => { const bannedPhrases = [ 'Respond ONLY with', 'Return only the', 'valid JSON', 'Do not include any explanatory text', 'markdown formatting', 'code block markers', 'Return ONLY' ]; test('prompts should not contain JSON formatting instructions', () => { const promptFiles = fs.readdirSync(promptsDir) .filter(file => file.endsWith('.json') && !file.includes('schema')); promptFiles.forEach(file => { const content = fs.readFileSync(path.join(promptsDir, file), 'utf8'); const promptData = JSON.parse(content); bannedPhrases.forEach(phrase => { expect(content.toLowerCase()).not.toContain(phrase.toLowerCase()); }); }); }); }); ``` **Success Criteria**: Test passes for all prompt files --- ## Task Group 3: Command Migration - Phase 1 (Tasks 16-25) ### Task 16: Migrate analyze-complexity Command **File**: `scripts/modules/task-manager/analyze-task-complexity.js` **Action**: Replace generateTextService with generateObjectService 1. Add imports: ```javascript import { generateObjectService } from '../ai-services-unified.js'; import { COMMAND_SCHEMAS } from '../../../src/schemas/registry.js'; ``` 2. Replace AI service call (around line 428): ```javascript // OLD CODE TO REMOVE: // aiServiceResponse = await generateTextService({ // prompt, // systemPrompt, // role, // session, // projectRoot, // commandName: 'analyze-complexity', // outputType: mcpLog ? 'mcp' : 'cli' // }); // NEW CODE: aiServiceResponse = await generateObjectService({ prompt, systemPrompt, role, session, projectRoot, schema: COMMAND_SCHEMAS['analyze-complexity'], objectName: 'complexity_analysis', commandName: 'analyze-complexity', outputType: mcpLog ? 'mcp' : 'cli' }); ``` 3. Replace parsing logic (around line 450-486): ```javascript // OLD CODE TO REMOVE (entire parsing block): // reportLog('Parsing complexity analysis from text response...', 'info'); // try { ... } catch (parseError) { ... } // NEW CODE: complexityAnalysis = aiServiceResponse.mainResult.complexityAnalysis; reportLog(`Received ${complexityAnalysis.length} complexity analyses from AI.`, 'info'); ``` 4. Delete the internal prompt generation function (lines 33-64) **Success Criteria**: Command executes successfully with generateObject ### Task 17: Create Integration Test for analyze-complexity **File**: `tests/integration/commands/analyze-complexity.test.js` **Action**: Test the migrated command ```javascript import analyzeTaskComplexity from '../../../scripts/modules/task-manager/analyze-task-complexity.js'; import { readJSON } from '../../../scripts/modules/utils.js'; describe('analyze-complexity with generateObject', () => { test('should return structured complexity analysis', async () => { const result = await analyzeTaskComplexity({ file: 'test-tasks.json', output: 'test-complexity.json' }); expect(result).toHaveProperty('report'); expect(result.report).toHaveProperty('complexityAnalysis'); expect(Array.isArray(result.report.complexityAnalysis)).toBe(true); if (result.report.complexityAnalysis.length > 0) { const analysis = result.report.complexityAnalysis[0]; expect(analysis).toHaveProperty('taskId'); expect(analysis).toHaveProperty('complexityScore'); expect(analysis).toHaveProperty('recommendedSubtasks'); } }); }); ``` **Success Criteria**: Test passes with real AI provider ### Task 18: Migrate update-task-by-id Command **File**: `scripts/modules/task-manager/update-task-by-id.js` **Action**: Similar migration pattern as Task 16 **Success Criteria**: Single task updates work with generateObject ### Task 19: Create Integration Test for update-task-by-id **File**: `tests/integration/commands/update-task-by-id.test.js` **Action**: Test single task update functionality **Success Criteria**: Test validates structured response --- ## Task Group 4: Command Migration - Phase 2 (Tasks 20-30) ### Task 20: Migrate expand-task Command **File**: `scripts/modules/task-manager/expand-task.js` 1. Add imports: ```javascript import { generateObjectService } from '../ai-services-unified.js'; import { COMMAND_SCHEMAS } from '../../../src/schemas/registry.js'; ``` 2. Replace generateTextService call (around line 533): ```javascript aiServiceResponse = await generateObjectService({ prompt: promptContent, systemPrompt: systemPrompt, role, session, projectRoot, schema: COMMAND_SCHEMAS['expand-task'], objectName: 'task_expansion', commandName: 'expand-task', outputType: outputFormat }); ``` 3. Replace parsing (around line 543): ```javascript // OLD: generatedSubtasks = parseSubtasksFromText(...); // NEW: generatedSubtasks = aiServiceResponse.mainResult.subtasks; logger.info(`Received ${generatedSubtasks.length} subtasks from AI.`); ``` 4. Delete parseSubtasksFromText function (lines 74-278) **Success Criteria**: Subtask expansion works correctly ### Task 21: Migrate update-tasks Command **File**: `scripts/modules/task-manager/update-tasks.js` **Action**: Most complex migration - handle multiple tasks **Success Criteria**: Bulk task updates work with structured output ### Task 22: Create Comprehensive Test Suite **File**: `tests/integration/generateObject-migration.test.js` **Action**: Test all migrated commands together **Success Criteria**: All commands pass integration tests --- ## Task Group 5: Provider Validation (Tasks 23-27) ### Task 23: Validate Claude-Code Provider **File**: `tests/integration/providers/claude-code-object.test.js` **Action**: Test generateObject with claude-code provider ```javascript import { generateObjectService } from '../../../scripts/modules/ai-services-unified.js'; import { z } from 'zod'; describe('Claude-Code generateObject support', () => { test('should handle structured output correctly', async () => { const TestSchema = z.object({ message: z.string(), number: z.number() }); const result = await generateObjectService({ role: 'main', prompt: 'Generate a test object with message "Hello" and number 42', systemPrompt: 'You are a test assistant.', schema: TestSchema, objectName: 'test_object', commandName: 'test-command' }); expect(result.mainResult).toEqual({ message: 'Hello', number: 42 }); }); }); ``` **Success Criteria**: Claude-code handles generateObject ### Task 24: Test Provider Fallback **Action**: Verify fallback sequence works with generateObject **Success Criteria**: System falls back correctly when providers fail --- ## Task Group 6: Migration Completion (Tasks 28-35) ### Task 25: Remove All Parsing Functions **Action**: Delete all parse*FromText functions **Files to modify**: - Remove `parseUpdatedTasksFromText` from update-tasks.js - Remove `parseSubtasksFromText` from expand-task.js - Remove similar functions from all command files **Success Criteria**: No parsing functions remain ### Task 26: Update Error Handling **Action**: Replace parsing error handlers with schema validation handlers **Success Criteria**: Clear error messages for validation failures ### Task 27: Performance Benchmarking **File**: `tests/benchmarks/generateObject-performance.js` **Action**: Compare performance before/after migration **Success Criteria**: Performance meets or exceeds current implementation ### Task 28: Update Documentation **Files**: - `README.md` - `docs/api-reference.md` - `docs/migration-guide.md` **Action**: Document the new structured output approach **Success Criteria**: Documentation reflects new architecture ### Task 29: Final Integration Testing **Action**: Run full test suite with all commands migrated **Success Criteria**: 100% test pass rate ### Task 30: Create Rollback Documentation **File**: `docs/rollback-procedure.md` **Action**: Document how to rollback if needed **Success Criteria**: Clear rollback steps documented --- ## Task Group 7: Cleanup and Optimization (Tasks 31-35) ### Task 31: Remove Temporary Code **Action**: Remove any temporary compatibility layers **Success Criteria**: Clean codebase without migration artifacts ### Task 32: Optimize Prompts **Action**: Fine-tune prompts for structured output **Success Criteria**: Improved response quality ### Task 33: Add Telemetry **Action**: Add metrics for generateObject performance **Success Criteria**: Performance metrics available ### Task 34: Security Review **Action**: Review schema validation for security issues **Success Criteria**: No injection vulnerabilities ### Task 35: Final Code Review **Action**: Complete code review of all changes **Success Criteria**: Code meets quality standards --- ## Implementation Notes for AI LLMs ### When implementing each task: 1. **Read the existing code first** - Use Read tool to understand current implementation 2. **Make incremental changes** - Don't try to change too much at once 3. **Test after each change** - Run relevant tests before proceeding 4. **Preserve functionality** - Ensure backward compatibility during migration 5. **Document changes** - Add comments explaining significant modifications ### Common Patterns: 1. **Import Pattern**: ```javascript import { generateObjectService } from '../ai-services-unified.js'; import { COMMAND_SCHEMAS } from '../../../src/schemas/registry.js'; ``` 2. **Service Call Pattern**: ```javascript const aiServiceResponse = await generateObjectService({ ...existingParams, schema: COMMAND_SCHEMAS[commandName], objectName: descriptive_name, }); ``` 3. **Result Access Pattern**: ```javascript const result = aiServiceResponse.mainResult.propertyName; ``` ### Error Handling: When you encounter schema validation errors, the error will be clear: ```javascript // Zod validation errors are descriptive // Example: "Expected number, received string at path: complexityScore" ``` ### Testing Commands: After modifying each command, test with: ```bash # Unit tests npm test -- path/to/specific/test.js # Integration test node scripts/test-integration.js command-name ``` ## Success Metrics After completing all tasks: 1. **Code Reduction**: 500+ lines of parsing code removed 2. **Error Rate**: 90% reduction in parsing errors 3. **Performance**: 15-50% improvement in execution time 4. **Reliability**: Zero JSON parsing failures 5. **Maintainability**: Significantly improved with schema-driven approach This sequential task plan provides a clear path for AI LLMs to implement the generateObject migration systematically and safely.