@brainfile/cli 0.7.1 → 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.
- package/CHANGELOG.md +15 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +8 -24
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +8 -23
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/delete.d.ts.map +1 -1
- package/dist/commands/delete.js +8 -23
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +4 -12
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +110 -3
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/move.d.ts.map +1 -1
- package/dist/commands/move.js +12 -35
- package/dist/commands/move.js.map +1 -1
- package/dist/commands/patch.d.ts.map +1 -1
- package/dist/commands/patch.js +9 -27
- package/dist/commands/patch.js.map +1 -1
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +10 -26
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/subtask.d.ts.map +1 -1
- package/dist/commands/subtask.js +16 -60
- package/dist/commands/subtask.js.map +1 -1
- package/dist/utils/errorHandler.d.ts +106 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +228 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.0] - 2025-11-25
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **MCP server auto-discovery** - Automatically finds workspace brainfile without hardcoded paths
|
|
14
|
+
- Checks `WORKSPACE_FOLDER_PATHS` env var (set by Cursor IDE)
|
|
15
|
+
- Falls back to git repository root detection
|
|
16
|
+
- Falls back to walking up directory tree from cwd
|
|
17
|
+
- Logs discovered path to stderr for debugging
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- **`brainfile init` schema URL** - Changed from `https://brainfile.md/v1` to `https://brainfile.md/v1/board.json` per protocol spec
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Upgraded to @brainfile/core@^0.8.0 with `findNearestBrainfile()` support
|
|
24
|
+
|
|
10
25
|
## [0.7.1] - 2025-11-25
|
|
11
26
|
|
|
12
27
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAaA,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,QAgG7C"}
|
package/dist/commands/add.js
CHANGED
|
@@ -41,33 +41,24 @@ 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 addCommand(options) {
|
|
45
46
|
try {
|
|
46
47
|
// Validate required options
|
|
47
48
|
if (!options.title) {
|
|
48
|
-
|
|
49
|
-
console.log(chalk_1.default.gray('Usage: brainfile add --title "Task title" [options]'));
|
|
50
|
-
process.exit(1);
|
|
49
|
+
(0, errorHandler_1.missingRequiredError)('--title', 'brainfile add --title "Task title" [options]');
|
|
51
50
|
}
|
|
52
51
|
// Resolve file path
|
|
53
52
|
const filePath = path.resolve(options.file);
|
|
54
53
|
// Check if file exists
|
|
55
54
|
if (!fs.existsSync(filePath)) {
|
|
56
|
-
|
|
57
|
-
console.log('');
|
|
58
|
-
console.log(chalk_1.default.gray('To create a new brainfile, run:'));
|
|
59
|
-
console.log(chalk_1.default.cyan(' brainfile init'));
|
|
60
|
-
process.exit(1);
|
|
55
|
+
(0, errorHandler_1.fileNotFoundError)(filePath);
|
|
61
56
|
}
|
|
62
57
|
// Read and parse the file
|
|
63
58
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
64
59
|
const result = core_1.Brainfile.parseWithErrors(content);
|
|
65
60
|
if (!result.board) {
|
|
66
|
-
|
|
67
|
-
if (result.error) {
|
|
68
|
-
console.error(chalk_1.default.red(result.error));
|
|
69
|
-
}
|
|
70
|
-
process.exit(1);
|
|
61
|
+
(0, errorHandler_1.parseError)(result.error);
|
|
71
62
|
}
|
|
72
63
|
let board = result.board;
|
|
73
64
|
// Find the target column by ID or name
|
|
@@ -76,12 +67,7 @@ function addCommand(options) {
|
|
|
76
67
|
targetColumn = (0, core_1.findColumnByName)(board, options.column);
|
|
77
68
|
}
|
|
78
69
|
if (!targetColumn) {
|
|
79
|
-
|
|
80
|
-
console.log(chalk_1.default.gray('Available columns:'));
|
|
81
|
-
board.columns.forEach(col => {
|
|
82
|
-
console.log(chalk_1.default.gray(` - ${col.id} (${col.title})`));
|
|
83
|
-
});
|
|
84
|
-
process.exit(1);
|
|
70
|
+
(0, errorHandler_1.columnNotFoundError)(options.column, board);
|
|
85
71
|
}
|
|
86
72
|
// Build TaskInput with all provided fields
|
|
87
73
|
const taskInput = {
|
|
@@ -97,8 +83,7 @@ function addCommand(options) {
|
|
|
97
83
|
// Add task using core operation (immutable)
|
|
98
84
|
const addResult = (0, core_1.addTask)(board, targetColumn.id, taskInput);
|
|
99
85
|
if (!addResult.success) {
|
|
100
|
-
|
|
101
|
-
process.exit(1);
|
|
86
|
+
(0, errorHandler_1.operationError)(addResult.error);
|
|
102
87
|
}
|
|
103
88
|
board = addResult.board;
|
|
104
89
|
// Get the new task for display
|
|
@@ -109,7 +94,7 @@ function addCommand(options) {
|
|
|
109
94
|
const updatedContent = core_1.Brainfile.serialize(board);
|
|
110
95
|
fs.writeFileSync(filePath, updatedContent, 'utf-8');
|
|
111
96
|
// Success message
|
|
112
|
-
console.log(chalk_1.default.green('
|
|
97
|
+
console.log(chalk_1.default.green('Task added successfully!'));
|
|
113
98
|
console.log('');
|
|
114
99
|
console.log(chalk_1.default.gray(` ID: ${newTask.id}`));
|
|
115
100
|
console.log(chalk_1.default.gray(` Title: ${options.title}`));
|
|
@@ -137,8 +122,7 @@ function addCommand(options) {
|
|
|
137
122
|
}
|
|
138
123
|
}
|
|
139
124
|
catch (error) {
|
|
140
|
-
|
|
141
|
-
process.exit(1);
|
|
125
|
+
(0, errorHandler_1.handleError)(error);
|
|
142
126
|
}
|
|
143
127
|
}
|
|
144
128
|
//# sourceMappingURL=add.js.map
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAaA,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,QAwDrD"}
|
package/dist/commands/archive.js
CHANGED
|
@@ -41,56 +41,42 @@ 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 archiveCommand(options) {
|
|
45
46
|
try {
|
|
46
47
|
// Validate required options
|
|
47
48
|
if (!options.task) {
|
|
48
|
-
|
|
49
|
-
console.log(chalk_1.default.gray('Usage: brainfile archive --task <task-id>'));
|
|
50
|
-
process.exit(1);
|
|
49
|
+
(0, errorHandler_1.missingRequiredError)('--task', 'brainfile archive --task <task-id>');
|
|
51
50
|
}
|
|
52
51
|
// Resolve file path
|
|
53
52
|
const filePath = path.resolve(options.file);
|
|
54
53
|
// Check if file exists
|
|
55
54
|
if (!fs.existsSync(filePath)) {
|
|
56
|
-
|
|
57
|
-
process.exit(1);
|
|
55
|
+
(0, errorHandler_1.fileNotFoundError)(filePath);
|
|
58
56
|
}
|
|
59
57
|
// Read and parse the file
|
|
60
58
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
61
59
|
const result = core_1.Brainfile.parseWithErrors(content);
|
|
62
60
|
if (!result.board) {
|
|
63
|
-
|
|
64
|
-
if (result.error) {
|
|
65
|
-
console.error(chalk_1.default.red(result.error));
|
|
66
|
-
}
|
|
67
|
-
process.exit(1);
|
|
61
|
+
(0, errorHandler_1.parseError)(result.error);
|
|
68
62
|
}
|
|
69
63
|
const board = result.board;
|
|
70
64
|
// Find the task
|
|
71
65
|
const taskInfo = (0, core_1.findTaskById)(board, options.task);
|
|
72
66
|
if (!taskInfo) {
|
|
73
|
-
|
|
74
|
-
console.log(chalk_1.default.gray('\nAvailable tasks:'));
|
|
75
|
-
board.columns.forEach((col) => {
|
|
76
|
-
col.tasks.forEach((task) => {
|
|
77
|
-
console.log(chalk_1.default.gray(` - ${task.id}: ${task.title}`));
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
process.exit(1);
|
|
67
|
+
(0, errorHandler_1.taskNotFoundError)(options.task, board);
|
|
81
68
|
}
|
|
82
69
|
const { task, column } = taskInfo;
|
|
83
70
|
// Archive task using core operation
|
|
84
71
|
const archiveResult = (0, core_1.archiveTask)(board, column.id, options.task);
|
|
85
72
|
if (!archiveResult.success) {
|
|
86
|
-
|
|
87
|
-
process.exit(1);
|
|
73
|
+
(0, errorHandler_1.operationError)(archiveResult.error);
|
|
88
74
|
}
|
|
89
75
|
// Serialize and write back
|
|
90
76
|
const updatedContent = core_1.Brainfile.serialize(archiveResult.board);
|
|
91
77
|
fs.writeFileSync(filePath, updatedContent, 'utf-8');
|
|
92
78
|
// Success message
|
|
93
|
-
console.log(chalk_1.default.green('
|
|
79
|
+
console.log(chalk_1.default.green('Task archived successfully!'));
|
|
94
80
|
console.log('');
|
|
95
81
|
console.log(chalk_1.default.gray(` Task: ${task.id} - ${task.title}`));
|
|
96
82
|
console.log(chalk_1.default.gray(` From: ${column.title}`));
|
|
@@ -99,8 +85,7 @@ function archiveCommand(options) {
|
|
|
99
85
|
console.log(chalk_1.default.gray('Use "brainfile restore" to restore this task.'));
|
|
100
86
|
}
|
|
101
87
|
catch (error) {
|
|
102
|
-
|
|
103
|
-
process.exit(1);
|
|
88
|
+
(0, errorHandler_1.handleError)(error);
|
|
104
89
|
}
|
|
105
90
|
}
|
|
106
91
|
//# sourceMappingURL=archive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,wCAwDC;AA1ED,uCAAyB;AACzB,2CAA6B;AAC7B,0CAAuE;AACvE,kDAA0B;AAC1B,wDAO+B;AAO/B,SAAgB,cAAc,CAAC,OAAuB;IACpD,IAAI,CAAC;QACH,4BAA4B;QAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,IAAA,mCAAoB,EAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;QACvE,CAAC;QAED,oBAAoB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE5C,uBAAuB;QACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,IAAA,gCAAiB,EAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,0BAA0B;QAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,gBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,IAAA,yBAAU,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAE3B,gBAAgB;QAChB,MAAM,QAAQ,GAAG,IAAA,mBAAY,EAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAA,gCAAiB,EAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAElC,oCAAoC;QACpC,MAAM,aAAa,GAAG,IAAA,kBAAW,EAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAElE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAA,6BAAc,EAAC,aAAa,CAAC,KAAM,CAAC,CAAC;QACvC,CAAC;QAED,2BAA2B;QAC3B,MAAM,cAAc,GAAG,gBAAS,CAAC,SAAS,CAAC,aAAa,CAAC,KAAM,CAAC,CAAC;QACjE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAEpD,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAE3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,0BAAW,EAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAaA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,QA+DnD"}
|
package/dist/commands/delete.js
CHANGED
|
@@ -41,43 +41,30 @@ 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 deleteCommand(options) {
|
|
45
46
|
try {
|
|
46
47
|
// Validate required options
|
|
47
48
|
if (!options.task) {
|
|
48
|
-
|
|
49
|
-
console.log(chalk_1.default.gray('Usage: brainfile delete --task <task-id> [--force]'));
|
|
50
|
-
process.exit(1);
|
|
49
|
+
(0, errorHandler_1.missingRequiredError)('--task', 'brainfile delete --task <task-id> [--force]');
|
|
51
50
|
}
|
|
52
51
|
// Resolve file path
|
|
53
52
|
const filePath = path.resolve(options.file);
|
|
54
53
|
// Check if file exists
|
|
55
54
|
if (!fs.existsSync(filePath)) {
|
|
56
|
-
|
|
57
|
-
process.exit(1);
|
|
55
|
+
(0, errorHandler_1.fileNotFoundError)(filePath);
|
|
58
56
|
}
|
|
59
57
|
// Read and parse the file
|
|
60
58
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
61
59
|
const result = core_1.Brainfile.parseWithErrors(content);
|
|
62
60
|
if (!result.board) {
|
|
63
|
-
|
|
64
|
-
if (result.error) {
|
|
65
|
-
console.error(chalk_1.default.red(result.error));
|
|
66
|
-
}
|
|
67
|
-
process.exit(1);
|
|
61
|
+
(0, errorHandler_1.parseError)(result.error);
|
|
68
62
|
}
|
|
69
63
|
const board = result.board;
|
|
70
64
|
// Find the task
|
|
71
65
|
const taskInfo = (0, core_1.findTaskById)(board, options.task);
|
|
72
66
|
if (!taskInfo) {
|
|
73
|
-
|
|
74
|
-
console.log(chalk_1.default.gray('\nAvailable tasks:'));
|
|
75
|
-
board.columns.forEach((col) => {
|
|
76
|
-
col.tasks.forEach((task) => {
|
|
77
|
-
console.log(chalk_1.default.gray(` - ${task.id}: ${task.title}`));
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
process.exit(1);
|
|
67
|
+
(0, errorHandler_1.taskNotFoundError)(options.task, board);
|
|
81
68
|
}
|
|
82
69
|
const { task, column } = taskInfo;
|
|
83
70
|
// Warn if not using --force
|
|
@@ -92,21 +79,19 @@ function deleteCommand(options) {
|
|
|
92
79
|
// Delete task using core operation
|
|
93
80
|
const deleteResult = (0, core_1.deleteTask)(board, column.id, options.task);
|
|
94
81
|
if (!deleteResult.success) {
|
|
95
|
-
|
|
96
|
-
process.exit(1);
|
|
82
|
+
(0, errorHandler_1.operationError)(deleteResult.error);
|
|
97
83
|
}
|
|
98
84
|
// Serialize and write back
|
|
99
85
|
const updatedContent = core_1.Brainfile.serialize(deleteResult.board);
|
|
100
86
|
fs.writeFileSync(filePath, updatedContent, 'utf-8');
|
|
101
87
|
// Success message
|
|
102
|
-
console.log(chalk_1.default.green('
|
|
88
|
+
console.log(chalk_1.default.green('Task deleted successfully!'));
|
|
103
89
|
console.log('');
|
|
104
90
|
console.log(chalk_1.default.gray(` Task: ${task.id} - ${task.title}`));
|
|
105
91
|
console.log(chalk_1.default.gray(` Column: ${column.title}`));
|
|
106
92
|
}
|
|
107
93
|
catch (error) {
|
|
108
|
-
|
|
109
|
-
process.exit(1);
|
|
94
|
+
(0, errorHandler_1.handleError)(error);
|
|
110
95
|
}
|
|
111
96
|
}
|
|
112
97
|
//# sourceMappingURL=delete.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,sCA+DC;AAlFD,uCAAyB;AACzB,2CAA6B;AAC7B,0CAAsE;AACtE,kDAA0B;AAC1B,wDAO+B;AAQ/B,SAAgB,aAAa,CAAC,OAAsB;IAClD,IAAI,CAAC;QACH,4BAA4B;QAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,IAAA,mCAAoB,EAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;QAChF,CAAC;QAED,oBAAoB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE5C,uBAAuB;QACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,IAAA,gCAAiB,EAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,0BAA0B;QAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,gBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,IAAA,yBAAU,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAE3B,gBAAgB;QAChB,MAAM,QAAQ,GAAG,IAAA,mBAAY,EAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAA,gCAAiB,EAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAElC,4BAA4B;QAC5B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC,CAAC;YAC3G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mCAAmC;QACnC,MAAM,YAAY,GAAG,IAAA,iBAAU,EAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEhE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAA,6BAAc,EAAC,YAAY,CAAC,KAAM,CAAC,CAAC;QACtC,CAAC;QAED,2BAA2B;QAC3B,MAAM,cAAc,GAAG,gBAAS,CAAC,SAAS,CAAC,YAAY,CAAC,KAAM,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAEpD,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,0BAAW,EAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -41,7 +41,7 @@ const fs = __importStar(require("fs"));
|
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
42
|
const chalk_1 = __importDefault(require("chalk"));
|
|
43
43
|
const DEFAULT_BRAINFILE = `---
|
|
44
|
-
schema: https://brainfile.md/v1
|
|
44
|
+
schema: https://brainfile.md/v1/board.json
|
|
45
45
|
title: My Project
|
|
46
46
|
agent:
|
|
47
47
|
instructions:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAUA,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,QAmE/C"}
|
package/dist/commands/list.js
CHANGED
|
@@ -41,27 +41,20 @@ 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 listCommand(options) {
|
|
45
46
|
try {
|
|
46
47
|
// Resolve file path
|
|
47
48
|
const filePath = path.resolve(options.file);
|
|
48
49
|
// Check if file exists
|
|
49
50
|
if (!fs.existsSync(filePath)) {
|
|
50
|
-
|
|
51
|
-
console.log('');
|
|
52
|
-
console.log(chalk_1.default.gray('To create a new brainfile, run:'));
|
|
53
|
-
console.log(chalk_1.default.cyan(' brainfile init'));
|
|
54
|
-
process.exit(1);
|
|
51
|
+
(0, errorHandler_1.fileNotFoundError)(filePath);
|
|
55
52
|
}
|
|
56
53
|
// Read and parse the file
|
|
57
54
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
58
55
|
const result = core_1.Brainfile.parseWithErrors(content);
|
|
59
56
|
if (!result.board) {
|
|
60
|
-
|
|
61
|
-
if (result.error) {
|
|
62
|
-
console.error(chalk_1.default.red(result.error));
|
|
63
|
-
}
|
|
64
|
-
process.exit(1);
|
|
57
|
+
(0, errorHandler_1.parseError)(result.error);
|
|
65
58
|
}
|
|
66
59
|
const board = result.board;
|
|
67
60
|
// Filter columns if specified
|
|
@@ -101,8 +94,7 @@ function listCommand(options) {
|
|
|
101
94
|
console.log(chalk_1.default.gray(`Total tasks: ${totalTasks}`));
|
|
102
95
|
}
|
|
103
96
|
catch (error) {
|
|
104
|
-
|
|
105
|
-
process.exit(1);
|
|
97
|
+
(0, errorHandler_1.handleError)(error);
|
|
106
98
|
}
|
|
107
99
|
}
|
|
108
100
|
function displayTask(task) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAmCA,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAiDD,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,iBAs/BnD"}
|
package/dist/commands/mcp.js
CHANGED
|
@@ -40,6 +40,7 @@ const zod_1 = require("zod");
|
|
|
40
40
|
const fs = __importStar(require("fs"));
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
42
|
const core_1 = require("@brainfile/core");
|
|
43
|
+
const errorHandler_1 = require("../utils/errorHandler");
|
|
43
44
|
function resolveBrainfile(filePath) {
|
|
44
45
|
return path.resolve(filePath);
|
|
45
46
|
}
|
|
@@ -60,11 +61,91 @@ function writeBoard(filePath, board) {
|
|
|
60
61
|
const content = core_1.Brainfile.serialize(board);
|
|
61
62
|
fs.writeFileSync(resolvedPath, content, 'utf-8');
|
|
62
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Find git repository root by walking up directory tree
|
|
66
|
+
*/
|
|
67
|
+
function findGitRoot(startDir) {
|
|
68
|
+
let currentDir = path.resolve(startDir);
|
|
69
|
+
const root = path.parse(currentDir).root;
|
|
70
|
+
while (currentDir !== root) {
|
|
71
|
+
const gitPath = path.join(currentDir, '.git');
|
|
72
|
+
if (fs.existsSync(gitPath)) {
|
|
73
|
+
return currentDir;
|
|
74
|
+
}
|
|
75
|
+
const parentDir = path.dirname(currentDir);
|
|
76
|
+
if (parentDir === currentDir)
|
|
77
|
+
break;
|
|
78
|
+
currentDir = parentDir;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
63
82
|
async function mcpCommand(options) {
|
|
64
|
-
|
|
83
|
+
// Auto-discover brainfile if not specified
|
|
84
|
+
let defaultFile = options.file;
|
|
85
|
+
if (defaultFile === 'brainfile.md') {
|
|
86
|
+
// Default value - try auto-discovery strategies
|
|
87
|
+
// Strategy 1: Check WORKSPACE_FOLDER_PATHS env var (set by Cursor)
|
|
88
|
+
const workspacePaths = process.env.WORKSPACE_FOLDER_PATHS;
|
|
89
|
+
if (workspacePaths) {
|
|
90
|
+
// Can be colon-separated list of paths
|
|
91
|
+
const paths = workspacePaths.split(':').filter(Boolean);
|
|
92
|
+
for (const wsPath of paths) {
|
|
93
|
+
const wsBrainfile = path.join(wsPath, 'brainfile.md');
|
|
94
|
+
if (fs.existsSync(wsBrainfile)) {
|
|
95
|
+
defaultFile = wsBrainfile;
|
|
96
|
+
console.error(`[brainfile-mcp] Found in workspace: ${defaultFile}`);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
// Also try discovery from workspace root
|
|
100
|
+
const discovered = (0, core_1.findNearestBrainfile)(wsPath);
|
|
101
|
+
if (discovered) {
|
|
102
|
+
defaultFile = discovered.absolutePath;
|
|
103
|
+
console.error(`[brainfile-mcp] Discovered in workspace: ${defaultFile}`);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Strategy 2: Check for git repo root and look for brainfile there
|
|
109
|
+
if (defaultFile === 'brainfile.md') {
|
|
110
|
+
const gitRoot = findGitRoot(process.cwd());
|
|
111
|
+
if (gitRoot) {
|
|
112
|
+
const gitRootBrainfile = path.join(gitRoot, 'brainfile.md');
|
|
113
|
+
if (fs.existsSync(gitRootBrainfile)) {
|
|
114
|
+
defaultFile = gitRootBrainfile;
|
|
115
|
+
console.error(`[brainfile-mcp] Found in git root: ${defaultFile}`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Try discovery from git root
|
|
119
|
+
const discovered = (0, core_1.findNearestBrainfile)(gitRoot);
|
|
120
|
+
if (discovered) {
|
|
121
|
+
defaultFile = discovered.absolutePath;
|
|
122
|
+
console.error(`[brainfile-mcp] Discovered from git root: ${defaultFile}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Strategy 3: If still default, try discovery from cwd
|
|
128
|
+
if (defaultFile === 'brainfile.md') {
|
|
129
|
+
const discovered = (0, core_1.findNearestBrainfile)();
|
|
130
|
+
if (discovered) {
|
|
131
|
+
defaultFile = discovered.absolutePath;
|
|
132
|
+
console.error(`[brainfile-mcp] Auto-discovered: ${defaultFile}`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// Fall back to relative path in cwd
|
|
136
|
+
defaultFile = path.resolve('brainfile.md');
|
|
137
|
+
console.error(`[brainfile-mcp] No brainfile found, using: ${defaultFile}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// User specified a file - resolve it
|
|
143
|
+
defaultFile = path.resolve(defaultFile);
|
|
144
|
+
console.error(`[brainfile-mcp] Using specified file: ${defaultFile}`);
|
|
145
|
+
}
|
|
65
146
|
const server = new mcp_js_1.McpServer({
|
|
66
147
|
name: 'brainfile',
|
|
67
|
-
version: '0.
|
|
148
|
+
version: '0.8.1'
|
|
68
149
|
});
|
|
69
150
|
// List tasks tool
|
|
70
151
|
server.registerTool('list_tasks', {
|
|
@@ -302,8 +383,14 @@ async function mcpCommand(options) {
|
|
|
302
383
|
return { content: [{ type: 'text', text: `Error: ${moveResult.error}` }], isError: true };
|
|
303
384
|
}
|
|
304
385
|
writeBoard(filePath, moveResult.board);
|
|
386
|
+
// Check for incomplete subtasks warning when moving to done-like column
|
|
387
|
+
const warning = (0, errorHandler_1.mcpCheckIncompleteSubtasks)(taskInfo.task, targetColumn);
|
|
388
|
+
let message = `Task ${task} moved from "${taskInfo.column.title}" to "${targetColumn.title}"`;
|
|
389
|
+
if (warning) {
|
|
390
|
+
message += `\n\n${warning.warning}`;
|
|
391
|
+
}
|
|
305
392
|
return {
|
|
306
|
-
content: [{ type: 'text', text:
|
|
393
|
+
content: [{ type: 'text', text: message }]
|
|
307
394
|
};
|
|
308
395
|
});
|
|
309
396
|
// Patch task tool
|
|
@@ -639,6 +726,21 @@ async function mcpCommand(options) {
|
|
|
639
726
|
if (!targetColumn) {
|
|
640
727
|
return { content: [{ type: 'text', text: `Error: Column not found: ${column}` }], isError: true };
|
|
641
728
|
}
|
|
729
|
+
// Check for incomplete subtasks before move (for warning)
|
|
730
|
+
const tasksWithIncomplete = [];
|
|
731
|
+
for (const taskId of tasks) {
|
|
732
|
+
const taskInfo = (0, core_1.findTaskById)(board, taskId);
|
|
733
|
+
if (taskInfo) {
|
|
734
|
+
const warning = (0, errorHandler_1.mcpCheckIncompleteSubtasks)(taskInfo.task, targetColumn);
|
|
735
|
+
if (warning?.incompleteSubtasks) {
|
|
736
|
+
tasksWithIncomplete.push({
|
|
737
|
+
id: taskId,
|
|
738
|
+
incomplete: warning.incompleteSubtasks.incomplete.length,
|
|
739
|
+
total: warning.incompleteSubtasks.total
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
}
|
|
642
744
|
const bulkResult = (0, core_1.moveTasks)(board, tasks, targetColumn.id);
|
|
643
745
|
if (bulkResult.board) {
|
|
644
746
|
writeBoard(filePath, bulkResult.board);
|
|
@@ -649,6 +751,11 @@ async function mcpCommand(options) {
|
|
|
649
751
|
failureCount: bulkResult.failureCount,
|
|
650
752
|
results: bulkResult.results
|
|
651
753
|
};
|
|
754
|
+
// Add warning about incomplete subtasks if any
|
|
755
|
+
if (tasksWithIncomplete.length > 0) {
|
|
756
|
+
output.warning = `${tasksWithIncomplete.length} task(s) moved to "${targetColumn.title}" have incomplete subtasks`;
|
|
757
|
+
output.tasksWithIncompleteSubtasks = tasksWithIncomplete;
|
|
758
|
+
}
|
|
652
759
|
return {
|
|
653
760
|
content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
|
|
654
761
|
isError: !bulkResult.success
|