brainfile 0.21.2 → 0.22.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.
Files changed (233) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/helpers/mcp-wire.d.ts +2 -0
  3. package/dist/__tests__/helpers/mcp-wire.d.ts.map +1 -1
  4. package/dist/__tests__/helpers/mcp-wire.js +4 -2
  5. package/dist/__tests__/helpers/mcp-wire.js.map +1 -1
  6. package/dist/chunk-CWUTU5VV.mjs +5585 -0
  7. package/dist/chunk-L4WSDMK3.mjs +1973 -0
  8. package/dist/{chunk-7KU2R7QC.mjs → chunk-XFDTTLSW.mjs} +3230 -4322
  9. package/dist/cli.js +7 -1
  10. package/dist/cli.mjs +8078 -5357
  11. package/dist/commands/add.d.ts +4 -0
  12. package/dist/commands/add.d.ts.map +1 -1
  13. package/dist/commands/add.js +68 -72
  14. package/dist/commands/add.js.map +1 -1
  15. package/dist/commands/boards.d.ts +18 -0
  16. package/dist/commands/boards.d.ts.map +1 -0
  17. package/dist/commands/boards.js +166 -0
  18. package/dist/commands/boards.js.map +1 -0
  19. package/dist/commands/brief.d.ts +17 -11
  20. package/dist/commands/brief.d.ts.map +1 -1
  21. package/dist/commands/brief.js +38 -35
  22. package/dist/commands/brief.js.map +1 -1
  23. package/dist/commands/check.d.ts +47 -0
  24. package/dist/commands/check.d.ts.map +1 -0
  25. package/dist/commands/check.js +134 -0
  26. package/dist/commands/check.js.map +1 -0
  27. package/dist/commands/columns.d.ts +48 -0
  28. package/dist/commands/columns.d.ts.map +1 -0
  29. package/dist/commands/columns.js +132 -0
  30. package/dist/commands/columns.js.map +1 -0
  31. package/dist/commands/complete.js +9 -4
  32. package/dist/commands/complete.js.map +1 -1
  33. package/dist/commands/decide.d.ts +72 -0
  34. package/dist/commands/decide.d.ts.map +1 -0
  35. package/dist/commands/decide.js +264 -0
  36. package/dist/commands/decide.js.map +1 -0
  37. package/dist/commands/hooks.d.ts +5 -1
  38. package/dist/commands/hooks.d.ts.map +1 -1
  39. package/dist/commands/hooks.js +10 -11
  40. package/dist/commands/hooks.js.map +1 -1
  41. package/dist/commands/init.d.ts.map +1 -1
  42. package/dist/commands/init.js +8 -0
  43. package/dist/commands/init.js.map +1 -1
  44. package/dist/commands/lint.d.ts +27 -0
  45. package/dist/commands/lint.d.ts.map +1 -1
  46. package/dist/commands/lint.js +127 -20
  47. package/dist/commands/lint.js.map +1 -1
  48. package/dist/commands/list.d.ts +6 -0
  49. package/dist/commands/list.d.ts.map +1 -1
  50. package/dist/commands/list.js +216 -7
  51. package/dist/commands/list.js.map +1 -1
  52. package/dist/commands/log.d.ts +51 -0
  53. package/dist/commands/log.d.ts.map +1 -1
  54. package/dist/commands/log.js +113 -84
  55. package/dist/commands/log.js.map +1 -1
  56. package/dist/commands/mcp.d.ts +5 -2
  57. package/dist/commands/mcp.d.ts.map +1 -1
  58. package/dist/commands/mcp.js +44 -9
  59. package/dist/commands/mcp.js.map +1 -1
  60. package/dist/commands/memory-index.d.ts +34 -0
  61. package/dist/commands/memory-index.d.ts.map +1 -0
  62. package/dist/commands/memory-index.js +135 -0
  63. package/dist/commands/memory-index.js.map +1 -0
  64. package/dist/commands/merge-driver.d.ts +1 -15
  65. package/dist/commands/merge-driver.d.ts.map +1 -1
  66. package/dist/commands/merge-driver.js +8 -134
  67. package/dist/commands/merge-driver.js.map +1 -1
  68. package/dist/commands/migrate-tracked.d.ts +1 -1
  69. package/dist/commands/migrate-tracked.d.ts.map +1 -1
  70. package/dist/commands/migrate-tracked.js +21 -10
  71. package/dist/commands/migrate-tracked.js.map +1 -1
  72. package/dist/commands/patch.d.ts +23 -4
  73. package/dist/commands/patch.d.ts.map +1 -1
  74. package/dist/commands/patch.js +149 -91
  75. package/dist/commands/patch.js.map +1 -1
  76. package/dist/commands/plan.d.ts.map +1 -1
  77. package/dist/commands/plan.js +11 -5
  78. package/dist/commands/plan.js.map +1 -1
  79. package/dist/commands/schema.d.ts +12 -0
  80. package/dist/commands/schema.d.ts.map +1 -1
  81. package/dist/commands/schema.js +28 -10
  82. package/dist/commands/schema.js.map +1 -1
  83. package/dist/commands/search.d.ts +46 -12
  84. package/dist/commands/search.d.ts.map +1 -1
  85. package/dist/commands/search.js +89 -44
  86. package/dist/commands/search.js.map +1 -1
  87. package/dist/commands/show.d.ts.map +1 -1
  88. package/dist/commands/show.js +175 -10
  89. package/dist/commands/show.js.map +1 -1
  90. package/dist/commands/template.d.ts +2 -0
  91. package/dist/commands/template.d.ts.map +1 -1
  92. package/dist/commands/template.js +2 -1
  93. package/dist/commands/template.js.map +1 -1
  94. package/dist/commands/types.d.ts +31 -1
  95. package/dist/commands/types.d.ts.map +1 -1
  96. package/dist/commands/types.js +122 -22
  97. package/dist/commands/types.js.map +1 -1
  98. package/dist/commands/where.d.ts +20 -1
  99. package/dist/commands/where.d.ts.map +1 -1
  100. package/dist/commands/where.js +56 -6
  101. package/dist/commands/where.js.map +1 -1
  102. package/dist/hook.mjs +15 -0
  103. package/dist/hooks/session-start.d.ts +39 -0
  104. package/dist/hooks/session-start.d.ts.map +1 -0
  105. package/dist/hooks/session-start.js +181 -0
  106. package/dist/hooks/session-start.js.map +1 -0
  107. package/dist/lib/contractRunner.d.ts.map +1 -1
  108. package/dist/lib/contractRunner.js +8 -0
  109. package/dist/lib/contractRunner.js.map +1 -1
  110. package/dist/mcp/helpers.d.ts +29 -1
  111. package/dist/mcp/helpers.d.ts.map +1 -1
  112. package/dist/mcp/helpers.js +57 -2
  113. package/dist/mcp/helpers.js.map +1 -1
  114. package/dist/mcp/instructions.d.ts +5 -0
  115. package/dist/mcp/instructions.d.ts.map +1 -0
  116. package/dist/mcp/instructions.js +57 -0
  117. package/dist/mcp/instructions.js.map +1 -0
  118. package/dist/mcp/resources.d.ts +9 -0
  119. package/dist/mcp/resources.d.ts.map +1 -0
  120. package/dist/mcp/resources.js +29 -0
  121. package/dist/mcp/resources.js.map +1 -0
  122. package/dist/mcp/schemas.d.ts +600 -9
  123. package/dist/mcp/schemas.d.ts.map +1 -1
  124. package/dist/mcp/schemas.js +374 -12
  125. package/dist/mcp/schemas.js.map +1 -1
  126. package/dist/mcp/tools/adr_promote_tool.d.ts +7 -0
  127. package/dist/mcp/tools/adr_promote_tool.d.ts.map +1 -0
  128. package/dist/mcp/tools/adr_promote_tool.js +37 -0
  129. package/dist/mcp/tools/adr_promote_tool.js.map +1 -0
  130. package/dist/mcp/tools/board_tool.d.ts +7 -0
  131. package/dist/mcp/tools/board_tool.d.ts.map +1 -0
  132. package/dist/mcp/tools/board_tool.js +61 -0
  133. package/dist/mcp/tools/board_tool.js.map +1 -0
  134. package/dist/mcp/tools/brief_tool.d.ts.map +1 -1
  135. package/dist/mcp/tools/brief_tool.js +13 -5
  136. package/dist/mcp/tools/brief_tool.js.map +1 -1
  137. package/dist/mcp/tools/check_tool.d.ts +6 -0
  138. package/dist/mcp/tools/check_tool.d.ts.map +1 -0
  139. package/dist/mcp/tools/check_tool.js +54 -0
  140. package/dist/mcp/tools/check_tool.js.map +1 -0
  141. package/dist/mcp/tools/columns_tool.d.ts +7 -0
  142. package/dist/mcp/tools/columns_tool.d.ts.map +1 -0
  143. package/dist/mcp/tools/columns_tool.js +94 -0
  144. package/dist/mcp/tools/columns_tool.js.map +1 -0
  145. package/dist/mcp/tools/decide_tool.d.ts +91 -0
  146. package/dist/mcp/tools/decide_tool.d.ts.map +1 -0
  147. package/dist/mcp/tools/decide_tool.js +141 -0
  148. package/dist/mcp/tools/decide_tool.js.map +1 -0
  149. package/dist/mcp/tools/get_task_tool.d.ts.map +1 -1
  150. package/dist/mcp/tools/get_task_tool.js +62 -4
  151. package/dist/mcp/tools/get_task_tool.js.map +1 -1
  152. package/dist/mcp/tools/lint_tool.d.ts +7 -0
  153. package/dist/mcp/tools/lint_tool.d.ts.map +1 -0
  154. package/dist/mcp/tools/lint_tool.js +48 -0
  155. package/dist/mcp/tools/lint_tool.js.map +1 -0
  156. package/dist/mcp/tools/list_tasks_tool.d.ts.map +1 -1
  157. package/dist/mcp/tools/list_tasks_tool.js +132 -15
  158. package/dist/mcp/tools/list_tasks_tool.js.map +1 -1
  159. package/dist/mcp/tools/log_tool.d.ts +4 -0
  160. package/dist/mcp/tools/log_tool.d.ts.map +1 -0
  161. package/dist/mcp/tools/log_tool.js +52 -0
  162. package/dist/mcp/tools/log_tool.js.map +1 -0
  163. package/dist/mcp/tools/note_tool.d.ts +7 -0
  164. package/dist/mcp/tools/note_tool.d.ts.map +1 -0
  165. package/dist/mcp/tools/note_tool.js +39 -0
  166. package/dist/mcp/tools/note_tool.js.map +1 -0
  167. package/dist/mcp/tools/retire_tool.d.ts +4 -0
  168. package/dist/mcp/tools/retire_tool.d.ts.map +1 -0
  169. package/dist/mcp/tools/retire_tool.js +81 -0
  170. package/dist/mcp/tools/retire_tool.js.map +1 -0
  171. package/dist/mcp/tools/search_tool.d.ts.map +1 -1
  172. package/dist/mcp/tools/search_tool.js +36 -19
  173. package/dist/mcp/tools/search_tool.js.map +1 -1
  174. package/dist/mcp/tools/supersede_tool.d.ts +4 -0
  175. package/dist/mcp/tools/supersede_tool.d.ts.map +1 -0
  176. package/dist/mcp/tools/supersede_tool.js +72 -0
  177. package/dist/mcp/tools/supersede_tool.js.map +1 -0
  178. package/dist/mcp/tools/sync_tool.d.ts +9 -0
  179. package/dist/mcp/tools/sync_tool.d.ts.map +1 -0
  180. package/dist/mcp/tools/sync_tool.js +87 -0
  181. package/dist/mcp/tools/sync_tool.js.map +1 -0
  182. package/dist/mcp/tools/task_add_tool.d.ts.map +1 -1
  183. package/dist/mcp/tools/task_add_tool.js +39 -17
  184. package/dist/mcp/tools/task_add_tool.js.map +1 -1
  185. package/dist/mcp/tools/task_complete_tool.d.ts.map +1 -1
  186. package/dist/mcp/tools/task_complete_tool.js +3 -2
  187. package/dist/mcp/tools/task_complete_tool.js.map +1 -1
  188. package/dist/mcp/tools/task_patch_tool.d.ts.map +1 -1
  189. package/dist/mcp/tools/task_patch_tool.js +30 -5
  190. package/dist/mcp/tools/task_patch_tool.js.map +1 -1
  191. package/dist/mcp/tools/template_tool.d.ts +4 -0
  192. package/dist/mcp/tools/template_tool.d.ts.map +1 -0
  193. package/dist/mcp/tools/template_tool.js +70 -0
  194. package/dist/mcp/tools/template_tool.js.map +1 -0
  195. package/dist/mcp/tools/types_tool.d.ts +4 -0
  196. package/dist/mcp/tools/types_tool.d.ts.map +1 -0
  197. package/dist/mcp/tools/types_tool.js +61 -0
  198. package/dist/mcp/tools/types_tool.js.map +1 -0
  199. package/dist/mcp/tools/where_tool.d.ts +4 -0
  200. package/dist/mcp/tools/where_tool.d.ts.map +1 -0
  201. package/dist/mcp/tools/where_tool.js +73 -0
  202. package/dist/mcp/tools/where_tool.js.map +1 -0
  203. package/dist/schemas/board.json +29 -8
  204. package/dist/{tui-3Z7ZJV7M.mjs → tui-D6RMFL6X.mjs} +994 -315
  205. package/dist/utils/board-autosync.d.ts +1 -10
  206. package/dist/utils/board-autosync.d.ts.map +1 -1
  207. package/dist/utils/board-autosync.js +11 -29
  208. package/dist/utils/board-autosync.js.map +1 -1
  209. package/dist/utils/board-commit-hooks.d.ts +8 -0
  210. package/dist/utils/board-commit-hooks.d.ts.map +1 -1
  211. package/dist/utils/board-commit-hooks.js +45 -1
  212. package/dist/utils/board-commit-hooks.js.map +1 -1
  213. package/dist/utils/board-repo.d.ts +1 -119
  214. package/dist/utils/board-repo.d.ts.map +1 -1
  215. package/dist/utils/board-repo.js +43 -571
  216. package/dist/utils/board-repo.js.map +1 -1
  217. package/dist/utils/board-sync.d.ts +3 -123
  218. package/dist/utils/board-sync.d.ts.map +1 -1
  219. package/dist/utils/board-sync.js +34 -551
  220. package/dist/utils/board-sync.js.map +1 -1
  221. package/dist/utils/graph.d.ts +20 -0
  222. package/dist/utils/graph.d.ts.map +1 -0
  223. package/dist/utils/graph.js +61 -0
  224. package/dist/utils/graph.js.map +1 -0
  225. package/dist/utils/related.d.ts +21 -0
  226. package/dist/utils/related.d.ts.map +1 -0
  227. package/dist/utils/related.js +36 -0
  228. package/dist/utils/related.js.map +1 -0
  229. package/package.json +2 -2
  230. package/dist/tui/theme.d.ts +0 -98
  231. package/dist/tui/theme.d.ts.map +0 -1
  232. package/dist/tui/theme.js +0 -141
  233. package/dist/tui/theme.js.map +0 -1
@@ -44,7 +44,7 @@ const schemas_1 = require("../schemas");
44
44
  function registerTaskPatchTool(server, defaultFile) {
45
45
  server.registerTool('task_patch', {
46
46
  title: 'Patch Task',
47
- description: 'Update specific fields of a task. Set fields to null to remove them. Set parentId to a plan ID to link a task to the plan it implements.',
47
+ description: 'Update specific fields of a task. Set fields to null to remove them. parentId moves a document under its parent (a task under a plan, a spec under an epic); an off-pattern parent is a warning, refused on a strict board, and a loop is always refused. dependsOn replaces the list of tasks that come first; decisions replaces the list of decisions the work rests on.',
48
48
  inputSchema: zod_1.z.object({
49
49
  file: zod_1.z.string().optional().describe('Path to brainfile.md (default: brainfile.md)'),
50
50
  taskId: zod_1.z.union([zod_1.z.string(), zod_1.z.array(zod_1.z.string())]).optional().describe('Task ID or array of task IDs to update'),
@@ -56,10 +56,12 @@ function registerTaskPatchTool(server, defaultFile) {
56
56
  assignee: zod_1.z.string().nullable().optional().describe('New assignee (null to remove)'),
57
57
  dueDate: zod_1.z.string().nullable().optional().describe('New due date (null to remove)'),
58
58
  relatedFiles: zod_1.z.array(zod_1.z.string()).nullable().optional().describe('Related file paths (null to remove)'),
59
- parentId: zod_1.z.string().nullable().optional().describe('Parent task ID (null to remove)')
59
+ parentId: zod_1.z.string().nullable().optional().describe('Parent task ID (null to remove)'),
60
+ dependsOn: zod_1.z.array(zod_1.z.string()).nullable().optional().describe('Task IDs this task depends on, replacing the list; alias:task-id names a task on a related board (null or [] to remove)'),
61
+ decisions: zod_1.z.array(zod_1.z.string()).nullable().optional().describe('IDs of the decisions this work rests on, replacing the list (null or [] to remove)'),
60
62
  }),
61
63
  outputSchema: schemas_1.taskPatchOutputSchema
62
- }, (0, helpers_1.withBoardCommit)('task_patch', defaultFile, async ({ file, taskId, task, title, description, priority, tags, assignee, dueDate, relatedFiles, parentId }) => {
64
+ }, (0, helpers_1.withBoardCommit)('task_patch', defaultFile, async ({ file, taskId, task, title, description, priority, tags, assignee, dueDate, relatedFiles, parentId, dependsOn, decisions }) => {
63
65
  const filePath = file || defaultFile;
64
66
  const rawTaskIds = taskId ?? task;
65
67
  if (!rawTaskIds) {
@@ -73,6 +75,10 @@ function registerTaskPatchTool(server, defaultFile) {
73
75
  return guard;
74
76
  const dirs = (0, v2_detect_1.getV2Dirs)(filePath);
75
77
  const results = [];
78
+ const linksChange = (typeof parentId === 'string' && !isNull(parentId))
79
+ || (Array.isArray(dependsOn) && dependsOn.length > 0)
80
+ || (Array.isArray(decisions) && decisions.length > 0);
81
+ const board = linksChange ? (0, core_1.readBoardGraph)(filePath) : null;
76
82
  for (const id of taskIds) {
77
83
  const taskPath = path.join(dirs.boardDir, (0, core_1.taskFileName)(id));
78
84
  const doc = (0, core_1.readTaskFile)(taskPath);
@@ -81,6 +87,22 @@ function registerTaskPatchTool(server, defaultFile) {
81
87
  continue;
82
88
  }
83
89
  const nullable = (v) => v === undefined ? undefined : (isNull(v) ? null : v);
90
+ // Links are checked against the board (spec-12): self links and loops are
91
+ // refused; an off-pattern link warns, and a strict board refuses it.
92
+ let warnings = [];
93
+ if (board) {
94
+ const check = (0, core_1.checkDocumentLinks)(board.graph, {
95
+ id,
96
+ ...(typeof parentId === 'string' && !isNull(parentId) && { parentId }),
97
+ ...(Array.isArray(dependsOn) && { dependsOn }),
98
+ ...(Array.isArray(decisions) && { decisions }),
99
+ }, { strict: board.config?.strict === true });
100
+ if (check.errors.length > 0) {
101
+ results.push({ taskId: id, success: false, error: check.errors.join('; ') });
102
+ continue;
103
+ }
104
+ warnings = check.warnings;
105
+ }
84
106
  const result = (0, core_1.patchTaskFile)(taskPath, {
85
107
  title,
86
108
  description: nullable(description),
@@ -90,12 +112,14 @@ function registerTaskPatchTool(server, defaultFile) {
90
112
  dueDate: nullable(dueDate),
91
113
  relatedFiles: nullable(relatedFiles),
92
114
  parentId: nullable(parentId),
115
+ dependsOn: nullable(dependsOn),
116
+ decisions: nullable(decisions),
93
117
  });
94
118
  if (!result.success) {
95
119
  results.push({ taskId: id, success: false, error: result.error || 'Task not found' });
96
120
  continue;
97
121
  }
98
- results.push({ taskId: id, success: true });
122
+ results.push({ taskId: id, success: true, ...(warnings.length > 0 && { warnings }) });
99
123
  }
100
124
  const successCount = results.filter(r => r.success).length;
101
125
  const failureCount = results.length - successCount;
@@ -111,8 +135,9 @@ function registerTaskPatchTool(server, defaultFile) {
111
135
  isError: true,
112
136
  };
113
137
  }
138
+ const warned = single.warnings?.length ? `\nWarning: ${single.warnings.join('\nWarning: ')}` : '';
114
139
  return {
115
- content: [{ type: 'text', text: `Task ${taskIds[0]} updated successfully` }],
140
+ content: [{ type: 'text', text: `Task ${taskIds[0]} updated successfully${warned}` }],
116
141
  structuredContent: output,
117
142
  };
118
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"task_patch_tool.js","sourceRoot":"","sources":["../../../src/mcp/tools/task_patch_tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task_patch_tool.js","sourceRoot":"","sources":["../../../src/mcp/tools/task_patch_tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/server";
2
+ /** `template`: list the task templates, or add a task from one, like `brainfile template`. */
3
+ export declare function registerTemplateTool(server: McpServer, defaultFile: string): void;
4
+ //# sourceMappingURL=template_tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template_tool.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/template_tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAoB9D,8FAA8F;AAC9F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CA+CjF"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerTemplateTool = registerTemplateTool;
4
+ const zod_1 = require("zod");
5
+ const core_1 = require("@brainfile/core");
6
+ const template_1 = require("../../commands/template");
7
+ const logger_1 = require("../../utils/logger");
8
+ const helpers_1 = require("../helpers");
9
+ const schemas_1 = require("../schemas");
10
+ /** The templates as plain data. */
11
+ function listTemplates() {
12
+ return core_1.BUILT_IN_TEMPLATES.map((t) => ({
13
+ id: t.id,
14
+ name: t.name,
15
+ description: t.description,
16
+ ...(t.template.priority ? { priority: String(t.template.priority) } : {}),
17
+ ...(t.template.tags && t.template.tags.length > 0 ? { tags: [...t.template.tags] } : {}),
18
+ subtasks: (t.template.subtasks ?? []).map((s) => s.title),
19
+ }));
20
+ }
21
+ /** `template`: list the task templates, or add a task from one, like `brainfile template`. */
22
+ function registerTemplateTool(server, defaultFile) {
23
+ server.registerTool('template', {
24
+ title: 'Task Templates',
25
+ description: 'Task templates (bug-report, feature-request, refactor), each with a priority, tags, a description outline and a subtask checklist. action=list shows them; action=use adds a task from one (template, title, optional description and column, default todo).',
26
+ inputSchema: zod_1.z.object({
27
+ file: zod_1.z.string().optional().describe('Path to brainfile.md (default: brainfile.md)'),
28
+ action: zod_1.z.enum(['list', 'use']).optional().describe('Default list'),
29
+ template: zod_1.z.string().optional().describe('use: the template ID, e.g. bug-report'),
30
+ title: zod_1.z.string().optional().describe('use: the task title'),
31
+ description: zod_1.z.string().optional().describe('use: fills the template\'s description'),
32
+ column: zod_1.z.string().optional().describe('use: column ID or name (default todo)'),
33
+ }),
34
+ outputSchema: schemas_1.templateOutputSchema,
35
+ }, (0, helpers_1.withBoardCommit)('template', defaultFile, async (input) => {
36
+ const action = input.action ?? 'list';
37
+ if (action === 'list') {
38
+ const output = { action, templates: listTemplates() };
39
+ return (0, helpers_1.mcpResult)(JSON.stringify(output, null, 2), output);
40
+ }
41
+ const filePath = input.file || defaultFile;
42
+ const guard = (0, helpers_1.requireV2)(filePath);
43
+ if (guard)
44
+ return guard;
45
+ if (!input.template?.trim())
46
+ return (0, helpers_1.mcpError)(`use needs a template: ${core_1.BUILT_IN_TEMPLATES.map((t) => t.id).join(', ')}`);
47
+ if (!input.title?.trim())
48
+ return (0, helpers_1.mcpError)('use needs a title');
49
+ try {
50
+ const result = (0, template_1.templateCommand)({
51
+ file: (0, helpers_1.resolveBrainfile)(filePath),
52
+ use: input.template.trim(),
53
+ title: input.title.trim(),
54
+ ...(input.description ? { description: input.description } : {}),
55
+ column: input.column?.trim() || 'todo',
56
+ }, new logger_1.MemoryLogger());
57
+ if (!result.success || !result.taskId)
58
+ return (0, helpers_1.mcpError)('the task was not created');
59
+ const output = {
60
+ action,
61
+ task: { id: result.taskId, title: input.title.trim(), template: input.template.trim(), column: result.columnId ?? 'todo' },
62
+ };
63
+ return (0, helpers_1.mcpResult)(`Task added from ${output.task.template}: ${output.task.id} - ${output.task.title}`, output);
64
+ }
65
+ catch (error) {
66
+ return (0, helpers_1.mcpErrorFrom)(error);
67
+ }
68
+ }));
69
+ }
70
+ //# sourceMappingURL=template_tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template_tool.js","sourceRoot":"","sources":["../../../src/mcp/tools/template_tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/server";
2
+ /** `types`: every type and its place in the graph; add one, like `brainfile types add`. */
3
+ export declare function registerTypesTool(server: McpServer, defaultFile: string): void;
4
+ //# sourceMappingURL=types_tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types_tool.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/types_tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAO9D,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAoD9E"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerTypesTool = registerTypesTool;
4
+ const zod_1 = require("zod");
5
+ const types_1 = require("../../commands/types");
6
+ const logger_1 = require("../../utils/logger");
7
+ const helpers_1 = require("../helpers");
8
+ const schemas_1 = require("../schemas");
9
+ /** `types`: every type and its place in the graph; add one, like `brainfile types add`. */
10
+ function registerTypesTool(server, defaultFile) {
11
+ server.registerTool('types', {
12
+ title: 'Document Types',
13
+ description: 'Every document type the board has, with its place in the graph: role, ID prefix, what it goes under (parents) and holds (children), whether it completes; the five built-ins (epic, spec, plan, task, decision) and the board\'s own. action=add saves a type under types: (name; like takes a built-in\'s place, e.g. bug like task; idPrefix; completable; schema). An alias name (adr, issue) cannot be added.',
14
+ inputSchema: zod_1.z.object({
15
+ file: zod_1.z.string().optional().describe('Path to brainfile.md (default: brainfile.md)'),
16
+ action: zod_1.z.enum(['list', 'add']).optional().describe('Default list'),
17
+ name: zod_1.z.string().optional().describe('add: the type name'),
18
+ like: zod_1.z.string().optional().describe('add: the type whose place it takes: epic, spec, plan, task, decision, or one on the board'),
19
+ idPrefix: zod_1.z.string().optional().describe('add: ID prefix (default: the name)'),
20
+ completable: zod_1.z.boolean().optional().describe('add: whether it can be completed (default true, or its like: type\'s rule)'),
21
+ schema: zod_1.z.string().optional().describe('add: a schema URL or path for the type'),
22
+ }),
23
+ outputSchema: schemas_1.typesOutputSchema,
24
+ }, (0, helpers_1.withBoardCommit)('types', defaultFile, async (input) => {
25
+ const filePath = input.file || defaultFile;
26
+ const guard = (0, helpers_1.requireV2)(filePath);
27
+ if (guard)
28
+ return guard;
29
+ const resolved = (0, helpers_1.resolveBrainfile)(filePath);
30
+ const action = input.action ?? 'list';
31
+ try {
32
+ let added;
33
+ if (action === 'add') {
34
+ const saved = (0, types_1.typesAddCommand)({
35
+ file: resolved,
36
+ name: input.name,
37
+ ...(input.idPrefix !== undefined ? { idPrefix: input.idPrefix } : {}),
38
+ ...(input.completable !== undefined ? { completable: input.completable } : {}),
39
+ ...(input.schema !== undefined ? { schema: input.schema } : {}),
40
+ ...(input.like !== undefined ? { like: input.like } : {}),
41
+ }, new logger_1.MemoryLogger());
42
+ added = { name: saved.typeName, entry: { ...saved.entry } };
43
+ }
44
+ const listed = (0, types_1.typesListCommand)({ file: resolved }, new logger_1.MemoryLogger());
45
+ const output = {
46
+ action,
47
+ strict: listed.strict,
48
+ types: listed.types,
49
+ graph: listed.graph,
50
+ aliasEntries: listed.aliasEntries,
51
+ ...(added ? { added } : {}),
52
+ };
53
+ const head = added ? `Saved type '${added.name}'` : `${listed.graph.length} types`;
54
+ return (0, helpers_1.mcpResult)(`${head}\n\n${JSON.stringify(output, null, 2)}`, output);
55
+ }
56
+ catch (error) {
57
+ return (0, helpers_1.mcpErrorFrom)(error);
58
+ }
59
+ }));
60
+ }
61
+ //# sourceMappingURL=types_tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types_tool.js","sourceRoot":"","sources":["../../../src/mcp/tools/types_tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/server";
2
+ /** `where`: where the board lives, how fresh it is, and any other copy of it, like `brainfile where`. Offline unless `fetch`. */
3
+ export declare function registerWhereTool(server: McpServer, defaultFile: string): void;
4
+ //# sourceMappingURL=where_tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where_tool.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/where_tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAS9D,iIAAiI;AACjI,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CA8B9E"}
@@ -0,0 +1,73 @@
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.registerWhereTool = registerWhereTool;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const zod_1 = require("zod");
40
+ const where_1 = require("../../commands/where");
41
+ const board_sync_1 = require("../../utils/board-sync");
42
+ const helpers_1 = require("../helpers");
43
+ const schemas_1 = require("../schemas");
44
+ /** `where`: where the board lives, how fresh it is, and any other copy of it, like `brainfile where`. Offline unless `fetch`. */
45
+ function registerWhereTool(server, defaultFile) {
46
+ server.registerTool('where', {
47
+ title: 'Where Is The Board',
48
+ description: 'Where the board lives (path), how it is stored (plain files, a branch of this repository, or its own repository), the remote it is shared through, when it last synced and whether that worked, and how many changes wait to be sent; every other copy of the board in the repository (boards), and conflict when one disagrees with this one, in which case every write is refused until conflict.resolve is run. Read-only; offline unless fetch.',
49
+ inputSchema: zod_1.z.object({
50
+ file: zod_1.z.string().optional().describe('Path to brainfile.md (default: brainfile.md)'),
51
+ fetch: zod_1.z.boolean().optional().describe('Ask the remote for its copy of the board first'),
52
+ }),
53
+ outputSchema: schemas_1.whereOutputSchema,
54
+ }, async ({ file, fetch }) => {
55
+ const resolved = (0, helpers_1.resolveBrainfile)(file || defaultFile);
56
+ if (!fs.existsSync(resolved))
57
+ return (0, helpers_1.mcpError)(`File not found: ${resolved}`);
58
+ const report = (0, where_1.whereReport)(path.dirname(resolved), { fetch: fetch === true });
59
+ const stored = report.storage === 'plain'
60
+ ? 'plain files, not tracked by git'
61
+ : report.storage === 'branch'
62
+ ? `commits on the '${report.branch}' branch`
63
+ : 'commits in its own repository';
64
+ const shared = report.remote
65
+ ? `shared through ${report.remote}${report.lastSyncSecondsAgo !== null ? `, last synced ${(0, where_1.ago)(report.lastSyncSecondsAgo)}${report.lastSyncOk === false ? ' (failed)' : ''}` : ''}, ${report.pendingChanges} change${report.pendingChanges === 1 ? '' : 's'} waiting`
66
+ : 'not shared';
67
+ const conflict = report.conflict
68
+ ? `\n${report.conflict.message} ${(0, board_sync_1.boardConflictRelation)(report.conflict)} Writes are refused until: ${report.conflict.resolve}`
69
+ : '';
70
+ return (0, helpers_1.mcpResult)(`${report.path}: ${stored}; ${shared}${conflict}\n\n${JSON.stringify(report, null, 2)}`, { ...report });
71
+ });
72
+ }
73
+ //# sourceMappingURL=where_tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where_tool.js","sourceRoot":"","sources":["../../../src/mcp/tools/where_tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,8CA8BC;AAvCD,uCAAyB;AACzB,2CAA6B;AAC7B,6BAAwB;AACxB,gDAAwD;AACxD,uDAA+D;AAC/D,wCAAmE;AACnE,wCAA+C;AAE/C,iIAAiI;AACjI,SAAgB,iBAAiB,CAAC,MAAiB,EAAE,WAAmB;IACtE,MAAM,CAAC,YAAY,CACjB,OAAO,EACP;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,qbAAqb;QAClc,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YACpF,KAAK,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;SACzF,CAAC;QACF,YAAY,EAAE,2BAAiB;KAChC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,IAAA,0BAAgB,EAAC,IAAI,IAAI,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAA,kBAAQ,EAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO;YACvC,CAAC,CAAC,iCAAiC;YACnC,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ;gBAC3B,CAAC,CAAC,mBAAmB,MAAM,CAAC,MAAM,UAAU;gBAC5C,CAAC,CAAC,+BAA+B,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;YAC1B,CAAC,CAAC,kBAAkB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,IAAA,WAAG,EAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,cAAc,UAAU,MAAM,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU;YACpQ,CAAC,CAAC,YAAY,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;YAC9B,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAA,kCAAqB,EAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC/H,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,IAAA,mBAAS,EAAC,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG,QAAQ,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3H,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "types": {
32
32
  "type": "object",
33
- "description": "Optional map of document type definitions. Keys are type identifiers (e.g., 'epic', 'adr') that match the type field in task.json. In strict mode, this map is the allowlist for non-task types; the built-in task type is always implicitly valid. When omitted, all items are standard tasks.",
33
+ "description": "Additions to and overrides of the document types. epic, spec, plan, task and decision are built in and need no entry; an entry under one of their names overrides it, and any other name adds a type, optionally taking a built-in's place with like. Entries under the aliases issue and adr do not configure task or decision. In strict mode a document's type must be built in or listed here.",
34
34
  "additionalProperties": {
35
35
  "$ref": "#/definitions/typeEntry"
36
36
  },
@@ -49,9 +49,25 @@
49
49
  }
50
50
  ]
51
51
  },
52
+ "related": {
53
+ "type": "object",
54
+ "description": "Sister boards in other repositories, by short name. Each value is the repository folder, relative to this repository's root (the project root, not .brainfile/). A task refers to a task on one as alias:task-id, in dependsOn or anywhere a task ID is taken. A folder that is not on this machine is still valid.",
55
+ "propertyNames": {
56
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
57
+ },
58
+ "additionalProperties": {
59
+ "type": "string",
60
+ "minLength": 1
61
+ },
62
+ "examples": [
63
+ {
64
+ "mobile": "../hotline-mobile"
65
+ }
66
+ ]
67
+ },
52
68
  "strict": {
53
69
  "type": "boolean",
54
- "description": "Enables strict validation for CLI operations. When true, add rejects unknown task types and move rejects unknown columns. When false (default), unknown types and columns are allowed for backward compatibility. The task type is always implicitly valid even if not listed in types.",
70
+ "description": "Enables strict validation for CLI operations. When true, add rejects unknown document types, move rejects unknown columns, and add, patch and lint refuse an off-pattern parent. When false (default), unknown types and columns are allowed and an off-pattern parent is a warning. The built-in types (epic, spec, plan, task, decision) are always valid even if not listed in types.",
55
71
  "default": false
56
72
  },
57
73
  "statsConfig": {
@@ -83,20 +99,25 @@
83
99
  "definitions": {
84
100
  "typeEntry": {
85
101
  "type": "object",
86
- "description": "Configuration for a custom document type. Defines how items of this type behave within the board.",
87
- "required": [
88
- "idPrefix"
89
- ],
102
+ "description": "Configuration for a document type: a type of your own, or an override of a built-in. Defines how items of this type behave within the board.",
90
103
  "properties": {
104
+ "like": {
105
+ "type": "string",
106
+ "description": "The built-in type whose place this one takes: its parents, children, completion rule and glyph. One of epic, spec, plan, task, decision (or the aliases issue, adr), or another type on the board. Without like, a type behaves as a task.",
107
+ "examples": [
108
+ "task",
109
+ "spec"
110
+ ]
111
+ },
91
112
  "idPrefix": {
92
113
  "type": "string",
93
- "description": "Prefix for auto-generated IDs of this type (e.g., 'epic' produces 'epic-1', 'epic-2'). Must be unique across all type entries.",
114
+ "description": "Prefix for auto-generated IDs of this type (e.g., 'epic' produces 'epic-1', 'epic-2'). Defaults to the type name.",
94
115
  "pattern": "^[a-z]+(-[a-z]+)*$",
95
116
  "minLength": 1
96
117
  },
97
118
  "completable": {
98
119
  "type": "boolean",
99
- "description": "Whether items of this type can be completed (moved to completion columns and logs/). Defaults to true. Set to false for reference documents like ADRs or epics that are not completable tasks.",
120
+ "description": "Whether items of this type complete when moved to a completion column. Defaults to true, or to the like type's rule. A task is always completable; a decision never is.",
100
121
  "default": true
101
122
  },
102
123
  "schema": {