@gonzui/claude-task-manager
Version:
Task management extension for Claude Code with archiving and history
345 lines ⢠13.4 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const commander_1 = require("commander");
const chalk_1 = __importDefault(require("chalk"));
const TaskManager_1 = require("../lib/TaskManager");
const types_1 = require("../types");
const i18n_1 = require("../lib/i18n");
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
// Read version from package.json
const packageJsonPath = path.join(__dirname, '../../package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
const version = packageJson.version;
const program = new commander_1.Command();
const taskManager = new TaskManager_1.TaskManager();
const i18n = i18n_1.I18n.getInstance();
// Initialize i18n with system or config language
async function initI18n() {
try {
const lang = await taskManager.getLanguage();
await i18n.init(lang);
}
catch {
await i18n.init('en');
}
}
program
.name('claude-task')
.description('Claude Code Task Manager')
.version(version)
.hook('preAction', async () => {
await initI18n();
});
program
.command('init')
.description(i18n.t('commands.init.description'))
.action(async () => {
try {
await taskManager.init();
console.log(chalk_1.default.green(i18n.t('commands.init.success')));
console.log(chalk_1.default.gray(' Created: task.md, archive/, .claude-tasks/'));
}
catch (error) {
handleError(error);
}
});
program
.command('new [title]')
.description(i18n.t('commands.new.description'))
.option('-d, --description <description>', 'Task description')
.option('-p, --priority <priority>', 'Task priority (low, medium, high)', 'medium')
.option('--tags <tags>', 'Task tags (comma-separated)')
.action(async (title, options) => {
try {
const taskOptions = {
title: title || options.title,
description: options.description,
priority: options.priority,
tags: options.tags ? options.tags.split(',').map((tag) => tag.trim()) : undefined
};
const taskFile = await taskManager.createNewTask(taskOptions);
console.log(chalk_1.default.green(i18n.t('commands.new.success', { title: taskOptions.title || 'New Task' })));
if (taskOptions.title) {
console.log(chalk_1.default.blue(i18n.t('commands.new.archiving')));
}
if (taskOptions.priority && taskOptions.priority !== 'medium') {
console.log(chalk_1.default.yellow(` Priority: ${taskOptions.priority.toUpperCase()}`));
}
if (taskOptions.tags && taskOptions.tags.length > 0) {
console.log(chalk_1.default.cyan(` Tags: ${taskOptions.tags.join(', ')}`));
}
}
catch (error) {
handleError(error);
}
});
program
.command('run')
.description(i18n.t('commands.run.description'))
.option('-v, --verbose', 'Verbose output')
.option('-d, --debug', 'Debug output')
.option('--no-edit-permission', 'Disable file edit permissions for Claude (default: edit permissions enabled)')
.action(async (options) => {
try {
console.log(chalk_1.default.blue(i18n.t('commands.run.starting')));
const startTime = Date.now();
const result = await taskManager.runTask(options.verbose, options.debug, options.editPermission);
const duration = Date.now() - startTime;
if (result.success) {
console.log(chalk_1.default.green(i18n.t('commands.run.success')));
if (options.verbose && result.output) {
console.log(chalk_1.default.gray('Output:'));
console.log(result.output);
}
}
else {
console.log(chalk_1.default.red(i18n.t('commands.run.error', { error: result.error || 'Unknown error' })));
}
}
catch (error) {
handleError(error);
}
});
program
.command('history')
.description(i18n.t('commands.history.description'))
.option('-l, --limit <number>', 'Limit number of results', '10')
.option('--size', 'Show file sizes')
.action(async (options) => {
try {
const history = await taskManager.getHistory(parseInt(options.limit));
if (history.length === 0) {
console.log(chalk_1.default.yellow(i18n.t('commands.history.empty')));
return;
}
console.log(chalk_1.default.blue(i18n.t('commands.history.title')));
history.forEach((task) => {
const sizeInfo = options.size && task.size ? ` (${formatBytes(task.size)})` : '';
console.log(i18n.t('commands.history.item', { date: task.date, title: task.title }) + chalk_1.default.gray(sizeInfo));
});
}
catch (error) {
handleError(error);
}
});
program
.command('status')
.description(i18n.t('commands.status.description'))
.action(async () => {
try {
const status = await taskManager.getStatus();
console.log(chalk_1.default.blue(i18n.t('commands.status.title')));
console.log(status.currentTask
? i18n.t('commands.status.currentTask', { task: chalk_1.default.yellow(status.currentTask) })
: i18n.t('commands.status.noCurrentTask'));
if (status.currentTaskSize) {
console.log(`Task file size: ${chalk_1.default.gray(formatBytes(status.currentTaskSize))}`);
}
console.log(i18n.t('commands.status.archivedCount', { count: chalk_1.default.green(status.archivedCount.toString()) }));
console.log(i18n.t('commands.status.totalExecutions', { count: chalk_1.default.cyan(status.totalExecutions.toString()) }));
console.log(status.lastRun
? i18n.t('commands.status.lastRun', { time: chalk_1.default.gray(status.lastRun) })
: i18n.t('commands.status.noLastRun'));
}
catch (error) {
handleError(error);
}
});
program
.command('archive')
.description(i18n.t('commands.archive.description'))
.action(async () => {
try {
const archivedPath = await taskManager.archiveCurrentTask();
if (archivedPath) {
console.log(chalk_1.default.green(i18n.t('commands.archive.success', { path: path.basename(archivedPath) })));
}
else {
console.log(chalk_1.default.yellow(i18n.t('commands.archive.noTask')));
}
}
catch (error) {
handleError(error);
}
});
program
.command('config')
.description('Show or update configuration')
.option('--set-template <file>', 'Set custom task template from file')
.option('--set-claude-cmd <command>', 'Set Claude Code command')
.action(async (options) => {
try {
if (options.setTemplate) {
// Implementation for setting template
console.log(chalk_1.default.blue('š§ Template configuration feature coming soon...'));
}
else if (options.setClaudeCmd) {
// Implementation for setting Claude command
console.log(chalk_1.default.blue('š§ Claude command configuration feature coming soon...'));
}
else {
// Show current config
console.log(chalk_1.default.blue('š§ Configuration display feature coming soon...'));
}
}
catch (error) {
handleError(error);
}
});
program
.command('claude <prompt>')
.description(i18n.t('commands.claude.description'))
.action(async (prompt) => {
try {
console.log(chalk_1.default.blue(i18n.t('commands.run.starting')));
// This would need to be implemented in TaskManager
console.log(chalk_1.default.yellow('Direct Claude execution feature coming soon...'));
}
catch (error) {
handleError(error);
}
});
program
.command('claude [prompt...]')
.description('Execute Claude Code with optional prompt')
.action(async (promptParts) => {
try {
const prompt = promptParts.join(' ');
if (!prompt) {
// No prompt provided, just show task content
console.log(chalk_1.default.blue('š Executing task with Claude Code...'));
const taskContent = await taskManager.getTaskContent();
console.log('\n' + taskContent);
console.log('\nš” Please use the task content above in Claude Code.');
}
else {
// Prompt provided, execute with task context
console.log(chalk_1.default.blue('š Executing Claude Code with prompt...'));
const taskContent = await taskManager.getTaskContent();
console.log('\n=== TASK CONTEXT ===');
console.log(taskContent);
console.log('=== END TASK CONTEXT ===\n');
console.log('š Your prompt:', chalk_1.default.yellow(prompt));
console.log('\nš” Please execute the above prompt with the task context in Claude Code.');
}
// Update execution count
await taskManager.recordExecution({
success: true,
output: 'Claude Code execution initiated',
timestamp: new Date().toISOString(),
duration: 0
});
}
catch (error) {
handleError(error);
}
});
program
.command('lang [language]')
.description(i18n.t('commands.lang.description'))
.action(async (language) => {
try {
if (!language) {
const currentLang = await taskManager.getLanguage();
console.log(i18n.t('commands.lang.current', { lang: currentLang }));
return;
}
if (language !== 'en' && language !== 'ja') {
console.log(chalk_1.default.red(i18n.t('commands.lang.invalid')));
return;
}
await taskManager.setLanguage(language);
await i18n.init(language);
console.log(chalk_1.default.green(i18n.t('commands.lang.changed', { lang: language })));
}
catch (error) {
handleError(error);
}
});
// Error handling function
function handleError(error) {
if (error instanceof types_1.ClaudeExecutionError) {
console.error(chalk_1.default.red('Claude Execution Error:'), error.message);
if (error.stderr) {
console.error(chalk_1.default.gray('Claude stderr:'), error.stderr);
}
if (error.exitCode) {
console.error(chalk_1.default.gray('Exit code:'), error.exitCode);
}
}
else if (error instanceof types_1.FileSystemError) {
console.error(chalk_1.default.red('File System Error:'), error.message);
console.error(chalk_1.default.gray('Path:'), error.details?.path);
console.error(chalk_1.default.gray('Operation:'), error.details?.operation);
}
else if (error instanceof types_1.TaskManagerError) {
console.error(chalk_1.default.red('Task Manager Error:'), error.message);
console.error(chalk_1.default.gray('Code:'), error.code);
}
else if (error instanceof Error) {
console.error(chalk_1.default.red('Error:'), error.message);
}
else {
console.error(chalk_1.default.red('Unknown error occurred'));
}
process.exit(1);
}
// Utility function to format bytes
function formatBytes(bytes) {
if (bytes === 0)
return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
// Handle unknown commands
program.on('command:*', () => {
console.error(chalk_1.default.red('Invalid command. See --help for available commands.'));
process.exit(1);
});
// Parse command line arguments
program.parse();
// Show help if no command provided
if (!process.argv.slice(2).length) {
program.outputHelp();
}
//# sourceMappingURL=claude-task.js.map