@brainfile/cli 0.11.1 → 0.12.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/brainfile.md +82 -5
- package/dist/cli.js +30 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +15 -2
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +351 -23
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/auth.d.ts +26 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +141 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/tui/BrainfileTUI.d.ts.map +1 -1
- package/dist/tui/BrainfileTUI.js +69 -36
- package/dist/tui/BrainfileTUI.js.map +1 -1
- package/dist/tui/components/ArchivePanel.d.ts +3 -2
- package/dist/tui/components/ArchivePanel.d.ts.map +1 -1
- package/dist/tui/components/ArchivePanel.js +7 -6
- package/dist/tui/components/ArchivePanel.js.map +1 -1
- package/dist/tui/components/Header.d.ts +4 -1
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +25 -1
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/HelpOverlay.d.ts +3 -1
- package/dist/tui/components/HelpOverlay.d.ts.map +1 -1
- package/dist/tui/components/HelpOverlay.js +38 -1
- package/dist/tui/components/HelpOverlay.js.map +1 -1
- package/dist/tui/components/MainPanelTabs.d.ts +3 -2
- package/dist/tui/components/MainPanelTabs.d.ts.map +1 -1
- package/dist/tui/components/MainPanelTabs.js +20 -1
- package/dist/tui/components/MainPanelTabs.js.map +1 -1
- package/dist/tui/components/RulesPanel.d.ts +3 -2
- package/dist/tui/components/RulesPanel.d.ts.map +1 -1
- package/dist/tui/components/RulesPanel.js +20 -6
- package/dist/tui/components/RulesPanel.js.map +1 -1
- package/dist/tui/components/StackedTaskList.d.ts +26 -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 +3 -2
- package/dist/tui/components/StatusBar.d.ts.map +1 -1
- package/dist/tui/components/StatusBar.js +6 -3
- package/dist/tui/components/StatusBar.js.map +1 -1
- package/dist/tui/components/TaskCard.d.ts +3 -1
- package/dist/tui/components/TaskCard.d.ts.map +1 -1
- package/dist/tui/components/TaskCard.js +3 -2
- package/dist/tui/components/TaskCard.js.map +1 -1
- package/dist/tui/components/index.d.ts +2 -0
- package/dist/tui/components/index.d.ts.map +1 -1
- package/dist/tui/components/index.js +4 -1
- package/dist/tui/components/index.js.map +1 -1
- package/dist/tui/hooks/useKeyboardNavigation.d.ts +6 -2
- package/dist/tui/hooks/useKeyboardNavigation.d.ts.map +1 -1
- package/dist/tui/hooks/useKeyboardNavigation.js +88 -40
- package/dist/tui/hooks/useKeyboardNavigation.js.map +1 -1
- package/dist/tui/types.d.ts +9 -0
- package/dist/tui/types.d.ts.map +1 -1
- package/dist/tui/types.js +7 -1
- package/dist/tui/types.js.map +1 -1
- 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/config.d.ts +89 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +211 -0
- package/dist/utils/config.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/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/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-auth.d.ts","sourceRoot":"","sources":["../../src/utils/github-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+CH;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7D;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsCnE;AAwLD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiEzF;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
|
|
@@ -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,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear Authentication for Brainfile CLI
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* 1. OAuth Device Flow (browser-based)
|
|
6
|
+
* 2. API Key (manual entry)
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
interface LinearTeam {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
key: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if Linear is already authenticated
|
|
17
|
+
*/
|
|
18
|
+
export declare function isLinearAuthenticated(): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Get the current Linear token
|
|
21
|
+
*/
|
|
22
|
+
export declare function getLinearToken(): Promise<string | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Authenticate with Linear using API key
|
|
25
|
+
*/
|
|
26
|
+
export declare function authenticateLinear(options: {
|
|
27
|
+
token?: string;
|
|
28
|
+
silent?: boolean;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
success: boolean;
|
|
31
|
+
workspace?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Get Linear teams
|
|
36
|
+
*/
|
|
37
|
+
export declare function getLinearTeams(): Promise<LinearTeam[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Create a Linear issue
|
|
40
|
+
*/
|
|
41
|
+
export declare function createLinearIssue(options: {
|
|
42
|
+
teamId: string;
|
|
43
|
+
title: string;
|
|
44
|
+
description?: string;
|
|
45
|
+
priority?: number;
|
|
46
|
+
labelNames?: string[];
|
|
47
|
+
stateName?: string;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
success: boolean;
|
|
50
|
+
issueId?: string;
|
|
51
|
+
issueUrl?: string;
|
|
52
|
+
error?: string;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Logout from Linear
|
|
56
|
+
*/
|
|
57
|
+
export declare function logoutLinear(): Promise<void>;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=linear-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-auth.d.ts","sourceRoot":"","sources":["../../src/utils/linear-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAiBD;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCpE;AAuED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAqC5D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmFrF;AA6DD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
|