@bragduck/mcp 1.7.0 → 1.8.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.
Files changed (50) hide show
  1. package/README.md +29 -0
  2. package/dist/index.js +2006 -122
  3. package/dist/index.js.map +1 -1
  4. package/package.json +8 -4
  5. package/dist/api-client.d.ts +0 -29
  6. package/dist/api-client.js +0 -146
  7. package/dist/api-client.js.map +0 -1
  8. package/dist/auth.d.ts +0 -8
  9. package/dist/auth.js +0 -202
  10. package/dist/auth.js.map +0 -1
  11. package/dist/credentials.d.ts +0 -31
  12. package/dist/credentials.js +0 -150
  13. package/dist/credentials.js.map +0 -1
  14. package/dist/index.d.ts +0 -2
  15. package/dist/org-preference.d.ts +0 -7
  16. package/dist/org-preference.js +0 -22
  17. package/dist/org-preference.js.map +0 -1
  18. package/dist/tools/link-brag-to-key-result.d.ts +0 -30
  19. package/dist/tools/link-brag-to-key-result.js +0 -81
  20. package/dist/tools/link-brag-to-key-result.js.map +0 -1
  21. package/dist/tools/list-brags.d.ts +0 -53
  22. package/dist/tools/list-brags.js +0 -110
  23. package/dist/tools/list-brags.js.map +0 -1
  24. package/dist/tools/list-objectives.d.ts +0 -15
  25. package/dist/tools/list-objectives.js +0 -66
  26. package/dist/tools/list-objectives.js.map +0 -1
  27. package/dist/tools/list-organisations.d.ts +0 -15
  28. package/dist/tools/list-organisations.js +0 -73
  29. package/dist/tools/list-organisations.js.map +0 -1
  30. package/dist/tools/list-stories.d.ts +0 -41
  31. package/dist/tools/list-stories.js +0 -103
  32. package/dist/tools/list-stories.js.map +0 -1
  33. package/dist/tools/log-brag.d.ts +0 -88
  34. package/dist/tools/log-brag.js +0 -175
  35. package/dist/tools/log-brag.js.map +0 -1
  36. package/dist/tools/log-story.d.ts +0 -81
  37. package/dist/tools/log-story.js +0 -122
  38. package/dist/tools/log-story.js.map +0 -1
  39. package/dist/tools/login.d.ts +0 -24
  40. package/dist/tools/login.js +0 -46
  41. package/dist/tools/login.js.map +0 -1
  42. package/dist/tools/preview-brag.d.ts +0 -71
  43. package/dist/tools/preview-brag.js +0 -103
  44. package/dist/tools/preview-brag.js.map +0 -1
  45. package/dist/tools/quick-brag.d.ts +0 -38
  46. package/dist/tools/quick-brag.js +0 -143
  47. package/dist/tools/quick-brag.js.map +0 -1
  48. package/dist/tools/save-org-preference.d.ts +0 -30
  49. package/dist/tools/save-org-preference.js +0 -47
  50. package/dist/tools/save-org-preference.js.map +0 -1
@@ -1,146 +0,0 @@
1
- import { getAccessToken, getRefreshToken, storeCredentials } from './credentials.js';
2
- const API_BASE_URL = process.env.BRAGDUCK_API_URL || 'https://api.bragduck.com';
3
- const DEBUG = !!process.env.BRAGDUCK_DEBUG;
4
- const OAUTH_CLIENT_ID = 'bragduck-cli';
5
- const TOKEN_ENDPOINT = '/v1/auth/cli/token';
6
- function debug(...args) {
7
- if (DEBUG)
8
- console.error('[bragduck-mcp]', ...args);
9
- }
10
- /**
11
- * Attempt to refresh the access token using the stored refresh token
12
- */
13
- async function refreshAccessToken() {
14
- const refreshToken = getRefreshToken();
15
- if (!refreshToken)
16
- return null;
17
- try {
18
- const response = await fetch(`${API_BASE_URL}${TOKEN_ENDPOINT}`, {
19
- method: 'POST',
20
- headers: { 'Content-Type': 'application/json' },
21
- body: JSON.stringify({
22
- refresh_token: refreshToken,
23
- client_id: OAUTH_CLIENT_ID,
24
- grant_type: 'refresh_token',
25
- }),
26
- });
27
- if (!response.ok)
28
- return null;
29
- const data = await response.json();
30
- const expiresAt = data.expires_in
31
- ? Date.now() + data.expires_in * 1000
32
- : undefined;
33
- storeCredentials({
34
- accessToken: data.access_token,
35
- refreshToken: data.refresh_token || refreshToken,
36
- expiresAt,
37
- });
38
- return data.access_token;
39
- }
40
- catch {
41
- return null;
42
- }
43
- }
44
- /**
45
- * Make an authenticated API request to the BragDuck backend.
46
- * Automatically retries once on 401 with a refreshed token.
47
- */
48
- export async function apiRequest(endpoint, options = {}) {
49
- const { method = 'GET', body, params } = options;
50
- let token = getAccessToken();
51
- if (!token) {
52
- throw new Error('NOT_AUTHENTICATED');
53
- }
54
- let url = `${API_BASE_URL}${endpoint}`;
55
- if (params) {
56
- const searchParams = new URLSearchParams();
57
- for (const [key, value] of Object.entries(params)) {
58
- if (Array.isArray(value)) {
59
- value.forEach((v) => searchParams.append(`${key}[]`, v));
60
- }
61
- else {
62
- searchParams.append(key, value);
63
- }
64
- }
65
- url += `?${searchParams.toString()}`;
66
- }
67
- const headers = {
68
- Authorization: `Bearer ${token}`,
69
- 'User-Agent': 'BragDuck-MCP/1.0.0',
70
- };
71
- if (body) {
72
- headers['Content-Type'] = 'application/json';
73
- }
74
- const bodyString = body ? JSON.stringify(body) : undefined;
75
- debug(`${method} ${url}`);
76
- if (bodyString)
77
- debug('Request body:', bodyString);
78
- let response = await fetch(url, {
79
- method,
80
- headers,
81
- body: bodyString,
82
- });
83
- debug(`Response: ${response.status} ${response.statusText}`);
84
- // On 401, try refreshing the token once
85
- if (response.status === 401) {
86
- const newToken = await refreshAccessToken();
87
- if (!newToken) {
88
- throw new Error('TOKEN_EXPIRED');
89
- }
90
- headers.Authorization = `Bearer ${newToken}`;
91
- response = await fetch(url, {
92
- method,
93
- headers,
94
- body: bodyString,
95
- });
96
- }
97
- if (!response.ok) {
98
- const text = await response.text().catch(() => '');
99
- debug('Error response body:', text);
100
- let msg = `API error: ${response.status} ${response.statusText}`;
101
- try {
102
- const errorData = JSON.parse(text);
103
- msg = errorData.message || errorData.error || msg;
104
- }
105
- catch {
106
- if (text)
107
- msg = text;
108
- }
109
- throw new Error(msg);
110
- }
111
- return response.json();
112
- }
113
- /**
114
- * Fetch the current user's subscription tier.
115
- */
116
- export async function getSubscriptionStatus() {
117
- return apiRequest('/v1/subscriptions/status');
118
- }
119
- /**
120
- * Returns an MCP error response if the user is on the FREE plan, otherwise null.
121
- * Call this at the start of every non-login tool handler.
122
- */
123
- export async function requirePaidPlan() {
124
- try {
125
- const { tier } = await getSubscriptionStatus();
126
- if (tier === 'FREE') {
127
- return {
128
- content: [
129
- {
130
- type: 'text',
131
- text: 'BragDuck MCP requires a PLUS or PRO subscription.\n\n' +
132
- 'The free plan does not include CLI or MCP access.\n' +
133
- 'Upgrade at: https://bragduck.com/app/settings/plans',
134
- },
135
- ],
136
- isError: true,
137
- };
138
- }
139
- return null;
140
- }
141
- catch {
142
- // If subscription check fails (e.g. network issue), let the request proceed
143
- return null;
144
- }
145
- }
146
- //# sourceMappingURL=api-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAErF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;AAChF,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAE3C,MAAM,eAAe,GAAG,cAAc,CAAC;AACvC,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAE5C,SAAS,KAAK,CAAC,GAAG,IAAe;IAC/B,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB;IAC/B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,GAAG,cAAc,EAAE,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,aAAa,EAAE,YAAY;gBAC3B,SAAS,EAAE,eAAe;gBAC1B,UAAU,EAAE,eAAe;aAC5B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAI/B,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU;YAC/B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;YACrC,CAAC,CAAC,SAAS,CAAC;QAEd,gBAAgB,CAAC;YACf,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,IAAI,CAAC,aAAa,IAAI,YAAY;YAChD,SAAS;SACV,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,UAII,EAAE;IAEN,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEjD,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,GAAG,GAAG,GAAG,YAAY,GAAG,QAAQ,EAAE,CAAC;IACvC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,GAAG,IAAI,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,KAAK,EAAE;QAChC,YAAY,EAAE,oBAAoB;KACnC,CAAC;IACF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3D,KAAK,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1B,IAAI,UAAU;QAAE,KAAK,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAEnD,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC9B,MAAM;QACN,OAAO;QACP,IAAI,EAAE,UAAU;KACjB,CAAC,CAAC;IAEH,KAAK,CAAC,aAAa,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAE7D,wCAAwC;IACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,aAAa,GAAG,UAAU,QAAQ,EAAE,CAAC;QAC7C,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,MAAM;YACN,OAAO;YACP,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,GAAG,GAAG,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAGhC,CAAC;YACF,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,IAAI;gBAAE,GAAG,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;AACvC,CAAC;AAOD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,OAAO,UAAU,CAAqB,0BAA0B,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IAInC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,qBAAqB,EAAE,CAAC;QAC/C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,uDAAuD;4BACvD,qDAAqD;4BACrD,qDAAqD;qBACxD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
package/dist/auth.d.ts DELETED
@@ -1,8 +0,0 @@
1
- /**
2
- * Run the full OAuth login flow: start callback server, open browser, wait for auth.
3
- * Returns user info on success.
4
- */
5
- export declare function login(): Promise<{
6
- email: string;
7
- name: string;
8
- }>;
package/dist/auth.js DELETED
@@ -1,202 +0,0 @@
1
- import { randomBytes } from 'crypto';
2
- import { createServer } from 'http';
3
- import { parse } from 'url';
4
- import { exec } from 'child_process';
5
- import { promisify } from 'util';
6
- import { storeCredentials, storeUserInfo } from './credentials.js';
7
- const execAsync = promisify(exec);
8
- const API_BASE_URL = process.env.BRAGDUCK_API_URL || 'https://api.bragduck.com';
9
- const OAUTH_CLIENT_ID = 'bragduck-cli';
10
- const CALLBACK_PATH = '/callback';
11
- const TIMEOUT_MS = 120000;
12
- const MIN_PORT = 8010;
13
- const MAX_PORT = 8014;
14
- async function findAvailablePort() {
15
- for (let port = MIN_PORT; port <= MAX_PORT; port++) {
16
- try {
17
- await new Promise((resolve, reject) => {
18
- const testServer = createServer();
19
- testServer.once('error', reject);
20
- testServer.once('listening', () => {
21
- testServer.close(() => resolve());
22
- });
23
- testServer.listen(port, '127.0.0.1');
24
- });
25
- return port;
26
- }
27
- catch {
28
- continue;
29
- }
30
- }
31
- throw new Error(`No available ports found in range ${MIN_PORT}-${MAX_PORT}`);
32
- }
33
- async function openBrowser(url) {
34
- const platform = process.platform;
35
- let command;
36
- switch (platform) {
37
- case 'darwin':
38
- command = `open "${url}"`;
39
- break;
40
- case 'win32':
41
- command = `start "" "${url}"`;
42
- break;
43
- default:
44
- command = `xdg-open "${url}"`;
45
- break;
46
- }
47
- await execAsync(command);
48
- }
49
- const SUCCESS_HTML = `<!DOCTYPE html>
50
- <html><head><meta charset="UTF-8"><title>BragDuck - Authenticated</title>
51
- <style>
52
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
53
- display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0;
54
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; }
55
- .container { text-align: center; padding: 2rem; background: rgba(255,255,255,0.1);
56
- border-radius: 1rem; backdrop-filter: blur(10px); max-width: 500px; }
57
- h1 { font-size: 2rem; margin: 0 0 1rem; }
58
- .check { font-size: 4rem; animation: pop 0.3s ease-out; }
59
- p { font-size: 1.1rem; opacity: 0.9; }
60
- @keyframes pop { from { transform: scale(0); } to { transform: scale(1); } }
61
- </style></head><body>
62
- <div class="container">
63
- <div class="check">&#10003;</div>
64
- <h1>Authentication Successful</h1>
65
- <p>You can close this window and return to your editor.</p>
66
- </div></body></html>`;
67
- const ERROR_HTML = (error) => `<!DOCTYPE html>
68
- <html><head><meta charset="UTF-8"><title>BragDuck - Auth Failed</title>
69
- <style>
70
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
71
- display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0;
72
- background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); color: white; }
73
- .container { text-align: center; padding: 2rem; background: rgba(255,255,255,0.1);
74
- border-radius: 1rem; backdrop-filter: blur(10px); max-width: 500px; }
75
- h1 { font-size: 2rem; margin: 0 0 1rem; }
76
- .err { font-size: 4rem; }
77
- p { font-size: 1.1rem; opacity: 0.9; }
78
- .details { background: rgba(0,0,0,0.2); padding: 1rem; border-radius: 0.5rem;
79
- font-family: monospace; font-size: 0.9rem; margin-top: 1rem; }
80
- </style></head><body>
81
- <div class="container">
82
- <div class="err">&#10007;</div>
83
- <h1>Authentication Failed</h1>
84
- <p>Please try again.</p>
85
- <div class="details">${error}</div>
86
- </div></body></html>`;
87
- async function exchangeCodeForToken(code, callbackUrl) {
88
- const response = await fetch(`${API_BASE_URL}/v1/auth/cli/token`, {
89
- method: 'POST',
90
- headers: { 'Content-Type': 'application/json' },
91
- body: JSON.stringify({
92
- code,
93
- redirect_uri: callbackUrl,
94
- client_id: OAUTH_CLIENT_ID,
95
- grant_type: 'authorization_code',
96
- }),
97
- });
98
- if (!response.ok) {
99
- const errorData = await response.json().catch(() => ({}));
100
- throw new Error(errorData.message || `Token exchange failed: ${response.statusText}`);
101
- }
102
- return response.json();
103
- }
104
- /**
105
- * Run the full OAuth login flow: start callback server, open browser, wait for auth.
106
- * Returns user info on success.
107
- */
108
- export async function login() {
109
- const state = randomBytes(32).toString('hex');
110
- const port = await findAvailablePort();
111
- const callbackUrl = `http://127.0.0.1:${port}${CALLBACK_PATH}`;
112
- const authParams = new URLSearchParams({
113
- client_id: OAUTH_CLIENT_ID,
114
- redirect_uri: callbackUrl,
115
- state,
116
- });
117
- const authUrl = `${API_BASE_URL}/v1/auth/cli/initiate?${authParams.toString()}`;
118
- return new Promise((resolve, reject) => {
119
- let server = null;
120
- let timeoutId = null;
121
- const cleanup = () => {
122
- if (timeoutId)
123
- globalThis.clearTimeout(timeoutId);
124
- if (server) {
125
- if (typeof server.closeAllConnections === 'function') {
126
- server.closeAllConnections();
127
- }
128
- server.close();
129
- server.unref();
130
- }
131
- };
132
- const handleRequest = async (req, res) => {
133
- const parsedUrl = parse(req.url || '', true);
134
- if (parsedUrl.pathname !== CALLBACK_PATH) {
135
- res.writeHead(404, { 'Content-Type': 'text/plain' });
136
- res.end('Not Found');
137
- return;
138
- }
139
- const { code, state: returnedState, error, error_description } = parsedUrl.query;
140
- if (error) {
141
- const errorMsg = String(error_description || error);
142
- res.writeHead(400, { 'Content-Type': 'text/html' });
143
- res.end(ERROR_HTML(errorMsg));
144
- cleanup();
145
- reject(new Error(`OAuth error: ${errorMsg}`));
146
- return;
147
- }
148
- if (!code || !returnedState) {
149
- res.writeHead(400, { 'Content-Type': 'text/html' });
150
- res.end(ERROR_HTML('Missing code or state parameter'));
151
- cleanup();
152
- reject(new Error('Missing code or state parameter'));
153
- return;
154
- }
155
- if (returnedState !== state) {
156
- res.writeHead(400, { 'Content-Type': 'text/html' });
157
- res.end(ERROR_HTML('Invalid state parameter'));
158
- cleanup();
159
- reject(new Error('Invalid state parameter (possible CSRF)'));
160
- return;
161
- }
162
- res.writeHead(200, { 'Content-Type': 'text/html' });
163
- res.end(SUCCESS_HTML);
164
- try {
165
- const tokenResponse = await exchangeCodeForToken(String(code), callbackUrl);
166
- const expiresAt = tokenResponse.expires_in
167
- ? Date.now() + tokenResponse.expires_in * 1000
168
- : undefined;
169
- storeCredentials({
170
- accessToken: tokenResponse.access_token,
171
- refreshToken: tokenResponse.refresh_token,
172
- expiresAt,
173
- });
174
- const user = tokenResponse.user || { id: 'unknown', email: 'unknown', name: 'Unknown' };
175
- storeUserInfo(user);
176
- globalThis.setTimeout(() => {
177
- cleanup();
178
- resolve({ email: user.email, name: user.name });
179
- }, 100);
180
- }
181
- catch (err) {
182
- cleanup();
183
- reject(err);
184
- }
185
- };
186
- server = createServer(handleRequest);
187
- server.on('error', (err) => {
188
- cleanup();
189
- reject(new Error(`OAuth server error: ${err.message}`));
190
- });
191
- server.listen(port, '127.0.0.1', () => {
192
- openBrowser(authUrl).catch(() => {
193
- // If browser opening fails, we'll report it but keep the server running
194
- });
195
- });
196
- timeoutId = globalThis.setTimeout(() => {
197
- cleanup();
198
- reject(new Error('Authentication timed out. No callback received within 2 minutes.'));
199
- }, TIMEOUT_MS);
200
- });
201
- }
202
- //# sourceMappingURL=auth.js.map
package/dist/auth.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- interface ServiceCredentials {
2
- accessToken: string;
3
- refreshToken?: string;
4
- expiresAt?: number;
5
- }
6
- interface UserInfo {
7
- id: string;
8
- email: string;
9
- name: string;
10
- }
11
- /**
12
- * Get the bragduck access token from stored credentials
13
- */
14
- export declare function getAccessToken(): string | null;
15
- /**
16
- * Get the refresh token from stored credentials
17
- */
18
- export declare function getRefreshToken(): string | null;
19
- /**
20
- * Store credentials after login or token refresh
21
- */
22
- export declare function storeCredentials(creds: ServiceCredentials): void;
23
- /**
24
- * Get stored user info from the Conf config store (shared with CLI)
25
- */
26
- export declare function getUserInfo(): UserInfo | null;
27
- /**
28
- * Store user info in the Conf config store (shared with CLI)
29
- */
30
- export declare function storeUserInfo(userInfo: UserInfo): void;
31
- export {};
@@ -1,150 +0,0 @@
1
- import { createDecipheriv, scryptSync, randomBytes, createCipheriv } from 'crypto';
2
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
3
- import { homedir } from 'os';
4
- import { join } from 'path';
5
- import Conf from 'conf';
6
- const APP_NAME = 'bragduck';
7
- const CREDENTIALS_DIR = '.bragduck';
8
- const CREDENTIALS_FILE = 'credentials.enc';
9
- const ENCRYPTION = {
10
- ALGORITHM: 'aes-256-gcm',
11
- KEY_LENGTH: 32,
12
- IV_LENGTH: 16,
13
- AUTH_TAG_LENGTH: 16,
14
- SALT_LENGTH: 32,
15
- };
16
- function deriveEncryptionKey(salt) {
17
- const password = `${APP_NAME}-${homedir()}-${process.platform}`;
18
- return scryptSync(password, salt, ENCRYPTION.KEY_LENGTH);
19
- }
20
- function decrypt(encryptedData, key) {
21
- const decipher = createDecipheriv(ENCRYPTION.ALGORITHM, key, Buffer.from(encryptedData.iv, 'hex'), { authTagLength: ENCRYPTION.AUTH_TAG_LENGTH });
22
- decipher.setAuthTag(Buffer.from(encryptedData.authTag, 'hex'));
23
- let decrypted = decipher.update(encryptedData.encrypted, 'hex', 'utf8');
24
- decrypted += decipher.final('utf8');
25
- return decrypted;
26
- }
27
- function encrypt(data, key) {
28
- const iv = randomBytes(ENCRYPTION.IV_LENGTH);
29
- const cipher = createCipheriv(ENCRYPTION.ALGORITHM, key, iv, {
30
- authTagLength: ENCRYPTION.AUTH_TAG_LENGTH,
31
- });
32
- let encrypted = cipher.update(data, 'utf8', 'hex');
33
- encrypted += cipher.final('hex');
34
- const authTag = cipher.getAuthTag();
35
- return {
36
- encrypted,
37
- iv: iv.toString('hex'),
38
- authTag: authTag.toString('hex'),
39
- salt: '',
40
- };
41
- }
42
- /**
43
- * Read stored credentials from the CLI's encrypted file
44
- */
45
- function readStoredCredentials() {
46
- const credentialsPath = join(homedir(), CREDENTIALS_DIR, CREDENTIALS_FILE);
47
- if (!existsSync(credentialsPath)) {
48
- return null;
49
- }
50
- try {
51
- const encryptedData = JSON.parse(readFileSync(credentialsPath, 'utf8'));
52
- const salt = Buffer.from(encryptedData.salt, 'hex');
53
- const key = deriveEncryptionKey(salt);
54
- const decrypted = decrypt(encryptedData, key);
55
- return JSON.parse(decrypted);
56
- }
57
- catch {
58
- return null;
59
- }
60
- }
61
- /**
62
- * Write credentials to the encrypted file (shared with CLI)
63
- */
64
- function writeStoredCredentials(credentials) {
65
- const credentialsDir = join(homedir(), CREDENTIALS_DIR);
66
- const credentialsPath = join(credentialsDir, CREDENTIALS_FILE);
67
- if (!existsSync(credentialsDir)) {
68
- mkdirSync(credentialsDir, { recursive: true, mode: 0o700 });
69
- }
70
- const data = JSON.stringify(credentials);
71
- const salt = randomBytes(ENCRYPTION.SALT_LENGTH);
72
- const key = deriveEncryptionKey(salt);
73
- const encrypted = encrypt(data, key);
74
- encrypted.salt = salt.toString('hex');
75
- writeFileSync(credentialsPath, JSON.stringify(encrypted), {
76
- mode: 0o600,
77
- encoding: 'utf8',
78
- });
79
- }
80
- /**
81
- * Get the bragduck access token from stored credentials
82
- */
83
- export function getAccessToken() {
84
- const credentials = readStoredCredentials();
85
- if (!credentials)
86
- return null;
87
- // Handle legacy format
88
- if (credentials.accessToken && !credentials.services) {
89
- return credentials.accessToken;
90
- }
91
- return credentials.services?.bragduck?.accessToken || null;
92
- }
93
- /**
94
- * Get the refresh token from stored credentials
95
- */
96
- export function getRefreshToken() {
97
- const credentials = readStoredCredentials();
98
- if (!credentials)
99
- return null;
100
- if (credentials.accessToken && !credentials.services) {
101
- return credentials.refreshToken || null;
102
- }
103
- return credentials.services?.bragduck?.refreshToken || null;
104
- }
105
- /**
106
- * Store credentials after login or token refresh
107
- */
108
- export function storeCredentials(creds) {
109
- let existing = readStoredCredentials();
110
- // Migrate legacy format
111
- if (existing && existing.accessToken && !existing.services) {
112
- existing = {
113
- services: {
114
- bragduck: {
115
- accessToken: existing.accessToken,
116
- refreshToken: existing.refreshToken,
117
- expiresAt: existing.expiresAt,
118
- },
119
- },
120
- };
121
- }
122
- const updated = {
123
- ...existing,
124
- services: {
125
- ...existing?.services,
126
- bragduck: creds,
127
- },
128
- };
129
- writeStoredCredentials(updated);
130
- }
131
- /**
132
- * Get stored user info from the Conf config store (shared with CLI)
133
- */
134
- export function getUserInfo() {
135
- try {
136
- const config = new Conf({ projectName: APP_NAME });
137
- return config.get('userInfo') || null;
138
- }
139
- catch {
140
- return null;
141
- }
142
- }
143
- /**
144
- * Store user info in the Conf config store (shared with CLI)
145
- */
146
- export function storeUserInfo(userInfo) {
147
- const config = new Conf({ projectName: APP_NAME });
148
- config.set('userInfo', userInfo);
149
- }
150
- //# sourceMappingURL=credentials.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -1,7 +0,0 @@
1
- interface OrgPreference {
2
- orgId: string;
3
- orgName: string;
4
- }
5
- export declare function getOrgPreference(cwd: string): OrgPreference | null;
6
- export declare function saveOrgPreference(cwd: string, orgId: string, orgName: string): void;
7
- export {};
@@ -1,22 +0,0 @@
1
- import Conf from 'conf';
2
- const APP_NAME = 'bragduck';
3
- function getConfig() {
4
- return new Conf({ projectName: APP_NAME });
5
- }
6
- export function getOrgPreference(cwd) {
7
- try {
8
- const config = getConfig();
9
- const prefs = config.get('orgPreferences') || {};
10
- return prefs[cwd] || null;
11
- }
12
- catch {
13
- return null;
14
- }
15
- }
16
- export function saveOrgPreference(cwd, orgId, orgName) {
17
- const config = getConfig();
18
- const prefs = config.get('orgPreferences') || {};
19
- prefs[cwd] = { orgId, orgName };
20
- config.set('orgPreferences', prefs);
21
- }
22
- //# sourceMappingURL=org-preference.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"org-preference.js","sourceRoot":"","sources":["../src/org-preference.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,QAAQ,GAAG,UAAU,CAAC;AAS5B,SAAS,SAAS;IAChB,OAAO,IAAI,IAAI,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAI,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAoB,IAAI,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,KAAa,EAAE,OAAe;IAC3E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAI,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAoB,IAAI,EAAE,CAAC;IACrE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAChC,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC"}
@@ -1,30 +0,0 @@
1
- export declare const linkBragToKeyResultTool: {
2
- name: string;
3
- description: string;
4
- inputSchema: {
5
- type: "object";
6
- properties: {
7
- bragId: {
8
- type: string;
9
- description: string;
10
- };
11
- keyResultId: {
12
- type: string;
13
- description: string;
14
- };
15
- };
16
- required: string[];
17
- };
18
- };
19
- interface LinkBragInput {
20
- bragId: string;
21
- keyResultId: string;
22
- }
23
- export declare function handleLinkBragToKeyResult(input: LinkBragInput): Promise<{
24
- content: Array<{
25
- type: string;
26
- text: string;
27
- }>;
28
- isError?: boolean;
29
- }>;
30
- export {};