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,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Authentication for Brainfile CLI
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* 1. Piggyback on gh CLI auth (if available)
|
|
7
|
+
* 2. OAuth Device Flow (browser-based, no server needed)
|
|
8
|
+
* 3. Personal Access Token (manual entry)
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
46
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
|
+
};
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.isGitHubAuthenticated = isGitHubAuthenticated;
|
|
50
|
+
exports.getGitHubToken = getGitHubToken;
|
|
51
|
+
exports.authenticateGitHub = authenticateGitHub;
|
|
52
|
+
exports.createGitHubIssue = createGitHubIssue;
|
|
53
|
+
exports.logoutGitHub = logoutGitHub;
|
|
54
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
55
|
+
const auth_store_1 = require("./auth-store");
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Constants
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// GitHub OAuth App Client ID for Brainfile
|
|
60
|
+
// This is a public client ID for the device flow - safe to commit
|
|
61
|
+
// TODO: Register a Brainfile OAuth App and replace this
|
|
62
|
+
const GITHUB_CLIENT_ID = process.env.BRAINFILE_GITHUB_CLIENT_ID || 'Ov23liYourClientId';
|
|
63
|
+
const GITHUB_DEVICE_CODE_URL = 'https://github.com/login/device/code';
|
|
64
|
+
const GITHUB_TOKEN_URL = 'https://github.com/login/oauth/access_token';
|
|
65
|
+
const GITHUB_API_URL = 'https://api.github.com';
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// GitHub Auth Functions
|
|
68
|
+
// ============================================================================
|
|
69
|
+
/**
|
|
70
|
+
* Check if GitHub is already authenticated
|
|
71
|
+
*/
|
|
72
|
+
async function isGitHubAuthenticated() {
|
|
73
|
+
return await auth_store_1.authStore.isAuthenticated('github');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get the current GitHub token (from any source)
|
|
77
|
+
*/
|
|
78
|
+
async function getGitHubToken() {
|
|
79
|
+
return await auth_store_1.authStore.get('github');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Authenticate with GitHub using the best available method
|
|
83
|
+
*
|
|
84
|
+
* Priority:
|
|
85
|
+
* 1. Use existing gh CLI auth
|
|
86
|
+
* 2. OAuth Device Flow
|
|
87
|
+
* 3. Manual PAT entry
|
|
88
|
+
*/
|
|
89
|
+
async function authenticateGitHub(options) {
|
|
90
|
+
const { usePAT, token, silent } = options;
|
|
91
|
+
// If token provided directly, verify and store it
|
|
92
|
+
if (token) {
|
|
93
|
+
return await verifyAndStoreToken(token, silent);
|
|
94
|
+
}
|
|
95
|
+
// If PAT mode requested, prompt for token
|
|
96
|
+
if (usePAT) {
|
|
97
|
+
return { success: false, error: 'PAT mode requires --token flag with token value' };
|
|
98
|
+
}
|
|
99
|
+
// Check if gh CLI is available
|
|
100
|
+
if ((0, auth_store_1.isGitHubCLIAvailable)()) {
|
|
101
|
+
const ghToken = (0, auth_store_1.getGitHubCLIToken)();
|
|
102
|
+
if (ghToken) {
|
|
103
|
+
if (!silent) {
|
|
104
|
+
console.log(chalk_1.default.green('✓') + ' Found existing GitHub CLI authentication');
|
|
105
|
+
}
|
|
106
|
+
// Verify the token and get username
|
|
107
|
+
const user = await getGitHubUser(ghToken);
|
|
108
|
+
if (user) {
|
|
109
|
+
// Store it in our auth store too for consistency
|
|
110
|
+
await auth_store_1.authStore.set('github', ghToken, { username: user.login });
|
|
111
|
+
if (!silent) {
|
|
112
|
+
console.log(chalk_1.default.green('✓') + ` Authenticated as ${chalk_1.default.cyan('@' + user.login)}`);
|
|
113
|
+
}
|
|
114
|
+
return { success: true, username: user.login };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Fall back to OAuth Device Flow
|
|
119
|
+
return await deviceFlowAuth(silent);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Verify a token and store it
|
|
123
|
+
*/
|
|
124
|
+
async function verifyAndStoreToken(token, silent) {
|
|
125
|
+
const user = await getGitHubUser(token);
|
|
126
|
+
if (!user) {
|
|
127
|
+
return { success: false, error: 'Invalid token or token lacks required permissions' };
|
|
128
|
+
}
|
|
129
|
+
await auth_store_1.authStore.set('github', token, { username: user.login });
|
|
130
|
+
if (!silent) {
|
|
131
|
+
console.log(chalk_1.default.green('✓') + ' Token verified');
|
|
132
|
+
console.log(chalk_1.default.green('✓') + ` Authenticated as ${chalk_1.default.cyan('@' + user.login)}`);
|
|
133
|
+
}
|
|
134
|
+
return { success: true, username: user.login };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* OAuth Device Flow authentication
|
|
138
|
+
*/
|
|
139
|
+
async function deviceFlowAuth(silent) {
|
|
140
|
+
if (!silent) {
|
|
141
|
+
console.log('');
|
|
142
|
+
console.log('Starting GitHub OAuth authentication...');
|
|
143
|
+
console.log('');
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
// Step 1: Request device code
|
|
147
|
+
const deviceCode = await requestDeviceCode();
|
|
148
|
+
if (!silent) {
|
|
149
|
+
console.log(chalk_1.default.yellow('!') + ` First, copy your one-time code: ${chalk_1.default.bold.cyan(deviceCode.user_code)}`);
|
|
150
|
+
console.log('');
|
|
151
|
+
console.log(`Then visit: ${chalk_1.default.underline(deviceCode.verification_uri)}`);
|
|
152
|
+
console.log('');
|
|
153
|
+
}
|
|
154
|
+
// Try to open browser
|
|
155
|
+
try {
|
|
156
|
+
const open = await Promise.resolve().then(() => __importStar(require('open')));
|
|
157
|
+
await open.default(deviceCode.verification_uri);
|
|
158
|
+
if (!silent) {
|
|
159
|
+
console.log(chalk_1.default.gray('(Opening browser...)'));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Browser open failed, user will need to manually navigate
|
|
164
|
+
}
|
|
165
|
+
if (!silent) {
|
|
166
|
+
console.log('');
|
|
167
|
+
console.log('Waiting for authentication...');
|
|
168
|
+
}
|
|
169
|
+
// Step 2: Poll for token
|
|
170
|
+
const token = await pollForToken(deviceCode);
|
|
171
|
+
if (!token) {
|
|
172
|
+
return { success: false, error: 'Authentication timed out or was denied' };
|
|
173
|
+
}
|
|
174
|
+
// Step 3: Verify and store
|
|
175
|
+
return await verifyAndStoreToken(token, silent);
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
return {
|
|
179
|
+
success: false,
|
|
180
|
+
error: error instanceof Error ? error.message : 'Unknown error during authentication',
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Request a device code from GitHub
|
|
186
|
+
*/
|
|
187
|
+
async function requestDeviceCode() {
|
|
188
|
+
const response = await fetch(GITHUB_DEVICE_CODE_URL, {
|
|
189
|
+
method: 'POST',
|
|
190
|
+
headers: {
|
|
191
|
+
Accept: 'application/json',
|
|
192
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
193
|
+
},
|
|
194
|
+
body: new URLSearchParams({
|
|
195
|
+
client_id: GITHUB_CLIENT_ID,
|
|
196
|
+
scope: 'repo',
|
|
197
|
+
}),
|
|
198
|
+
});
|
|
199
|
+
if (!response.ok) {
|
|
200
|
+
throw new Error(`Failed to request device code: ${response.status}`);
|
|
201
|
+
}
|
|
202
|
+
return (await response.json());
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Poll for the access token after user authorizes
|
|
206
|
+
*/
|
|
207
|
+
async function pollForToken(deviceCode) {
|
|
208
|
+
const startTime = Date.now();
|
|
209
|
+
const expiresAt = startTime + deviceCode.expires_in * 1000;
|
|
210
|
+
const interval = Math.max(deviceCode.interval, 5) * 1000; // At least 5 seconds
|
|
211
|
+
while (Date.now() < expiresAt) {
|
|
212
|
+
await sleep(interval);
|
|
213
|
+
const response = await fetch(GITHUB_TOKEN_URL, {
|
|
214
|
+
method: 'POST',
|
|
215
|
+
headers: {
|
|
216
|
+
Accept: 'application/json',
|
|
217
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
218
|
+
},
|
|
219
|
+
body: new URLSearchParams({
|
|
220
|
+
client_id: GITHUB_CLIENT_ID,
|
|
221
|
+
device_code: deviceCode.device_code,
|
|
222
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
223
|
+
}),
|
|
224
|
+
});
|
|
225
|
+
const data = (await response.json());
|
|
226
|
+
if (data.access_token) {
|
|
227
|
+
return data.access_token;
|
|
228
|
+
}
|
|
229
|
+
if (data.error === 'authorization_pending') {
|
|
230
|
+
// User hasn't authorized yet, keep polling
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (data.error === 'slow_down') {
|
|
234
|
+
// Back off
|
|
235
|
+
await sleep(5000);
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (data.error === 'expired_token') {
|
|
239
|
+
throw new Error('Device code expired. Please try again.');
|
|
240
|
+
}
|
|
241
|
+
if (data.error === 'access_denied') {
|
|
242
|
+
throw new Error('Authorization was denied.');
|
|
243
|
+
}
|
|
244
|
+
if (data.error) {
|
|
245
|
+
throw new Error(data.error_description || data.error);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get the authenticated GitHub user
|
|
252
|
+
*/
|
|
253
|
+
async function getGitHubUser(token) {
|
|
254
|
+
try {
|
|
255
|
+
const response = await fetch(`${GITHUB_API_URL}/user`, {
|
|
256
|
+
headers: {
|
|
257
|
+
Authorization: `Bearer ${token}`,
|
|
258
|
+
Accept: 'application/vnd.github.v3+json',
|
|
259
|
+
'User-Agent': 'brainfile-cli',
|
|
260
|
+
},
|
|
261
|
+
});
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
return (await response.json());
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Create a GitHub Issue
|
|
273
|
+
*/
|
|
274
|
+
async function createGitHubIssue(options) {
|
|
275
|
+
const token = await getGitHubToken();
|
|
276
|
+
if (!token) {
|
|
277
|
+
return { success: false, error: 'Not authenticated with GitHub. Run: brainfile auth github' };
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
// Create the issue
|
|
281
|
+
const createResponse = await fetch(`${GITHUB_API_URL}/repos/${options.owner}/${options.repo}/issues`, {
|
|
282
|
+
method: 'POST',
|
|
283
|
+
headers: {
|
|
284
|
+
Authorization: `Bearer ${token}`,
|
|
285
|
+
Accept: 'application/vnd.github.v3+json',
|
|
286
|
+
'User-Agent': 'brainfile-cli',
|
|
287
|
+
'Content-Type': 'application/json',
|
|
288
|
+
},
|
|
289
|
+
body: JSON.stringify({
|
|
290
|
+
title: options.title,
|
|
291
|
+
body: options.body,
|
|
292
|
+
labels: options.labels,
|
|
293
|
+
}),
|
|
294
|
+
});
|
|
295
|
+
if (!createResponse.ok) {
|
|
296
|
+
const errorData = await createResponse.json();
|
|
297
|
+
return {
|
|
298
|
+
success: false,
|
|
299
|
+
error: `Failed to create issue: ${errorData.message || createResponse.status}`,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
const issue = (await createResponse.json());
|
|
303
|
+
// Close the issue if requested
|
|
304
|
+
if (options.state === 'closed') {
|
|
305
|
+
await fetch(`${GITHUB_API_URL}/repos/${options.owner}/${options.repo}/issues/${issue.number}`, {
|
|
306
|
+
method: 'PATCH',
|
|
307
|
+
headers: {
|
|
308
|
+
Authorization: `Bearer ${token}`,
|
|
309
|
+
Accept: 'application/vnd.github.v3+json',
|
|
310
|
+
'User-Agent': 'brainfile-cli',
|
|
311
|
+
'Content-Type': 'application/json',
|
|
312
|
+
},
|
|
313
|
+
body: JSON.stringify({ state: 'closed' }),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
success: true,
|
|
318
|
+
issueNumber: issue.number,
|
|
319
|
+
issueUrl: issue.html_url,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
return {
|
|
324
|
+
success: false,
|
|
325
|
+
error: err instanceof Error ? err.message : 'Unknown error creating issue',
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Logout from GitHub
|
|
331
|
+
*/
|
|
332
|
+
async function logoutGitHub() {
|
|
333
|
+
await auth_store_1.authStore.clear('github');
|
|
334
|
+
}
|
|
335
|
+
// ============================================================================
|
|
336
|
+
// Helpers
|
|
337
|
+
// ============================================================================
|
|
338
|
+
function sleep(ms) {
|
|
339
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=github-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-auth.js","sourceRoot":"","sources":["../../src/utils/github-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse hook input JSON and extract relevant information
|
|
3
|
+
* Handles different input formats from different tools
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseHookInput(input: any): {
|
|
6
|
+
filePath?: string;
|
|
7
|
+
command?: string;
|
|
8
|
+
prompt?: string;
|
|
9
|
+
tool?: 'claude-code' | 'cursor' | 'cline' | 'unknown';
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Determine if we should output JSON for Cursor's beforeSubmitPrompt or Cline hooks
|
|
13
|
+
*/
|
|
14
|
+
export declare function shouldOutputJSON(input: any): boolean;
|
|
15
|
+
//# sourceMappingURL=hook-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-parser.d.ts","sourceRoot":"","sources":["../../src/utils/hook-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;CACvD,CAsDA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAQpD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseHookInput = parseHookInput;
|
|
4
|
+
exports.shouldOutputJSON = shouldOutputJSON;
|
|
5
|
+
/**
|
|
6
|
+
* Parse hook input JSON and extract relevant information
|
|
7
|
+
* Handles different input formats from different tools
|
|
8
|
+
*/
|
|
9
|
+
function parseHookInput(input) {
|
|
10
|
+
// Handle null or undefined input
|
|
11
|
+
if (!input) {
|
|
12
|
+
return {
|
|
13
|
+
tool: 'unknown'
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
// Cline format - check for clineVersion and hookName
|
|
17
|
+
if (input.clineVersion && input.hookName) {
|
|
18
|
+
// Extract file path from postToolUse parameters if available
|
|
19
|
+
let filePath;
|
|
20
|
+
if (input.postToolUse?.parameters?.target_file) {
|
|
21
|
+
filePath = input.postToolUse.parameters.target_file;
|
|
22
|
+
}
|
|
23
|
+
else if (input.postToolUse?.parameters?.file_path) {
|
|
24
|
+
filePath = input.postToolUse.parameters.file_path;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
filePath,
|
|
28
|
+
prompt: input.userPromptSubmit?.prompt,
|
|
29
|
+
tool: 'cline'
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Claude Code format
|
|
33
|
+
if (input.tool_input) {
|
|
34
|
+
return {
|
|
35
|
+
filePath: input.tool_input.file_path,
|
|
36
|
+
command: input.tool_input.command,
|
|
37
|
+
tool: 'claude-code'
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Cursor format
|
|
41
|
+
if (input.file_path) {
|
|
42
|
+
return {
|
|
43
|
+
filePath: input.file_path,
|
|
44
|
+
tool: 'cursor'
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Prompt-related hooks
|
|
48
|
+
if (input.prompt) {
|
|
49
|
+
return {
|
|
50
|
+
prompt: input.prompt,
|
|
51
|
+
tool: input.hook_event_name ? 'cursor' : 'claude-code'
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
tool: 'unknown'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Determine if we should output JSON for Cursor's beforeSubmitPrompt or Cline hooks
|
|
60
|
+
*/
|
|
61
|
+
function shouldOutputJSON(input) {
|
|
62
|
+
// Cline always expects JSON output
|
|
63
|
+
if (input && input.clineVersion && input.hookName) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
// Cursor's beforeSubmitPrompt expects JSON
|
|
67
|
+
return input.hook_event_name === 'beforeSubmitPrompt';
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=hook-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-parser.js","sourceRoot":"","sources":["../../src/utils/hook-parser.ts"],"names":[],"mappings":";;AAIA,wCA2DC;AAKD,4CAQC;AA5ED;;;GAGG;AACH,SAAgB,cAAc,CAAC,KAAU;IAMvC,iCAAiC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,SAAS;SAChB,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzC,6DAA6D;QAC7D,IAAI,QAA4B,CAAC;QAEjC,IAAI,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;YAC/C,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC;QACtD,CAAC;aAAM,IAAI,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YACpD,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC;QACpD,CAAC;QAED,OAAO;YACL,QAAQ;YACR,MAAM,EAAE,KAAK,CAAC,gBAAgB,EAAE,MAAM;YACtC,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS;YACpC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO;YACjC,IAAI,EAAE,aAAa;SACpB,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa;SACvD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,KAAU;IACzC,mCAAmC;IACnC,IAAI,KAAK,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2CAA2C;IAC3C,OAAO,KAAK,CAAC,eAAe,KAAK,oBAAoB,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type SupportedTool = 'claude-code' | 'cursor' | 'cline';
|
|
2
|
+
export type SettingsScope = 'user' | 'project';
|
|
3
|
+
/**
|
|
4
|
+
* Get settings path for a specific tool and scope
|
|
5
|
+
*/
|
|
6
|
+
export declare function getSettingsPath(tool: SupportedTool, scope: SettingsScope): string;
|
|
7
|
+
/**
|
|
8
|
+
* Read tool settings (returns empty object if file doesn't exist)
|
|
9
|
+
*/
|
|
10
|
+
export declare function readToolSettings(tool: SupportedTool, scope: SettingsScope): any;
|
|
11
|
+
/**
|
|
12
|
+
* Write tool settings
|
|
13
|
+
*/
|
|
14
|
+
export declare function writeToolSettings(tool: SupportedTool, scope: SettingsScope, settings: any): void;
|
|
15
|
+
/**
|
|
16
|
+
* Add brainfile hooks to tool settings
|
|
17
|
+
*/
|
|
18
|
+
export declare function installBrainfileHooks(tool: SupportedTool, scope: SettingsScope): void;
|
|
19
|
+
/**
|
|
20
|
+
* Remove brainfile hooks from tool settings
|
|
21
|
+
*/
|
|
22
|
+
export declare function uninstallBrainfileHooks(tool: SupportedTool, scope: SettingsScope): void;
|
|
23
|
+
/**
|
|
24
|
+
* Check if brainfile hooks are installed for a tool
|
|
25
|
+
*/
|
|
26
|
+
export declare function areBrainfileHooksInstalled(tool: SupportedTool, scope: SettingsScope): boolean;
|
|
27
|
+
//# sourceMappingURL=hook-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-settings.d.ts","sourceRoot":"","sources":["../../src/utils/hook-settings.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC/D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAO/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAuBjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,GAAG,CAgC/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,CAUhG;AAoDD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAqIrF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAyEvF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CA6D7F"}
|