brainfile 0.20.0 → 0.21.0
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/dist/{chunk-UOCQBEEW.mjs → chunk-FOLBAGJS.mjs} +1232 -318
- package/dist/cli.mjs +2048 -1318
- package/dist/commands/brief.d.ts +1 -0
- package/dist/commands/brief.d.ts.map +1 -1
- package/dist/commands/brief.js +10 -0
- package/dist/commands/brief.js.map +1 -1
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +115 -15
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +44 -0
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/merge-driver.d.ts +26 -0
- package/dist/commands/merge-driver.d.ts.map +1 -0
- package/dist/commands/merge-driver.js +195 -0
- package/dist/commands/merge-driver.js.map +1 -0
- package/dist/commands/migrate-tracked.d.ts +8 -0
- package/dist/commands/migrate-tracked.d.ts.map +1 -0
- package/dist/commands/migrate-tracked.js +428 -0
- package/dist/commands/migrate-tracked.js.map +1 -0
- package/dist/commands/migrate.d.ts +6 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +9 -0
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/sync.d.ts +16 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +152 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/where.d.ts +21 -0
- package/dist/commands/where.d.ts.map +1 -0
- package/dist/commands/where.js +135 -0
- package/dist/commands/where.js.map +1 -0
- package/dist/mcp/helpers.d.ts +8 -0
- package/dist/mcp/helpers.d.ts.map +1 -1
- package/dist/mcp/helpers.js +44 -0
- package/dist/mcp/helpers.js.map +1 -1
- package/dist/mcp/tools/brief_tool.d.ts.map +1 -1
- package/dist/mcp/tools/brief_tool.js +39 -1
- package/dist/mcp/tools/brief_tool.js.map +1 -1
- package/dist/mcp/tools/contract_tool.d.ts.map +1 -1
- package/dist/mcp/tools/contract_tool.js +6 -5
- package/dist/mcp/tools/contract_tool.js.map +1 -1
- package/dist/mcp/tools/subtask_tool.d.ts.map +1 -1
- package/dist/mcp/tools/subtask_tool.js +5 -4
- package/dist/mcp/tools/subtask_tool.js.map +1 -1
- package/dist/mcp/tools/task_add_tool.d.ts.map +1 -1
- package/dist/mcp/tools/task_add_tool.js +6 -5
- package/dist/mcp/tools/task_add_tool.js.map +1 -1
- package/dist/mcp/tools/task_complete_tool.d.ts.map +1 -1
- package/dist/mcp/tools/task_complete_tool.js +5 -4
- package/dist/mcp/tools/task_complete_tool.js.map +1 -1
- package/dist/mcp/tools/task_delete_tool.d.ts.map +1 -1
- package/dist/mcp/tools/task_delete_tool.js +5 -4
- package/dist/mcp/tools/task_delete_tool.js.map +1 -1
- package/dist/mcp/tools/task_move_tool.d.ts.map +1 -1
- package/dist/mcp/tools/task_move_tool.js +6 -5
- package/dist/mcp/tools/task_move_tool.js.map +1 -1
- package/dist/mcp/tools/task_patch_tool.d.ts.map +1 -1
- package/dist/mcp/tools/task_patch_tool.js +5 -4
- package/dist/mcp/tools/task_patch_tool.js.map +1 -1
- package/dist/{tui-H3RI22S4.mjs → tui-M2KWIG2E.mjs} +295 -253
- package/dist/utils/board-autosync.d.ts +22 -0
- package/dist/utils/board-autosync.d.ts.map +1 -0
- package/dist/utils/board-autosync.js +166 -0
- package/dist/utils/board-autosync.js.map +1 -0
- package/dist/utils/board-commit-hooks.d.ts +12 -0
- package/dist/utils/board-commit-hooks.d.ts.map +1 -0
- package/dist/utils/board-commit-hooks.js +51 -0
- package/dist/utils/board-commit-hooks.js.map +1 -0
- package/dist/utils/board-repo.d.ts +108 -0
- package/dist/utils/board-repo.d.ts.map +1 -0
- package/dist/utils/board-repo.js +501 -0
- package/dist/utils/board-repo.js.map +1 -0
- package/dist/utils/board-sync.d.ts +111 -0
- package/dist/utils/board-sync.d.ts.map +1 -0
- package/dist/utils/board-sync.js +469 -0
- package/dist/utils/board-sync.js.map +1 -0
- package/dist/utils/brainfile-path.d.ts +11 -1
- package/dist/utils/brainfile-path.d.ts.map +1 -1
- package/dist/utils/brainfile-path.js +39 -2
- package/dist/utils/brainfile-path.js.map +1 -1
- package/package.json +2 -2
package/dist/commands/brief.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../../src/commands/brief.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../../src/commands/brief.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAO7D,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,MAAsB,GAC7B,kBAAkB,GAAG,SAAS,CAkChC"}
|
package/dist/commands/brief.js
CHANGED
|
@@ -63,6 +63,8 @@ const logger_1 = require("../utils/logger");
|
|
|
63
63
|
const cli_error_1 = require("../utils/cli-error");
|
|
64
64
|
const brainfile_path_1 = require("../utils/brainfile-path");
|
|
65
65
|
const errorHandler_1 = require("../utils/errorHandler");
|
|
66
|
+
const board_sync_1 = require("../utils/board-sync");
|
|
67
|
+
const path = __importStar(require("path"));
|
|
66
68
|
/** `--json` envelope version. Bump only on a breaking payload change. */
|
|
67
69
|
exports.BRIEF_JSON_VERSION = '0.1';
|
|
68
70
|
function briefCommand(options, logger = logger_1.defaultLogger) {
|
|
@@ -108,6 +110,14 @@ function runBrief(options) {
|
|
|
108
110
|
if (!(0, v2_detect_1.isV2)(filePath)) {
|
|
109
111
|
throw (0, cli_error_1.operationFailed)('Brief requires v2 per-task file architecture. Run: brainfile migrate');
|
|
110
112
|
}
|
|
113
|
+
// A shared board syncs first so the brief reflects other machines. Sync
|
|
114
|
+
// failures are a one-line warning: the brief itself never fails over them.
|
|
115
|
+
if (!options.offline) {
|
|
116
|
+
const sync = (0, board_sync_1.syncBoard)(path.dirname(filePath), { agent });
|
|
117
|
+
if (!sync.skipped && !sync.ok) {
|
|
118
|
+
process.stderr.write(`${(0, board_sync_1.syncMessage)(sync).text}\n`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
111
121
|
const dirs = (0, v2_detect_1.getV2Dirs)(filePath);
|
|
112
122
|
const peek = options.peek === true;
|
|
113
123
|
const state = (0, core_1.readBriefState)(filePath, agent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/commands/brief.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/commands/brief.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
interface InitOptions {
|
|
2
2
|
file?: string;
|
|
3
3
|
force?: boolean;
|
|
4
|
+
/** Store the board as its own git branch (in a repo) or repository (elsewhere). */
|
|
5
|
+
tracked?: boolean;
|
|
6
|
+
/** Plain directory, no git tracking, even inside a repo. */
|
|
7
|
+
plain?: boolean;
|
|
8
|
+
/** Inside a repo: create the board here instead of at the repository root. */
|
|
9
|
+
here?: boolean;
|
|
10
|
+
/** The home board at ~/.brainfile. */
|
|
11
|
+
global?: boolean;
|
|
4
12
|
}
|
|
5
13
|
export declare function initCommand(options: InitOptions): void;
|
|
14
|
+
/**
|
|
15
|
+
* What a person needs right after init: where the board is, who has it, and
|
|
16
|
+
* the one command to change that. Plain words first; git terms only where
|
|
17
|
+
* they are the literal answer.
|
|
18
|
+
*/
|
|
19
|
+
export declare function printStorageStory(mode: 'plain' | 'linked' | 'standalone', dotDir: string, branch: string | null, movedToRoot: boolean): void;
|
|
6
20
|
export {};
|
|
7
21
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA4CA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAoED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,QA0E/C;AAOD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI,CAwB5I"}
|
package/dist/commands/init.js
CHANGED
|
@@ -37,12 +37,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.initCommand = initCommand;
|
|
40
|
+
exports.printStorageStory = printStorageStory;
|
|
40
41
|
const fs = __importStar(require("fs"));
|
|
41
42
|
const path = __importStar(require("path"));
|
|
42
43
|
const chalk_1 = __importDefault(require("chalk"));
|
|
43
44
|
const core_1 = require("@brainfile/core");
|
|
44
45
|
const dot_brainfile_1 = require("../utils/dot-brainfile");
|
|
45
46
|
const workspace_format_1 = require("../utils/workspace-format");
|
|
47
|
+
const board_repo_1 = require("../utils/board-repo");
|
|
48
|
+
const board_sync_1 = require("../utils/board-sync");
|
|
46
49
|
const DEFAULT_BRAINFILE_V2 = `---
|
|
47
50
|
schema: https://brainfile.md/v2/board.json
|
|
48
51
|
title: My Project
|
|
@@ -65,9 +68,56 @@ Add your project description here.
|
|
|
65
68
|
|
|
66
69
|
> Note: Completing a task moves it to \`logs/\` via \`brainfile complete\`.
|
|
67
70
|
`;
|
|
71
|
+
const DEFAULT_FILE = path.join('.brainfile', 'brainfile.md');
|
|
72
|
+
function planInit(options) {
|
|
73
|
+
const explicitFile = Boolean(options.file) && path.resolve(options.file) !== path.resolve(DEFAULT_FILE);
|
|
74
|
+
if (options.global || (!explicitFile && (0, board_repo_1.isGlobalBoardRequested)())) {
|
|
75
|
+
return {
|
|
76
|
+
filePath: path.join((0, board_repo_1.homeBoardDir)(), 'brainfile.md'),
|
|
77
|
+
mode: options.plain ? 'plain' : 'standalone',
|
|
78
|
+
repoRoot: null,
|
|
79
|
+
movedToRoot: false,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (explicitFile) {
|
|
83
|
+
return {
|
|
84
|
+
filePath: path.resolve(options.file),
|
|
85
|
+
mode: options.tracked ? 'standalone' : 'plain',
|
|
86
|
+
repoRoot: null,
|
|
87
|
+
movedToRoot: false,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const cwd = process.cwd();
|
|
91
|
+
const repoRoot = (0, board_repo_1.gitToplevel)(cwd);
|
|
92
|
+
if (repoRoot && !options.plain) {
|
|
93
|
+
const base = options.here ? cwd : repoRoot;
|
|
94
|
+
const atRoot = path.resolve(base) === repoRoot;
|
|
95
|
+
return {
|
|
96
|
+
filePath: path.join(base, DEFAULT_FILE),
|
|
97
|
+
mode: atRoot ? 'linked' : options.tracked ? 'standalone' : 'plain',
|
|
98
|
+
repoRoot,
|
|
99
|
+
movedToRoot: base !== cwd,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
filePath: path.join(cwd, DEFAULT_FILE),
|
|
104
|
+
mode: options.tracked ? 'standalone' : 'plain',
|
|
105
|
+
repoRoot,
|
|
106
|
+
movedToRoot: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function isNonEmptyDir(dir) {
|
|
110
|
+
try {
|
|
111
|
+
return fs.statSync(dir).isDirectory() && fs.readdirSync(dir).length > 0;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
68
117
|
function initCommand(options) {
|
|
69
118
|
try {
|
|
70
|
-
const
|
|
119
|
+
const plan = planInit(options);
|
|
120
|
+
const { filePath, mode } = plan;
|
|
71
121
|
const dotDir = path.dirname(filePath);
|
|
72
122
|
const workspaceRoot = (0, workspace_format_1.workspaceRootFromBrainfilePath)(filePath);
|
|
73
123
|
const probe = (0, workspace_format_1.probeWorkspaceFormat)(workspaceRoot);
|
|
@@ -82,17 +132,29 @@ function initCommand(options) {
|
|
|
82
132
|
(0, dot_brainfile_1.removeLegacyStateFile)(filePath);
|
|
83
133
|
fs.mkdirSync(path.join(dotDir, 'board'), { recursive: true });
|
|
84
134
|
fs.mkdirSync(path.join(dotDir, 'logs'), { recursive: true });
|
|
85
|
-
console.log(chalk_1.default.green(
|
|
86
|
-
|
|
135
|
+
console.log(chalk_1.default.green(`A board already exists at ${displayPath(dotDir)}/`));
|
|
136
|
+
if (mode !== 'plain' && (0, board_repo_1.boardRepoKind)(dotDir) === null) {
|
|
137
|
+
console.log(chalk_1.default.gray(' It is plain files. To keep it on its own branch and share it: ') + chalk_1.default.cyan('brainfile migrate --to-branch'));
|
|
138
|
+
}
|
|
139
|
+
console.log(chalk_1.default.gray(' Where it lives and who has it: ') + chalk_1.default.cyan('brainfile where'));
|
|
87
140
|
return;
|
|
88
141
|
}
|
|
89
|
-
// Ensure `.brainfile/.gitignore` exists
|
|
90
|
-
(0, core_1.ensureDotBrainfileGitignore)(filePath);
|
|
91
142
|
if (fs.existsSync(filePath) && !options.force) {
|
|
92
143
|
console.error(chalk_1.default.red(`Error: File already exists: ${filePath}`));
|
|
93
144
|
console.log(chalk_1.default.gray('Use --force to overwrite'));
|
|
94
145
|
process.exit(1);
|
|
95
146
|
}
|
|
147
|
+
if (mode === 'linked') {
|
|
148
|
+
if (isNonEmptyDir(dotDir)) {
|
|
149
|
+
console.error(chalk_1.default.red(`Error: ${dotDir} exists and is not empty.`));
|
|
150
|
+
console.log(chalk_1.default.gray('To move an existing board onto its own branch: ') + chalk_1.default.cyan('brainfile migrate --to-branch'));
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
// The worktree must be created before any file lands in the directory.
|
|
154
|
+
(0, board_repo_1.createOrphanBoardWorktree)(plan.repoRoot, dotDir, (0, board_repo_1.boardBranch)(plan.repoRoot));
|
|
155
|
+
}
|
|
156
|
+
// Ensure `.brainfile/.gitignore` exists
|
|
157
|
+
(0, core_1.ensureDotBrainfileGitignore)(filePath);
|
|
96
158
|
fs.mkdirSync(dotDir, { recursive: true });
|
|
97
159
|
const boardDir = path.join(dotDir, 'board');
|
|
98
160
|
const logsDir = path.join(dotDir, 'logs');
|
|
@@ -100,20 +162,58 @@ function initCommand(options) {
|
|
|
100
162
|
fs.mkdirSync(logsDir, { recursive: true });
|
|
101
163
|
fs.writeFileSync(filePath, DEFAULT_BRAINFILE_V2, 'utf-8');
|
|
102
164
|
(0, dot_brainfile_1.removeLegacyStateFile)(filePath);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
165
|
+
if (mode === 'standalone') {
|
|
166
|
+
(0, board_repo_1.initStandaloneBoardRepo)(dotDir);
|
|
167
|
+
}
|
|
168
|
+
if (mode !== 'plain') {
|
|
169
|
+
if (mode === 'linked')
|
|
170
|
+
(0, board_repo_1.ensureExcludeEntry)(plan.repoRoot);
|
|
171
|
+
(0, board_sync_1.ensureBoardAttributes)(dotDir);
|
|
172
|
+
(0, board_sync_1.registerMergeDriver)(dotDir);
|
|
173
|
+
(0, board_repo_1.commitBoard)(dotDir, { message: 'init board' });
|
|
174
|
+
}
|
|
175
|
+
printStorageStory(mode, dotDir, plan.repoRoot ? (0, board_repo_1.boardBranch)(plan.repoRoot) : null, plan.movedToRoot === true);
|
|
113
176
|
}
|
|
114
177
|
catch (error) {
|
|
115
178
|
console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
116
179
|
process.exit(1);
|
|
117
180
|
}
|
|
118
181
|
}
|
|
182
|
+
function displayPath(dir) {
|
|
183
|
+
const relative = path.relative(process.cwd(), dir);
|
|
184
|
+
return relative && !relative.startsWith('..') ? relative : dir;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* What a person needs right after init: where the board is, who has it, and
|
|
188
|
+
* the one command to change that. Plain words first; git terms only where
|
|
189
|
+
* they are the literal answer.
|
|
190
|
+
*/
|
|
191
|
+
function printStorageStory(mode, dotDir, branch, movedToRoot) {
|
|
192
|
+
const say = (text = '') => console.log(text ? ` ${text}` : '');
|
|
193
|
+
console.log(chalk_1.default.green(`Board created at ${displayPath(dotDir)}/`));
|
|
194
|
+
say();
|
|
195
|
+
if (mode === 'plain') {
|
|
196
|
+
say('Plain files on this machine. Read and edit them directly, or use the commands below.');
|
|
197
|
+
}
|
|
198
|
+
else if (mode === 'linked') {
|
|
199
|
+
say('Only on this machine for now. Every change is a git commit on a');
|
|
200
|
+
say(`separate '${branch}' branch, kept out of your code and pull requests.`);
|
|
201
|
+
say(chalk_1.default.gray(`(A plain git push never sends it; git push --all or --mirror would.)`));
|
|
202
|
+
if (movedToRoot)
|
|
203
|
+
say(chalk_1.default.gray('Created at the repository root so every checkout finds it. Use --plain for a folder board in this directory.'));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
say('Only on this machine for now. Every change is a git commit in its');
|
|
207
|
+
say(`own small repository inside ${displayPath(dotDir)}/.`);
|
|
208
|
+
}
|
|
209
|
+
say();
|
|
210
|
+
if (mode !== 'plain') {
|
|
211
|
+
say(`${chalk_1.default.gray('Share it:')} ${chalk_1.default.cyan('brainfile sync --set-remote origin')}`);
|
|
212
|
+
say(`${chalk_1.default.gray('Check it:')} ${chalk_1.default.cyan('brainfile where')}`);
|
|
213
|
+
say();
|
|
214
|
+
}
|
|
215
|
+
console.log(chalk_1.default.gray('Next:'));
|
|
216
|
+
say(chalk_1.default.cyan('brainfile add --title "Your first task"'));
|
|
217
|
+
say(chalk_1.default.cyan('brainfile list'));
|
|
218
|
+
}
|
|
119
219
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAUzD,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAe9D;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAmBvE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,iBA2EnD"}
|
package/dist/commands/mcp.js
CHANGED
|
@@ -1,13 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.createBrainfileMcpServer = createBrainfileMcpServer;
|
|
4
37
|
exports.mcpCommand = mcpCommand;
|
|
5
38
|
const stdio_1 = require("@modelcontextprotocol/server/stdio");
|
|
6
39
|
const server_1 = require("@modelcontextprotocol/server");
|
|
40
|
+
const path = __importStar(require("path"));
|
|
7
41
|
// Resolved at runtime from dist/commands/ — avoids widening tsc rootDir for a JSON import.
|
|
8
42
|
const cliVersion = require('../../package.json').version;
|
|
9
43
|
const core_1 = require("@brainfile/core");
|
|
10
44
|
const helpers_1 = require("../mcp/helpers");
|
|
45
|
+
const board_repo_1 = require("../utils/board-repo");
|
|
11
46
|
const v2_only_1 = require("../utils/v2-only");
|
|
12
47
|
const list_tasks_tool_1 = require("../mcp/tools/list_tasks_tool");
|
|
13
48
|
const get_task_tool_1 = require("../mcp/tools/get_task_tool");
|
|
@@ -86,6 +121,15 @@ async function mcpCommand(options) {
|
|
|
86
121
|
}
|
|
87
122
|
}
|
|
88
123
|
}
|
|
124
|
+
// Strategy 2b: the board lives on its own branch (spec-9) — the worktree
|
|
125
|
+
// checked out on it, created from the local or origin branch if needed.
|
|
126
|
+
if (defaultFile === 'brainfile.md') {
|
|
127
|
+
const tracked = (0, board_repo_1.findTrackedBoardDir)(process.cwd()) ?? (0, board_repo_1.materializeBoardWorktree)(process.cwd());
|
|
128
|
+
if (tracked) {
|
|
129
|
+
defaultFile = path.join(tracked, 'brainfile.md');
|
|
130
|
+
console.error(`[brainfile-mcp] Found tracked board: ${defaultFile}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
89
133
|
// Strategy 3: discovery from cwd
|
|
90
134
|
if (defaultFile === 'brainfile.md') {
|
|
91
135
|
const found = (0, core_1.findBrainfile)();
|
package/dist/commands/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
type Fields = Record<string, unknown>;
|
|
2
|
+
export interface MergeOutcome {
|
|
3
|
+
content: string;
|
|
4
|
+
/** False when conflict markers remain in the body. */
|
|
5
|
+
clean: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** Field-level last-writer-wins; exported for tests. */
|
|
8
|
+
export declare function mergeFields(base: Fields, ours: Fields, theirs: Fields): Fields;
|
|
9
|
+
/** Three-way text merge through git, then union-resolve list conflicts. */
|
|
10
|
+
export declare function mergeBodies(base: string, ours: string, theirs: string): MergeOutcome;
|
|
11
|
+
/** Merge two board documents against their common base. */
|
|
12
|
+
export declare function mergeBoardDocuments(base: string, ours: string, theirs: string): MergeOutcome;
|
|
13
|
+
/** "column: todo → review; title: …" for the fields that differ; exported for sync. */
|
|
14
|
+
export declare function summarizeFieldChanges(before: string, after: string): string;
|
|
15
|
+
export interface MergeDriverOptions {
|
|
16
|
+
base: string;
|
|
17
|
+
ours: string;
|
|
18
|
+
theirs: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Entry point for git: reads the three files, writes the result over `ours`,
|
|
22
|
+
* returns the exit code (0 clean, 1 conflicts remain, 2 usage).
|
|
23
|
+
*/
|
|
24
|
+
export declare function mergeDriverCommand(options: MergeDriverOptions): number;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=merge-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-driver.d.ts","sourceRoot":"","sources":["../../src/commands/merge-driver.ts"],"names":[],"mappings":"AAkBA,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,KAAK,EAAE,OAAO,CAAC;CAChB;AAsBD,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAoB9E;AAsBD,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CA+BpF;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAQ5F;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAU3E;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAMtE"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.mergeFields = mergeFields;
|
|
37
|
+
exports.mergeBodies = mergeBodies;
|
|
38
|
+
exports.mergeBoardDocuments = mergeBoardDocuments;
|
|
39
|
+
exports.summarizeFieldChanges = summarizeFieldChanges;
|
|
40
|
+
exports.mergeDriverCommand = mergeDriverCommand;
|
|
41
|
+
/**
|
|
42
|
+
* `brainfile merge-driver <base> <ours> <theirs>` — git merge driver for
|
|
43
|
+
* board documents (spec-9). Registered by init/migrate/sync as
|
|
44
|
+
* `merge.brainfile.driver`, selected by `.gitattributes` on the board branch.
|
|
45
|
+
*
|
|
46
|
+
* Frontmatter merges field by field: a field changed on one side takes that
|
|
47
|
+
* side; changed on both, the later `updatedAt` wins and a tie goes to theirs,
|
|
48
|
+
* so both machines converge on the same answer. The body goes through git's
|
|
49
|
+
* own three-way text merge; a conflict whose two sides are both list items
|
|
50
|
+
* (log entries, notes) resolves by union ordered by timestamp. Anything else
|
|
51
|
+
* keeps git's markers and exits 1 so `sync` can name the file.
|
|
52
|
+
*/
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const os = __importStar(require("os"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const child_process_1 = require("child_process");
|
|
57
|
+
const core_1 = require("@brainfile/core");
|
|
58
|
+
function parseDoc(content) {
|
|
59
|
+
const parsed = (0, core_1.parseFrontmatter)(content);
|
|
60
|
+
if (!parsed)
|
|
61
|
+
return null;
|
|
62
|
+
return { data: parsed.data, body: parsed.body };
|
|
63
|
+
}
|
|
64
|
+
function same(a, b) {
|
|
65
|
+
return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
66
|
+
}
|
|
67
|
+
function stamp(data) {
|
|
68
|
+
const value = data.updatedAt;
|
|
69
|
+
return typeof value === 'string' ? value : '';
|
|
70
|
+
}
|
|
71
|
+
/** Field-level last-writer-wins; exported for tests. */
|
|
72
|
+
function mergeFields(base, ours, theirs) {
|
|
73
|
+
const keys = [];
|
|
74
|
+
for (const key of [...Object.keys(ours), ...Object.keys(theirs), ...Object.keys(base)]) {
|
|
75
|
+
if (!keys.includes(key))
|
|
76
|
+
keys.push(key);
|
|
77
|
+
}
|
|
78
|
+
const oursWins = stamp(ours) > stamp(theirs);
|
|
79
|
+
const out = {};
|
|
80
|
+
for (const key of keys) {
|
|
81
|
+
const b = base[key];
|
|
82
|
+
const o = ours[key];
|
|
83
|
+
const t = theirs[key];
|
|
84
|
+
let pick;
|
|
85
|
+
if (same(o, t))
|
|
86
|
+
pick = o;
|
|
87
|
+
else if (same(b, o))
|
|
88
|
+
pick = t;
|
|
89
|
+
else if (same(b, t))
|
|
90
|
+
pick = o;
|
|
91
|
+
else if (key === 'updatedAt')
|
|
92
|
+
pick = String(o ?? '') > String(t ?? '') ? o : t;
|
|
93
|
+
else
|
|
94
|
+
pick = oursWins ? o : t;
|
|
95
|
+
if (pick !== undefined)
|
|
96
|
+
out[key] = pick;
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
const CONFLICT = /^<{7}[^\n]*\n([\s\S]*?)^={7}\n([\s\S]*?)^>{7}[^\n]*\n?/gm;
|
|
101
|
+
const LIST_ITEM = /^\s*[-*]\s+/;
|
|
102
|
+
const LEADING_STAMP = /^\s*[-*]\s+(\d{4}-\d{2}-\d{2}T[0-9:.]+Z?)\b/;
|
|
103
|
+
function unionLists(ours, theirs) {
|
|
104
|
+
const a = ours.split('\n').filter((l) => l.trim().length > 0);
|
|
105
|
+
const b = theirs.split('\n').filter((l) => l.trim().length > 0);
|
|
106
|
+
if (![...a, ...b].every((l) => LIST_ITEM.test(l)))
|
|
107
|
+
return null;
|
|
108
|
+
const merged = [...a];
|
|
109
|
+
for (const line of b)
|
|
110
|
+
if (!merged.includes(line))
|
|
111
|
+
merged.push(line);
|
|
112
|
+
if (merged.every((l) => LEADING_STAMP.test(l))) {
|
|
113
|
+
merged.sort((x, y) => {
|
|
114
|
+
const sx = LEADING_STAMP.exec(x)?.[1] ?? '';
|
|
115
|
+
const sy = LEADING_STAMP.exec(y)?.[1] ?? '';
|
|
116
|
+
return sx < sy ? -1 : sx > sy ? 1 : 0;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return `${merged.join('\n')}\n`;
|
|
120
|
+
}
|
|
121
|
+
/** Three-way text merge through git, then union-resolve list conflicts. */
|
|
122
|
+
function mergeBodies(base, ours, theirs) {
|
|
123
|
+
if (ours === theirs)
|
|
124
|
+
return { content: ours, clean: true };
|
|
125
|
+
if (base === ours)
|
|
126
|
+
return { content: theirs, clean: true };
|
|
127
|
+
if (base === theirs)
|
|
128
|
+
return { content: ours, clean: true };
|
|
129
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'brainfile-merge-'));
|
|
130
|
+
try {
|
|
131
|
+
const files = { base: path.join(dir, 'base'), ours: path.join(dir, 'ours'), theirs: path.join(dir, 'theirs') };
|
|
132
|
+
fs.writeFileSync(files.base, base);
|
|
133
|
+
fs.writeFileSync(files.ours, ours);
|
|
134
|
+
fs.writeFileSync(files.theirs, theirs);
|
|
135
|
+
const r = (0, child_process_1.spawnSync)('git', ['merge-file', '-p', '-L', 'ours', '-L', 'base', '-L', 'theirs', files.ours, files.base, files.theirs], {
|
|
136
|
+
encoding: 'utf-8',
|
|
137
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
138
|
+
});
|
|
139
|
+
if (r.status === null || r.status < 0) {
|
|
140
|
+
return { content: `<<<<<<< ours\n${ours}=======\n${theirs}>>>>>>> theirs\n`, clean: false };
|
|
141
|
+
}
|
|
142
|
+
if (r.status === 0)
|
|
143
|
+
return { content: r.stdout, clean: true };
|
|
144
|
+
let clean = true;
|
|
145
|
+
const content = r.stdout.replace(CONFLICT, (whole, oursHunk, theirsHunk) => {
|
|
146
|
+
const union = unionLists(oursHunk, theirsHunk);
|
|
147
|
+
if (union === null) {
|
|
148
|
+
clean = false;
|
|
149
|
+
return whole;
|
|
150
|
+
}
|
|
151
|
+
return union;
|
|
152
|
+
});
|
|
153
|
+
return { content, clean };
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** Merge two board documents against their common base. */
|
|
160
|
+
function mergeBoardDocuments(base, ours, theirs) {
|
|
161
|
+
const b = parseDoc(base);
|
|
162
|
+
const o = parseDoc(ours);
|
|
163
|
+
const t = parseDoc(theirs);
|
|
164
|
+
if (!o || !t)
|
|
165
|
+
return mergeBodies(base, ours, theirs);
|
|
166
|
+
const data = mergeFields(b?.data ?? {}, o.data, t.data);
|
|
167
|
+
const body = mergeBodies(b?.body ?? '', o.body, t.body);
|
|
168
|
+
return { content: (0, core_1.serializeFrontmatter)(data, body.content), clean: body.clean };
|
|
169
|
+
}
|
|
170
|
+
/** "column: todo → review; title: …" for the fields that differ; exported for sync. */
|
|
171
|
+
function summarizeFieldChanges(before, after) {
|
|
172
|
+
const b = parseDoc(before)?.data ?? {};
|
|
173
|
+
const a = parseDoc(after)?.data ?? {};
|
|
174
|
+
const parts = [];
|
|
175
|
+
for (const key of Object.keys(a)) {
|
|
176
|
+
if (key === 'updatedAt' || same(b[key], a[key]))
|
|
177
|
+
continue;
|
|
178
|
+
const render = (v) => (typeof v === 'string' ? v : JSON.stringify(v));
|
|
179
|
+
parts.push(`${key}: ${b[key] === undefined ? '∅' : render(b[key])} → ${render(a[key])}`);
|
|
180
|
+
}
|
|
181
|
+
return parts.join('; ');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Entry point for git: reads the three files, writes the result over `ours`,
|
|
185
|
+
* returns the exit code (0 clean, 1 conflicts remain, 2 usage).
|
|
186
|
+
*/
|
|
187
|
+
function mergeDriverCommand(options) {
|
|
188
|
+
const read = (p) => (fs.existsSync(p) ? fs.readFileSync(p, 'utf-8') : '');
|
|
189
|
+
if (!options.ours || !options.theirs)
|
|
190
|
+
return 2;
|
|
191
|
+
const outcome = mergeBoardDocuments(read(options.base), read(options.ours), read(options.theirs));
|
|
192
|
+
fs.writeFileSync(options.ours, outcome.content, 'utf-8');
|
|
193
|
+
return outcome.clean ? 0 : 1;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=merge-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-driver.js","sourceRoot":"","sources":["../../src/commands/merge-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface MigrateTrackedOptions {
|
|
2
|
+
dir?: string;
|
|
3
|
+
/** After `--to-branch` on a committed board, also commit its removal from the code branch. */
|
|
4
|
+
commit?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function migrateToBranch(options?: MigrateTrackedOptions): void;
|
|
7
|
+
export declare function migrateToPlain(options?: MigrateTrackedOptions): void;
|
|
8
|
+
//# sourceMappingURL=migrate-tracked.d.ts.map
|