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,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Linear Authentication for Brainfile CLI
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* 1. OAuth Device Flow (browser-based)
|
|
7
|
+
* 2. API Key (manual entry)
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.isLinearAuthenticated = isLinearAuthenticated;
|
|
16
|
+
exports.getLinearToken = getLinearToken;
|
|
17
|
+
exports.authenticateLinear = authenticateLinear;
|
|
18
|
+
exports.getLinearTeams = getLinearTeams;
|
|
19
|
+
exports.createLinearIssue = createLinearIssue;
|
|
20
|
+
exports.logoutLinear = logoutLinear;
|
|
21
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
22
|
+
const auth_store_1 = require("./auth-store");
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Constants
|
|
25
|
+
// ============================================================================
|
|
26
|
+
const LINEAR_API_URL = 'https://api.linear.app/graphql';
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Linear Auth Functions
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Check if Linear is already authenticated
|
|
32
|
+
*/
|
|
33
|
+
async function isLinearAuthenticated() {
|
|
34
|
+
return await auth_store_1.authStore.isAuthenticated('linear');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the current Linear token
|
|
38
|
+
*/
|
|
39
|
+
async function getLinearToken() {
|
|
40
|
+
return await auth_store_1.authStore.get('linear');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Authenticate with Linear using API key
|
|
44
|
+
*/
|
|
45
|
+
async function authenticateLinear(options) {
|
|
46
|
+
const { token, silent } = options;
|
|
47
|
+
if (!token) {
|
|
48
|
+
if (!silent) {
|
|
49
|
+
console.log('');
|
|
50
|
+
console.log('To authenticate with Linear, you need an API key.');
|
|
51
|
+
console.log('');
|
|
52
|
+
console.log(`Get your API key from: ${chalk_1.default.underline('https://linear.app/settings/api')}`);
|
|
53
|
+
console.log('');
|
|
54
|
+
}
|
|
55
|
+
return { success: false, error: 'Linear API key required. Use --token flag.' };
|
|
56
|
+
}
|
|
57
|
+
// Verify the token
|
|
58
|
+
const viewer = await getLinearViewer(token);
|
|
59
|
+
if (!viewer) {
|
|
60
|
+
return { success: false, error: 'Invalid API key or API key lacks required permissions' };
|
|
61
|
+
}
|
|
62
|
+
// Get organization info
|
|
63
|
+
const org = await getLinearOrganization(token);
|
|
64
|
+
const workspace = org?.name || 'Unknown';
|
|
65
|
+
await auth_store_1.authStore.set('linear', token, {
|
|
66
|
+
username: viewer.name,
|
|
67
|
+
workspace,
|
|
68
|
+
});
|
|
69
|
+
if (!silent) {
|
|
70
|
+
console.log(chalk_1.default.green('✓') + ' API key verified');
|
|
71
|
+
console.log(chalk_1.default.green('✓') + ` Authenticated as ${chalk_1.default.cyan(viewer.name)} in ${chalk_1.default.cyan(workspace)}`);
|
|
72
|
+
}
|
|
73
|
+
return { success: true, workspace };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get Linear user info
|
|
77
|
+
*/
|
|
78
|
+
async function getLinearViewer(token) {
|
|
79
|
+
try {
|
|
80
|
+
const response = await fetch(LINEAR_API_URL, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
headers: {
|
|
83
|
+
Authorization: token,
|
|
84
|
+
'Content-Type': 'application/json',
|
|
85
|
+
},
|
|
86
|
+
body: JSON.stringify({
|
|
87
|
+
query: `
|
|
88
|
+
query {
|
|
89
|
+
viewer {
|
|
90
|
+
id
|
|
91
|
+
name
|
|
92
|
+
email
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
`,
|
|
96
|
+
}),
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const json = await response.json();
|
|
102
|
+
return json.data?.viewer || null;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get Linear organization info
|
|
110
|
+
*/
|
|
111
|
+
async function getLinearOrganization(token) {
|
|
112
|
+
try {
|
|
113
|
+
const response = await fetch(LINEAR_API_URL, {
|
|
114
|
+
method: 'POST',
|
|
115
|
+
headers: {
|
|
116
|
+
Authorization: token,
|
|
117
|
+
'Content-Type': 'application/json',
|
|
118
|
+
},
|
|
119
|
+
body: JSON.stringify({
|
|
120
|
+
query: `
|
|
121
|
+
query {
|
|
122
|
+
organization {
|
|
123
|
+
id
|
|
124
|
+
name
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
`,
|
|
128
|
+
}),
|
|
129
|
+
});
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
const json = await response.json();
|
|
134
|
+
return json.data?.organization || null;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get Linear teams
|
|
142
|
+
*/
|
|
143
|
+
async function getLinearTeams() {
|
|
144
|
+
const token = await getLinearToken();
|
|
145
|
+
if (!token) {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const response = await fetch(LINEAR_API_URL, {
|
|
150
|
+
method: 'POST',
|
|
151
|
+
headers: {
|
|
152
|
+
Authorization: token,
|
|
153
|
+
'Content-Type': 'application/json',
|
|
154
|
+
},
|
|
155
|
+
body: JSON.stringify({
|
|
156
|
+
query: `
|
|
157
|
+
query {
|
|
158
|
+
teams {
|
|
159
|
+
nodes {
|
|
160
|
+
id
|
|
161
|
+
name
|
|
162
|
+
key
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
`,
|
|
167
|
+
}),
|
|
168
|
+
});
|
|
169
|
+
if (!response.ok) {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
const json = await response.json();
|
|
173
|
+
return json.data?.teams?.nodes || [];
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create a Linear issue
|
|
181
|
+
*/
|
|
182
|
+
async function createLinearIssue(options) {
|
|
183
|
+
const token = await getLinearToken();
|
|
184
|
+
if (!token) {
|
|
185
|
+
return { success: false, error: 'Not authenticated with Linear. Run: brainfile auth linear' };
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
// First, get the "Done" state ID if stateName is specified
|
|
189
|
+
let stateId;
|
|
190
|
+
if (options.stateName) {
|
|
191
|
+
stateId = await getStateId(token, options.teamId, options.stateName);
|
|
192
|
+
}
|
|
193
|
+
// Create the issue
|
|
194
|
+
const response = await fetch(LINEAR_API_URL, {
|
|
195
|
+
method: 'POST',
|
|
196
|
+
headers: {
|
|
197
|
+
Authorization: token,
|
|
198
|
+
'Content-Type': 'application/json',
|
|
199
|
+
},
|
|
200
|
+
body: JSON.stringify({
|
|
201
|
+
query: `
|
|
202
|
+
mutation CreateIssue($input: IssueCreateInput!) {
|
|
203
|
+
issueCreate(input: $input) {
|
|
204
|
+
success
|
|
205
|
+
issue {
|
|
206
|
+
id
|
|
207
|
+
identifier
|
|
208
|
+
url
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
`,
|
|
213
|
+
variables: {
|
|
214
|
+
input: {
|
|
215
|
+
teamId: options.teamId,
|
|
216
|
+
title: options.title,
|
|
217
|
+
description: options.description,
|
|
218
|
+
priority: options.priority,
|
|
219
|
+
stateId,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
}),
|
|
223
|
+
});
|
|
224
|
+
if (!response.ok) {
|
|
225
|
+
return { success: false, error: `Linear API error: ${response.status}` };
|
|
226
|
+
}
|
|
227
|
+
const json = await response.json();
|
|
228
|
+
if (json.errors) {
|
|
229
|
+
return { success: false, error: json.errors[0]?.message || 'Unknown error' };
|
|
230
|
+
}
|
|
231
|
+
const result = json.data?.issueCreate;
|
|
232
|
+
if (!result?.success) {
|
|
233
|
+
return { success: false, error: 'Failed to create issue' };
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
success: true,
|
|
237
|
+
issueId: result.issue.identifier,
|
|
238
|
+
issueUrl: result.issue.url,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
return {
|
|
243
|
+
success: false,
|
|
244
|
+
error: err instanceof Error ? err.message : 'Unknown error creating issue',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get state ID by name
|
|
250
|
+
*/
|
|
251
|
+
async function getStateId(token, teamId, stateName) {
|
|
252
|
+
try {
|
|
253
|
+
const response = await fetch(LINEAR_API_URL, {
|
|
254
|
+
method: 'POST',
|
|
255
|
+
headers: {
|
|
256
|
+
Authorization: token,
|
|
257
|
+
'Content-Type': 'application/json',
|
|
258
|
+
},
|
|
259
|
+
body: JSON.stringify({
|
|
260
|
+
query: `
|
|
261
|
+
query GetStates($teamId: String!) {
|
|
262
|
+
team(id: $teamId) {
|
|
263
|
+
states {
|
|
264
|
+
nodes {
|
|
265
|
+
id
|
|
266
|
+
name
|
|
267
|
+
type
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
`,
|
|
273
|
+
variables: { teamId },
|
|
274
|
+
}),
|
|
275
|
+
});
|
|
276
|
+
if (!response.ok) {
|
|
277
|
+
return undefined;
|
|
278
|
+
}
|
|
279
|
+
const json = await response.json();
|
|
280
|
+
const states = json.data?.team?.states?.nodes || [];
|
|
281
|
+
// Find state by name (case-insensitive)
|
|
282
|
+
const state = states.find((s) => s.name.toLowerCase() === stateName.toLowerCase());
|
|
283
|
+
return state?.id;
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Logout from Linear
|
|
291
|
+
*/
|
|
292
|
+
async function logoutLinear() {
|
|
293
|
+
await auth_store_1.authStore.clear('linear');
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=linear-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-auth.js","sourceRoot":"","sources":["../../src/utils/linear-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger interface for CLI output.
|
|
3
|
+
* Allows dependency injection for testability.
|
|
4
|
+
*/
|
|
5
|
+
export interface Logger {
|
|
6
|
+
info(...args: unknown[]): void;
|
|
7
|
+
warn(...args: unknown[]): void;
|
|
8
|
+
error(...args: unknown[]): void;
|
|
9
|
+
log(...args: unknown[]): void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Default logger implementation wrapping console.
|
|
13
|
+
*/
|
|
14
|
+
export declare const defaultLogger: Logger;
|
|
15
|
+
/**
|
|
16
|
+
* Memory logger for testing - captures all output.
|
|
17
|
+
*/
|
|
18
|
+
export declare class MemoryLogger implements Logger {
|
|
19
|
+
readonly infos: unknown[][];
|
|
20
|
+
readonly warns: unknown[][];
|
|
21
|
+
readonly errors: unknown[][];
|
|
22
|
+
readonly logs: unknown[][];
|
|
23
|
+
info(...args: unknown[]): void;
|
|
24
|
+
warn(...args: unknown[]): void;
|
|
25
|
+
error(...args: unknown[]): void;
|
|
26
|
+
log(...args: unknown[]): void;
|
|
27
|
+
/** Get all output as a single string (for assertions) */
|
|
28
|
+
getOutput(): string;
|
|
29
|
+
/** Get all error output as a single string */
|
|
30
|
+
getErrorOutput(): string;
|
|
31
|
+
/** Clear all captured output */
|
|
32
|
+
clear(): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,MAAM;IACnB,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAK3B,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,YAAW,MAAM;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAM;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAM;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAM;IAClC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAM;IAEhC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI9B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI9B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI/B,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI7B,yDAAyD;IACzD,SAAS,IAAI,MAAM;IAMnB,8CAA8C;IAC9C,cAAc,IAAI,MAAM;IAMxB,gCAAgC;IAChC,KAAK,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemoryLogger = exports.defaultLogger = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Default logger implementation wrapping console.
|
|
6
|
+
*/
|
|
7
|
+
exports.defaultLogger = {
|
|
8
|
+
info: (...args) => console.log(...args),
|
|
9
|
+
warn: (...args) => console.warn(...args),
|
|
10
|
+
error: (...args) => console.error(...args),
|
|
11
|
+
log: (...args) => console.log(...args),
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Memory logger for testing - captures all output.
|
|
15
|
+
*/
|
|
16
|
+
class MemoryLogger {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.infos = [];
|
|
19
|
+
this.warns = [];
|
|
20
|
+
this.errors = [];
|
|
21
|
+
this.logs = [];
|
|
22
|
+
}
|
|
23
|
+
info(...args) {
|
|
24
|
+
this.infos.push(args);
|
|
25
|
+
}
|
|
26
|
+
warn(...args) {
|
|
27
|
+
this.warns.push(args);
|
|
28
|
+
}
|
|
29
|
+
error(...args) {
|
|
30
|
+
this.errors.push(args);
|
|
31
|
+
}
|
|
32
|
+
log(...args) {
|
|
33
|
+
this.logs.push(args);
|
|
34
|
+
}
|
|
35
|
+
/** Get all output as a single string (for assertions) */
|
|
36
|
+
getOutput() {
|
|
37
|
+
return [...this.logs, ...this.infos, ...this.warns]
|
|
38
|
+
.map(args => args.map(String).join(' '))
|
|
39
|
+
.join('\n');
|
|
40
|
+
}
|
|
41
|
+
/** Get all error output as a single string */
|
|
42
|
+
getErrorOutput() {
|
|
43
|
+
return this.errors
|
|
44
|
+
.map(args => args.map(String).join(' '))
|
|
45
|
+
.join('\n');
|
|
46
|
+
}
|
|
47
|
+
/** Clear all captured output */
|
|
48
|
+
clear() {
|
|
49
|
+
this.infos.length = 0;
|
|
50
|
+
this.warns.length = 0;
|
|
51
|
+
this.errors.length = 0;
|
|
52
|
+
this.logs.length = 0;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.MemoryLogger = MemoryLogger;
|
|
56
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;AAWA;;GAEG;AACU,QAAA,aAAa,GAAW;IACjC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACvC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACxC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1C,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF;;GAEG;AACH,MAAa,YAAY;IAAzB;QACa,UAAK,GAAgB,EAAE,CAAC;QACxB,UAAK,GAAgB,EAAE,CAAC;QACxB,WAAM,GAAgB,EAAE,CAAC;QACzB,SAAI,GAAgB,EAAE,CAAC;IAuCpC,CAAC;IArCG,IAAI,CAAC,GAAG,IAAe;QACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,GAAG,IAAe;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,yDAAyD;IACzD,SAAS;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;aAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACvC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,8CAA8C;IAC9C,cAAc;QACV,OAAO,IAAI,CAAC,MAAM;aACb,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACvC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,gCAAgC;IAChC,KAAK;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;CACJ;AA3CD,oCA2CC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Board } from '@brainfile/core';
|
|
2
|
+
export interface BoardValidationResult {
|
|
3
|
+
valid: boolean;
|
|
4
|
+
error?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function validateType(board: Board, typeName: string): BoardValidationResult;
|
|
7
|
+
export declare function validateColumn(board: Board, columnId: string): BoardValidationResult;
|
|
8
|
+
//# sourceMappingURL=strict-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-validation.d.ts","sourceRoot":"","sources":["../../src/utils/strict-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAsBlF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAkBpF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateType = validateType;
|
|
4
|
+
exports.validateColumn = validateColumn;
|
|
5
|
+
const coreValidation = require('@brainfile/core');
|
|
6
|
+
function validateType(board, typeName) {
|
|
7
|
+
if (typeof coreValidation.validateType === 'function') {
|
|
8
|
+
return coreValidation.validateType(board, typeName);
|
|
9
|
+
}
|
|
10
|
+
const strict = board.strict;
|
|
11
|
+
const types = board.types;
|
|
12
|
+
if (!strict || !types) {
|
|
13
|
+
return { valid: true };
|
|
14
|
+
}
|
|
15
|
+
if (typeName === 'task' || Object.prototype.hasOwnProperty.call(types, typeName)) {
|
|
16
|
+
return { valid: true };
|
|
17
|
+
}
|
|
18
|
+
const definedKeys = Object.keys(types);
|
|
19
|
+
const availableTypes = definedKeys.includes('task') ? definedKeys : ['task', ...definedKeys];
|
|
20
|
+
return {
|
|
21
|
+
valid: false,
|
|
22
|
+
error: `Type '${typeName}' is not defined. Available types: ${availableTypes.join(', ')}`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function validateColumn(board, columnId) {
|
|
26
|
+
if (typeof coreValidation.validateColumn === 'function') {
|
|
27
|
+
return coreValidation.validateColumn(board, columnId);
|
|
28
|
+
}
|
|
29
|
+
if (!board.strict) {
|
|
30
|
+
return { valid: true };
|
|
31
|
+
}
|
|
32
|
+
const columnIds = board.columns.map(column => column.id);
|
|
33
|
+
if (columnIds.includes(columnId)) {
|
|
34
|
+
return { valid: true };
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
valid: false,
|
|
38
|
+
error: `Column '${columnId}' is not defined. Available columns: ${columnIds.join(', ')}`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=strict-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-validation.js","sourceRoot":"","sources":["../../src/utils/strict-validation.ts"],"names":[],"mappings":";;AAcA,oCAsBC;AAED,wCAkBC;AA5CD,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAA0B,CAAC;AAE3E,SAAgB,YAAY,CAAC,KAAY,EAAE,QAAgB;IACzD,IAAI,OAAO,cAAc,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACtD,OAAO,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAI,KAAa,CAAC,MAAM,CAAC;IACrC,MAAM,KAAK,GAAI,KAAa,CAAC,KAA4C,CAAC;IAE1E,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC;IAC7F,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,SAAS,QAAQ,sCAAsC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAC1F,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,KAAY,EAAE,QAAgB;IAC3D,IAAI,OAAO,cAAc,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QACxD,OAAO,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAE,KAAa,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,WAAW,QAAQ,wCAAwC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACzF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V2 per-task file architecture detection, path resolution, and body helpers.
|
|
3
|
+
*
|
|
4
|
+
* Core owns these helpers (`@brainfile/core` workspace exports). This file
|
|
5
|
+
* re-exports them for existing CLI imports and retains CLI-only migration
|
|
6
|
+
* hint helpers.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export { type V2Dirs, getV2Dirs, isV2, ensureV2Dirs, getTaskFilePath, getLogFilePath, findV2Task, extractDescription, extractLog, composeBody, readV2BoardConfig, buildBoardFromV2, } from '@brainfile/core';
|
|
11
|
+
/**
|
|
12
|
+
* Check whether we should show the one-time migration suggestion.
|
|
13
|
+
*
|
|
14
|
+
* Returns true when ALL of these hold:
|
|
15
|
+
* a. The workspace appears to be in a legacy or mixed layout, OR this file
|
|
16
|
+
* itself looks like a legacy board file.
|
|
17
|
+
* b. This process has not already shown the hint for this brainfile path.
|
|
18
|
+
*/
|
|
19
|
+
export declare function shouldSuggestV2Migration(brainfilePath: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Record that the migration hint has been shown so it won't appear again.
|
|
22
|
+
*
|
|
23
|
+
* This is intentionally in-memory only; Brainfile no longer persists state.json.
|
|
24
|
+
*/
|
|
25
|
+
export declare function markV2MigrationHintShown(brainfilePath: string): void;
|
|
26
|
+
/** @internal test helper */
|
|
27
|
+
export declare function __resetV2MigrationHintState(): void;
|
|
28
|
+
//# sourceMappingURL=v2-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-detect.d.ts","sourceRoot":"","sources":["../../src/utils/v2-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,EACL,KAAK,MAAM,EACX,SAAS,EACT,IAAI,EACJ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAYzB;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAuBvE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAEpE;AAED,4BAA4B;AAC5B,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* V2 per-task file architecture detection, path resolution, and body helpers.
|
|
4
|
+
*
|
|
5
|
+
* Core owns these helpers (`@brainfile/core` workspace exports). This file
|
|
6
|
+
* re-exports them for existing CLI imports and retains CLI-only migration
|
|
7
|
+
* hint helpers.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.buildBoardFromV2 = exports.readV2BoardConfig = exports.composeBody = exports.extractLog = exports.extractDescription = exports.findV2Task = exports.getLogFilePath = exports.getTaskFilePath = exports.ensureV2Dirs = exports.isV2 = exports.getV2Dirs = void 0;
|
|
46
|
+
exports.shouldSuggestV2Migration = shouldSuggestV2Migration;
|
|
47
|
+
exports.markV2MigrationHintShown = markV2MigrationHintShown;
|
|
48
|
+
exports.__resetV2MigrationHintState = __resetV2MigrationHintState;
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const core_1 = require("@brainfile/core");
|
|
52
|
+
// ── Re-exports from core ─────────────────────────────────────────────
|
|
53
|
+
var core_2 = require("@brainfile/core");
|
|
54
|
+
Object.defineProperty(exports, "getV2Dirs", { enumerable: true, get: function () { return core_2.getV2Dirs; } });
|
|
55
|
+
Object.defineProperty(exports, "isV2", { enumerable: true, get: function () { return core_2.isV2; } });
|
|
56
|
+
Object.defineProperty(exports, "ensureV2Dirs", { enumerable: true, get: function () { return core_2.ensureV2Dirs; } });
|
|
57
|
+
Object.defineProperty(exports, "getTaskFilePath", { enumerable: true, get: function () { return core_2.getTaskFilePath; } });
|
|
58
|
+
Object.defineProperty(exports, "getLogFilePath", { enumerable: true, get: function () { return core_2.getLogFilePath; } });
|
|
59
|
+
Object.defineProperty(exports, "findV2Task", { enumerable: true, get: function () { return core_2.findV2Task; } });
|
|
60
|
+
Object.defineProperty(exports, "extractDescription", { enumerable: true, get: function () { return core_2.extractDescription; } });
|
|
61
|
+
Object.defineProperty(exports, "extractLog", { enumerable: true, get: function () { return core_2.extractLog; } });
|
|
62
|
+
Object.defineProperty(exports, "composeBody", { enumerable: true, get: function () { return core_2.composeBody; } });
|
|
63
|
+
Object.defineProperty(exports, "readV2BoardConfig", { enumerable: true, get: function () { return core_2.readV2BoardConfig; } });
|
|
64
|
+
Object.defineProperty(exports, "buildBoardFromV2", { enumerable: true, get: function () { return core_2.buildBoardFromV2; } });
|
|
65
|
+
// ── CLI-specific migration hint helpers ──────────────────────────────
|
|
66
|
+
const core_3 = require("@brainfile/core");
|
|
67
|
+
const workspace_format_1 = require("./workspace-format");
|
|
68
|
+
const v2MigrationHintShown = new Set();
|
|
69
|
+
/**
|
|
70
|
+
* Check whether we should show the one-time migration suggestion.
|
|
71
|
+
*
|
|
72
|
+
* Returns true when ALL of these hold:
|
|
73
|
+
* a. The workspace appears to be in a legacy or mixed layout, OR this file
|
|
74
|
+
* itself looks like a legacy board file.
|
|
75
|
+
* b. This process has not already shown the hint for this brainfile path.
|
|
76
|
+
*/
|
|
77
|
+
function shouldSuggestV2Migration(brainfilePath) {
|
|
78
|
+
const resolved = path.resolve(brainfilePath);
|
|
79
|
+
if (v2MigrationHintShown.has(resolved))
|
|
80
|
+
return false;
|
|
81
|
+
const probe = (0, workspace_format_1.probeWorkspaceForBrainfile)(resolved);
|
|
82
|
+
if ((0, workspace_format_1.shouldSuggestMigration)(probe)) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
// Fallback: explicit non-standard board files (e.g. fixtures/test-board.md)
|
|
86
|
+
// should still receive a migration suggestion when they parse as v1 board files.
|
|
87
|
+
if (!(0, core_3.isV2)(resolved) && fs.existsSync(resolved)) {
|
|
88
|
+
try {
|
|
89
|
+
const content = fs.readFileSync(resolved, 'utf-8');
|
|
90
|
+
const parsed = core_1.Brainfile.parseWithErrors(content);
|
|
91
|
+
if (parsed.board)
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Ignore parse/read errors and suppress hint.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Record that the migration hint has been shown so it won't appear again.
|
|
102
|
+
*
|
|
103
|
+
* This is intentionally in-memory only; Brainfile no longer persists state.json.
|
|
104
|
+
*/
|
|
105
|
+
function markV2MigrationHintShown(brainfilePath) {
|
|
106
|
+
v2MigrationHintShown.add(path.resolve(brainfilePath));
|
|
107
|
+
}
|
|
108
|
+
/** @internal test helper */
|
|
109
|
+
function __resetV2MigrationHintState() {
|
|
110
|
+
v2MigrationHintShown.clear();
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=v2-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-detect.js","sourceRoot":"","sources":["../../src/utils/v2-detect.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCH,4DAuBC;AAOD,4DAEC;AAGD,kEAEC;AA5ED,uCAAyB;AACzB,2CAA6B;AAC7B,0CAA4C;AAE5C,wEAAwE;AAExE,wCAayB;AAXvB,iGAAA,SAAS,OAAA;AACT,4FAAA,IAAI,OAAA;AACJ,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AACf,sGAAA,cAAc,OAAA;AACd,kGAAA,UAAU,OAAA;AACV,0GAAA,kBAAkB,OAAA;AAClB,kGAAA,UAAU,OAAA;AACV,mGAAA,WAAW,OAAA;AACX,yGAAA,iBAAiB,OAAA;AACjB,wGAAA,gBAAgB,OAAA;AAGlB,wEAAwE;AAExE,0CAAuC;AACvC,yDAG4B;AAE5B,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE/C;;;;;;;GAOG;AACH,SAAgB,wBAAwB,CAAC,aAAqB;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAE7C,IAAI,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAErD,MAAM,KAAK,GAAG,IAAA,6CAA0B,EAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,IAAA,yCAAsB,EAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,iFAAiF;IACjF,IAAI,CAAC,IAAA,WAAI,EAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,gBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,aAAqB;IAC5D,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,4BAA4B;AAC5B,SAAgB,2BAA2B;IACzC,oBAAoB,CAAC,KAAK,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const V1_UNSUPPORTED_MESSAGE = "Brainfile v1 is no longer supported by this command. Run `brainfile migrate` to convert this workspace to v2.";
|
|
2
|
+
/**
|
|
3
|
+
* Require v2 per-task file architecture for normal runtime commands.
|
|
4
|
+
*
|
|
5
|
+
* `brainfile migrate` is the only command allowed to read or transform v1
|
|
6
|
+
* layouts. Runtime commands should call this after resolving the brainfile path.
|
|
7
|
+
*/
|
|
8
|
+
export declare function assertV2Brainfile(brainfilePath: string): void;
|
|
9
|
+
//# sourceMappingURL=v2-only.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-only.d.ts","sourceRoot":"","sources":["../../src/utils/v2-only.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,kHAC8E,CAAC;AAUlH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAQ7D"}
|