brainfile 0.18.1 → 0.20.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 (275) 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/__tests__/helpers/mcp.d.ts +34 -0
  7. package/dist/__tests__/helpers/mcp.d.ts.map +1 -0
  8. package/dist/__tests__/helpers/mcp.js +37 -0
  9. package/dist/__tests__/helpers/mcp.js.map +1 -0
  10. package/dist/chunk-I5SJHUZK.mjs +52 -0
  11. package/dist/chunk-UOCQBEEW.mjs +12583 -0
  12. package/dist/cli.js +8 -479
  13. package/dist/cli.mjs +41334 -0
  14. package/dist/commands/add.d.ts.map +1 -1
  15. package/dist/commands/add.js +28 -37
  16. package/dist/commands/add.js.map +1 -1
  17. package/dist/commands/adr.d.ts +1 -9
  18. package/dist/commands/adr.d.ts.map +1 -1
  19. package/dist/commands/adr.js +11 -88
  20. package/dist/commands/adr.js.map +1 -1
  21. package/dist/commands/archive.d.ts +2 -4
  22. package/dist/commands/archive.d.ts.map +1 -1
  23. package/dist/commands/archive.js +55 -212
  24. package/dist/commands/archive.js.map +1 -1
  25. package/dist/commands/brief.d.ts +31 -0
  26. package/dist/commands/brief.d.ts.map +1 -0
  27. package/dist/commands/brief.js +151 -0
  28. package/dist/commands/brief.js.map +1 -0
  29. package/dist/commands/complete.d.ts +0 -4
  30. package/dist/commands/complete.d.ts.map +1 -1
  31. package/dist/commands/complete.js +14 -168
  32. package/dist/commands/complete.js.map +1 -1
  33. package/dist/commands/contract.d.ts.map +1 -1
  34. package/dist/commands/contract.js +66 -331
  35. package/dist/commands/contract.js.map +1 -1
  36. package/dist/commands/delete.d.ts.map +1 -1
  37. package/dist/commands/delete.js +13 -55
  38. package/dist/commands/delete.js.map +1 -1
  39. package/dist/commands/init.d.ts.map +1 -1
  40. package/dist/commands/init.js +3 -2
  41. package/dist/commands/init.js.map +1 -1
  42. package/dist/commands/list.d.ts.map +1 -1
  43. package/dist/commands/list.js +3 -54
  44. package/dist/commands/list.js.map +1 -1
  45. package/dist/commands/log.js +33 -26
  46. package/dist/commands/log.js.map +1 -1
  47. package/dist/commands/mcp.d.ts +9 -0
  48. package/dist/commands/mcp.d.ts.map +1 -1
  49. package/dist/commands/mcp.js +34 -18
  50. package/dist/commands/mcp.js.map +1 -1
  51. package/dist/commands/migrate.d.ts.map +1 -1
  52. package/dist/commands/migrate.js +14 -15
  53. package/dist/commands/migrate.js.map +1 -1
  54. package/dist/commands/move.d.ts.map +1 -1
  55. package/dist/commands/move.js +31 -126
  56. package/dist/commands/move.js.map +1 -1
  57. package/dist/commands/patch.d.ts.map +1 -1
  58. package/dist/commands/patch.js +22 -92
  59. package/dist/commands/patch.js.map +1 -1
  60. package/dist/commands/plan.d.ts +61 -0
  61. package/dist/commands/plan.d.ts.map +1 -0
  62. package/dist/commands/plan.js +205 -0
  63. package/dist/commands/plan.js.map +1 -0
  64. package/dist/commands/search.d.ts.map +1 -1
  65. package/dist/commands/search.js +20 -146
  66. package/dist/commands/search.js.map +1 -1
  67. package/dist/commands/show.d.ts.map +1 -1
  68. package/dist/commands/show.js +5 -126
  69. package/dist/commands/show.js.map +1 -1
  70. package/dist/commands/subtask.d.ts.map +1 -1
  71. package/dist/commands/subtask.js +19 -135
  72. package/dist/commands/subtask.js.map +1 -1
  73. package/dist/commands/types.d.ts +2 -2
  74. package/dist/commands/types.d.ts.map +1 -1
  75. package/dist/commands/types.js +8 -30
  76. package/dist/commands/types.js.map +1 -1
  77. package/dist/devtools-NE5M3KPM.mjs +92 -0
  78. package/dist/lib/contractRunner.d.ts.map +1 -1
  79. package/dist/lib/contractRunner.js +19 -205
  80. package/dist/lib/contractRunner.js.map +1 -1
  81. package/dist/mcp/helpers.d.ts +11 -16
  82. package/dist/mcp/helpers.d.ts.map +1 -1
  83. package/dist/mcp/helpers.js +9 -46
  84. package/dist/mcp/helpers.js.map +1 -1
  85. package/dist/mcp/schemas.d.ts +297 -0
  86. package/dist/mcp/schemas.d.ts.map +1 -0
  87. package/dist/mcp/schemas.js +328 -0
  88. package/dist/mcp/schemas.js.map +1 -0
  89. package/dist/mcp/tools/brief_tool.d.ts +14 -0
  90. package/dist/mcp/tools/brief_tool.d.ts.map +1 -0
  91. package/dist/mcp/tools/brief_tool.js +58 -0
  92. package/dist/mcp/tools/brief_tool.js.map +1 -0
  93. package/dist/mcp/tools/contract_tool.d.ts +1 -1
  94. package/dist/mcp/tools/contract_tool.d.ts.map +1 -1
  95. package/dist/mcp/tools/contract_tool.js +58 -186
  96. package/dist/mcp/tools/contract_tool.js.map +1 -1
  97. package/dist/mcp/tools/get_task_tool.d.ts +1 -1
  98. package/dist/mcp/tools/get_task_tool.d.ts.map +1 -1
  99. package/dist/mcp/tools/get_task_tool.js +18 -32
  100. package/dist/mcp/tools/get_task_tool.js.map +1 -1
  101. package/dist/mcp/tools/list_tasks_tool.d.ts +1 -1
  102. package/dist/mcp/tools/list_tasks_tool.d.ts.map +1 -1
  103. package/dist/mcp/tools/list_tasks_tool.js +14 -45
  104. package/dist/mcp/tools/list_tasks_tool.js.map +1 -1
  105. package/dist/mcp/tools/search_tool.d.ts +1 -1
  106. package/dist/mcp/tools/search_tool.d.ts.map +1 -1
  107. package/dist/mcp/tools/search_tool.js +33 -101
  108. package/dist/mcp/tools/search_tool.js.map +1 -1
  109. package/dist/mcp/tools/subtask_tool.d.ts +1 -1
  110. package/dist/mcp/tools/subtask_tool.d.ts.map +1 -1
  111. package/dist/mcp/tools/subtask_tool.js +95 -236
  112. package/dist/mcp/tools/subtask_tool.js.map +1 -1
  113. package/dist/mcp/tools/task_add_tool.d.ts +1 -1
  114. package/dist/mcp/tools/task_add_tool.d.ts.map +1 -1
  115. package/dist/mcp/tools/task_add_tool.js +63 -154
  116. package/dist/mcp/tools/task_add_tool.js.map +1 -1
  117. package/dist/mcp/tools/task_complete_tool.d.ts +1 -1
  118. package/dist/mcp/tools/task_complete_tool.d.ts.map +1 -1
  119. package/dist/mcp/tools/task_complete_tool.js +59 -127
  120. package/dist/mcp/tools/task_complete_tool.js.map +1 -1
  121. package/dist/mcp/tools/task_delete_tool.d.ts +1 -1
  122. package/dist/mcp/tools/task_delete_tool.d.ts.map +1 -1
  123. package/dist/mcp/tools/task_delete_tool.js +19 -33
  124. package/dist/mcp/tools/task_delete_tool.js.map +1 -1
  125. package/dist/mcp/tools/task_move_tool.d.ts +1 -1
  126. package/dist/mcp/tools/task_move_tool.d.ts.map +1 -1
  127. package/dist/mcp/tools/task_move_tool.js +53 -150
  128. package/dist/mcp/tools/task_move_tool.js.map +1 -1
  129. package/dist/mcp/tools/task_patch_tool.d.ts +1 -1
  130. package/dist/mcp/tools/task_patch_tool.d.ts.map +1 -1
  131. package/dist/mcp/tools/task_patch_tool.js +49 -113
  132. package/dist/mcp/tools/task_patch_tool.js.map +1 -1
  133. package/dist/open-ZGSQIGEH.mjs +542 -0
  134. package/dist/schemas/board.json +1 -1
  135. package/dist/tui/theme.d.ts +74 -95
  136. package/dist/tui/theme.d.ts.map +1 -1
  137. package/dist/tui/theme.js +113 -110
  138. package/dist/tui/theme.js.map +1 -1
  139. package/dist/tui-H3RI22S4.mjs +23374 -0
  140. package/dist/utils/cli-error.d.ts +20 -0
  141. package/dist/utils/cli-error.d.ts.map +1 -1
  142. package/dist/utils/cli-error.js +36 -0
  143. package/dist/utils/cli-error.js.map +1 -1
  144. package/dist/utils/dot-brainfile.d.ts +0 -4
  145. package/dist/utils/dot-brainfile.d.ts.map +1 -1
  146. package/dist/utils/dot-brainfile.js +0 -17
  147. package/dist/utils/dot-brainfile.js.map +1 -1
  148. package/dist/utils/errorHandler.d.ts +7 -11
  149. package/dist/utils/errorHandler.d.ts.map +1 -1
  150. package/dist/utils/errorHandler.js +8 -19
  151. package/dist/utils/errorHandler.js.map +1 -1
  152. package/package.json +24 -16
  153. package/dist/cli.d.ts +0 -3
  154. package/dist/cli.d.ts.map +0 -1
  155. package/dist/cli.js.map +0 -1
  156. package/dist/commands/rules.d.ts +0 -68
  157. package/dist/commands/rules.d.ts.map +0 -1
  158. package/dist/commands/rules.js +0 -322
  159. package/dist/commands/rules.js.map +0 -1
  160. package/dist/commands/tui.d.ts +0 -6
  161. package/dist/commands/tui.d.ts.map +0 -1
  162. package/dist/commands/tui.js +0 -79
  163. package/dist/commands/tui.js.map +0 -1
  164. package/dist/tui/BrainfileTUI.d.ts +0 -4
  165. package/dist/tui/BrainfileTUI.d.ts.map +0 -1
  166. package/dist/tui/BrainfileTUI.js +0 -272
  167. package/dist/tui/BrainfileTUI.js.map +0 -1
  168. package/dist/tui/actions.d.ts +0 -84
  169. package/dist/tui/actions.d.ts.map +0 -1
  170. package/dist/tui/actions.js +0 -1251
  171. package/dist/tui/actions.js.map +0 -1
  172. package/dist/tui/components/ColumnTabs.d.ts +0 -9
  173. package/dist/tui/components/ColumnTabs.d.ts.map +0 -1
  174. package/dist/tui/components/ColumnTabs.js +0 -34
  175. package/dist/tui/components/ColumnTabs.js.map +0 -1
  176. package/dist/tui/components/Header.d.ts +0 -15
  177. package/dist/tui/components/Header.d.ts.map +0 -1
  178. package/dist/tui/components/Header.js +0 -48
  179. package/dist/tui/components/Header.js.map +0 -1
  180. package/dist/tui/components/HelpOverlay.d.ts +0 -9
  181. package/dist/tui/components/HelpOverlay.d.ts.map +0 -1
  182. package/dist/tui/components/HelpOverlay.js +0 -116
  183. package/dist/tui/components/HelpOverlay.js.map +0 -1
  184. package/dist/tui/components/LogsPanel.d.ts +0 -16
  185. package/dist/tui/components/LogsPanel.d.ts.map +0 -1
  186. package/dist/tui/components/LogsPanel.js +0 -115
  187. package/dist/tui/components/LogsPanel.js.map +0 -1
  188. package/dist/tui/components/MainPanelTabs.d.ts +0 -10
  189. package/dist/tui/components/MainPanelTabs.d.ts.map +0 -1
  190. package/dist/tui/components/MainPanelTabs.js +0 -56
  191. package/dist/tui/components/MainPanelTabs.js.map +0 -1
  192. package/dist/tui/components/ManualBorder.d.ts +0 -42
  193. package/dist/tui/components/ManualBorder.d.ts.map +0 -1
  194. package/dist/tui/components/ManualBorder.js +0 -56
  195. package/dist/tui/components/ManualBorder.js.map +0 -1
  196. package/dist/tui/components/Overlays.d.ts +0 -41
  197. package/dist/tui/components/Overlays.d.ts.map +0 -1
  198. package/dist/tui/components/Overlays.js +0 -127
  199. package/dist/tui/components/Overlays.js.map +0 -1
  200. package/dist/tui/components/ProgressBar.d.ts +0 -8
  201. package/dist/tui/components/ProgressBar.d.ts.map +0 -1
  202. package/dist/tui/components/ProgressBar.js +0 -35
  203. package/dist/tui/components/ProgressBar.js.map +0 -1
  204. package/dist/tui/components/RulesPanel.d.ts +0 -25
  205. package/dist/tui/components/RulesPanel.d.ts.map +0 -1
  206. package/dist/tui/components/RulesPanel.js +0 -139
  207. package/dist/tui/components/RulesPanel.js.map +0 -1
  208. package/dist/tui/components/SearchBar.d.ts +0 -8
  209. package/dist/tui/components/SearchBar.d.ts.map +0 -1
  210. package/dist/tui/components/SearchBar.js +0 -38
  211. package/dist/tui/components/SearchBar.js.map +0 -1
  212. package/dist/tui/components/StackedTaskList.d.ts +0 -27
  213. package/dist/tui/components/StackedTaskList.d.ts.map +0 -1
  214. package/dist/tui/components/StackedTaskList.js +0 -120
  215. package/dist/tui/components/StackedTaskList.js.map +0 -1
  216. package/dist/tui/components/StatusBar.d.ts +0 -14
  217. package/dist/tui/components/StatusBar.d.ts.map +0 -1
  218. package/dist/tui/components/StatusBar.js +0 -42
  219. package/dist/tui/components/StatusBar.js.map +0 -1
  220. package/dist/tui/components/TaskCard.d.ts +0 -25
  221. package/dist/tui/components/TaskCard.d.ts.map +0 -1
  222. package/dist/tui/components/TaskCard.js +0 -221
  223. package/dist/tui/components/TaskCard.js.map +0 -1
  224. package/dist/tui/components/TaskCardMeasure.d.ts +0 -31
  225. package/dist/tui/components/TaskCardMeasure.d.ts.map +0 -1
  226. package/dist/tui/components/TaskCardMeasure.js +0 -133
  227. package/dist/tui/components/TaskCardMeasure.js.map +0 -1
  228. package/dist/tui/components/TaskDetail.d.ts +0 -13
  229. package/dist/tui/components/TaskDetail.d.ts.map +0 -1
  230. package/dist/tui/components/TaskDetail.js +0 -64
  231. package/dist/tui/components/TaskDetail.js.map +0 -1
  232. package/dist/tui/components/TaskList.d.ts +0 -12
  233. package/dist/tui/components/TaskList.d.ts.map +0 -1
  234. package/dist/tui/components/TaskList.js +0 -75
  235. package/dist/tui/components/TaskList.js.map +0 -1
  236. package/dist/tui/components/index.d.ts +0 -31
  237. package/dist/tui/components/index.d.ts.map +0 -1
  238. package/dist/tui/components/index.js +0 -43
  239. package/dist/tui/components/index.js.map +0 -1
  240. package/dist/tui/hooks/index.d.ts +0 -3
  241. package/dist/tui/hooks/index.d.ts.map +0 -1
  242. package/dist/tui/hooks/index.js +0 -8
  243. package/dist/tui/hooks/index.js.map +0 -1
  244. package/dist/tui/hooks/useBrainfileLoader.d.ts +0 -5
  245. package/dist/tui/hooks/useBrainfileLoader.d.ts.map +0 -1
  246. package/dist/tui/hooks/useBrainfileLoader.js +0 -237
  247. package/dist/tui/hooks/useBrainfileLoader.js.map +0 -1
  248. package/dist/tui/hooks/useKeyboardNavigation.d.ts +0 -20
  249. package/dist/tui/hooks/useKeyboardNavigation.d.ts.map +0 -1
  250. package/dist/tui/hooks/useKeyboardNavigation.js +0 -806
  251. package/dist/tui/hooks/useKeyboardNavigation.js.map +0 -1
  252. package/dist/tui/index.d.ts +0 -10
  253. package/dist/tui/index.d.ts.map +0 -1
  254. package/dist/tui/index.js +0 -38
  255. package/dist/tui/index.js.map +0 -1
  256. package/dist/tui/types.d.ts +0 -53
  257. package/dist/tui/types.d.ts.map +0 -1
  258. package/dist/tui/types.js +0 -12
  259. package/dist/tui/types.js.map +0 -1
  260. package/dist/tui/utils.d.ts +0 -24
  261. package/dist/tui/utils.d.ts.map +0 -1
  262. package/dist/tui/utils.js +0 -161
  263. package/dist/tui/utils.js.map +0 -1
  264. package/dist/utils/board-types.d.ts +0 -13
  265. package/dist/utils/board-types.d.ts.map +0 -1
  266. package/dist/utils/board-types.js +0 -7
  267. package/dist/utils/board-types.js.map +0 -1
  268. package/dist/utils/contractSpec.d.ts +0 -13
  269. package/dist/utils/contractSpec.d.ts.map +0 -1
  270. package/dist/utils/contractSpec.js +0 -61
  271. package/dist/utils/contractSpec.js.map +0 -1
  272. package/dist/utils/strict-validation.d.ts +0 -8
  273. package/dist/utils/strict-validation.d.ts.map +0 -1
  274. package/dist/utils/strict-validation.js +0 -41
  275. package/dist/utils/strict-validation.js.map +0 -1
@@ -0,0 +1,542 @@
1
+ import { createRequire as __brainfileCreateRequire } from 'node:module';
2
+ import { fileURLToPath as __brainfileFileURLToPath } from 'node:url';
3
+ import { dirname as __brainfileDirname } from 'node:path';
4
+ const require = __brainfileCreateRequire(import.meta.url);
5
+ const __filename = __brainfileFileURLToPath(import.meta.url);
6
+ const __dirname = __brainfileDirname(__filename);
7
+ import "./chunk-I5SJHUZK.mjs";
8
+
9
+ // ../node_modules/open/index.js
10
+ import process6 from "node:process";
11
+ import { Buffer } from "node:buffer";
12
+ import path from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+ import { promisify as promisify5 } from "node:util";
15
+ import childProcess from "node:child_process";
16
+ import fs5, { constants as fsConstants2 } from "node:fs/promises";
17
+
18
+ // ../node_modules/wsl-utils/index.js
19
+ import process2 from "node:process";
20
+ import fs4, { constants as fsConstants } from "node:fs/promises";
21
+
22
+ // ../node_modules/is-wsl/index.js
23
+ import process from "node:process";
24
+ import os from "node:os";
25
+ import fs3 from "node:fs";
26
+
27
+ // ../node_modules/is-inside-container/index.js
28
+ import fs2 from "node:fs";
29
+
30
+ // ../node_modules/is-docker/index.js
31
+ import fs from "node:fs";
32
+ var isDockerCached;
33
+ function hasDockerEnv() {
34
+ try {
35
+ fs.statSync("/.dockerenv");
36
+ return true;
37
+ } catch {
38
+ return false;
39
+ }
40
+ }
41
+ function hasDockerCGroup() {
42
+ try {
43
+ return fs.readFileSync("/proc/self/cgroup", "utf8").includes("docker");
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+ function isDocker() {
49
+ if (isDockerCached === void 0) {
50
+ isDockerCached = hasDockerEnv() || hasDockerCGroup();
51
+ }
52
+ return isDockerCached;
53
+ }
54
+
55
+ // ../node_modules/is-inside-container/index.js
56
+ var cachedResult;
57
+ var hasContainerEnv = () => {
58
+ try {
59
+ fs2.statSync("/run/.containerenv");
60
+ return true;
61
+ } catch {
62
+ return false;
63
+ }
64
+ };
65
+ function isInsideContainer() {
66
+ if (cachedResult === void 0) {
67
+ cachedResult = hasContainerEnv() || isDocker();
68
+ }
69
+ return cachedResult;
70
+ }
71
+
72
+ // ../node_modules/is-wsl/index.js
73
+ var isWsl = () => {
74
+ if (process.platform !== "linux") {
75
+ return false;
76
+ }
77
+ if (os.release().toLowerCase().includes("microsoft")) {
78
+ if (isInsideContainer()) {
79
+ return false;
80
+ }
81
+ return true;
82
+ }
83
+ try {
84
+ if (fs3.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft")) {
85
+ return !isInsideContainer();
86
+ }
87
+ } catch {
88
+ }
89
+ if (fs3.existsSync("/proc/sys/fs/binfmt_misc/WSLInterop") || fs3.existsSync("/run/WSL")) {
90
+ return !isInsideContainer();
91
+ }
92
+ return false;
93
+ };
94
+ var is_wsl_default = process.env.__IS_WSL_TEST__ ? isWsl : isWsl();
95
+
96
+ // ../node_modules/wsl-utils/index.js
97
+ var wslDrivesMountPoint = /* @__PURE__ */ (() => {
98
+ const defaultMountPoint = "/mnt/";
99
+ let mountPoint;
100
+ return async function() {
101
+ if (mountPoint) {
102
+ return mountPoint;
103
+ }
104
+ const configFilePath = "/etc/wsl.conf";
105
+ let isConfigFileExists = false;
106
+ try {
107
+ await fs4.access(configFilePath, fsConstants.F_OK);
108
+ isConfigFileExists = true;
109
+ } catch {
110
+ }
111
+ if (!isConfigFileExists) {
112
+ return defaultMountPoint;
113
+ }
114
+ const configContent = await fs4.readFile(configFilePath, { encoding: "utf8" });
115
+ const configMountPoint = /(?<!#.*)root\s*=\s*(?<mountPoint>.*)/g.exec(configContent);
116
+ if (!configMountPoint) {
117
+ return defaultMountPoint;
118
+ }
119
+ mountPoint = configMountPoint.groups.mountPoint.trim();
120
+ mountPoint = mountPoint.endsWith("/") ? mountPoint : `${mountPoint}/`;
121
+ return mountPoint;
122
+ };
123
+ })();
124
+ var powerShellPathFromWsl = async () => {
125
+ const mountPoint = await wslDrivesMountPoint();
126
+ return `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;
127
+ };
128
+ var powerShellPath = async () => {
129
+ if (is_wsl_default) {
130
+ return powerShellPathFromWsl();
131
+ }
132
+ return `${process2.env.SYSTEMROOT || process2.env.windir || String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;
133
+ };
134
+
135
+ // ../node_modules/define-lazy-prop/index.js
136
+ function defineLazyProperty(object, propertyName, valueGetter) {
137
+ const define = (value) => Object.defineProperty(object, propertyName, { value, enumerable: true, writable: true });
138
+ Object.defineProperty(object, propertyName, {
139
+ configurable: true,
140
+ enumerable: true,
141
+ get() {
142
+ const result = valueGetter();
143
+ define(result);
144
+ return result;
145
+ },
146
+ set(value) {
147
+ define(value);
148
+ }
149
+ });
150
+ return object;
151
+ }
152
+
153
+ // ../node_modules/default-browser/index.js
154
+ import { promisify as promisify4 } from "node:util";
155
+ import process5 from "node:process";
156
+ import { execFile as execFile4 } from "node:child_process";
157
+
158
+ // ../node_modules/default-browser-id/index.js
159
+ import { promisify } from "node:util";
160
+ import process3 from "node:process";
161
+ import { execFile } from "node:child_process";
162
+ var execFileAsync = promisify(execFile);
163
+ async function defaultBrowserId() {
164
+ if (process3.platform !== "darwin") {
165
+ throw new Error("macOS only");
166
+ }
167
+ const { stdout } = await execFileAsync("defaults", ["read", "com.apple.LaunchServices/com.apple.launchservices.secure", "LSHandlers"]);
168
+ const match = /LSHandlerRoleAll = "(?!-)(?<id>[^"]+?)";\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);
169
+ const browserId = match?.groups.id ?? "com.apple.Safari";
170
+ if (browserId === "com.apple.safari") {
171
+ return "com.apple.Safari";
172
+ }
173
+ return browserId;
174
+ }
175
+
176
+ // ../node_modules/run-applescript/index.js
177
+ import process4 from "node:process";
178
+ import { promisify as promisify2 } from "node:util";
179
+ import { execFile as execFile2, execFileSync } from "node:child_process";
180
+ var execFileAsync2 = promisify2(execFile2);
181
+ async function runAppleScript(script, { humanReadableOutput = true, signal } = {}) {
182
+ if (process4.platform !== "darwin") {
183
+ throw new Error("macOS only");
184
+ }
185
+ const outputArguments = humanReadableOutput ? [] : ["-ss"];
186
+ const execOptions = {};
187
+ if (signal) {
188
+ execOptions.signal = signal;
189
+ }
190
+ const { stdout } = await execFileAsync2("osascript", ["-e", script, outputArguments], execOptions);
191
+ return stdout.trim();
192
+ }
193
+
194
+ // ../node_modules/bundle-name/index.js
195
+ async function bundleName(bundleId) {
196
+ return runAppleScript(`tell application "Finder" to set app_path to application file id "${bundleId}" as string
197
+ tell application "System Events" to get value of property list item "CFBundleName" of property list file (app_path & ":Contents:Info.plist")`);
198
+ }
199
+
200
+ // ../node_modules/default-browser/windows.js
201
+ import { promisify as promisify3 } from "node:util";
202
+ import { execFile as execFile3 } from "node:child_process";
203
+ var execFileAsync3 = promisify3(execFile3);
204
+ var windowsBrowserProgIds = {
205
+ MSEdgeHTM: { name: "Edge", id: "com.microsoft.edge" },
206
+ // The missing `L` is correct.
207
+ MSEdgeBHTML: { name: "Edge Beta", id: "com.microsoft.edge.beta" },
208
+ MSEdgeDHTML: { name: "Edge Dev", id: "com.microsoft.edge.dev" },
209
+ AppXq0fevzme2pys62n3e0fbqa7peapykr8v: { name: "Edge", id: "com.microsoft.edge.old" },
210
+ ChromeHTML: { name: "Chrome", id: "com.google.chrome" },
211
+ ChromeBHTML: { name: "Chrome Beta", id: "com.google.chrome.beta" },
212
+ ChromeDHTML: { name: "Chrome Dev", id: "com.google.chrome.dev" },
213
+ ChromiumHTM: { name: "Chromium", id: "org.chromium.Chromium" },
214
+ BraveHTML: { name: "Brave", id: "com.brave.Browser" },
215
+ BraveBHTML: { name: "Brave Beta", id: "com.brave.Browser.beta" },
216
+ BraveDHTML: { name: "Brave Dev", id: "com.brave.Browser.dev" },
217
+ BraveSSHTM: { name: "Brave Nightly", id: "com.brave.Browser.nightly" },
218
+ FirefoxURL: { name: "Firefox", id: "org.mozilla.firefox" },
219
+ OperaStable: { name: "Opera", id: "com.operasoftware.Opera" },
220
+ VivaldiHTM: { name: "Vivaldi", id: "com.vivaldi.Vivaldi" },
221
+ "IE.HTTP": { name: "Internet Explorer", id: "com.microsoft.ie" }
222
+ };
223
+ var _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));
224
+ var UnknownBrowserError = class extends Error {
225
+ };
226
+ async function defaultBrowser(_execFileAsync = execFileAsync3) {
227
+ const { stdout } = await _execFileAsync("reg", [
228
+ "QUERY",
229
+ " HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice",
230
+ "/v",
231
+ "ProgId"
232
+ ]);
233
+ const match = /ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(stdout);
234
+ if (!match) {
235
+ throw new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);
236
+ }
237
+ const { id } = match.groups;
238
+ const dotIndex = id.lastIndexOf(".");
239
+ const hyphenIndex = id.lastIndexOf("-");
240
+ const baseIdByDot = dotIndex === -1 ? void 0 : id.slice(0, dotIndex);
241
+ const baseIdByHyphen = hyphenIndex === -1 ? void 0 : id.slice(0, hyphenIndex);
242
+ return windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? { name: id, id };
243
+ }
244
+
245
+ // ../node_modules/default-browser/index.js
246
+ var execFileAsync4 = promisify4(execFile4);
247
+ var titleize = (string) => string.toLowerCase().replaceAll(/(?:^|\s|-)\S/g, (x) => x.toUpperCase());
248
+ async function defaultBrowser2() {
249
+ if (process5.platform === "darwin") {
250
+ const id = await defaultBrowserId();
251
+ const name = await bundleName(id);
252
+ return { name, id };
253
+ }
254
+ if (process5.platform === "linux") {
255
+ const { stdout } = await execFileAsync4("xdg-mime", ["query", "default", "x-scheme-handler/http"]);
256
+ const id = stdout.trim();
257
+ const name = titleize(id.replace(/.desktop$/, "").replace("-", " "));
258
+ return { name, id };
259
+ }
260
+ if (process5.platform === "win32") {
261
+ return defaultBrowser();
262
+ }
263
+ throw new Error("Only macOS, Linux, and Windows are supported");
264
+ }
265
+
266
+ // ../node_modules/open/index.js
267
+ var execFile5 = promisify5(childProcess.execFile);
268
+ var __dirname = path.dirname(fileURLToPath(import.meta.url));
269
+ var localXdgOpenPath = path.join(__dirname, "xdg-open");
270
+ var { platform, arch } = process6;
271
+ async function getWindowsDefaultBrowserFromWsl() {
272
+ const powershellPath = await powerShellPath();
273
+ const rawCommand = String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`;
274
+ const encodedCommand = Buffer.from(rawCommand, "utf16le").toString("base64");
275
+ const { stdout } = await execFile5(
276
+ powershellPath,
277
+ [
278
+ "-NoProfile",
279
+ "-NonInteractive",
280
+ "-ExecutionPolicy",
281
+ "Bypass",
282
+ "-EncodedCommand",
283
+ encodedCommand
284
+ ],
285
+ { encoding: "utf8" }
286
+ );
287
+ const progId = stdout.trim();
288
+ const browserMap = {
289
+ ChromeHTML: "com.google.chrome",
290
+ BraveHTML: "com.brave.Browser",
291
+ MSEdgeHTM: "com.microsoft.edge",
292
+ FirefoxURL: "org.mozilla.firefox"
293
+ };
294
+ return browserMap[progId] ? { id: browserMap[progId] } : {};
295
+ }
296
+ var pTryEach = async (array, mapper) => {
297
+ let latestError;
298
+ for (const item of array) {
299
+ try {
300
+ return await mapper(item);
301
+ } catch (error) {
302
+ latestError = error;
303
+ }
304
+ }
305
+ throw latestError;
306
+ };
307
+ var baseOpen = async (options) => {
308
+ options = {
309
+ wait: false,
310
+ background: false,
311
+ newInstance: false,
312
+ allowNonzeroExitCode: false,
313
+ ...options
314
+ };
315
+ if (Array.isArray(options.app)) {
316
+ return pTryEach(options.app, (singleApp) => baseOpen({
317
+ ...options,
318
+ app: singleApp
319
+ }));
320
+ }
321
+ let { name: app, arguments: appArguments = [] } = options.app ?? {};
322
+ appArguments = [...appArguments];
323
+ if (Array.isArray(app)) {
324
+ return pTryEach(app, (appName) => baseOpen({
325
+ ...options,
326
+ app: {
327
+ name: appName,
328
+ arguments: appArguments
329
+ }
330
+ }));
331
+ }
332
+ if (app === "browser" || app === "browserPrivate") {
333
+ const ids = {
334
+ "com.google.chrome": "chrome",
335
+ "google-chrome.desktop": "chrome",
336
+ "com.brave.Browser": "brave",
337
+ "org.mozilla.firefox": "firefox",
338
+ "firefox.desktop": "firefox",
339
+ "com.microsoft.msedge": "edge",
340
+ "com.microsoft.edge": "edge",
341
+ "com.microsoft.edgemac": "edge",
342
+ "microsoft-edge.desktop": "edge"
343
+ };
344
+ const flags = {
345
+ chrome: "--incognito",
346
+ brave: "--incognito",
347
+ firefox: "--private-window",
348
+ edge: "--inPrivate"
349
+ };
350
+ const browser = is_wsl_default ? await getWindowsDefaultBrowserFromWsl() : await defaultBrowser2();
351
+ if (browser.id in ids) {
352
+ const browserName = ids[browser.id];
353
+ if (app === "browserPrivate") {
354
+ appArguments.push(flags[browserName]);
355
+ }
356
+ return baseOpen({
357
+ ...options,
358
+ app: {
359
+ name: apps[browserName],
360
+ arguments: appArguments
361
+ }
362
+ });
363
+ }
364
+ throw new Error(`${browser.name} is not supported as a default browser`);
365
+ }
366
+ let command;
367
+ const cliArguments = [];
368
+ const childProcessOptions = {};
369
+ if (platform === "darwin") {
370
+ command = "open";
371
+ if (options.wait) {
372
+ cliArguments.push("--wait-apps");
373
+ }
374
+ if (options.background) {
375
+ cliArguments.push("--background");
376
+ }
377
+ if (options.newInstance) {
378
+ cliArguments.push("--new");
379
+ }
380
+ if (app) {
381
+ cliArguments.push("-a", app);
382
+ }
383
+ } else if (platform === "win32" || is_wsl_default && !isInsideContainer() && !app) {
384
+ command = await powerShellPath();
385
+ cliArguments.push(
386
+ "-NoProfile",
387
+ "-NonInteractive",
388
+ "-ExecutionPolicy",
389
+ "Bypass",
390
+ "-EncodedCommand"
391
+ );
392
+ if (!is_wsl_default) {
393
+ childProcessOptions.windowsVerbatimArguments = true;
394
+ }
395
+ const encodedArguments = ["Start"];
396
+ if (options.wait) {
397
+ encodedArguments.push("-Wait");
398
+ }
399
+ if (app) {
400
+ encodedArguments.push(`"\`"${app}\`""`);
401
+ if (options.target) {
402
+ appArguments.push(options.target);
403
+ }
404
+ } else if (options.target) {
405
+ encodedArguments.push(`"${options.target}"`);
406
+ }
407
+ if (appArguments.length > 0) {
408
+ appArguments = appArguments.map((argument) => `"\`"${argument}\`""`);
409
+ encodedArguments.push("-ArgumentList", appArguments.join(","));
410
+ }
411
+ options.target = Buffer.from(encodedArguments.join(" "), "utf16le").toString("base64");
412
+ } else {
413
+ if (app) {
414
+ command = app;
415
+ } else {
416
+ const isBundled = !__dirname || __dirname === "/";
417
+ let exeLocalXdgOpen = false;
418
+ try {
419
+ await fs5.access(localXdgOpenPath, fsConstants2.X_OK);
420
+ exeLocalXdgOpen = true;
421
+ } catch {
422
+ }
423
+ const useSystemXdgOpen = process6.versions.electron ?? (platform === "android" || isBundled || !exeLocalXdgOpen);
424
+ command = useSystemXdgOpen ? "xdg-open" : localXdgOpenPath;
425
+ }
426
+ if (appArguments.length > 0) {
427
+ cliArguments.push(...appArguments);
428
+ }
429
+ if (!options.wait) {
430
+ childProcessOptions.stdio = "ignore";
431
+ childProcessOptions.detached = true;
432
+ }
433
+ }
434
+ if (platform === "darwin" && appArguments.length > 0) {
435
+ cliArguments.push("--args", ...appArguments);
436
+ }
437
+ if (options.target) {
438
+ cliArguments.push(options.target);
439
+ }
440
+ const subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);
441
+ if (options.wait) {
442
+ return new Promise((resolve, reject) => {
443
+ subprocess.once("error", reject);
444
+ subprocess.once("close", (exitCode) => {
445
+ if (!options.allowNonzeroExitCode && exitCode > 0) {
446
+ reject(new Error(`Exited with code ${exitCode}`));
447
+ return;
448
+ }
449
+ resolve(subprocess);
450
+ });
451
+ });
452
+ }
453
+ subprocess.unref();
454
+ return subprocess;
455
+ };
456
+ var open = (target, options) => {
457
+ if (typeof target !== "string") {
458
+ throw new TypeError("Expected a `target`");
459
+ }
460
+ return baseOpen({
461
+ ...options,
462
+ target
463
+ });
464
+ };
465
+ var openApp = (name, options) => {
466
+ if (typeof name !== "string" && !Array.isArray(name)) {
467
+ throw new TypeError("Expected a valid `name`");
468
+ }
469
+ const { arguments: appArguments = [] } = options ?? {};
470
+ if (appArguments !== void 0 && appArguments !== null && !Array.isArray(appArguments)) {
471
+ throw new TypeError("Expected `appArguments` as Array type");
472
+ }
473
+ return baseOpen({
474
+ ...options,
475
+ app: {
476
+ name,
477
+ arguments: appArguments
478
+ }
479
+ });
480
+ };
481
+ function detectArchBinary(binary) {
482
+ if (typeof binary === "string" || Array.isArray(binary)) {
483
+ return binary;
484
+ }
485
+ const { [arch]: archBinary } = binary;
486
+ if (!archBinary) {
487
+ throw new Error(`${arch} is not supported`);
488
+ }
489
+ return archBinary;
490
+ }
491
+ function detectPlatformBinary({ [platform]: platformBinary }, { wsl }) {
492
+ if (wsl && is_wsl_default) {
493
+ return detectArchBinary(wsl);
494
+ }
495
+ if (!platformBinary) {
496
+ throw new Error(`${platform} is not supported`);
497
+ }
498
+ return detectArchBinary(platformBinary);
499
+ }
500
+ var apps = {};
501
+ defineLazyProperty(apps, "chrome", () => detectPlatformBinary({
502
+ darwin: "google chrome",
503
+ win32: "chrome",
504
+ linux: ["google-chrome", "google-chrome-stable", "chromium"]
505
+ }, {
506
+ wsl: {
507
+ ia32: "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe",
508
+ x64: ["/mnt/c/Program Files/Google/Chrome/Application/chrome.exe", "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"]
509
+ }
510
+ }));
511
+ defineLazyProperty(apps, "brave", () => detectPlatformBinary({
512
+ darwin: "brave browser",
513
+ win32: "brave",
514
+ linux: ["brave-browser", "brave"]
515
+ }, {
516
+ wsl: {
517
+ ia32: "/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe",
518
+ x64: ["/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe", "/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe"]
519
+ }
520
+ }));
521
+ defineLazyProperty(apps, "firefox", () => detectPlatformBinary({
522
+ darwin: "firefox",
523
+ win32: String.raw`C:\Program Files\Mozilla Firefox\firefox.exe`,
524
+ linux: "firefox"
525
+ }, {
526
+ wsl: "/mnt/c/Program Files/Mozilla Firefox/firefox.exe"
527
+ }));
528
+ defineLazyProperty(apps, "edge", () => detectPlatformBinary({
529
+ darwin: "microsoft edge",
530
+ win32: "msedge",
531
+ linux: ["microsoft-edge", "microsoft-edge-dev"]
532
+ }, {
533
+ wsl: "/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"
534
+ }));
535
+ defineLazyProperty(apps, "browser", () => "browser");
536
+ defineLazyProperty(apps, "browserPrivate", () => "browserPrivate");
537
+ var open_default = open;
538
+ export {
539
+ apps,
540
+ open_default as default,
541
+ openApp
542
+ };
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://brainfile.md/v1/board.json",
4
4
  "title": "Brainfile Board Schema",
5
- "description": "Schema for Kanban-style task boards. In v2 (per-task file architecture), the board file is config-only: it defines columns, rules, and project metadata. Tasks are standalone .md files in .brainfile/tasks/ (active) and .brainfile/logs/ (completed), each validated against task.json. In v1 (legacy), tasks are embedded in column arrays within this file.",
5
+ "description": "Schema for Kanban-style task boards. In v2 (per-task file architecture), the board file is config-only: it defines columns, document types, and project metadata. Tasks are standalone .md files in .brainfile/tasks/ (active) and .brainfile/logs/ (completed), each validated against task.json. In v1 (legacy), tasks are embedded in column arrays within this file.",
6
6
  "x-brainfile-renderer": "kanban",
7
7
  "x-brainfile-columns-path": "$.columns",
8
8
  "x-brainfile-title-field": "title",