brainfile 0.19.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.
Files changed (128) hide show
  1. package/README.md +18 -24
  2. package/dist/__tests__/helpers/mcp-wire.d.ts +45 -0
  3. package/dist/__tests__/helpers/mcp-wire.d.ts.map +1 -0
  4. package/dist/__tests__/helpers/mcp-wire.js +133 -0
  5. package/dist/__tests__/helpers/mcp-wire.js.map +1 -0
  6. package/dist/{chunk-YTFLC673.mjs → chunk-FOLBAGJS.mjs} +2483 -1075
  7. package/dist/cli.mjs +2526 -1656
  8. package/dist/commands/adr.d.ts +1 -9
  9. package/dist/commands/adr.d.ts.map +1 -1
  10. package/dist/commands/adr.js +11 -88
  11. package/dist/commands/adr.js.map +1 -1
  12. package/dist/commands/archive.d.ts +2 -5
  13. package/dist/commands/archive.d.ts.map +1 -1
  14. package/dist/commands/archive.js +43 -11
  15. package/dist/commands/archive.js.map +1 -1
  16. package/dist/commands/brief.d.ts +32 -0
  17. package/dist/commands/brief.d.ts.map +1 -0
  18. package/dist/commands/brief.js +161 -0
  19. package/dist/commands/brief.js.map +1 -0
  20. package/dist/commands/complete.js +1 -1
  21. package/dist/commands/complete.js.map +1 -1
  22. package/dist/commands/init.d.ts +14 -0
  23. package/dist/commands/init.d.ts.map +1 -1
  24. package/dist/commands/init.js +115 -15
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/log.js +31 -18
  27. package/dist/commands/log.js.map +1 -1
  28. package/dist/commands/mcp.d.ts +9 -0
  29. package/dist/commands/mcp.d.ts.map +1 -1
  30. package/dist/commands/mcp.js +72 -17
  31. package/dist/commands/mcp.js.map +1 -1
  32. package/dist/commands/merge-driver.d.ts +26 -0
  33. package/dist/commands/merge-driver.d.ts.map +1 -0
  34. package/dist/commands/merge-driver.js +195 -0
  35. package/dist/commands/merge-driver.js.map +1 -0
  36. package/dist/commands/migrate-tracked.d.ts +8 -0
  37. package/dist/commands/migrate-tracked.d.ts.map +1 -0
  38. package/dist/commands/migrate-tracked.js +428 -0
  39. package/dist/commands/migrate-tracked.js.map +1 -0
  40. package/dist/commands/migrate.d.ts +6 -0
  41. package/dist/commands/migrate.d.ts.map +1 -1
  42. package/dist/commands/migrate.js +19 -12
  43. package/dist/commands/migrate.js.map +1 -1
  44. package/dist/commands/sync.d.ts +16 -0
  45. package/dist/commands/sync.d.ts.map +1 -0
  46. package/dist/commands/sync.js +152 -0
  47. package/dist/commands/sync.js.map +1 -0
  48. package/dist/commands/where.d.ts +21 -0
  49. package/dist/commands/where.d.ts.map +1 -0
  50. package/dist/commands/where.js +135 -0
  51. package/dist/commands/where.js.map +1 -0
  52. package/dist/mcp/helpers.d.ts +8 -0
  53. package/dist/mcp/helpers.d.ts.map +1 -1
  54. package/dist/mcp/helpers.js +44 -0
  55. package/dist/mcp/helpers.js.map +1 -1
  56. package/dist/mcp/schemas.d.ts +297 -0
  57. package/dist/mcp/schemas.d.ts.map +1 -0
  58. package/dist/mcp/schemas.js +328 -0
  59. package/dist/mcp/schemas.js.map +1 -0
  60. package/dist/mcp/tools/brief_tool.d.ts +14 -0
  61. package/dist/mcp/tools/brief_tool.d.ts.map +1 -0
  62. package/dist/mcp/tools/brief_tool.js +96 -0
  63. package/dist/mcp/tools/brief_tool.js.map +1 -0
  64. package/dist/mcp/tools/contract_tool.d.ts.map +1 -1
  65. package/dist/mcp/tools/contract_tool.js +43 -18
  66. package/dist/mcp/tools/contract_tool.js.map +1 -1
  67. package/dist/mcp/tools/get_task_tool.d.ts.map +1 -1
  68. package/dist/mcp/tools/get_task_tool.js +7 -2
  69. package/dist/mcp/tools/get_task_tool.js.map +1 -1
  70. package/dist/mcp/tools/list_tasks_tool.d.ts.map +1 -1
  71. package/dist/mcp/tools/list_tasks_tool.js +9 -3
  72. package/dist/mcp/tools/list_tasks_tool.js.map +1 -1
  73. package/dist/mcp/tools/search_tool.d.ts.map +1 -1
  74. package/dist/mcp/tools/search_tool.js +17 -4
  75. package/dist/mcp/tools/search_tool.js.map +1 -1
  76. package/dist/mcp/tools/subtask_tool.d.ts.map +1 -1
  77. package/dist/mcp/tools/subtask_tool.js +52 -17
  78. package/dist/mcp/tools/subtask_tool.js.map +1 -1
  79. package/dist/mcp/tools/task_add_tool.d.ts.map +1 -1
  80. package/dist/mcp/tools/task_add_tool.js +13 -7
  81. package/dist/mcp/tools/task_add_tool.js.map +1 -1
  82. package/dist/mcp/tools/task_complete_tool.d.ts.map +1 -1
  83. package/dist/mcp/tools/task_complete_tool.js +39 -10
  84. package/dist/mcp/tools/task_complete_tool.js.map +1 -1
  85. package/dist/mcp/tools/task_delete_tool.d.ts.map +1 -1
  86. package/dist/mcp/tools/task_delete_tool.js +12 -6
  87. package/dist/mcp/tools/task_delete_tool.js.map +1 -1
  88. package/dist/mcp/tools/task_move_tool.d.ts.map +1 -1
  89. package/dist/mcp/tools/task_move_tool.js +21 -11
  90. package/dist/mcp/tools/task_move_tool.js.map +1 -1
  91. package/dist/mcp/tools/task_patch_tool.d.ts.map +1 -1
  92. package/dist/mcp/tools/task_patch_tool.js +23 -10
  93. package/dist/mcp/tools/task_patch_tool.js.map +1 -1
  94. package/dist/schemas/board.json +1 -1
  95. package/dist/tui/theme.d.ts +98 -0
  96. package/dist/tui/theme.d.ts.map +1 -0
  97. package/dist/tui/theme.js +141 -0
  98. package/dist/tui/theme.js.map +1 -0
  99. package/dist/{tui-P56H4X7N.mjs → tui-M2KWIG2E.mjs} +1707 -2006
  100. package/dist/utils/board-autosync.d.ts +22 -0
  101. package/dist/utils/board-autosync.d.ts.map +1 -0
  102. package/dist/utils/board-autosync.js +166 -0
  103. package/dist/utils/board-autosync.js.map +1 -0
  104. package/dist/utils/board-commit-hooks.d.ts +12 -0
  105. package/dist/utils/board-commit-hooks.d.ts.map +1 -0
  106. package/dist/utils/board-commit-hooks.js +51 -0
  107. package/dist/utils/board-commit-hooks.js.map +1 -0
  108. package/dist/utils/board-repo.d.ts +108 -0
  109. package/dist/utils/board-repo.d.ts.map +1 -0
  110. package/dist/utils/board-repo.js +501 -0
  111. package/dist/utils/board-repo.js.map +1 -0
  112. package/dist/utils/board-sync.d.ts +111 -0
  113. package/dist/utils/board-sync.d.ts.map +1 -0
  114. package/dist/utils/board-sync.js +469 -0
  115. package/dist/utils/board-sync.js.map +1 -0
  116. package/dist/utils/brainfile-path.d.ts +11 -1
  117. package/dist/utils/brainfile-path.d.ts.map +1 -1
  118. package/dist/utils/brainfile-path.js +39 -2
  119. package/dist/utils/brainfile-path.js.map +1 -1
  120. package/dist/utils/cli-error.d.ts +20 -0
  121. package/dist/utils/cli-error.d.ts.map +1 -1
  122. package/dist/utils/cli-error.js +36 -0
  123. package/dist/utils/cli-error.js.map +1 -1
  124. package/package.json +3 -3
  125. package/dist/commands/rules.d.ts +0 -68
  126. package/dist/commands/rules.d.ts.map +0 -1
  127. package/dist/commands/rules.js +0 -322
  128. package/dist/commands/rules.js.map +0 -1
@@ -0,0 +1,501 @@
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.BOARD_BRANCH_CONFIG_KEY = exports.DEFAULT_BOARD_BRANCH = void 0;
37
+ exports.git = git;
38
+ exports.gitToplevel = gitToplevel;
39
+ exports.gitCommonDir = gitCommonDir;
40
+ exports.listWorktrees = listWorktrees;
41
+ exports.boardBranch = boardBranch;
42
+ exports.boardRepoKind = boardRepoKind;
43
+ exports.isTrackedBoard = isTrackedBoard;
44
+ exports.findTrackedBoardDir = findTrackedBoardDir;
45
+ exports.materializeBoardWorktree = materializeBoardWorktree;
46
+ exports.ensureExcludeEntry = ensureExcludeEntry;
47
+ exports.removeExcludeEntry = removeExcludeEntry;
48
+ exports.createOrphanBoardWorktree = createOrphanBoardWorktree;
49
+ exports.initStandaloneBoardRepo = initStandaloneBoardRepo;
50
+ exports.boardIsDirty = boardIsDirty;
51
+ exports.boardHasCommits = boardHasCommits;
52
+ exports.unmergedFiles = unmergedFiles;
53
+ exports.boardDirtyFiles = boardDirtyFiles;
54
+ exports.onBoardCommitted = onBoardCommitted;
55
+ exports.ensureBoardDirs = ensureBoardDirs;
56
+ exports.commitBoard = commitBoard;
57
+ exports.commitHandEdits = commitHandEdits;
58
+ exports.resolveAgentName = resolveAgentName;
59
+ exports.homeBoardDir = homeBoardDir;
60
+ exports.isGlobalBoardRequested = isGlobalBoardRequested;
61
+ exports.describeCommandForCommit = describeCommandForCommit;
62
+ exports.scheduleBoardCommit = scheduleBoardCommit;
63
+ exports.flushBoardCommits = flushBoardCommits;
64
+ /**
65
+ * Board-on-a-branch storage (spec-9, phase 1).
66
+ *
67
+ * A *tracked* board is a `.brainfile/` directory that is itself a git
68
+ * repository: inside a project repo it is a linked worktree checked out on the
69
+ * board branch (default `brainfile`, an orphan branch with its own history);
70
+ * outside any repo it is a standalone repository. Either way every mutation
71
+ * becomes one commit, authored as the acting agent, and the board is shared
72
+ * by every worktree of the project because linked worktrees share one git
73
+ * directory.
74
+ *
75
+ * Core stays git-free: everything that shells out to git lives here.
76
+ */
77
+ const fs = __importStar(require("fs"));
78
+ const os = __importStar(require("os"));
79
+ const path = __importStar(require("path"));
80
+ const child_process_1 = require("child_process");
81
+ exports.DEFAULT_BOARD_BRANCH = 'brainfile';
82
+ exports.BOARD_BRANCH_CONFIG_KEY = 'brainfile.branch';
83
+ const EXCLUDE_ENTRY = '.brainfile/';
84
+ const EXCLUDE_MARKER = '# brainfile: board worktree (managed by `brainfile`)';
85
+ const FALLBACK_IDENTITY_NAME = 'brainfile';
86
+ const FALLBACK_IDENTITY_EMAIL = 'brainfile@localhost';
87
+ const MAX_MESSAGE_LENGTH = 72;
88
+ const BOARD_SUBDIRS = ['board', 'logs'];
89
+ /** Run git synchronously. Never throws; a missing git binary is `ok: false`. */
90
+ function git(args, cwd, env) {
91
+ const result = (0, child_process_1.spawnSync)('git', args, {
92
+ cwd,
93
+ encoding: 'utf-8',
94
+ env: env ? { ...process.env, ...env } : process.env,
95
+ stdio: ['ignore', 'pipe', 'pipe'],
96
+ });
97
+ return {
98
+ ok: result.status === 0,
99
+ status: result.status,
100
+ stdout: (result.stdout ?? '').toString().trim(),
101
+ stderr: (result.stderr ?? '').toString().trim(),
102
+ };
103
+ }
104
+ /** Toplevel of the working tree containing `cwd`, or null outside any repo. */
105
+ function gitToplevel(cwd) {
106
+ const r = git(['rev-parse', '--show-toplevel'], cwd);
107
+ return r.ok && r.stdout ? path.resolve(r.stdout) : null;
108
+ }
109
+ /** The git directory shared by every worktree of the repo containing `cwd`. */
110
+ function gitCommonDir(cwd) {
111
+ const r = git(['rev-parse', '--git-common-dir'], cwd);
112
+ if (!r.ok || !r.stdout)
113
+ return null;
114
+ return path.resolve(cwd, r.stdout);
115
+ }
116
+ /** `git worktree list --porcelain`, parsed. Empty outside a repo. */
117
+ function listWorktrees(cwd) {
118
+ const r = git(['worktree', 'list', '--porcelain'], cwd);
119
+ if (!r.ok)
120
+ return [];
121
+ const entries = [];
122
+ let current = null;
123
+ for (const line of r.stdout.split('\n')) {
124
+ if (line.startsWith('worktree ')) {
125
+ current = { path: path.resolve(line.slice('worktree '.length)), bare: false, detached: false };
126
+ entries.push(current);
127
+ }
128
+ else if (!current) {
129
+ continue;
130
+ }
131
+ else if (line.startsWith('HEAD ')) {
132
+ current.head = line.slice(5);
133
+ }
134
+ else if (line.startsWith('branch ')) {
135
+ current.branch = line.slice(7);
136
+ }
137
+ else if (line === 'bare') {
138
+ current.bare = true;
139
+ }
140
+ else if (line === 'detached') {
141
+ current.detached = true;
142
+ }
143
+ }
144
+ return entries;
145
+ }
146
+ /** Name of the board branch for the repo containing `cwd` (`brainfile.branch`, default `brainfile`). */
147
+ function boardBranch(cwd) {
148
+ const r = git(['config', '--get', exports.BOARD_BRANCH_CONFIG_KEY], cwd);
149
+ return r.ok && r.stdout ? r.stdout : exports.DEFAULT_BOARD_BRANCH;
150
+ }
151
+ /**
152
+ * How the board directory is tracked: a linked worktree (`.git` is a gitdir
153
+ * pointer file), a standalone repository (`.git` is a directory), or null for
154
+ * a plain directory.
155
+ */
156
+ function boardRepoKind(dotDir) {
157
+ try {
158
+ const st = fs.statSync(path.join(dotDir, '.git'));
159
+ if (st.isFile())
160
+ return 'linked';
161
+ if (st.isDirectory())
162
+ return 'standalone';
163
+ }
164
+ catch {
165
+ /* plain directory */
166
+ }
167
+ return null;
168
+ }
169
+ function isTrackedBoard(dotDir) {
170
+ return boardRepoKind(dotDir) !== null;
171
+ }
172
+ /**
173
+ * Resolution step 3: from anywhere inside a repo (including a linked code
174
+ * worktree that has no `.brainfile/` of its own), find the worktree checked
175
+ * out on the board branch.
176
+ */
177
+ function findTrackedBoardDir(cwd) {
178
+ const worktrees = listWorktrees(cwd);
179
+ if (worktrees.length === 0)
180
+ return null;
181
+ const wanted = `refs/heads/${boardBranch(cwd)}`;
182
+ const hit = worktrees.find((w) => w.branch === wanted);
183
+ if (!hit)
184
+ return null;
185
+ return fs.existsSync(path.join(hit.path, 'brainfile.md')) ? hit.path : null;
186
+ }
187
+ /**
188
+ * Resolution step 4: the board branch exists locally but no worktree has it
189
+ * checked out (a fresh clone, or the directory was removed). Create the
190
+ * worktree at `<main worktree>/.brainfile` — or inside the common git dir for
191
+ * bare layouts — and hide it from the code branch. Returns the new board
192
+ * directory, or null when there is nothing to materialize.
193
+ */
194
+ function materializeBoardWorktree(cwd) {
195
+ const branch = boardBranch(cwd);
196
+ const hasLocal = git(['rev-parse', '--verify', '--quiet', `refs/heads/${branch}`], cwd).ok;
197
+ // The configured board remote wins; `origin/<branch>` is the fresh-clone case.
198
+ const configuredRemote = git(['config', '--get', 'brainfile.remote'], cwd).stdout || null;
199
+ const configuredBranch = git(['config', '--get', 'brainfile.remoteBranch'], cwd).stdout || branch;
200
+ let upstream = null;
201
+ if (!hasLocal) {
202
+ if (configuredRemote) {
203
+ const ref = `${configuredRemote}/${configuredBranch}`;
204
+ if (!git(['rev-parse', '--verify', '--quiet', `refs/remotes/${ref}`], cwd).ok) {
205
+ git(['fetch', '--quiet', configuredRemote, configuredBranch], cwd);
206
+ }
207
+ if (git(['rev-parse', '--verify', '--quiet', `refs/remotes/${ref}`], cwd).ok)
208
+ upstream = ref;
209
+ }
210
+ if (!upstream && git(['rev-parse', '--verify', '--quiet', `refs/remotes/origin/${branch}`], cwd).ok) {
211
+ upstream = `origin/${branch}`;
212
+ }
213
+ }
214
+ if (!hasLocal && !upstream)
215
+ return null;
216
+ const worktrees = listWorktrees(cwd);
217
+ if (worktrees.length === 0)
218
+ return null;
219
+ if (worktrees.some((w) => w.branch === `refs/heads/${branch}`))
220
+ return null;
221
+ const main = worktrees[0];
222
+ let target;
223
+ if (main.bare) {
224
+ const common = gitCommonDir(cwd);
225
+ if (!common)
226
+ return null;
227
+ target = path.join(common, 'brainfile');
228
+ }
229
+ else {
230
+ target = path.join(main.path, '.brainfile');
231
+ }
232
+ if (fs.existsSync(target))
233
+ return null;
234
+ const r = hasLocal
235
+ ? git(['worktree', 'add', '--quiet', target, branch], cwd)
236
+ : git(['worktree', 'add', '--quiet', '--track', '-b', branch, target, upstream], cwd);
237
+ if (!r.ok)
238
+ return null;
239
+ ensureExcludeEntry(cwd);
240
+ // Boards shared before empty directories were kept arrive without them.
241
+ for (const sub of BOARD_SUBDIRS)
242
+ fs.mkdirSync(path.join(target, sub), { recursive: true });
243
+ const cameFrom = upstream ? upstream.slice(0, upstream.indexOf('/')) : null;
244
+ // The board arrived through this remote, so that is where it goes back to.
245
+ if (cameFrom && !configuredRemote)
246
+ git(['config', 'brainfile.remote', cameFrom], cwd);
247
+ const relative = path.relative(process.cwd(), target) || '.';
248
+ process.stderr.write(cameFrom
249
+ ? `Checked out the shared board from ${cameFrom} into ${relative}/\n`
250
+ : `Checked out the board from the '${branch}' branch into ${relative}/\n`);
251
+ return target;
252
+ }
253
+ /** Hide `.brainfile/` from the code branch without touching `.gitignore`. Returns true when an entry was added. */
254
+ function ensureExcludeEntry(cwd) {
255
+ const common = gitCommonDir(cwd);
256
+ if (!common)
257
+ return false;
258
+ const file = path.join(common, 'info', 'exclude');
259
+ const existing = fs.existsSync(file) ? fs.readFileSync(file, 'utf-8') : '';
260
+ const present = existing
261
+ .split(/\r?\n/)
262
+ .some((line) => line.trim() === EXCLUDE_ENTRY || line.trim() === '.brainfile');
263
+ if (present)
264
+ return false;
265
+ fs.mkdirSync(path.dirname(file), { recursive: true });
266
+ const separator = existing.length > 0 && !existing.endsWith('\n') ? '\n' : '';
267
+ fs.appendFileSync(file, `${separator}${EXCLUDE_MARKER}\n${EXCLUDE_ENTRY}\n`, 'utf-8');
268
+ return true;
269
+ }
270
+ /** Remove the exclude entry, but only the one we wrote (identified by its marker). */
271
+ function removeExcludeEntry(cwd) {
272
+ const common = gitCommonDir(cwd);
273
+ if (!common)
274
+ return false;
275
+ const file = path.join(common, 'info', 'exclude');
276
+ if (!fs.existsSync(file))
277
+ return false;
278
+ const lines = fs.readFileSync(file, 'utf-8').split(/\r?\n/);
279
+ const at = lines.indexOf(EXCLUDE_MARKER);
280
+ if (at < 0)
281
+ return false;
282
+ const removeCount = lines[at + 1]?.trim() === EXCLUDE_ENTRY ? 2 : 1;
283
+ lines.splice(at, removeCount);
284
+ fs.writeFileSync(file, lines.join('\n'), 'utf-8');
285
+ return true;
286
+ }
287
+ /** `git worktree add --orphan -b <branch> <dotDir>` (git >= 2.42). */
288
+ function createOrphanBoardWorktree(repoCwd, dotDir, branch) {
289
+ const r = git(['worktree', 'add', '--quiet', '--orphan', '-b', branch, dotDir], repoCwd);
290
+ if (!r.ok) {
291
+ throw new Error(`Could not create the board worktree on branch '${branch}' (git >= 2.42 is required for --orphan): ${r.stderr}`);
292
+ }
293
+ }
294
+ /** `git init` inside the board directory for boards outside any repo. */
295
+ function initStandaloneBoardRepo(dotDir) {
296
+ const parent = path.dirname(dotDir);
297
+ let r = git(['init', '--quiet', '-b', 'main', dotDir], parent);
298
+ if (!r.ok)
299
+ r = git(['init', '--quiet', dotDir], parent);
300
+ if (!r.ok)
301
+ throw new Error(`Could not initialize a git repository in ${dotDir}: ${r.stderr}`);
302
+ }
303
+ function boardIsDirty(dotDir) {
304
+ const r = git(['status', '--porcelain'], dotDir);
305
+ return r.ok && r.stdout.length > 0;
306
+ }
307
+ function boardHasCommits(dotDir) {
308
+ return git(['rev-parse', '--verify', '--quiet', 'HEAD'], dotDir).ok;
309
+ }
310
+ /** Files with uncommitted changes, relative to the board directory. */
311
+ /** Paths still carrying conflict markers from an unfinished merge. */
312
+ function unmergedFiles(dotDir) {
313
+ const r = git(['diff', '--name-only', '--diff-filter=U'], dotDir);
314
+ return r.ok ? r.stdout.split('\n').map((l) => l.trim()).filter(Boolean) : [];
315
+ }
316
+ function boardDirtyFiles(dotDir) {
317
+ const r = git(['status', '--porcelain'], dotDir);
318
+ if (!r.ok || !r.stdout)
319
+ return [];
320
+ // `git()` trims stdout, so the first line may have lost its leading status
321
+ // column; strip the status letters and whitespace rather than a fixed width.
322
+ return r.stdout
323
+ .split('\n')
324
+ .map((line) => line.replace(/^[ MADRCU?!]{1,2}\s+/, '').replace(/^.* -> /, '').trim())
325
+ .filter(Boolean);
326
+ }
327
+ function identityArgs(dotDir) {
328
+ const args = [];
329
+ if (!git(['config', '--get', 'user.name'], dotDir).stdout)
330
+ args.push('-c', `user.name=${FALLBACK_IDENTITY_NAME}`);
331
+ if (!git(['config', '--get', 'user.email'], dotDir).stdout)
332
+ args.push('-c', `user.email=${FALLBACK_IDENTITY_EMAIL}`);
333
+ return args;
334
+ }
335
+ function sanitizeAgent(agent) {
336
+ return agent.replace(/[<>\r\n]/g, '').trim();
337
+ }
338
+ const commitListeners = [];
339
+ /** Run `listener` after every successful board commit made by this process. */
340
+ function onBoardCommitted(listener) {
341
+ if (!commitListeners.includes(listener))
342
+ commitListeners.push(listener);
343
+ }
344
+ function notifyCommitted(dotDir) {
345
+ for (const listener of commitListeners) {
346
+ try {
347
+ listener(dotDir);
348
+ }
349
+ catch {
350
+ /* listeners are best-effort */
351
+ }
352
+ }
353
+ }
354
+ /**
355
+ * Stage everything in the board directory and commit it. Returns true when a
356
+ * commit was made, false when the board is plain or nothing changed. Never
357
+ * throws: a failed commit must not fail the mutation it records.
358
+ */
359
+ /**
360
+ * git does not store empty directories, and a board without `board/` reads
361
+ * as legacy on the other side. Keep both alive with a `.gitkeep`.
362
+ */
363
+ function ensureBoardDirs(dotDir) {
364
+ let created = false;
365
+ for (const sub of BOARD_SUBDIRS) {
366
+ const dir = path.join(dotDir, sub);
367
+ try {
368
+ fs.mkdirSync(dir, { recursive: true });
369
+ const keep = path.join(dir, '.gitkeep');
370
+ if (!fs.existsSync(keep)) {
371
+ fs.writeFileSync(keep, '', 'utf-8');
372
+ created = true;
373
+ }
374
+ }
375
+ catch {
376
+ /* best effort */
377
+ }
378
+ }
379
+ return created;
380
+ }
381
+ function commitBoard(dotDir, options) {
382
+ if (!isTrackedBoard(dotDir))
383
+ return false;
384
+ ensureBoardDirs(dotDir);
385
+ // A merge a human still owns must not be committed with its markers.
386
+ if (unmergedFiles(dotDir).length > 0)
387
+ return false;
388
+ if (!git(['add', '-A'], dotDir).ok)
389
+ return false;
390
+ if (!boardIsDirty(dotDir))
391
+ return false;
392
+ const env = {};
393
+ const agent = options.agent ? sanitizeAgent(options.agent) : '';
394
+ if (agent) {
395
+ env.GIT_AUTHOR_NAME = agent;
396
+ env.GIT_AUTHOR_EMAIL = `${agent}@brainfile.local`;
397
+ }
398
+ const message = oneLine(options.message);
399
+ const r = git([...identityArgs(dotDir), '-c', 'commit.gpgsign=false', 'commit', '--quiet', '--no-verify', '-m', message], dotDir, env);
400
+ if (r.ok)
401
+ notifyCommitted(dotDir);
402
+ return r.ok;
403
+ }
404
+ /**
405
+ * Commit outstanding hand edits (files changed outside the CLI) before a
406
+ * command mutates, so they are never folded into that command's commit.
407
+ */
408
+ function commitHandEdits(dotDir) {
409
+ if (!isTrackedBoard(dotDir))
410
+ return false;
411
+ // Boards created before the .gitkeep files existed get them in their own
412
+ // commit, not folded into whatever command happens to run next.
413
+ // git lists a directory holding only new files as `board/`, not its contents.
414
+ const keepOnly = (f) => f.endsWith('.gitkeep') || BOARD_SUBDIRS.some((sub) => f === `${sub}/`);
415
+ if (ensureBoardDirs(dotDir) && boardDirtyFiles(dotDir).every(keepOnly)) {
416
+ commitBoard(dotDir, { message: 'chore: keep board/ and logs/ in git' });
417
+ }
418
+ const files = boardDirtyFiles(dotDir);
419
+ if (files.length === 0)
420
+ return false;
421
+ const summary = files.length <= 3 ? files.join(', ') : `${files.length} files`;
422
+ return commitBoard(dotDir, { message: `edit: ${summary}` });
423
+ }
424
+ /** The acting agent: `BRAINFILE_AGENT`, else `--agent <name>` on the command line. */
425
+ function resolveAgentName(argv = process.argv) {
426
+ if (process.env.BRAINFILE_AGENT)
427
+ return process.env.BRAINFILE_AGENT;
428
+ const flag = argv.indexOf('--agent');
429
+ if (flag >= 0 && argv[flag + 1] && !argv[flag + 1].startsWith('-'))
430
+ return argv[flag + 1];
431
+ const inline = argv.find((a) => a.startsWith('--agent='));
432
+ return inline ? inline.slice('--agent='.length) : null;
433
+ }
434
+ /** The home board: `~/.brainfile`, addressed with `-g` / `--global` or `BRAINFILE_GLOBAL=1`. */
435
+ function homeBoardDir() {
436
+ return path.join(os.homedir(), '.brainfile');
437
+ }
438
+ function isGlobalBoardRequested(argv = process.argv) {
439
+ if (process.env.BRAINFILE_GLOBAL === '1')
440
+ return true;
441
+ return argv.includes('-g') || argv.includes('--global');
442
+ }
443
+ function oneLine(message) {
444
+ const flat = message.replace(/\s+/g, ' ').trim();
445
+ return flat.length > MAX_MESSAGE_LENGTH ? `${flat.slice(0, MAX_MESSAGE_LENGTH - 1)}…` : flat;
446
+ }
447
+ /**
448
+ * Commit message for a CLI invocation: `<verb> <id>: <detail>`, e.g.
449
+ * `move task-3: in-progress`, `add: Fix login bug`, `contract pickup task-2`.
450
+ */
451
+ function describeCommandForCommit(command) {
452
+ const names = [];
453
+ let cursor = command;
454
+ while (cursor && cursor.parent) {
455
+ names.unshift(cursor.name());
456
+ cursor = cursor.parent;
457
+ }
458
+ const opts = command.opts();
459
+ const idValue = opts.task ?? opts.taskId;
460
+ const id = Array.isArray(idValue) ? idValue.join(',') : typeof idValue === 'string' ? idValue : '';
461
+ const positional = command.args.filter((a) => typeof a === 'string' && a.length > 0);
462
+ const detail = [opts.title, opts.column, positional.join(' ')]
463
+ .find((v) => typeof v === 'string' && v.length > 0) ?? '';
464
+ const head = `${names.join(' ')}${id ? ` ${id}` : ''}`;
465
+ return oneLine(detail ? `${head}: ${detail}` : head);
466
+ }
467
+ // ── Debounced commits for long-running frontends (TUI) ──────────────────────
468
+ const pendingCommits = new Map();
469
+ let flushTimer = null;
470
+ let exitHookInstalled = false;
471
+ /** Queue a commit for a board; bursts of edits within `delayMs` become one commit. */
472
+ function scheduleBoardCommit(brainfilePath, message, delayMs = 2000) {
473
+ const dotDir = path.dirname(path.resolve(brainfilePath));
474
+ if (!isTrackedBoard(dotDir))
475
+ return;
476
+ const entry = pendingCommits.get(dotDir) ?? { messages: [], agent: resolveAgentName() };
477
+ entry.messages.push(message);
478
+ pendingCommits.set(dotDir, entry);
479
+ if (flushTimer)
480
+ clearTimeout(flushTimer);
481
+ flushTimer = setTimeout(flushBoardCommits, delayMs);
482
+ flushTimer.unref?.();
483
+ if (!exitHookInstalled) {
484
+ exitHookInstalled = true;
485
+ process.once('exit', flushBoardCommits);
486
+ }
487
+ }
488
+ /** Commit every queued board now. Safe to call from an `exit` handler (synchronous). */
489
+ function flushBoardCommits() {
490
+ if (flushTimer) {
491
+ clearTimeout(flushTimer);
492
+ flushTimer = null;
493
+ }
494
+ for (const [dotDir, entry] of pendingCommits) {
495
+ const [first, ...rest] = entry.messages;
496
+ const message = rest.length === 0 ? first : `${first} (+${rest.length} more)`;
497
+ commitBoard(dotDir, { message, agent: entry.agent });
498
+ }
499
+ pendingCommits.clear();
500
+ }
501
+ //# sourceMappingURL=board-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-repo.js","sourceRoot":"","sources":["../../src/utils/board-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ export declare const REMOTE_CONFIG_KEY = "brainfile.remote";
2
+ export declare const REMOTE_BRANCH_CONFIG_KEY = "brainfile.remoteBranch";
3
+ export declare const AUTOSYNC_CONFIG_KEY = "brainfile.autosync";
4
+ /** Remote name used when `--set-remote` is given a URL instead of a name. */
5
+ export declare const URL_REMOTE_NAME = "board";
6
+ export declare const MERGE_DRIVER_NAME = "brainfile";
7
+ export declare const DEFAULT_MERGE_DRIVER_COMMAND = "brainfile merge-driver %O %A %B";
8
+ export declare const BOARD_GITATTRIBUTES: string[];
9
+ export type AutosyncMode = 'off' | 'push' | 'full';
10
+ export interface SyncOptions {
11
+ pull?: boolean;
12
+ push?: boolean;
13
+ agent?: string | null;
14
+ }
15
+ export interface SyncResult {
16
+ /** True when every requested step succeeded (nothing to do also counts). */
17
+ ok: boolean;
18
+ /** Set when sync did not run at all. */
19
+ skipped?: 'not-tracked' | 'no-remote';
20
+ remote?: string;
21
+ remoteBranch?: string;
22
+ /** Commits brought in from the remote. */
23
+ pulled: number;
24
+ /** Commits sent to the remote. */
25
+ pushed: number;
26
+ /** Files left with conflict markers for a human. */
27
+ conflicts: string[];
28
+ /** One-line, technical explanation when `ok` is false. */
29
+ warning?: string;
30
+ /** Why it failed, for plain-language messages (see `syncMessage`). */
31
+ failure?: 'offline' | 'rejected' | 'conflict' | 'error';
32
+ }
33
+ export interface SyncState {
34
+ at: string;
35
+ remote: string;
36
+ remoteBranch: string;
37
+ ok: boolean;
38
+ warning?: string;
39
+ }
40
+ export declare function boardRemote(dotDir: string): string | null;
41
+ /**
42
+ * Branch name on the remote. Defaults keep the "one private boards repo, one
43
+ * branch per project" pattern from colliding: the board branch name inside a
44
+ * repo, the parent folder's basename for a standalone board, `home` for the
45
+ * global board.
46
+ */
47
+ export declare function boardRemoteBranch(dotDir: string): string;
48
+ export declare function boardAutosync(dotDir: string): AutosyncMode;
49
+ export declare function setBoardAutosync(dotDir: string, mode: AutosyncMode): boolean;
50
+ /** True when `target` names a place rather than an existing git remote. */
51
+ export declare function looksLikeRemoteUrl(target: string): boolean;
52
+ export interface RemoteSetting {
53
+ remote: string;
54
+ url: string | null;
55
+ remoteBranch: string;
56
+ }
57
+ /**
58
+ * Point the board at a remote: an existing remote name, or a URL/path that is
59
+ * registered as the `board` remote. Throws an Error naming an unknown remote.
60
+ * `cwd` may be the board directory or, when no board exists yet, the code
61
+ * repository the board will be materialized into.
62
+ */
63
+ export declare function setBoardRemote(cwd: string, target: string, remoteBranch?: string): RemoteSetting;
64
+ /**
65
+ * Register the field-level merge driver in the board's git config.
66
+ *
67
+ * Without an explicit `command` this only fills in a missing driver: a
68
+ * driver someone configured on purpose (an absolute path to the CLI, or a
69
+ * test's built bundle) is never overwritten by the next sync.
70
+ */
71
+ export declare function registerMergeDriver(cwd: string, command?: string): boolean;
72
+ /**
73
+ * Make sure `.gitattributes` on the board declares the merge strategies.
74
+ * Returns true when the file was created or extended (caller commits).
75
+ */
76
+ export declare function ensureBoardAttributes(dotDir: string): boolean;
77
+ export declare function readSyncState(dotDir: string): SyncState | null;
78
+ /**
79
+ * Complete-vs-edit: one side archived a task (deleted `board/<id>.md`, wrote
80
+ * `logs/<id>.md`) while the other edited it. Completion wins; the edit is
81
+ * appended to the archived file as a log entry. Returns the paths resolved.
82
+ */
83
+ export declare function resolveCompleteVersusEdit(dotDir: string): string[];
84
+ /**
85
+ * fetch → fast-forward or merge → push. Runs entirely inside the board
86
+ * directory. Never throws; network failures come back as `warning`.
87
+ */
88
+ export declare function syncBoard(dotDir: string, options?: SyncOptions): SyncResult;
89
+ /** Seconds since the last recorded sync attempt, or null when there was none. */
90
+ export declare function secondsSinceSync(dotDir: string, now?: number): number | null;
91
+ /**
92
+ * Short status for a header: `synced 12s ago`, `local only` for a tracked
93
+ * board nobody else has, `not synced · saved locally` after a failure. Null
94
+ * for a plain board.
95
+ */
96
+ export declare function syncStatusLabel(dotDir: string, now?: number): string | null;
97
+ /**
98
+ * Commits on this machine the remote has not seen yet, judged against the
99
+ * last-known remote position (no network). Null when the board is not shared.
100
+ */
101
+ export declare function pendingChanges(dotDir: string): number;
102
+ /**
103
+ * The one sentence a person needs after a sync: what moved, or why nothing
104
+ * did and that nothing was lost. `detail` is the technical cause, if any.
105
+ */
106
+ export declare function syncMessage(result: SyncResult): {
107
+ text: string;
108
+ tone: 'ok' | 'warn';
109
+ detail?: string;
110
+ };
111
+ //# sourceMappingURL=board-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-sync.d.ts","sourceRoot":"","sources":["../../src/utils/board-sync.ts"],"names":[],"mappings":"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"}