mirror of
https://github.com/eyaltoledano/claude-task-master.git
synced 2025-11-20 03:57:50 +00:00
* initial cutover * update log to debug * update tracker to pass units * update test to match new base tracker format * add streamTextService mocks * remove unused imports * Ensure the CLI waits for async main() completion * refactor to reduce code duplication * update comment * reuse function * ensure targetTag is defined in streaming mode * avoid throwing inside process.exit spy * check for null * remove reference to generate * fix formatting * fix textStream assignment * ensure no division by 0 * fix jest chalk mocks * refactor for maintainability * Improve bar chart calculation logic for consistent visual representation * use custom streaming error types; fix mocks * Update streamText extraction in parse-prd.js to match actual service response * remove check - doesn't belong here * update mocks * remove streaming test that wasn't really doing anything * add comment * make parsing logic more DRY * fix formatting * Fix textStream extraction to match actual service response * fix mock * Add a cleanup method to ensure proper resource disposal and prevent memory leaks * debounce progress updates to reduce UI flicker during rapid updates * Implement timeout protection for streaming operations (60-second timeout) with automatic fallback to non-streaming mode. * clear timeout properly * Add a maximum buffer size limit (1MB) to prevent unbounded memory growth with very large streaming responses. * fix formatting * remove duplicate mock * better docs * fix formatting * sanitize the dynamic property name * Fix incorrect remaining progress calculation * Use onError callback instead of console.warn * Remove unused chalk import * Add missing custom validator in fallback parsing configuration * add custom validator parameter in fallback parsing * chore: fix package-lock.json * chore: large code refactor * chore: increase timeout from 1 minute to 3 minutes * fix: refactor and fix streaming * Merge remote-tracking branch 'origin/next' into joedanz/parse-prd-progress * fix: cleanup and fix unit tests * chore: fix unit tests * chore: fix format * chore: run format * chore: fix weird CI unit test error * chore: fix format --------- Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
106 lines
3.2 KiB
JavaScript
106 lines
3.2 KiB
JavaScript
/**
|
|
* Configuration classes and schemas for PRD parsing
|
|
*/
|
|
|
|
import { z } from 'zod';
|
|
import { TASK_PRIORITY_OPTIONS } from '../../../../src/constants/task-priority.js';
|
|
import { getCurrentTag, isSilentMode, log } from '../../utils.js';
|
|
import { Duration } from '../../../../src/utils/timeout-manager.js';
|
|
import { CUSTOM_PROVIDERS } from '../../../../src/constants/providers.js';
|
|
import { getMainProvider, getResearchProvider } from '../../config-manager.js';
|
|
|
|
// ============================================================================
|
|
// SCHEMAS
|
|
// ============================================================================
|
|
|
|
// Define the Zod schema for a SINGLE task object
|
|
export const prdSingleTaskSchema = z.object({
|
|
id: z.number(),
|
|
title: z.string().min(1),
|
|
description: z.string().min(1),
|
|
details: z.string(),
|
|
testStrategy: z.string(),
|
|
priority: z.enum(TASK_PRIORITY_OPTIONS),
|
|
dependencies: z.array(z.number()),
|
|
status: z.string()
|
|
});
|
|
|
|
// Define the Zod schema for the ENTIRE expected AI response object
|
|
export const prdResponseSchema = z.object({
|
|
tasks: z.array(prdSingleTaskSchema),
|
|
metadata: z.object({
|
|
projectName: z.string(),
|
|
totalTasks: z.number(),
|
|
sourceFile: z.string(),
|
|
generatedAt: z.string()
|
|
})
|
|
});
|
|
|
|
// ============================================================================
|
|
// CONFIGURATION CLASSES
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Configuration object for PRD parsing
|
|
*/
|
|
export class PrdParseConfig {
|
|
constructor(prdPath, tasksPath, numTasks, options = {}) {
|
|
this.prdPath = prdPath;
|
|
this.tasksPath = tasksPath;
|
|
this.numTasks = numTasks;
|
|
this.force = options.force || false;
|
|
this.append = options.append || false;
|
|
this.research = options.research || false;
|
|
this.reportProgress = options.reportProgress;
|
|
this.mcpLog = options.mcpLog;
|
|
this.session = options.session;
|
|
this.projectRoot = options.projectRoot;
|
|
this.tag = options.tag;
|
|
this.streamingTimeout =
|
|
options.streamingTimeout || Duration.seconds(180).milliseconds;
|
|
|
|
// Derived values
|
|
this.targetTag = this.tag || getCurrentTag(this.projectRoot) || 'master';
|
|
this.isMCP = !!this.mcpLog;
|
|
this.outputFormat = this.isMCP && !this.reportProgress ? 'json' : 'text';
|
|
this.useStreaming =
|
|
typeof this.reportProgress === 'function' || this.outputFormat === 'text';
|
|
}
|
|
|
|
/**
|
|
* Check if Claude Code is being used
|
|
*/
|
|
isClaudeCode() {
|
|
const currentProvider = this.research
|
|
? getResearchProvider(this.projectRoot)
|
|
: getMainProvider(this.projectRoot);
|
|
return currentProvider === CUSTOM_PROVIDERS.CLAUDE_CODE;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Logging configuration and utilities
|
|
*/
|
|
export class LoggingConfig {
|
|
constructor(mcpLog, reportProgress) {
|
|
this.isMCP = !!mcpLog;
|
|
this.outputFormat = this.isMCP && !reportProgress ? 'json' : 'text';
|
|
|
|
this.logFn = mcpLog || {
|
|
info: (...args) => log('info', ...args),
|
|
warn: (...args) => log('warn', ...args),
|
|
error: (...args) => log('error', ...args),
|
|
debug: (...args) => log('debug', ...args),
|
|
success: (...args) => log('success', ...args)
|
|
};
|
|
}
|
|
|
|
report(message, level = 'info') {
|
|
if (this.logFn && typeof this.logFn[level] === 'function') {
|
|
this.logFn[level](message);
|
|
} else if (!isSilentMode() && this.outputFormat === 'text') {
|
|
log(level, message);
|
|
}
|
|
}
|
|
}
|