@brainfile/cli 0.11.2 → 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/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/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,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication commands for Brainfile CLI
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* - brainfile auth github [--token <token>]
|
|
7
|
+
* - brainfile auth linear --token <token>
|
|
8
|
+
* - brainfile auth status
|
|
9
|
+
* - brainfile auth logout <provider>
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.githubAuthCommand = githubAuthCommand;
|
|
18
|
+
exports.linearAuthCommand = linearAuthCommand;
|
|
19
|
+
exports.authStatusCommand = authStatusCommand;
|
|
20
|
+
exports.authLogoutCommand = authLogoutCommand;
|
|
21
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
22
|
+
const auth_store_1 = require("../utils/auth-store");
|
|
23
|
+
const github_auth_1 = require("../utils/github-auth");
|
|
24
|
+
const linear_auth_1 = require("../utils/linear-auth");
|
|
25
|
+
const errorHandler_1 = require("../utils/errorHandler");
|
|
26
|
+
async function githubAuthCommand(options) {
|
|
27
|
+
try {
|
|
28
|
+
const result = await (0, github_auth_1.authenticateGitHub)({
|
|
29
|
+
token: options.token,
|
|
30
|
+
usePAT: !!options.token,
|
|
31
|
+
});
|
|
32
|
+
if (!result.success) {
|
|
33
|
+
console.log(chalk_1.default.red('✗') + ` Authentication failed: ${result.error}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
console.log('');
|
|
37
|
+
console.log(chalk_1.default.green('GitHub authentication complete!'));
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
(0, errorHandler_1.handleError)(error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function linearAuthCommand(options) {
|
|
44
|
+
try {
|
|
45
|
+
if (!options.token) {
|
|
46
|
+
console.log('');
|
|
47
|
+
console.log('Linear authentication requires an API key.');
|
|
48
|
+
console.log('');
|
|
49
|
+
console.log(`Get your API key from: ${chalk_1.default.underline('https://linear.app/settings/api')}`);
|
|
50
|
+
console.log('');
|
|
51
|
+
console.log('Then run:');
|
|
52
|
+
console.log(chalk_1.default.cyan(' brainfile auth linear --token <your-api-key>'));
|
|
53
|
+
console.log('');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const result = await (0, linear_auth_1.authenticateLinear)({
|
|
57
|
+
token: options.token,
|
|
58
|
+
});
|
|
59
|
+
if (!result.success) {
|
|
60
|
+
console.log(chalk_1.default.red('✗') + ` Authentication failed: ${result.error}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
console.log('');
|
|
64
|
+
console.log(chalk_1.default.green('Linear authentication complete!'));
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
(0, errorHandler_1.handleError)(error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// Status Command
|
|
72
|
+
// ============================================================================
|
|
73
|
+
async function authStatusCommand() {
|
|
74
|
+
try {
|
|
75
|
+
const status = await auth_store_1.authStore.getStatus();
|
|
76
|
+
console.log('');
|
|
77
|
+
console.log(chalk_1.default.bold('Authentication Status'));
|
|
78
|
+
console.log('');
|
|
79
|
+
// GitHub
|
|
80
|
+
if (status.github.authenticated) {
|
|
81
|
+
const source = status.github.source;
|
|
82
|
+
const username = status.github.username ? ` as ${chalk_1.default.cyan('@' + status.github.username)}` : '';
|
|
83
|
+
console.log(chalk_1.default.green('✓') +
|
|
84
|
+
` GitHub: authenticated${username} ${chalk_1.default.gray(`(${source})`)}`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.log(chalk_1.default.red('✗') + ' GitHub: not configured');
|
|
88
|
+
}
|
|
89
|
+
// Linear
|
|
90
|
+
if (status.linear.authenticated) {
|
|
91
|
+
const source = status.linear.source;
|
|
92
|
+
const username = status.linear.username ? ` as ${chalk_1.default.cyan(status.linear.username)}` : '';
|
|
93
|
+
console.log(chalk_1.default.green('✓') +
|
|
94
|
+
` Linear: authenticated${username} ${chalk_1.default.gray(`(${source})`)}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log(chalk_1.default.red('✗') + ' Linear: not configured');
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
(0, errorHandler_1.handleError)(error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function authLogoutCommand(provider, options) {
|
|
106
|
+
try {
|
|
107
|
+
if (options?.all || provider === 'all') {
|
|
108
|
+
await (0, github_auth_1.logoutGitHub)();
|
|
109
|
+
await (0, linear_auth_1.logoutLinear)();
|
|
110
|
+
console.log(chalk_1.default.green('✓') + ' Logged out from all providers');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (!provider) {
|
|
114
|
+
console.log('');
|
|
115
|
+
console.log('Usage:');
|
|
116
|
+
console.log(' brainfile auth logout github');
|
|
117
|
+
console.log(' brainfile auth logout linear');
|
|
118
|
+
console.log(' brainfile auth logout --all');
|
|
119
|
+
console.log('');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
switch (provider.toLowerCase()) {
|
|
123
|
+
case 'github':
|
|
124
|
+
await (0, github_auth_1.logoutGitHub)();
|
|
125
|
+
console.log(chalk_1.default.green('✓') + ' Logged out from GitHub');
|
|
126
|
+
break;
|
|
127
|
+
case 'linear':
|
|
128
|
+
await (0, linear_auth_1.logoutLinear)();
|
|
129
|
+
console.log(chalk_1.default.green('✓') + ' Logged out from Linear');
|
|
130
|
+
break;
|
|
131
|
+
default:
|
|
132
|
+
console.log(chalk_1.default.red('✗') + ` Unknown provider: ${provider}`);
|
|
133
|
+
console.log('Valid providers: github, linear');
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
(0, errorHandler_1.handleError)(error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication token storage for Brainfile CLI
|
|
3
|
+
*
|
|
4
|
+
* Stores tokens with the following priority:
|
|
5
|
+
* 1. System keychain (via keytar, if available)
|
|
6
|
+
* 2. Config file (~/.config/brainfile/auth.json)
|
|
7
|
+
* 3. Environment variables (read-only)
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
export type AuthProvider = 'github' | 'linear';
|
|
12
|
+
export interface StoredToken {
|
|
13
|
+
token: string;
|
|
14
|
+
savedAt: string;
|
|
15
|
+
username?: string;
|
|
16
|
+
workspace?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Try to get GitHub token from gh CLI
|
|
20
|
+
* @returns Token from gh CLI, or null if not available
|
|
21
|
+
*/
|
|
22
|
+
export declare function getGitHubCLIToken(): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Check if gh CLI is installed and authenticated
|
|
25
|
+
*/
|
|
26
|
+
export declare function isGitHubCLIAvailable(): boolean;
|
|
27
|
+
export declare class AuthStore {
|
|
28
|
+
/**
|
|
29
|
+
* Get a token for a provider
|
|
30
|
+
* Checks: env vars → keychain → config file → gh CLI (for github)
|
|
31
|
+
*/
|
|
32
|
+
get(provider: AuthProvider): Promise<string | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Get stored token info (includes metadata like username)
|
|
35
|
+
*/
|
|
36
|
+
getTokenInfo(provider: AuthProvider): Promise<StoredToken | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Store a token for a provider
|
|
39
|
+
* Stores in: keychain (if available) AND config file (for metadata)
|
|
40
|
+
*/
|
|
41
|
+
set(provider: AuthProvider, token: string, metadata?: {
|
|
42
|
+
username?: string;
|
|
43
|
+
workspace?: string;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Clear a token for a provider
|
|
47
|
+
*/
|
|
48
|
+
clear(provider: AuthProvider): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a provider is authenticated
|
|
51
|
+
*/
|
|
52
|
+
isAuthenticated(provider: AuthProvider): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Get authentication status for all providers
|
|
55
|
+
*/
|
|
56
|
+
getStatus(): Promise<Record<AuthProvider, {
|
|
57
|
+
authenticated: boolean;
|
|
58
|
+
source?: string;
|
|
59
|
+
username?: string;
|
|
60
|
+
}>>;
|
|
61
|
+
private getFromEnv;
|
|
62
|
+
private loadAuthFile;
|
|
63
|
+
private saveAuthFile;
|
|
64
|
+
private getFromFile;
|
|
65
|
+
private saveToFile;
|
|
66
|
+
private removeFromFile;
|
|
67
|
+
}
|
|
68
|
+
export declare const authStore: AuthStore;
|
|
69
|
+
//# sourceMappingURL=auth-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../../src/utils/auth-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmDD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAejD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAMD,qBAAa,SAAS;IACpB;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkCzD;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAMvE;;;OAGG;IACG,GAAG,CACP,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAelD;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAyDhH,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,cAAc;CAKvB;AAGD,eAAO,MAAM,SAAS,WAAkB,CAAC"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication token storage for Brainfile CLI
|
|
4
|
+
*
|
|
5
|
+
* Stores tokens with the following priority:
|
|
6
|
+
* 1. System keychain (via keytar, if available)
|
|
7
|
+
* 2. Config file (~/.config/brainfile/auth.json)
|
|
8
|
+
* 3. Environment variables (read-only)
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.authStore = exports.AuthStore = void 0;
|
|
47
|
+
exports.getGitHubCLIToken = getGitHubCLIToken;
|
|
48
|
+
exports.isGitHubCLIAvailable = isGitHubCLIAvailable;
|
|
49
|
+
const fs = __importStar(require("fs"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const child_process_1 = require("child_process");
|
|
52
|
+
const config_1 = require("./config");
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// Constants
|
|
55
|
+
// ============================================================================
|
|
56
|
+
const SERVICE_NAME = 'brainfile';
|
|
57
|
+
const AUTH_FILE = path.join((0, config_1.getConfigDir)(), 'auth.json');
|
|
58
|
+
const ENV_VAR_MAP = {
|
|
59
|
+
github: ['GITHUB_TOKEN', 'GH_TOKEN'],
|
|
60
|
+
linear: ['LINEAR_API_KEY', 'LINEAR_TOKEN'],
|
|
61
|
+
};
|
|
62
|
+
// ============================================================================
|
|
63
|
+
// Keytar Integration (Optional)
|
|
64
|
+
// ============================================================================
|
|
65
|
+
let keytar = null;
|
|
66
|
+
let keytarChecked = false;
|
|
67
|
+
/**
|
|
68
|
+
* Try to load keytar (system keychain integration)
|
|
69
|
+
* Returns null if keytar is not available
|
|
70
|
+
*/
|
|
71
|
+
function getKeytar() {
|
|
72
|
+
if (keytarChecked) {
|
|
73
|
+
return keytar;
|
|
74
|
+
}
|
|
75
|
+
keytarChecked = true;
|
|
76
|
+
try {
|
|
77
|
+
// Dynamic require to make keytar optional
|
|
78
|
+
keytar = require('keytar');
|
|
79
|
+
return keytar;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// keytar not installed or native module not built
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// GitHub CLI Integration
|
|
88
|
+
// ============================================================================
|
|
89
|
+
/**
|
|
90
|
+
* Try to get GitHub token from gh CLI
|
|
91
|
+
* @returns Token from gh CLI, or null if not available
|
|
92
|
+
*/
|
|
93
|
+
function getGitHubCLIToken() {
|
|
94
|
+
try {
|
|
95
|
+
const token = (0, child_process_1.execSync)('gh auth token', {
|
|
96
|
+
encoding: 'utf-8',
|
|
97
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
98
|
+
}).trim();
|
|
99
|
+
if (token && token.length > 0) {
|
|
100
|
+
return token;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// gh CLI not installed or not authenticated
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if gh CLI is installed and authenticated
|
|
110
|
+
*/
|
|
111
|
+
function isGitHubCLIAvailable() {
|
|
112
|
+
return getGitHubCLIToken() !== null;
|
|
113
|
+
}
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// Auth Store Class
|
|
116
|
+
// ============================================================================
|
|
117
|
+
class AuthStore {
|
|
118
|
+
/**
|
|
119
|
+
* Get a token for a provider
|
|
120
|
+
* Checks: env vars → keychain → config file → gh CLI (for github)
|
|
121
|
+
*/
|
|
122
|
+
async get(provider) {
|
|
123
|
+
// 1. Check environment variables
|
|
124
|
+
const envToken = this.getFromEnv(provider);
|
|
125
|
+
if (envToken) {
|
|
126
|
+
return envToken;
|
|
127
|
+
}
|
|
128
|
+
// 2. Check system keychain
|
|
129
|
+
const kt = getKeytar();
|
|
130
|
+
if (kt) {
|
|
131
|
+
try {
|
|
132
|
+
const keychainToken = await kt.getPassword(SERVICE_NAME, provider);
|
|
133
|
+
if (keychainToken) {
|
|
134
|
+
return keychainToken;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Keychain access failed, continue to next option
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// 3. Check config file
|
|
142
|
+
const fileToken = this.getFromFile(provider);
|
|
143
|
+
if (fileToken) {
|
|
144
|
+
return fileToken;
|
|
145
|
+
}
|
|
146
|
+
// 4. For GitHub, check gh CLI as last resort
|
|
147
|
+
if (provider === 'github') {
|
|
148
|
+
return getGitHubCLIToken();
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get stored token info (includes metadata like username)
|
|
154
|
+
*/
|
|
155
|
+
async getTokenInfo(provider) {
|
|
156
|
+
// Check config file for metadata
|
|
157
|
+
const authData = this.loadAuthFile();
|
|
158
|
+
return authData[provider] || null;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Store a token for a provider
|
|
162
|
+
* Stores in: keychain (if available) AND config file (for metadata)
|
|
163
|
+
*/
|
|
164
|
+
async set(provider, token, metadata) {
|
|
165
|
+
const storedToken = {
|
|
166
|
+
token,
|
|
167
|
+
savedAt: new Date().toISOString(),
|
|
168
|
+
...metadata,
|
|
169
|
+
};
|
|
170
|
+
// 1. Try to store in keychain
|
|
171
|
+
const kt = getKeytar();
|
|
172
|
+
if (kt) {
|
|
173
|
+
try {
|
|
174
|
+
await kt.setPassword(SERVICE_NAME, provider, token);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Keychain storage failed, will fall back to file
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// 2. Store in config file (always, for metadata)
|
|
181
|
+
this.saveToFile(provider, storedToken);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Clear a token for a provider
|
|
185
|
+
*/
|
|
186
|
+
async clear(provider) {
|
|
187
|
+
// 1. Remove from keychain
|
|
188
|
+
const kt = getKeytar();
|
|
189
|
+
if (kt) {
|
|
190
|
+
try {
|
|
191
|
+
await kt.deletePassword(SERVICE_NAME, provider);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Ignore errors
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// 2. Remove from config file
|
|
198
|
+
this.removeFromFile(provider);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if a provider is authenticated
|
|
202
|
+
*/
|
|
203
|
+
async isAuthenticated(provider) {
|
|
204
|
+
const token = await this.get(provider);
|
|
205
|
+
return token !== null;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get authentication status for all providers
|
|
209
|
+
*/
|
|
210
|
+
async getStatus() {
|
|
211
|
+
const result = {
|
|
212
|
+
github: { authenticated: false },
|
|
213
|
+
linear: { authenticated: false },
|
|
214
|
+
};
|
|
215
|
+
for (const provider of ['github', 'linear']) {
|
|
216
|
+
// Check env first
|
|
217
|
+
if (this.getFromEnv(provider)) {
|
|
218
|
+
result[provider] = { authenticated: true, source: 'environment' };
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
// Check keychain
|
|
222
|
+
const kt = getKeytar();
|
|
223
|
+
if (kt) {
|
|
224
|
+
try {
|
|
225
|
+
const token = await kt.getPassword(SERVICE_NAME, provider);
|
|
226
|
+
if (token) {
|
|
227
|
+
const info = await this.getTokenInfo(provider);
|
|
228
|
+
result[provider] = {
|
|
229
|
+
authenticated: true,
|
|
230
|
+
source: 'keychain',
|
|
231
|
+
username: info?.username,
|
|
232
|
+
};
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Continue to next check
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Check config file
|
|
241
|
+
const fileToken = this.getFromFile(provider);
|
|
242
|
+
if (fileToken) {
|
|
243
|
+
const info = await this.getTokenInfo(provider);
|
|
244
|
+
result[provider] = {
|
|
245
|
+
authenticated: true,
|
|
246
|
+
source: 'config',
|
|
247
|
+
username: info?.username,
|
|
248
|
+
};
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
// For GitHub, check gh CLI
|
|
252
|
+
if (provider === 'github' && getGitHubCLIToken()) {
|
|
253
|
+
result[provider] = { authenticated: true, source: 'gh-cli' };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
// ============================================================================
|
|
259
|
+
// Private Methods
|
|
260
|
+
// ============================================================================
|
|
261
|
+
getFromEnv(provider) {
|
|
262
|
+
const vars = ENV_VAR_MAP[provider];
|
|
263
|
+
for (const varName of vars) {
|
|
264
|
+
const value = process.env[varName];
|
|
265
|
+
if (value && value.length > 0) {
|
|
266
|
+
return value;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
loadAuthFile() {
|
|
272
|
+
try {
|
|
273
|
+
if (fs.existsSync(AUTH_FILE)) {
|
|
274
|
+
const content = fs.readFileSync(AUTH_FILE, 'utf-8');
|
|
275
|
+
return JSON.parse(content);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// File corrupted or unreadable
|
|
280
|
+
}
|
|
281
|
+
return {};
|
|
282
|
+
}
|
|
283
|
+
saveAuthFile(data) {
|
|
284
|
+
(0, config_1.ensureConfigDir)();
|
|
285
|
+
fs.writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), {
|
|
286
|
+
encoding: 'utf-8',
|
|
287
|
+
mode: 0o600, // Owner read/write only
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
getFromFile(provider) {
|
|
291
|
+
const data = this.loadAuthFile();
|
|
292
|
+
return data[provider]?.token || null;
|
|
293
|
+
}
|
|
294
|
+
saveToFile(provider, tokenInfo) {
|
|
295
|
+
const data = this.loadAuthFile();
|
|
296
|
+
data[provider] = tokenInfo;
|
|
297
|
+
this.saveAuthFile(data);
|
|
298
|
+
}
|
|
299
|
+
removeFromFile(provider) {
|
|
300
|
+
const data = this.loadAuthFile();
|
|
301
|
+
delete data[provider];
|
|
302
|
+
this.saveAuthFile(data);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
exports.AuthStore = AuthStore;
|
|
306
|
+
// Export singleton instance
|
|
307
|
+
exports.authStore = new AuthStore();
|
|
308
|
+
//# sourceMappingURL=auth-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../../src/utils/auth-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration file management for Brainfile CLI
|
|
3
|
+
*
|
|
4
|
+
* Handles reading/writing ~/.config/brainfile/config.json for:
|
|
5
|
+
* - Archive destination defaults
|
|
6
|
+
* - GitHub connection details (owner, repo)
|
|
7
|
+
* - Linear connection details (teamId)
|
|
8
|
+
* - User preferences
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
export interface GitHubConfig {
|
|
13
|
+
/** GitHub repository owner (username or org) */
|
|
14
|
+
owner?: string;
|
|
15
|
+
/** GitHub repository name */
|
|
16
|
+
repo?: string;
|
|
17
|
+
/** Extra labels to add to archived issues */
|
|
18
|
+
labels?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface LinearConfig {
|
|
21
|
+
/** Linear team ID */
|
|
22
|
+
teamId?: string;
|
|
23
|
+
/** Linear project ID (optional) */
|
|
24
|
+
projectId?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ArchiveConfig {
|
|
27
|
+
/** Default archive destination: 'local' | 'github' | 'linear' */
|
|
28
|
+
default?: 'local' | 'github' | 'linear';
|
|
29
|
+
/** GitHub-specific settings */
|
|
30
|
+
github?: GitHubConfig;
|
|
31
|
+
/** Linear-specific settings */
|
|
32
|
+
linear?: LinearConfig;
|
|
33
|
+
}
|
|
34
|
+
export interface BrainfileConfig {
|
|
35
|
+
/** Archive configuration */
|
|
36
|
+
archive?: ArchiveConfig;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the path to the config directory
|
|
40
|
+
*/
|
|
41
|
+
export declare function getConfigDir(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Get the path to the config file
|
|
44
|
+
*/
|
|
45
|
+
export declare function getConfigPath(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Ensure the config directory exists
|
|
48
|
+
*/
|
|
49
|
+
export declare function ensureConfigDir(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Load the config file
|
|
52
|
+
* @returns Config object, or empty object if file doesn't exist
|
|
53
|
+
*/
|
|
54
|
+
export declare function loadConfig(): BrainfileConfig;
|
|
55
|
+
/**
|
|
56
|
+
* Save the config file
|
|
57
|
+
* @param config - Config object to save
|
|
58
|
+
*/
|
|
59
|
+
export declare function saveConfig(config: BrainfileConfig): void;
|
|
60
|
+
/**
|
|
61
|
+
* Update specific config values (merges with existing)
|
|
62
|
+
* @param updates - Partial config to merge
|
|
63
|
+
*/
|
|
64
|
+
export declare function updateConfig(updates: Partial<BrainfileConfig>): BrainfileConfig;
|
|
65
|
+
/**
|
|
66
|
+
* Get archive configuration with defaults
|
|
67
|
+
*/
|
|
68
|
+
export declare function getArchiveConfig(): ArchiveConfig;
|
|
69
|
+
/**
|
|
70
|
+
* Set archive default destination
|
|
71
|
+
*/
|
|
72
|
+
export declare function setArchiveDefault(destination: 'local' | 'github' | 'linear'): void;
|
|
73
|
+
/**
|
|
74
|
+
* Set GitHub configuration
|
|
75
|
+
*/
|
|
76
|
+
export declare function setGitHubConfig(github: GitHubConfig): void;
|
|
77
|
+
/**
|
|
78
|
+
* Set Linear configuration
|
|
79
|
+
*/
|
|
80
|
+
export declare function setLinearConfig(linear: LinearConfig): void;
|
|
81
|
+
/**
|
|
82
|
+
* Get the effective archive destination
|
|
83
|
+
* Priority: brainfile.md archive.destination > config default > 'local'
|
|
84
|
+
*
|
|
85
|
+
* @param brainfileDestination - Destination from brainfile.md (if any)
|
|
86
|
+
* @returns The effective destination
|
|
87
|
+
*/
|
|
88
|
+
export declare function getEffectiveArchiveDestination(brainfileDestination?: string): 'local' | 'github' | 'linear';
|
|
89
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACxC,+BAA+B;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAaD;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,eAAe,CAW5C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAMxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAK/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAGhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAKlF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAK1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAK1D;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAc/B"}
|