2025-04-21 17:48:30 -04:00
|
|
|
import path from 'path';
|
|
|
|
import chalk from 'chalk';
|
|
|
|
import boxen from 'boxen';
|
|
|
|
|
|
|
|
import { log, readJSON, writeJSON, findTaskById } from '../utils.js';
|
|
|
|
import { displayBanner } from '../ui.js';
|
|
|
|
import { validateTaskDependencies } from '../dependency-manager.js';
|
|
|
|
import { getDebugFlag } from '../config-manager.js';
|
|
|
|
import updateSingleTaskStatus from './update-single-task-status.js';
|
|
|
|
import generateTaskFiles from './generate-task-files.js';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the status of a task
|
|
|
|
* @param {string} tasksPath - Path to the tasks.json file
|
|
|
|
* @param {string} taskIdInput - Task ID(s) to update
|
|
|
|
* @param {string} newStatus - New status
|
|
|
|
* @param {Object} options - Additional options (mcpLog for MCP mode)
|
|
|
|
* @returns {Object|undefined} Result object in MCP mode, undefined in CLI mode
|
|
|
|
*/
|
|
|
|
async function setTaskStatus(tasksPath, taskIdInput, newStatus, options = {}) {
|
|
|
|
try {
|
|
|
|
// Determine if we're in MCP mode by checking for mcpLog
|
|
|
|
const isMcpMode = !!options?.mcpLog;
|
|
|
|
|
|
|
|
// Only display UI elements if not in MCP mode
|
|
|
|
if (!isMcpMode) {
|
|
|
|
displayBanner();
|
|
|
|
|
|
|
|
console.log(
|
|
|
|
boxen(chalk.white.bold(`Updating Task Status to: ${newStatus}`), {
|
|
|
|
padding: 1,
|
|
|
|
borderColor: 'blue',
|
|
|
|
borderStyle: 'round'
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
log('info', `Reading tasks from ${tasksPath}...`);
|
|
|
|
const data = readJSON(tasksPath);
|
|
|
|
if (!data || !data.tasks) {
|
|
|
|
throw new Error(`No valid tasks found in ${tasksPath}`);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle multiple task IDs (comma-separated)
|
|
|
|
const taskIds = taskIdInput.split(',').map((id) => id.trim());
|
|
|
|
const updatedTasks = [];
|
|
|
|
|
|
|
|
// Update each task
|
|
|
|
for (const id of taskIds) {
|
|
|
|
await updateSingleTaskStatus(tasksPath, id, newStatus, data, !isMcpMode);
|
|
|
|
updatedTasks.push(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write the updated tasks to the file
|
|
|
|
writeJSON(tasksPath, data);
|
|
|
|
|
|
|
|
// Validate dependencies after status update
|
|
|
|
log('info', 'Validating dependencies after status update...');
|
|
|
|
validateTaskDependencies(data.tasks);
|
|
|
|
|
|
|
|
// Generate individual task files
|
|
|
|
log('info', 'Regenerating task files...');
|
|
|
|
await generateTaskFiles(tasksPath, path.dirname(tasksPath), {
|
|
|
|
mcpLog: options.mcpLog
|
|
|
|
});
|
|
|
|
|
|
|
|
// Display success message - only in CLI mode
|
|
|
|
if (!isMcpMode) {
|
|
|
|
for (const id of updatedTasks) {
|
|
|
|
const task = findTaskById(data.tasks, id);
|
|
|
|
const taskName = task ? task.title : id;
|
|
|
|
|
|
|
|
console.log(
|
|
|
|
boxen(
|
|
|
|
chalk.white.bold(`Successfully updated task ${id} status:`) +
|
|
|
|
'\n' +
|
|
|
|
`From: ${chalk.yellow(task ? task.status : 'unknown')}\n` +
|
|
|
|
`To: ${chalk.green(newStatus)}`,
|
|
|
|
{ padding: 1, borderColor: 'green', borderStyle: 'round' }
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return success value for programmatic use
|
|
|
|
return {
|
|
|
|
success: true,
|
|
|
|
updatedTasks: updatedTasks.map((id) => ({
|
|
|
|
id,
|
|
|
|
status: newStatus
|
|
|
|
}))
|
|
|
|
};
|
|
|
|
} catch (error) {
|
|
|
|
log('error', `Error setting task status: ${error.message}`);
|
|
|
|
|
|
|
|
// Only show error UI in CLI mode
|
|
|
|
if (!options?.mcpLog) {
|
|
|
|
console.error(chalk.red(`Error: ${error.message}`));
|
|
|
|
|
refactor: Standardize configuration and environment variable access
This commit centralizes configuration and environment variable access across various modules by consistently utilizing getters from scripts/modules/config-manager.js. This replaces direct access to process.env and the global CONFIG object, leading to improved consistency, maintainability, testability, and better handling of session-specific configurations within the MCP context.
Key changes include:
- Centralized Getters: Replaced numerous instances of process.env.* and CONFIG.* with corresponding getter functions (e.g., getLogLevel, getMainModelId, getResearchMaxTokens, getMainTemperature, isApiKeySet, getDebugFlag, getDefaultSubtasks).
- Session Awareness: Ensured that the session object is passed to config getters where necessary, particularly within AI service calls (ai-services.js, add-task.js) and error handling (ai-services.js), allowing for session-specific environment overrides.
- API Key Checks: Standardized API key availability checks using isApiKeySet() instead of directly checking process.env.* (e.g., for Perplexity in commands.js and ai-services.js).
- Client Instantiation Cleanup: Removed now-redundant/obsolete local client instantiation functions (getAnthropicClient, getPerplexityClient) from ai-services.js and the global Anthropic client initialization from dependency-manager.js. Client creation should now rely on the config manager and factory patterns.
- Consistent Debug Flag Usage: Standardized calls to getDebugFlag() in commands.js, removing potentially unnecessary null arguments.
- Accurate Progress Calculation: Updated AI stream progress reporting (ai-services.js, add-task.js) to use getMainMaxTokens(session) for more accurate calculations.
- Minor Cleanup: Removed unused import from scripts/modules/commands.js.
Specific module updates:
- :
- Uses getLogLevel() instead of process.env.LOG_LEVEL.
- :
- Replaced direct env/config access for model IDs, tokens, temperature, API keys, and default subtasks with appropriate getters.
- Passed session to handleClaudeError.
- Removed local getPerplexityClient and getAnthropicClient functions.
- Updated progress calculations to use getMainMaxTokens(session).
- :
- Uses isApiKeySet('perplexity') for API key checks.
- Uses getDebugFlag() consistently for debug checks.
- Removed unused import.
- :
- Removed global Anthropic client initialization.
- :
- Uses config getters (getResearch..., getMain...) for Perplexity and Claude API call parameters, preserving customEnv override logic.
This refactoring also resolves a potential SyntaxError: Identifier 'getPerplexityClient' has already been declared by removing the duplicated/obsolete function definition previously present in ai-services.js.
2025-04-21 21:30:12 -04:00
|
|
|
// Pass session to getDebugFlag
|
|
|
|
if (getDebugFlag(options?.session)) {
|
2025-04-21 17:48:30 -04:00
|
|
|
// Use getter
|
|
|
|
console.error(error);
|
|
|
|
}
|
|
|
|
|
|
|
|
process.exit(1);
|
|
|
|
} else {
|
|
|
|
// In MCP mode, throw the error for the caller to handle
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default setTaskStatus;
|