UNPKG

@tosin2013/kanbn

Version:

A CLI Kanban board with AI-powered task management features

148 lines (137 loc) 4.26 kB
const path = require('path'); /** * Check if a task id exists in the index * @param {object} index The index object * @param {string} taskId The task id to check * @return {boolean} True if the task is in the index */ function taskInIndex(index, taskId) { if (typeof taskId !== 'string') { return false; } return Object.values(index.columns).flat().includes(taskId); } /** * Find which column a task is in * @param {object} index The index object * @param {string} taskId The task id to find * @return {string|null} The name of the column, or null if the task isn't in the index */ function findTaskColumn(index, taskId) { if (typeof taskId !== 'string') { return null; } return Object.entries(index.columns).find(([_, tasks]) => tasks.includes(taskId))?.[0] || null; } /** * Add a task to the index * @param {object} index The index object * @param {string} taskId The task id to add * @param {string} columnName The name of the column to add the task to * @param {?number} [position=null] The position to add the task at * @return {object} The updated index */ function addTaskToIndex(index, taskId, columnName, position = null) { if (position === null || position >= index.columns[columnName].length) { index.columns[columnName].push(taskId); } else { index.columns[columnName].splice(position, 0, taskId); } return index; } /** * Remove a task from the index * @param {object} index The index object * @param {string} taskId The task id to remove * @return {object} The updated index */ function removeTaskFromIndex(index, taskId) { Object.values(index.columns).forEach(tasks => { const taskIndex = tasks.indexOf(taskId); if (taskIndex !== -1) { tasks.splice(taskIndex, 1); } }); return index; } /** * Rename a task in the index * @param {object} index The index object * @param {string} oldTaskId The old task id * @param {string} newTaskId The new task id * @return {object} The updated index */ function renameTaskInIndex(index, oldTaskId, newTaskId) { Object.values(index.columns).forEach(tasks => { const taskIndex = tasks.indexOf(oldTaskId); if (taskIndex !== -1) { tasks[taskIndex] = newTaskId; } }); return index; } /** * Get task metadata * @param {object} task The task object * @param {string} property The metadata property name * @return {*} The metadata property value */ function getTaskMetadata(task, property) { return task.metadata && property in task.metadata ? task.metadata[property] : null; } /** * Set task metadata * @param {object} task The task object * @param {string} property The metadata property name * @param {*} value The metadata property value * @return {object} The updated task */ function setTaskMetadata(task, property, value) { if (!task.metadata) { task.metadata = {}; } task.metadata[property] = value; return task; } /** * Check if a task is completed * @param {object} index The index object * @param {object} task The task object * @return {boolean} True if the task is completed */ function taskCompleted(index, task) { const columnName = findTaskColumn(index, task.id); return ( ('completedColumns' in index.options && index.options.completedColumns.includes(columnName)) || ('completed' in task.metadata && task.metadata.completed) ); } /** * Determines if a task is a system-generated task (like AI interactions) * @param {string} taskId The task ID to check * @param {object} task The task object to check * @return {boolean} True if this is a system task */ function isSystemTask(taskId, task) { return taskId.includes('ai-request') || taskId.includes('ai-response') || (task.name && ( task.name.toLowerCase().includes('ai request') || task.name.toLowerCase().includes('ai response') || task.name.toLowerCase().includes('ai interaction') )) || (task.description && task.description.includes('automatically generated record of an AI interaction')); } module.exports = { taskInIndex, findTaskColumn, addTaskToIndex, removeTaskFromIndex, renameTaskInIndex, getTaskMetadata, setTaskMetadata, taskCompleted, isSystemTask };