brainfile 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +222 -0
- package/dist/__tests__/helpers/v2.d.ts +12 -0
- package/dist/__tests__/helpers/v2.d.ts.map +1 -0
- package/dist/__tests__/helpers/v2.js +73 -0
- package/dist/__tests__/helpers/v2.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +480 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +34 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +255 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/adr.d.ts +22 -0
- package/dist/commands/adr.d.ts.map +1 -0
- package/dist/commands/adr.js +195 -0
- package/dist/commands/adr.js.map +1 -0
- package/dist/commands/archive.d.ts +20 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +590 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/auth.d.ts +26 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +245 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/complete.d.ts +30 -0
- package/dist/commands/complete.d.ts.map +1 -0
- package/dist/commands/complete.js +267 -0
- package/dist/commands/complete.js.map +1 -0
- package/dist/commands/config.d.ts +29 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +210 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/contract.d.ts +84 -0
- package/dist/commands/contract.d.ts.map +1 -0
- package/dist/commands/contract.js +715 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/delete.d.ts +8 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +139 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/hooks.d.ts +35 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +324 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +118 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +16 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +123 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/list.d.ts +20 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +175 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/log.d.ts +52 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +246 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +96 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/migrate.d.ts +16 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +388 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/move.d.ts +16 -0
- package/dist/commands/move.d.ts.map +1 -0
- package/dist/commands/move.js +225 -0
- package/dist/commands/move.js.map +1 -0
- package/dist/commands/patch.d.ts +17 -0
- package/dist/commands/patch.d.ts.map +1 -0
- package/dist/commands/patch.js +226 -0
- package/dist/commands/patch.js.map +1 -0
- package/dist/commands/restore.d.ts +8 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +111 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/rules.d.ts +68 -0
- package/dist/commands/rules.d.ts.map +1 -0
- package/dist/commands/rules.js +322 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/commands/schema.d.ts +31 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +374 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +33 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +209 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/show.d.ts +20 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +272 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/subtask.d.ts +12 -0
- package/dist/commands/subtask.d.ts.map +1 -0
- package/dist/commands/subtask.js +212 -0
- package/dist/commands/subtask.js.map +1 -0
- package/dist/commands/template.d.ts +17 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +149 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/tui.d.ts +6 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +79 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/types.d.ts +40 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +242 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/contractRunner.d.ts +59 -0
- package/dist/lib/contractRunner.d.ts.map +1 -0
- package/dist/lib/contractRunner.js +511 -0
- package/dist/lib/contractRunner.js.map +1 -0
- package/dist/mcp/helpers.d.ts +32 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +125 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/tools/contract.d.ts +25 -0
- package/dist/mcp/tools/contract.d.ts.map +1 -0
- package/dist/mcp/tools/contract.js +33 -0
- package/dist/mcp/tools/contract.js.map +1 -0
- package/dist/mcp/tools/contract_tool.d.ts +3 -0
- package/dist/mcp/tools/contract_tool.d.ts.map +1 -0
- package/dist/mcp/tools/contract_tool.js +328 -0
- package/dist/mcp/tools/contract_tool.js.map +1 -0
- package/dist/mcp/tools/get_task_tool.d.ts +3 -0
- package/dist/mcp/tools/get_task_tool.d.ts.map +1 -0
- package/dist/mcp/tools/get_task_tool.js +55 -0
- package/dist/mcp/tools/get_task_tool.js.map +1 -0
- package/dist/mcp/tools/list_tasks_tool.d.ts +3 -0
- package/dist/mcp/tools/list_tasks_tool.d.ts.map +1 -0
- package/dist/mcp/tools/list_tasks_tool.js +82 -0
- package/dist/mcp/tools/list_tasks_tool.js.map +1 -0
- package/dist/mcp/tools/search_tool.d.ts +3 -0
- package/dist/mcp/tools/search_tool.d.ts.map +1 -0
- package/dist/mcp/tools/search_tool.js +155 -0
- package/dist/mcp/tools/search_tool.js.map +1 -0
- package/dist/mcp/tools/subtask_tool.d.ts +3 -0
- package/dist/mcp/tools/subtask_tool.d.ts.map +1 -0
- package/dist/mcp/tools/subtask_tool.js +321 -0
- package/dist/mcp/tools/subtask_tool.js.map +1 -0
- package/dist/mcp/tools/task_add_tool.d.ts +3 -0
- package/dist/mcp/tools/task_add_tool.d.ts.map +1 -0
- package/dist/mcp/tools/task_add_tool.js +196 -0
- package/dist/mcp/tools/task_add_tool.js.map +1 -0
- package/dist/mcp/tools/task_complete_tool.d.ts +3 -0
- package/dist/mcp/tools/task_complete_tool.d.ts.map +1 -0
- package/dist/mcp/tools/task_complete_tool.js +265 -0
- package/dist/mcp/tools/task_complete_tool.js.map +1 -0
- package/dist/mcp/tools/task_delete_tool.d.ts +3 -0
- package/dist/mcp/tools/task_delete_tool.d.ts.map +1 -0
- package/dist/mcp/tools/task_delete_tool.js +87 -0
- package/dist/mcp/tools/task_delete_tool.js.map +1 -0
- package/dist/mcp/tools/task_move_tool.d.ts +3 -0
- package/dist/mcp/tools/task_move_tool.d.ts.map +1 -0
- package/dist/mcp/tools/task_move_tool.js +187 -0
- package/dist/mcp/tools/task_move_tool.js.map +1 -0
- package/dist/mcp/tools/task_patch_tool.d.ts +3 -0
- package/dist/mcp/tools/task_patch_tool.d.ts.map +1 -0
- package/dist/mcp/tools/task_patch_tool.js +189 -0
- package/dist/mcp/tools/task_patch_tool.js.map +1 -0
- package/dist/schemas/base.json +159 -0
- package/dist/schemas/board.json +290 -0
- package/dist/tui/BrainfileTUI.d.ts +4 -0
- package/dist/tui/BrainfileTUI.d.ts.map +1 -0
- package/dist/tui/BrainfileTUI.js +272 -0
- package/dist/tui/BrainfileTUI.js.map +1 -0
- package/dist/tui/actions.d.ts +84 -0
- package/dist/tui/actions.d.ts.map +1 -0
- package/dist/tui/actions.js +1251 -0
- package/dist/tui/actions.js.map +1 -0
- package/dist/tui/components/ColumnTabs.d.ts +9 -0
- package/dist/tui/components/ColumnTabs.d.ts.map +1 -0
- package/dist/tui/components/ColumnTabs.js +34 -0
- package/dist/tui/components/ColumnTabs.js.map +1 -0
- package/dist/tui/components/Header.d.ts +15 -0
- package/dist/tui/components/Header.d.ts.map +1 -0
- package/dist/tui/components/Header.js +48 -0
- package/dist/tui/components/Header.js.map +1 -0
- package/dist/tui/components/HelpOverlay.d.ts +9 -0
- package/dist/tui/components/HelpOverlay.d.ts.map +1 -0
- package/dist/tui/components/HelpOverlay.js +116 -0
- package/dist/tui/components/HelpOverlay.js.map +1 -0
- package/dist/tui/components/LogsPanel.d.ts +16 -0
- package/dist/tui/components/LogsPanel.d.ts.map +1 -0
- package/dist/tui/components/LogsPanel.js +115 -0
- package/dist/tui/components/LogsPanel.js.map +1 -0
- package/dist/tui/components/MainPanelTabs.d.ts +10 -0
- package/dist/tui/components/MainPanelTabs.d.ts.map +1 -0
- package/dist/tui/components/MainPanelTabs.js +56 -0
- package/dist/tui/components/MainPanelTabs.js.map +1 -0
- package/dist/tui/components/ManualBorder.d.ts +42 -0
- package/dist/tui/components/ManualBorder.d.ts.map +1 -0
- package/dist/tui/components/ManualBorder.js +56 -0
- package/dist/tui/components/ManualBorder.js.map +1 -0
- package/dist/tui/components/Overlays.d.ts +41 -0
- package/dist/tui/components/Overlays.d.ts.map +1 -0
- package/dist/tui/components/Overlays.js +127 -0
- package/dist/tui/components/Overlays.js.map +1 -0
- package/dist/tui/components/ProgressBar.d.ts +8 -0
- package/dist/tui/components/ProgressBar.d.ts.map +1 -0
- package/dist/tui/components/ProgressBar.js +35 -0
- package/dist/tui/components/ProgressBar.js.map +1 -0
- package/dist/tui/components/RulesPanel.d.ts +25 -0
- package/dist/tui/components/RulesPanel.d.ts.map +1 -0
- package/dist/tui/components/RulesPanel.js +139 -0
- package/dist/tui/components/RulesPanel.js.map +1 -0
- package/dist/tui/components/SearchBar.d.ts +8 -0
- package/dist/tui/components/SearchBar.d.ts.map +1 -0
- package/dist/tui/components/SearchBar.js +38 -0
- package/dist/tui/components/SearchBar.js.map +1 -0
- package/dist/tui/components/StackedTaskList.d.ts +27 -0
- package/dist/tui/components/StackedTaskList.d.ts.map +1 -0
- package/dist/tui/components/StackedTaskList.js +120 -0
- package/dist/tui/components/StackedTaskList.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +14 -0
- package/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/tui/components/StatusBar.js +42 -0
- package/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/tui/components/TaskCard.d.ts +25 -0
- package/dist/tui/components/TaskCard.d.ts.map +1 -0
- package/dist/tui/components/TaskCard.js +221 -0
- package/dist/tui/components/TaskCard.js.map +1 -0
- package/dist/tui/components/TaskCardMeasure.d.ts +31 -0
- package/dist/tui/components/TaskCardMeasure.d.ts.map +1 -0
- package/dist/tui/components/TaskCardMeasure.js +133 -0
- package/dist/tui/components/TaskCardMeasure.js.map +1 -0
- package/dist/tui/components/TaskDetail.d.ts +13 -0
- package/dist/tui/components/TaskDetail.d.ts.map +1 -0
- package/dist/tui/components/TaskDetail.js +64 -0
- package/dist/tui/components/TaskDetail.js.map +1 -0
- package/dist/tui/components/TaskList.d.ts +12 -0
- package/dist/tui/components/TaskList.d.ts.map +1 -0
- package/dist/tui/components/TaskList.js +75 -0
- package/dist/tui/components/TaskList.js.map +1 -0
- package/dist/tui/components/index.d.ts +31 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +43 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/hooks/index.d.ts +3 -0
- package/dist/tui/hooks/index.d.ts.map +1 -0
- package/dist/tui/hooks/index.js +8 -0
- package/dist/tui/hooks/index.js.map +1 -0
- package/dist/tui/hooks/useBrainfileLoader.d.ts +5 -0
- package/dist/tui/hooks/useBrainfileLoader.d.ts.map +1 -0
- package/dist/tui/hooks/useBrainfileLoader.js +237 -0
- package/dist/tui/hooks/useBrainfileLoader.js.map +1 -0
- package/dist/tui/hooks/useKeyboardNavigation.d.ts +20 -0
- package/dist/tui/hooks/useKeyboardNavigation.d.ts.map +1 -0
- package/dist/tui/hooks/useKeyboardNavigation.js +806 -0
- package/dist/tui/hooks/useKeyboardNavigation.js.map +1 -0
- package/dist/tui/index.d.ts +10 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +38 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/theme.d.ts +119 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +138 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.d.ts +53 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +12 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui/utils.d.ts +24 -0
- package/dist/tui/utils.d.ts.map +1 -0
- package/dist/tui/utils.js +161 -0
- package/dist/tui/utils.js.map +1 -0
- package/dist/utils/archive.d.ts +57 -0
- package/dist/utils/archive.d.ts.map +1 -0
- package/dist/utils/archive.js +304 -0
- package/dist/utils/archive.js.map +1 -0
- package/dist/utils/auth-store.d.ts +69 -0
- package/dist/utils/auth-store.d.ts.map +1 -0
- package/dist/utils/auth-store.js +308 -0
- package/dist/utils/auth-store.js.map +1 -0
- package/dist/utils/board-types.d.ts +13 -0
- package/dist/utils/board-types.d.ts.map +1 -0
- package/dist/utils/board-types.js +7 -0
- package/dist/utils/board-types.js.map +1 -0
- package/dist/utils/brainfile-finder.d.ts +12 -0
- package/dist/utils/brainfile-finder.d.ts.map +1 -0
- package/dist/utils/brainfile-finder.js +69 -0
- package/dist/utils/brainfile-finder.js.map +1 -0
- package/dist/utils/brainfile-path.d.ts +10 -0
- package/dist/utils/brainfile-path.d.ts.map +1 -0
- package/dist/utils/brainfile-path.js +88 -0
- package/dist/utils/brainfile-path.js.map +1 -0
- package/dist/utils/cli-error.d.ts +44 -0
- package/dist/utils/cli-error.d.ts.map +1 -0
- package/dist/utils/cli-error.js +85 -0
- package/dist/utils/cli-error.js.map +1 -0
- package/dist/utils/config.d.ts +119 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +304 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/contractSpec.d.ts +13 -0
- package/dist/utils/contractSpec.d.ts.map +1 -0
- package/dist/utils/contractSpec.js +61 -0
- package/dist/utils/contractSpec.js.map +1 -0
- package/dist/utils/dot-brainfile.d.ts +9 -0
- package/dist/utils/dot-brainfile.d.ts.map +1 -0
- package/dist/utils/dot-brainfile.js +74 -0
- package/dist/utils/dot-brainfile.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +106 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +223 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/git-helper.d.ts +17 -0
- package/dist/utils/git-helper.d.ts.map +1 -0
- package/dist/utils/git-helper.js +62 -0
- package/dist/utils/git-helper.js.map +1 -0
- package/dist/utils/github-auth.d.ts +56 -0
- package/dist/utils/github-auth.d.ts.map +1 -0
- package/dist/utils/github-auth.js +341 -0
- package/dist/utils/github-auth.js.map +1 -0
- package/dist/utils/hook-parser.d.ts +15 -0
- package/dist/utils/hook-parser.d.ts.map +1 -0
- package/dist/utils/hook-parser.js +69 -0
- package/dist/utils/hook-parser.js.map +1 -0
- package/dist/utils/hook-settings.d.ts +27 -0
- package/dist/utils/hook-settings.d.ts.map +1 -0
- package/dist/utils/hook-settings.js +364 -0
- package/dist/utils/hook-settings.js.map +1 -0
- package/dist/utils/linear-auth.d.ts +59 -0
- package/dist/utils/linear-auth.d.ts.map +1 -0
- package/dist/utils/linear-auth.js +295 -0
- package/dist/utils/linear-auth.js.map +1 -0
- package/dist/utils/logger.d.ts +34 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/strict-validation.d.ts +8 -0
- package/dist/utils/strict-validation.d.ts.map +1 -0
- package/dist/utils/strict-validation.js +41 -0
- package/dist/utils/strict-validation.js.map +1 -0
- package/dist/utils/v2-detect.d.ts +28 -0
- package/dist/utils/v2-detect.d.ts.map +1 -0
- package/dist/utils/v2-detect.js +112 -0
- package/dist/utils/v2-detect.js.map +1 -0
- package/dist/utils/v2-only.d.ts +9 -0
- package/dist/utils/v2-only.d.ts.map +1 -0
- package/dist/utils/v2-only.js +64 -0
- package/dist/utils/v2-only.js.map +1 -0
- package/dist/utils/workspace-format.d.ts +25 -0
- package/dist/utils/workspace-format.d.ts.map +1 -0
- package/dist/utils/workspace-format.js +106 -0
- package/dist/utils/workspace-format.js.map +1 -0
- package/dist/validation/command-lint.d.ts +11 -0
- package/dist/validation/command-lint.d.ts.map +1 -0
- package/dist/validation/command-lint.js +88 -0
- package/dist/validation/command-lint.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication token storage for Brainfile CLI
|
|
4
|
+
*
|
|
5
|
+
* Stores tokens with the following priority:
|
|
6
|
+
* 1. System keychain (via keytar, if available)
|
|
7
|
+
* 2. Config file (~/.config/brainfile/auth.json)
|
|
8
|
+
* 3. Environment variables (read-only)
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.authStore = exports.AuthStore = void 0;
|
|
47
|
+
exports.getGitHubCLIToken = getGitHubCLIToken;
|
|
48
|
+
exports.isGitHubCLIAvailable = isGitHubCLIAvailable;
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const child_process_1 = require("child_process");
|
|
52
|
+
const config_1 = require("./config");
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// Constants
|
|
55
|
+
// ============================================================================
|
|
56
|
+
const SERVICE_NAME = 'brainfile';
|
|
57
|
+
const AUTH_FILE = path.join((0, config_1.getConfigDir)(), 'auth.json');
|
|
58
|
+
const ENV_VAR_MAP = {
|
|
59
|
+
github: ['GITHUB_TOKEN', 'GH_TOKEN'],
|
|
60
|
+
linear: ['LINEAR_API_KEY', 'LINEAR_TOKEN'],
|
|
61
|
+
};
|
|
62
|
+
// ============================================================================
|
|
63
|
+
// Keytar Integration (Optional)
|
|
64
|
+
// ============================================================================
|
|
65
|
+
let keytar = null;
|
|
66
|
+
let keytarChecked = false;
|
|
67
|
+
/**
|
|
68
|
+
* Try to load keytar (system keychain integration)
|
|
69
|
+
* Returns null if keytar is not available
|
|
70
|
+
*/
|
|
71
|
+
function getKeytar() {
|
|
72
|
+
if (keytarChecked) {
|
|
73
|
+
return keytar;
|
|
74
|
+
}
|
|
75
|
+
keytarChecked = true;
|
|
76
|
+
try {
|
|
77
|
+
// Dynamic require to make keytar optional
|
|
78
|
+
keytar = require('keytar');
|
|
79
|
+
return keytar;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// keytar not installed or native module not built
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// GitHub CLI Integration
|
|
88
|
+
// ============================================================================
|
|
89
|
+
/**
|
|
90
|
+
* Try to get GitHub token from gh CLI
|
|
91
|
+
* @returns Token from gh CLI, or null if not available
|
|
92
|
+
*/
|
|
93
|
+
function getGitHubCLIToken() {
|
|
94
|
+
try {
|
|
95
|
+
const token = (0, child_process_1.execSync)('gh auth token', {
|
|
96
|
+
encoding: 'utf-8',
|
|
97
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
98
|
+
}).trim();
|
|
99
|
+
if (token && token.length > 0) {
|
|
100
|
+
return token;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// gh CLI not installed or not authenticated
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if gh CLI is installed and authenticated
|
|
110
|
+
*/
|
|
111
|
+
function isGitHubCLIAvailable() {
|
|
112
|
+
return getGitHubCLIToken() !== null;
|
|
113
|
+
}
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// Auth Store Class
|
|
116
|
+
// ============================================================================
|
|
117
|
+
class AuthStore {
|
|
118
|
+
/**
|
|
119
|
+
* Get a token for a provider
|
|
120
|
+
* Checks: env vars → keychain → config file → gh CLI (for github)
|
|
121
|
+
*/
|
|
122
|
+
async get(provider) {
|
|
123
|
+
// 1. Check environment variables
|
|
124
|
+
const envToken = this.getFromEnv(provider);
|
|
125
|
+
if (envToken) {
|
|
126
|
+
return envToken;
|
|
127
|
+
}
|
|
128
|
+
// 2. Check system keychain
|
|
129
|
+
const kt = getKeytar();
|
|
130
|
+
if (kt) {
|
|
131
|
+
try {
|
|
132
|
+
const keychainToken = await kt.getPassword(SERVICE_NAME, provider);
|
|
133
|
+
if (keychainToken) {
|
|
134
|
+
return keychainToken;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Keychain access failed, continue to next option
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// 3. Check config file
|
|
142
|
+
const fileToken = this.getFromFile(provider);
|
|
143
|
+
if (fileToken) {
|
|
144
|
+
return fileToken;
|
|
145
|
+
}
|
|
146
|
+
// 4. For GitHub, check gh CLI as last resort
|
|
147
|
+
if (provider === 'github') {
|
|
148
|
+
return getGitHubCLIToken();
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get stored token info (includes metadata like username)
|
|
154
|
+
*/
|
|
155
|
+
async getTokenInfo(provider) {
|
|
156
|
+
// Check config file for metadata
|
|
157
|
+
const authData = this.loadAuthFile();
|
|
158
|
+
return authData[provider] || null;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Store a token for a provider
|
|
162
|
+
* Stores in: keychain (if available) AND config file (for metadata)
|
|
163
|
+
*/
|
|
164
|
+
async set(provider, token, metadata) {
|
|
165
|
+
const storedToken = {
|
|
166
|
+
token,
|
|
167
|
+
savedAt: new Date().toISOString(),
|
|
168
|
+
...metadata,
|
|
169
|
+
};
|
|
170
|
+
// 1. Try to store in keychain
|
|
171
|
+
const kt = getKeytar();
|
|
172
|
+
if (kt) {
|
|
173
|
+
try {
|
|
174
|
+
await kt.setPassword(SERVICE_NAME, provider, token);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Keychain storage failed, will fall back to file
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// 2. Store in config file (always, for metadata)
|
|
181
|
+
this.saveToFile(provider, storedToken);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Clear a token for a provider
|
|
185
|
+
*/
|
|
186
|
+
async clear(provider) {
|
|
187
|
+
// 1. Remove from keychain
|
|
188
|
+
const kt = getKeytar();
|
|
189
|
+
if (kt) {
|
|
190
|
+
try {
|
|
191
|
+
await kt.deletePassword(SERVICE_NAME, provider);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Ignore errors
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// 2. Remove from config file
|
|
198
|
+
this.removeFromFile(provider);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if a provider is authenticated
|
|
202
|
+
*/
|
|
203
|
+
async isAuthenticated(provider) {
|
|
204
|
+
const token = await this.get(provider);
|
|
205
|
+
return token !== null;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get authentication status for all providers
|
|
209
|
+
*/
|
|
210
|
+
async getStatus() {
|
|
211
|
+
const result = {
|
|
212
|
+
github: { authenticated: false },
|
|
213
|
+
linear: { authenticated: false },
|
|
214
|
+
};
|
|
215
|
+
for (const provider of ['github', 'linear']) {
|
|
216
|
+
// Check env first
|
|
217
|
+
if (this.getFromEnv(provider)) {
|
|
218
|
+
result[provider] = { authenticated: true, source: 'environment' };
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
// Check keychain
|
|
222
|
+
const kt = getKeytar();
|
|
223
|
+
if (kt) {
|
|
224
|
+
try {
|
|
225
|
+
const token = await kt.getPassword(SERVICE_NAME, provider);
|
|
226
|
+
if (token) {
|
|
227
|
+
const info = await this.getTokenInfo(provider);
|
|
228
|
+
result[provider] = {
|
|
229
|
+
authenticated: true,
|
|
230
|
+
source: 'keychain',
|
|
231
|
+
username: info?.username,
|
|
232
|
+
};
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Continue to next check
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Check config file
|
|
241
|
+
const fileToken = this.getFromFile(provider);
|
|
242
|
+
if (fileToken) {
|
|
243
|
+
const info = await this.getTokenInfo(provider);
|
|
244
|
+
result[provider] = {
|
|
245
|
+
authenticated: true,
|
|
246
|
+
source: 'config',
|
|
247
|
+
username: info?.username,
|
|
248
|
+
};
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
// For GitHub, check gh CLI
|
|
252
|
+
if (provider === 'github' && getGitHubCLIToken()) {
|
|
253
|
+
result[provider] = { authenticated: true, source: 'gh-cli' };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
// ============================================================================
|
|
259
|
+
// Private Methods
|
|
260
|
+
// ============================================================================
|
|
261
|
+
getFromEnv(provider) {
|
|
262
|
+
const vars = ENV_VAR_MAP[provider];
|
|
263
|
+
for (const varName of vars) {
|
|
264
|
+
const value = process.env[varName];
|
|
265
|
+
if (value && value.length > 0) {
|
|
266
|
+
return value;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
loadAuthFile() {
|
|
272
|
+
try {
|
|
273
|
+
if (fs.existsSync(AUTH_FILE)) {
|
|
274
|
+
const content = fs.readFileSync(AUTH_FILE, 'utf-8');
|
|
275
|
+
return JSON.parse(content);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// File corrupted or unreadable
|
|
280
|
+
}
|
|
281
|
+
return {};
|
|
282
|
+
}
|
|
283
|
+
saveAuthFile(data) {
|
|
284
|
+
(0, config_1.ensureConfigDir)();
|
|
285
|
+
fs.writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), {
|
|
286
|
+
encoding: 'utf-8',
|
|
287
|
+
mode: 0o600, // Owner read/write only
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
getFromFile(provider) {
|
|
291
|
+
const data = this.loadAuthFile();
|
|
292
|
+
return data[provider]?.token || null;
|
|
293
|
+
}
|
|
294
|
+
saveToFile(provider, tokenInfo) {
|
|
295
|
+
const data = this.loadAuthFile();
|
|
296
|
+
data[provider] = tokenInfo;
|
|
297
|
+
this.saveAuthFile(data);
|
|
298
|
+
}
|
|
299
|
+
removeFromFile(provider) {
|
|
300
|
+
const data = this.loadAuthFile();
|
|
301
|
+
delete data[provider];
|
|
302
|
+
this.saveAuthFile(data);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
exports.AuthStore = AuthStore;
|
|
306
|
+
// Export singleton instance
|
|
307
|
+
exports.authStore = new AuthStore();
|
|
308
|
+
//# sourceMappingURL=auth-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../../src/utils/auth-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Board } from '@brainfile/core';
|
|
2
|
+
export interface TypeEntry {
|
|
3
|
+
idPrefix: string;
|
|
4
|
+
completable?: boolean;
|
|
5
|
+
schema?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TypesConfig {
|
|
8
|
+
[typeName: string]: TypeEntry;
|
|
9
|
+
}
|
|
10
|
+
export declare function getBoardTypes(board: Board & {
|
|
11
|
+
types?: TypesConfig;
|
|
12
|
+
}): TypesConfig;
|
|
13
|
+
//# sourceMappingURL=board-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-types.d.ts","sourceRoot":"","sources":["../../src/utils/board-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,WAAW,CAEjF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-types.js","sourceRoot":"","sources":["../../src/utils/board-types.ts"],"names":[],"mappings":";;AAYA,sCAEC;AAFD,SAAgB,aAAa,CAAC,KAAsC;IAClE,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find a brainfile by walking up from the current directory.
|
|
3
|
+
* @returns Absolute path to brainfile, or null if not found
|
|
4
|
+
*/
|
|
5
|
+
export declare function findBrainfile(): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Get the age of a file in minutes
|
|
8
|
+
* @param filePath Absolute path to file
|
|
9
|
+
* @returns Age in minutes, or Infinity if file doesn't exist
|
|
10
|
+
*/
|
|
11
|
+
export declare function getFileAgeMinutes(filePath: string): number;
|
|
12
|
+
//# sourceMappingURL=brainfile-finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brainfile-finder.d.ts","sourceRoot":"","sources":["../../src/utils/brainfile-finder.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAI7C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY1D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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.findBrainfile = findBrainfile;
|
|
37
|
+
exports.getFileAgeMinutes = getFileAgeMinutes;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const core_1 = require("@brainfile/core");
|
|
40
|
+
/**
|
|
41
|
+
* Find a brainfile by walking up from the current directory.
|
|
42
|
+
* @returns Absolute path to brainfile, or null if not found
|
|
43
|
+
*/
|
|
44
|
+
function findBrainfile() {
|
|
45
|
+
const found = (0, core_1.findBrainfile)(process.cwd());
|
|
46
|
+
if (found && found.kind !== 'dotdir')
|
|
47
|
+
return null;
|
|
48
|
+
return found?.absolutePath ?? null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the age of a file in minutes
|
|
52
|
+
* @param filePath Absolute path to file
|
|
53
|
+
* @returns Age in minutes, or Infinity if file doesn't exist
|
|
54
|
+
*/
|
|
55
|
+
function getFileAgeMinutes(filePath) {
|
|
56
|
+
try {
|
|
57
|
+
const stats = fs.statSync(filePath);
|
|
58
|
+
const now = Date.now();
|
|
59
|
+
const modifiedTime = stats.mtimeMs;
|
|
60
|
+
const ageMs = now - modifiedTime;
|
|
61
|
+
const ageMinutes = ageMs / 1000 / 60; // Convert to minutes
|
|
62
|
+
// Handle edge case where mtime might be slightly in the future due to timing
|
|
63
|
+
return Math.max(0, ageMinutes);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return Infinity;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=brainfile-finder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brainfile-finder.js","sourceRoot":"","sources":["../../src/utils/brainfile-finder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,sCAIC;AAOD,8CAYC;AA9BD,uCAAyB;AACzB,0CAAqE;AAErE;;;GAGG;AACH,SAAgB,aAAa;IAC3B,MAAM,KAAK,GAAG,IAAA,oBAAiB,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,KAAK,EAAE,YAAY,IAAI,IAAI,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,GAAG,YAAY,CAAC;QACjC,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,qBAAqB;QAC3D,6EAA6E;QAC7E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a brainfile path for CLI commands.
|
|
3
|
+
*
|
|
4
|
+
* Supports three input forms:
|
|
5
|
+
* - Default (omitted): auto-discover from cwd upward
|
|
6
|
+
* - Directory path (`cli/`, `./projects/foo`): find brainfile inside that directory
|
|
7
|
+
* - File path (`path/to/brainfile.md`): use as-is
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveCliBrainfilePath(filePath?: string): string;
|
|
10
|
+
//# sourceMappingURL=brainfile-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brainfile-path.d.ts","sourceRoot":"","sources":["../../src/utils/brainfile-path.ts"],"names":[],"mappings":"AAyBA;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBjE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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.resolveCliBrainfilePath = resolveCliBrainfilePath;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const core_1 = require("@brainfile/core");
|
|
40
|
+
const cli_error_1 = require("./cli-error");
|
|
41
|
+
const v2_only_1 = require("./v2-only");
|
|
42
|
+
function isMigrationCommand() {
|
|
43
|
+
return process.argv.includes('migrate');
|
|
44
|
+
}
|
|
45
|
+
function migrationHintForPath(brainfilePath) {
|
|
46
|
+
const absolute = path.resolve(brainfilePath);
|
|
47
|
+
const dir = path.basename(path.dirname(absolute)) === '.brainfile'
|
|
48
|
+
? path.dirname(path.dirname(absolute))
|
|
49
|
+
: path.dirname(absolute);
|
|
50
|
+
return `Run: brainfile migrate --dir ${dir}`;
|
|
51
|
+
}
|
|
52
|
+
function rejectLegacyRuntimePath(resolvedPath) {
|
|
53
|
+
if (!isMigrationCommand() && fs.existsSync(resolvedPath) && !(0, core_1.isV2)(resolvedPath)) {
|
|
54
|
+
throw new cli_error_1.CLIError(v2_only_1.V1_UNSUPPORTED_MESSAGE, undefined, migrationHintForPath(resolvedPath));
|
|
55
|
+
}
|
|
56
|
+
return resolvedPath;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Resolve a brainfile path for CLI commands.
|
|
60
|
+
*
|
|
61
|
+
* Supports three input forms:
|
|
62
|
+
* - Default (omitted): auto-discover from cwd upward
|
|
63
|
+
* - Directory path (`cli/`, `./projects/foo`): find brainfile inside that directory
|
|
64
|
+
* - File path (`path/to/brainfile.md`): use as-is
|
|
65
|
+
*/
|
|
66
|
+
function resolveCliBrainfilePath(filePath) {
|
|
67
|
+
// If a path was given and it's a directory, look for a brainfile inside it
|
|
68
|
+
if (filePath) {
|
|
69
|
+
const resolved = path.resolve(process.cwd(), filePath);
|
|
70
|
+
try {
|
|
71
|
+
if (fs.statSync(resolved).isDirectory()) {
|
|
72
|
+
// Try discovery starting from this directory (non-recursive upward)
|
|
73
|
+
const found = (0, core_1.findBrainfile)(resolved);
|
|
74
|
+
if (found && found.projectRoot === resolved) {
|
|
75
|
+
return rejectLegacyRuntimePath(found.absolutePath);
|
|
76
|
+
}
|
|
77
|
+
// Fallback: check .brainfile/brainfile.md directly
|
|
78
|
+
const dotDir = path.join(resolved, '.brainfile', 'brainfile.md');
|
|
79
|
+
return rejectLegacyRuntimePath(dotDir);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Not a directory, fall through to normal resolution
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return rejectLegacyRuntimePath((0, core_1.resolveBrainfilePath)({ filePath, startDir: process.cwd() }));
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=brainfile-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brainfile-path.js","sourceRoot":"","sources":["../../src/utils/brainfile-path.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,0DAqBC;AAtDD,uCAAyB;AACzB,2CAA6B;AAC7B,0CAA4E;AAC5E,2CAAuC;AACvC,uCAAmD;AAEnD,SAAS,kBAAkB;IACzB,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,oBAAoB,CAAC,aAAqB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,YAAY;QAChE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,gCAAgC,GAAG,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,uBAAuB,CAAC,YAAoB;IACnD,IAAI,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAA,WAAI,EAAC,YAAY,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,oBAAQ,CAAC,gCAAsB,EAAE,SAAS,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,uBAAuB,CAAC,QAAiB;IACvD,2EAA2E;IAC3E,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxC,oEAAoE;gBACpE,MAAM,KAAK,GAAG,IAAA,oBAAa,EAAC,QAAQ,CAAC,CAAC;gBACtC,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAC5C,OAAO,uBAAuB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACrD,CAAC;gBACD,mDAAmD;gBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;gBACjE,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;IAED,OAAO,uBAAuB,CAAC,IAAA,2BAAoB,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type ExitCodeType } from './errorHandler';
|
|
2
|
+
/**
|
|
3
|
+
* Custom error class for CLI errors.
|
|
4
|
+
* Thrown by commands to signal failure without calling process.exit directly.
|
|
5
|
+
* The CLI entry point catches this and handles exit codes.
|
|
6
|
+
*/
|
|
7
|
+
export declare class CLIError extends Error {
|
|
8
|
+
readonly exitCode: ExitCodeType;
|
|
9
|
+
readonly details?: string;
|
|
10
|
+
constructor(message: string, exitCode?: ExitCodeType, details?: string);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a CLIError for file not found.
|
|
14
|
+
*/
|
|
15
|
+
export declare function fileNotFound(filePath: string): CLIError;
|
|
16
|
+
/**
|
|
17
|
+
* Create a CLIError for parse errors.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseFailure(error?: string): CLIError;
|
|
20
|
+
/**
|
|
21
|
+
* Create a CLIError for missing required options.
|
|
22
|
+
*/
|
|
23
|
+
export declare function missingRequired(option: string, usage: string): CLIError;
|
|
24
|
+
/**
|
|
25
|
+
* Create a CLIError from a core operation failure.
|
|
26
|
+
*/
|
|
27
|
+
export declare function operationFailed(error: string): CLIError;
|
|
28
|
+
/**
|
|
29
|
+
* Create a CLIError for column not found.
|
|
30
|
+
*/
|
|
31
|
+
export declare function columnNotFound(columnId: string, availableColumns: string[]): CLIError;
|
|
32
|
+
/**
|
|
33
|
+
* Create a CLIError for task not found.
|
|
34
|
+
*/
|
|
35
|
+
export declare function taskNotFound(taskId: string, availableTasks?: string[]): CLIError;
|
|
36
|
+
/**
|
|
37
|
+
* Create a CLIError for subtask not found.
|
|
38
|
+
*/
|
|
39
|
+
export declare function subtaskNotFound(subtaskId: string, availableSubtasks?: string[]): CLIError;
|
|
40
|
+
/**
|
|
41
|
+
* Create a CLIError for validation errors.
|
|
42
|
+
*/
|
|
43
|
+
export declare function validationError(message: string): CLIError;
|
|
44
|
+
//# sourceMappingURL=cli-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-error.d.ts","sourceRoot":"","sources":["../../src/utils/cli-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAC/B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,YAAkC,EAAE,OAAO,CAAC,EAAE,MAAM;CAM9F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAMvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAOrD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAMvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAEvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,QAAQ,CAOrF;AACD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,GAAE,MAAM,EAAO,GAAG,QAAQ,CAMpF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAM,EAAO,GAAG,QAAQ,CAM7F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAEzD"}
|