@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.
@@ -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":";AAAA;;;;;;;;;;GAUG;;;;;AAgBH,8CAiBC;AAUD,8CA4BC;AAMD,8CAoCC;AAUD,8CAoCC;AA7JD,kDAA0B;AAC1B,oDAAgD;AAChD,sDAAwE;AACxE,sDAAwE;AACxE,wDAAoD;AAU7C,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAkB,EAAC;YACtC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,2BAA2B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,0BAAW,EAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAUM,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IAChE,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,0BAA0B,eAAK,CAAC,SAAS,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;YAC5F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAkB,EAAC;YACtC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,2BAA2B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,0BAAW,EAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAExE,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,sBAAS,CAAC,SAAS,EAAE,CAAC;QAE3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,SAAS;QACT,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjG,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBACd,yBAAyB,QAAQ,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CACnE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,yBAAyB,CAAC,CAAC;QAC1D,CAAC;QAED,SAAS;QACT,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBACd,yBAAyB,QAAQ,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CACnE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,yBAAyB,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,0BAAW,EAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAUM,KAAK,UAAU,iBAAiB,CAAC,QAAiB,EAAE,OAAuB;IAChF,IAAI,CAAC;QACH,IAAI,OAAO,EAAE,GAAG,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvC,MAAM,IAAA,0BAAY,GAAE,CAAC;YACrB,MAAM,IAAA,0BAAY,GAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,gCAAgC,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,KAAK,QAAQ;gBACX,MAAM,IAAA,0BAAY,GAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,yBAAyB,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,IAAA,0BAAY,GAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,yBAAyB,CAAC,CAAC;gBAC1D,MAAM;YACR;gBACE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,sBAAsB,QAAQ,EAAE,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,0BAAW,EAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -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"}