@nanocollective/nanocoder
Version:
A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter
117 lines • 4.63 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { Box, Text } from 'ink';
import React from 'react';
import { TaskListDisplay } from '../components/task-list-display.js';
import { useTheme } from '../hooks/useTheme.js';
import { clearAllTasks, generateTaskId, loadTasks, saveTasks, } from '../tools/tasks/storage.js';
function TaskMessage({ message, isError }) {
const { colors } = useTheme();
return (_jsx(Box, { marginY: 1, children: _jsx(Text, { color: isError ? colors.error : colors.success, children: message }) }));
}
function TasksDisplay({ tasks, message, isError }) {
return (_jsxs(Box, { flexDirection: "column", children: [message && _jsx(TaskMessage, { message: message, isError: isError }), _jsx(TaskListDisplay, { tasks: tasks, title: "Tasks" })] }));
}
export const tasksCommand = {
name: 'tasks',
description: 'Manage your task list',
handler: async (args) => {
const subcommand = args[0]?.toLowerCase();
const rest = args.slice(1).join(' ');
// No subcommand - show task list
if (!subcommand) {
const tasks = await loadTasks();
return React.createElement(TasksDisplay, {
key: `tasks-list-${Date.now()}`,
tasks,
});
}
// Add task
if (subcommand === 'add') {
if (!rest.trim()) {
return React.createElement(TaskMessage, {
key: `tasks-error-${Date.now()}`,
message: 'Usage: /tasks add <title>',
isError: true,
});
}
const tasks = await loadTasks();
const now = new Date().toISOString();
const newTask = {
id: generateTaskId(),
title: rest.trim(),
status: 'pending',
createdAt: now,
updatedAt: now,
};
tasks.push(newTask);
await saveTasks(tasks);
return React.createElement(TasksDisplay, {
key: `tasks-added-${Date.now()}`,
tasks,
message: `Added: ${newTask.title}`,
});
}
// Remove task
if (subcommand === 'remove' || subcommand === 'rm') {
if (!rest.trim()) {
return React.createElement(TaskMessage, {
key: `tasks-error-${Date.now()}`,
message: 'Usage: /tasks remove <number>',
isError: true,
});
}
const taskNumber = parseInt(rest.trim(), 10);
if (isNaN(taskNumber) || taskNumber < 1) {
return React.createElement(TaskMessage, {
key: `tasks-error-${Date.now()}`,
message: 'Please provide a valid task number (e.g., /tasks remove 1)',
isError: true,
});
}
const tasks = await loadTasks();
const taskIndex = taskNumber - 1;
if (taskIndex >= tasks.length) {
return React.createElement(TaskMessage, {
key: `tasks-error-${Date.now()}`,
message: `Task ${taskNumber} not found. You have ${tasks.length} task(s).`,
isError: true,
});
}
const removed = tasks.splice(taskIndex, 1)[0];
await saveTasks(tasks);
return React.createElement(TasksDisplay, {
key: `tasks-removed-${Date.now()}`,
tasks,
message: `Removed: ${removed.title}`,
});
}
// Clear all
if (subcommand === 'clear') {
await clearAllTasks();
return React.createElement(TasksDisplay, {
key: `tasks-cleared-${Date.now()}`,
tasks: [],
message: 'All tasks cleared',
});
}
// Unknown subcommand - treat as task title to add
const fullTitle = args.join(' ').trim();
const tasks = await loadTasks();
const now = new Date().toISOString();
const newTask = {
id: generateTaskId(),
title: fullTitle,
status: 'pending',
createdAt: now,
updatedAt: now,
};
tasks.push(newTask);
await saveTasks(tasks);
return React.createElement(TasksDisplay, {
key: `tasks-added-${Date.now()}`,
tasks,
message: `Added: ${newTask.title}`,
});
},
};
//# sourceMappingURL=tasks.js.map