@brainfile/cli 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -41,58 +41,38 @@ const fs = __importStar(require("fs"));
41
41
  const path = __importStar(require("path"));
42
42
  const core_1 = require("@brainfile/core");
43
43
  const chalk_1 = __importDefault(require("chalk"));
44
+ const errorHandler_1 = require("../utils/errorHandler");
44
45
  function subtaskCommand(options) {
45
46
  try {
46
47
  // Validate required task option
47
48
  if (!options.task) {
48
- console.error(chalk_1.default.red('Error: --task is required'));
49
- console.log(chalk_1.default.gray('Usage: brainfile subtask --task <task-id> <operation>'));
50
- console.log(chalk_1.default.gray('Operations:'));
51
- console.log(chalk_1.default.gray(' --add <title> Add a new subtask'));
52
- console.log(chalk_1.default.gray(' --delete <subtask-id> Delete a subtask'));
53
- console.log(chalk_1.default.gray(' --update <subtask-id> --title <new-title> Update subtask title'));
54
- console.log(chalk_1.default.gray(' --toggle <subtask-id> Toggle subtask completion'));
55
- process.exit(1);
49
+ (0, errorHandler_1.missingRequiredError)('--task', 'brainfile subtask --task <task-id> <operation>\nOperations:\n --add <title> Add a new subtask\n --delete <subtask-id> Delete a subtask\n --update <subtask-id> --title <new-title> Update subtask title\n --toggle <subtask-id> Toggle subtask completion');
56
50
  }
57
51
  // Check for exactly one operation
58
52
  const operations = [options.add, options.delete, options.update, options.toggle].filter(Boolean);
59
53
  if (operations.length === 0) {
60
- console.error(chalk_1.default.red('Error: One operation is required (--add, --delete, --update, or --toggle)'));
61
- process.exit(1);
54
+ (0, errorHandler_1.validationError)('One operation is required (--add, --delete, --update, or --toggle)');
62
55
  }
63
56
  if (operations.length > 1) {
64
- console.error(chalk_1.default.red('Error: Only one operation can be performed at a time'));
65
- process.exit(1);
57
+ (0, errorHandler_1.validationError)('Only one operation can be performed at a time');
66
58
  }
67
59
  // Resolve file path
68
60
  const filePath = path.resolve(options.file);
69
61
  // Check if file exists
70
62
  if (!fs.existsSync(filePath)) {
71
- console.error(chalk_1.default.red(`Error: File not found: ${filePath}`));
72
- process.exit(1);
63
+ (0, errorHandler_1.fileNotFoundError)(filePath);
73
64
  }
74
65
  // Read and parse the file
75
66
  const content = fs.readFileSync(filePath, 'utf-8');
76
67
  const result = core_1.Brainfile.parseWithErrors(content);
77
68
  if (!result.board) {
78
- console.error(chalk_1.default.red('Error: Failed to parse brainfile'));
79
- if (result.error) {
80
- console.error(chalk_1.default.red(result.error));
81
- }
82
- process.exit(1);
69
+ (0, errorHandler_1.parseError)(result.error);
83
70
  }
84
71
  const board = result.board;
85
72
  // Find the task
86
73
  const taskInfo = (0, core_1.findTaskById)(board, options.task);
87
74
  if (!taskInfo) {
88
- console.error(chalk_1.default.red(`Error: Task not found: ${options.task}`));
89
- console.log(chalk_1.default.gray('\nAvailable tasks:'));
90
- board.columns.forEach((col) => {
91
- col.tasks.forEach((task) => {
92
- console.log(chalk_1.default.gray(` - ${task.id}: ${task.title}`));
93
- });
94
- });
95
- process.exit(1);
75
+ (0, errorHandler_1.taskNotFoundError)(options.task, board);
96
76
  }
97
77
  let operationResult;
98
78
  let successMessage = '';
@@ -109,18 +89,11 @@ function subtaskCommand(options) {
109
89
  if (options.delete) {
110
90
  // Verify subtask exists
111
91
  if (!taskInfo.task.subtasks || taskInfo.task.subtasks.length === 0) {
112
- console.error(chalk_1.default.red(`Error: Task ${options.task} has no subtasks`));
113
- process.exit(1);
92
+ (0, errorHandler_1.validationError)(`Task ${options.task} has no subtasks`);
114
93
  }
115
94
  const subtask = taskInfo.task.subtasks.find(st => st.id === options.delete);
116
95
  if (!subtask) {
117
- console.error(chalk_1.default.red(`Error: Subtask not found: ${options.delete}`));
118
- console.log(chalk_1.default.gray('\nAvailable subtasks:'));
119
- taskInfo.task.subtasks.forEach((st) => {
120
- const status = st.completed ? chalk_1.default.green('[x]') : chalk_1.default.gray('[ ]');
121
- console.log(chalk_1.default.gray(` ${status} ${st.id}: ${st.title}`));
122
- });
123
- process.exit(1);
96
+ (0, errorHandler_1.subtaskNotFoundError)(options.delete, taskInfo.task);
124
97
  }
125
98
  operationResult = (0, core_1.deleteSubtask)(board, options.task, options.delete);
126
99
  successMessage = `Subtask deleted: ${options.delete} - ${subtask.title}`;
@@ -128,24 +101,15 @@ function subtaskCommand(options) {
128
101
  // Handle update operation
129
102
  if (options.update) {
130
103
  if (!options.title) {
131
- console.error(chalk_1.default.red('Error: --title is required for update operation'));
132
- console.log(chalk_1.default.gray('Usage: brainfile subtask --task <task-id> --update <subtask-id> --title "New title"'));
133
- process.exit(1);
104
+ (0, errorHandler_1.missingRequiredError)('--title', 'brainfile subtask --task <task-id> --update <subtask-id> --title "New title"');
134
105
  }
135
106
  // Verify subtask exists
136
107
  if (!taskInfo.task.subtasks || taskInfo.task.subtasks.length === 0) {
137
- console.error(chalk_1.default.red(`Error: Task ${options.task} has no subtasks`));
138
- process.exit(1);
108
+ (0, errorHandler_1.validationError)(`Task ${options.task} has no subtasks`);
139
109
  }
140
110
  const subtask = taskInfo.task.subtasks.find(st => st.id === options.update);
141
111
  if (!subtask) {
142
- console.error(chalk_1.default.red(`Error: Subtask not found: ${options.update}`));
143
- console.log(chalk_1.default.gray('\nAvailable subtasks:'));
144
- taskInfo.task.subtasks.forEach((st) => {
145
- const status = st.completed ? chalk_1.default.green('[x]') : chalk_1.default.gray('[ ]');
146
- console.log(chalk_1.default.gray(` ${status} ${st.id}: ${st.title}`));
147
- });
148
- process.exit(1);
112
+ (0, errorHandler_1.subtaskNotFoundError)(options.update, taskInfo.task);
149
113
  }
150
114
  operationResult = (0, core_1.updateSubtask)(board, options.task, options.update, options.title);
151
115
  successMessage = `Subtask updated: ${options.update}\n "${subtask.title}" → "${options.title}"`;
@@ -154,18 +118,11 @@ function subtaskCommand(options) {
154
118
  if (options.toggle) {
155
119
  // Verify subtask exists
156
120
  if (!taskInfo.task.subtasks || taskInfo.task.subtasks.length === 0) {
157
- console.error(chalk_1.default.red(`Error: Task ${options.task} has no subtasks`));
158
- process.exit(1);
121
+ (0, errorHandler_1.validationError)(`Task ${options.task} has no subtasks`);
159
122
  }
160
123
  const subtask = taskInfo.task.subtasks.find(st => st.id === options.toggle);
161
124
  if (!subtask) {
162
- console.error(chalk_1.default.red(`Error: Subtask not found: ${options.toggle}`));
163
- console.log(chalk_1.default.gray('\nAvailable subtasks:'));
164
- taskInfo.task.subtasks.forEach((st) => {
165
- const status = st.completed ? chalk_1.default.green('[x]') : chalk_1.default.gray('[ ]');
166
- console.log(chalk_1.default.gray(` ${status} ${st.id}: ${st.title}`));
167
- });
168
- process.exit(1);
125
+ (0, errorHandler_1.subtaskNotFoundError)(options.toggle, taskInfo.task);
169
126
  }
170
127
  operationResult = (0, core_1.toggleSubtask)(board, options.task, options.toggle);
171
128
  const newStatus = !subtask.completed ? 'completed' : 'incomplete';
@@ -179,11 +136,10 @@ function subtaskCommand(options) {
179
136
  const updatedContent = core_1.Brainfile.serialize(operationResult.board);
180
137
  fs.writeFileSync(filePath, updatedContent, 'utf-8');
181
138
  // Success message
182
- console.log(chalk_1.default.green('✓ ' + successMessage));
139
+ console.log(chalk_1.default.green(successMessage));
183
140
  }
184
141
  catch (error) {
185
- console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : String(error));
186
- process.exit(1);
142
+ (0, errorHandler_1.handleError)(error);
187
143
  }
188
144
  }
189
145
  //# sourceMappingURL=subtask.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subtask.js","sourceRoot":"","sources":["../../src/commands/subtask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subtask.js","sourceRoot":"","sources":["../../src/commands/subtask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import type { Board, Task } from '@brainfile/core';
2
+ export declare const ExitCode: {
3
+ readonly SUCCESS: 0;
4
+ readonly USER_ERROR: 1;
5
+ readonly WARNING: 0;
6
+ };
7
+ export type ExitCodeType = typeof ExitCode[keyof typeof ExitCode];
8
+ export declare enum ErrorType {
9
+ FILE_NOT_FOUND = "FILE_NOT_FOUND",
10
+ PARSE_ERROR = "PARSE_ERROR",
11
+ TASK_NOT_FOUND = "TASK_NOT_FOUND",
12
+ COLUMN_NOT_FOUND = "COLUMN_NOT_FOUND",
13
+ SUBTASK_NOT_FOUND = "SUBTASK_NOT_FOUND",
14
+ VALIDATION_ERROR = "VALIDATION_ERROR",
15
+ MISSING_REQUIRED = "MISSING_REQUIRED",
16
+ OPERATION_FAILED = "OPERATION_FAILED"
17
+ }
18
+ /**
19
+ * Determines if a column represents a "done" or completion state.
20
+ * Used for soft error warnings about incomplete subtasks.
21
+ */
22
+ export declare function isDoneColumn(column: {
23
+ id: string;
24
+ title: string;
25
+ }): boolean;
26
+ export interface IncompleteSubtasksResult {
27
+ hasIncomplete: boolean;
28
+ completed: number;
29
+ total: number;
30
+ incomplete: Array<{
31
+ id: string;
32
+ title: string;
33
+ }>;
34
+ }
35
+ /**
36
+ * Checks a task for incomplete subtasks.
37
+ */
38
+ export declare function checkIncompleteSubtasks(task: Task): IncompleteSubtasksResult;
39
+ /**
40
+ * Prints a warning about incomplete subtasks when moving to a done column.
41
+ * Returns true if warning was printed.
42
+ */
43
+ export declare function warnIncompleteSubtasks(task: Task, targetColumn: {
44
+ id: string;
45
+ title: string;
46
+ }): boolean;
47
+ /**
48
+ * Handles file not found errors with actionable guidance.
49
+ */
50
+ export declare function fileNotFoundError(filePath: string): never;
51
+ /**
52
+ * Handles brainfile parse errors.
53
+ */
54
+ export declare function parseError(error?: string): never;
55
+ /**
56
+ * Handles task not found errors with available tasks list.
57
+ */
58
+ export declare function taskNotFoundError(taskId: string, board: Board): never;
59
+ /**
60
+ * Handles column not found errors with available columns list.
61
+ */
62
+ export declare function columnNotFoundError(columnId: string, board: Board): never;
63
+ /**
64
+ * Handles subtask not found errors with available subtasks list.
65
+ */
66
+ export declare function subtaskNotFoundError(subtaskId: string, task: Task): never;
67
+ /**
68
+ * Handles missing required option errors with usage example.
69
+ */
70
+ export declare function missingRequiredError(option: string, usage: string): never;
71
+ /**
72
+ * Handles validation errors.
73
+ */
74
+ export declare function validationError(message: string): never;
75
+ /**
76
+ * Handles operation failures from core functions.
77
+ */
78
+ export declare function operationError(error: string): never;
79
+ /**
80
+ * Generic error handler for catch blocks.
81
+ */
82
+ export declare function handleError(error: unknown): never;
83
+ export interface McpError {
84
+ content: Array<{
85
+ type: 'text';
86
+ text: string;
87
+ }>;
88
+ isError: true;
89
+ }
90
+ export interface McpWarning {
91
+ warning: string;
92
+ incompleteSubtasks?: IncompleteSubtasksResult;
93
+ }
94
+ /**
95
+ * Creates an MCP error response.
96
+ */
97
+ export declare function mcpError(message: string): McpError;
98
+ /**
99
+ * Checks for incomplete subtasks warning for MCP responses.
100
+ * Returns warning info if applicable, undefined otherwise.
101
+ */
102
+ export declare function mcpCheckIncompleteSubtasks(task: Task, targetColumn: {
103
+ id: string;
104
+ title: string;
105
+ }): McpWarning | undefined;
106
+ //# sourceMappingURL=errorHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAU,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM3D,eAAO,MAAM,QAAQ;;;;CAIX,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,OAAO,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAMlE,oBAAY,SAAS;IACnB,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;IACvC,gBAAgB,qBAAqB;IACrC,gBAAgB,qBAAqB;IACrC,gBAAgB,qBAAqB;CACtC;AAaD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAI3E;AAMD,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,wBAAwB,CAiB5E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,YAAY,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAoBT;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAMzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAShD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAcrE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAOzE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,CAczE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAIzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAGtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAGnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAGjD;AAMD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,IAAI,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAKlD;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,EACV,YAAY,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1C,UAAU,GAAG,SAAS,CAkBxB"}
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ErrorType = exports.ExitCode = void 0;
7
+ exports.isDoneColumn = isDoneColumn;
8
+ exports.checkIncompleteSubtasks = checkIncompleteSubtasks;
9
+ exports.warnIncompleteSubtasks = warnIncompleteSubtasks;
10
+ exports.fileNotFoundError = fileNotFoundError;
11
+ exports.parseError = parseError;
12
+ exports.taskNotFoundError = taskNotFoundError;
13
+ exports.columnNotFoundError = columnNotFoundError;
14
+ exports.subtaskNotFoundError = subtaskNotFoundError;
15
+ exports.missingRequiredError = missingRequiredError;
16
+ exports.validationError = validationError;
17
+ exports.operationError = operationError;
18
+ exports.handleError = handleError;
19
+ exports.mcpError = mcpError;
20
+ exports.mcpCheckIncompleteSubtasks = mcpCheckIncompleteSubtasks;
21
+ const chalk_1 = __importDefault(require("chalk"));
22
+ // ============================================================================
23
+ // Exit Codes
24
+ // ============================================================================
25
+ exports.ExitCode = {
26
+ SUCCESS: 0,
27
+ USER_ERROR: 1, // Invalid input, missing file, validation errors
28
+ WARNING: 0, // Success with warning (soft errors)
29
+ };
30
+ // ============================================================================
31
+ // Error Types
32
+ // ============================================================================
33
+ var ErrorType;
34
+ (function (ErrorType) {
35
+ ErrorType["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
36
+ ErrorType["PARSE_ERROR"] = "PARSE_ERROR";
37
+ ErrorType["TASK_NOT_FOUND"] = "TASK_NOT_FOUND";
38
+ ErrorType["COLUMN_NOT_FOUND"] = "COLUMN_NOT_FOUND";
39
+ ErrorType["SUBTASK_NOT_FOUND"] = "SUBTASK_NOT_FOUND";
40
+ ErrorType["VALIDATION_ERROR"] = "VALIDATION_ERROR";
41
+ ErrorType["MISSING_REQUIRED"] = "MISSING_REQUIRED";
42
+ ErrorType["OPERATION_FAILED"] = "OPERATION_FAILED";
43
+ })(ErrorType || (exports.ErrorType = ErrorType = {}));
44
+ // ============================================================================
45
+ // Done-Column Detection
46
+ // ============================================================================
47
+ const DONE_COLUMN_PATTERNS = [
48
+ /^done$/i,
49
+ /^completed?$/i,
50
+ /^finished$/i,
51
+ /^closed$/i,
52
+ ];
53
+ /**
54
+ * Determines if a column represents a "done" or completion state.
55
+ * Used for soft error warnings about incomplete subtasks.
56
+ */
57
+ function isDoneColumn(column) {
58
+ return DONE_COLUMN_PATTERNS.some(pattern => pattern.test(column.id) || pattern.test(column.title));
59
+ }
60
+ /**
61
+ * Checks a task for incomplete subtasks.
62
+ */
63
+ function checkIncompleteSubtasks(task) {
64
+ if (!task.subtasks || task.subtasks.length === 0) {
65
+ return { hasIncomplete: false, completed: 0, total: 0, incomplete: [] };
66
+ }
67
+ const incomplete = task.subtasks
68
+ .filter(st => !st.completed)
69
+ .map(st => ({ id: st.id, title: st.title }));
70
+ const completed = task.subtasks.length - incomplete.length;
71
+ return {
72
+ hasIncomplete: incomplete.length > 0,
73
+ completed,
74
+ total: task.subtasks.length,
75
+ incomplete,
76
+ };
77
+ }
78
+ /**
79
+ * Prints a warning about incomplete subtasks when moving to a done column.
80
+ * Returns true if warning was printed.
81
+ */
82
+ function warnIncompleteSubtasks(task, targetColumn) {
83
+ if (!isDoneColumn(targetColumn)) {
84
+ return false;
85
+ }
86
+ const result = checkIncompleteSubtasks(task);
87
+ if (!result.hasIncomplete) {
88
+ return false;
89
+ }
90
+ console.log('');
91
+ console.log(chalk_1.default.yellow(`Warning: Task has ${result.incomplete.length}/${result.total} incomplete subtasks`));
92
+ console.log(chalk_1.default.gray(' Incomplete:'));
93
+ result.incomplete.forEach(st => {
94
+ console.log(chalk_1.default.gray(` - [ ] ${st.id}: ${st.title}`));
95
+ });
96
+ console.log('');
97
+ console.log(chalk_1.default.gray(' Consider completing subtasks before marking done.'));
98
+ return true;
99
+ }
100
+ // ============================================================================
101
+ // Error Handlers
102
+ // ============================================================================
103
+ /**
104
+ * Handles file not found errors with actionable guidance.
105
+ */
106
+ function fileNotFoundError(filePath) {
107
+ console.error(chalk_1.default.red(`Error: File not found: ${filePath}`));
108
+ console.log('');
109
+ console.log(chalk_1.default.gray('To create a new brainfile, run:'));
110
+ console.log(chalk_1.default.cyan(' brainfile init'));
111
+ process.exit(exports.ExitCode.USER_ERROR);
112
+ }
113
+ /**
114
+ * Handles brainfile parse errors.
115
+ */
116
+ function parseError(error) {
117
+ console.error(chalk_1.default.red('Error: Failed to parse brainfile'));
118
+ if (error) {
119
+ console.error(chalk_1.default.red(error));
120
+ }
121
+ console.log('');
122
+ console.log(chalk_1.default.gray('To validate and fix syntax issues, run:'));
123
+ console.log(chalk_1.default.cyan(' brainfile lint --fix'));
124
+ process.exit(exports.ExitCode.USER_ERROR);
125
+ }
126
+ /**
127
+ * Handles task not found errors with available tasks list.
128
+ */
129
+ function taskNotFoundError(taskId, board) {
130
+ console.error(chalk_1.default.red(`Error: Task not found: ${taskId}`));
131
+ const allTasks = board.columns.flatMap(col => col.tasks);
132
+ if (allTasks.length > 0) {
133
+ console.log(chalk_1.default.gray('\nAvailable tasks:'));
134
+ board.columns.forEach(col => {
135
+ col.tasks.forEach(task => {
136
+ console.log(chalk_1.default.gray(` - ${task.id}: ${task.title}`));
137
+ });
138
+ });
139
+ }
140
+ process.exit(exports.ExitCode.USER_ERROR);
141
+ }
142
+ /**
143
+ * Handles column not found errors with available columns list.
144
+ */
145
+ function columnNotFoundError(columnId, board) {
146
+ console.error(chalk_1.default.red(`Error: Column not found: ${columnId}`));
147
+ console.log(chalk_1.default.gray('Available columns:'));
148
+ board.columns.forEach(col => {
149
+ console.log(chalk_1.default.gray(` - ${col.id} (${col.title})`));
150
+ });
151
+ process.exit(exports.ExitCode.USER_ERROR);
152
+ }
153
+ /**
154
+ * Handles subtask not found errors with available subtasks list.
155
+ */
156
+ function subtaskNotFoundError(subtaskId, task) {
157
+ console.error(chalk_1.default.red(`Error: Subtask not found: ${subtaskId}`));
158
+ if (task.subtasks && task.subtasks.length > 0) {
159
+ console.log(chalk_1.default.gray('\nAvailable subtasks:'));
160
+ task.subtasks.forEach(st => {
161
+ const status = st.completed ? chalk_1.default.green('[x]') : chalk_1.default.gray('[ ]');
162
+ console.log(chalk_1.default.gray(` ${status} ${st.id}: ${st.title}`));
163
+ });
164
+ }
165
+ else {
166
+ console.log(chalk_1.default.gray(`\nTask ${task.id} has no subtasks.`));
167
+ }
168
+ process.exit(exports.ExitCode.USER_ERROR);
169
+ }
170
+ /**
171
+ * Handles missing required option errors with usage example.
172
+ */
173
+ function missingRequiredError(option, usage) {
174
+ console.error(chalk_1.default.red(`Error: ${option} is required`));
175
+ console.log(chalk_1.default.gray(`Usage: ${usage}`));
176
+ process.exit(exports.ExitCode.USER_ERROR);
177
+ }
178
+ /**
179
+ * Handles validation errors.
180
+ */
181
+ function validationError(message) {
182
+ console.error(chalk_1.default.red(`Error: ${message}`));
183
+ process.exit(exports.ExitCode.USER_ERROR);
184
+ }
185
+ /**
186
+ * Handles operation failures from core functions.
187
+ */
188
+ function operationError(error) {
189
+ console.error(chalk_1.default.red(`Error: ${error}`));
190
+ process.exit(exports.ExitCode.USER_ERROR);
191
+ }
192
+ /**
193
+ * Generic error handler for catch blocks.
194
+ */
195
+ function handleError(error) {
196
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : String(error));
197
+ process.exit(exports.ExitCode.USER_ERROR);
198
+ }
199
+ /**
200
+ * Creates an MCP error response.
201
+ */
202
+ function mcpError(message) {
203
+ return {
204
+ content: [{ type: 'text', text: `Error: ${message}` }],
205
+ isError: true,
206
+ };
207
+ }
208
+ /**
209
+ * Checks for incomplete subtasks warning for MCP responses.
210
+ * Returns warning info if applicable, undefined otherwise.
211
+ */
212
+ function mcpCheckIncompleteSubtasks(task, targetColumn) {
213
+ if (!isDoneColumn(targetColumn)) {
214
+ return undefined;
215
+ }
216
+ const result = checkIncompleteSubtasks(task);
217
+ if (!result.hasIncomplete) {
218
+ return undefined;
219
+ }
220
+ const incompleteList = result.incomplete
221
+ .map(st => ` - [ ] ${st.id}: ${st.title}`)
222
+ .join('\n');
223
+ return {
224
+ warning: `Warning: Task has ${result.incomplete.length}/${result.total} incomplete subtasks:\n${incompleteList}\n\nConsider completing subtasks before marking done.`,
225
+ incompleteSubtasks: result,
226
+ };
227
+ }
228
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainfile/cli",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Command-line interface for Brainfile task management",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",