ceetrix 1.0.17 → 1.0.19
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/browser.d.ts +12 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +19 -1
- package/dist/browser.js.map +1 -1
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -1
- package/dist/device-flow.d.ts +31 -0
- package/dist/device-flow.d.ts.map +1 -0
- package/dist/device-flow.js +214 -0
- package/dist/device-flow.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -30
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
package/dist/browser.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser launch utilities
|
|
2
|
+
* Browser launch and detection utilities
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* Open the system browser to the specified URL.
|
|
@@ -8,4 +8,15 @@
|
|
|
8
8
|
* @returns true if browser was opened, false otherwise
|
|
9
9
|
*/
|
|
10
10
|
export declare function openBrowser(url: string): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Check whether this environment can launch a browser.
|
|
13
|
+
*
|
|
14
|
+
* - macOS: always true (has `open` command)
|
|
15
|
+
* - Linux with DISPLAY or WAYLAND_DISPLAY: true (has a desktop session)
|
|
16
|
+
* - Linux without display server (SSH, headless): false
|
|
17
|
+
* - Other platforms: false
|
|
18
|
+
*
|
|
19
|
+
* Story 224: Used to auto-select device flow on headless environments.
|
|
20
|
+
*/
|
|
21
|
+
export declare function canLaunchBrowser(): boolean;
|
|
11
22
|
//# sourceMappingURL=browser.d.ts.map
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAc/D"}
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAc/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAQ1C"}
|
package/dist/browser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser launch utilities
|
|
2
|
+
* Browser launch and detection utilities
|
|
3
3
|
*/
|
|
4
4
|
import open from 'open';
|
|
5
5
|
/**
|
|
@@ -24,4 +24,22 @@ export async function openBrowser(url) {
|
|
|
24
24
|
return false;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Check whether this environment can launch a browser.
|
|
29
|
+
*
|
|
30
|
+
* - macOS: always true (has `open` command)
|
|
31
|
+
* - Linux with DISPLAY or WAYLAND_DISPLAY: true (has a desktop session)
|
|
32
|
+
* - Linux without display server (SSH, headless): false
|
|
33
|
+
* - Other platforms: false
|
|
34
|
+
*
|
|
35
|
+
* Story 224: Used to auto-select device flow on headless environments.
|
|
36
|
+
*/
|
|
37
|
+
export function canLaunchBrowser() {
|
|
38
|
+
if (process.platform === 'darwin')
|
|
39
|
+
return true;
|
|
40
|
+
if (process.platform === 'linux') {
|
|
41
|
+
return !!(process.env.DISPLAY || process.env.WAYLAND_DISPLAY);
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
27
45
|
//# sourceMappingURL=browser.js.map
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAC5E,uDAAuD;QACvD,2CAA2C;QAC3C,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAC5E,uDAAuD;QACvD,2CAA2C;QAC3C,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE/C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -16,6 +16,26 @@ export declare const DEFAULT_PORT = 54321;
|
|
|
16
16
|
export declare const PORT_RANGE: number[];
|
|
17
17
|
/** MCP server URL for Claude Code config (HTTP transport) */
|
|
18
18
|
export declare function getMcpServerUrl(): string;
|
|
19
|
+
/** GitHub device authorization endpoint (RFC 8628) */
|
|
20
|
+
export declare const GITHUB_DEVICE_CODE_URL = "https://github.com/login/device/code";
|
|
21
|
+
/** GitHub device token polling endpoint */
|
|
22
|
+
export declare const GITHUB_DEVICE_TOKEN_URL = "https://github.com/login/oauth/access_token";
|
|
23
|
+
/** OAuth grant type for device authorization (RFC 8628 section 3.4) */
|
|
24
|
+
export declare const DEVICE_FLOW_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:device_code";
|
|
25
|
+
/** Minimum poll interval in seconds per RFC 8628 section 3.5 */
|
|
26
|
+
export declare const DEVICE_POLL_INTERVAL_SECONDS = 5;
|
|
27
|
+
/** Interval increase when GitHub returns slow_down (seconds, RFC 8628 section 3.5) */
|
|
28
|
+
export declare const DEVICE_POLL_SLOWDOWN_INCREMENT_SECONDS = 5;
|
|
29
|
+
/** Maximum time to wait for device flow authorization (seconds). Matches GitHub's device_code expiry. */
|
|
30
|
+
export declare const DEVICE_FLOW_TIMEOUT_SECONDS = 900;
|
|
31
|
+
/** Client-id endpoint path */
|
|
32
|
+
export declare const CLIENT_ID_PATH = "/setup/client-id";
|
|
33
|
+
/** Device completion endpoint path */
|
|
34
|
+
export declare const DEVICE_COMPLETE_PATH = "/setup/device-complete";
|
|
35
|
+
/** Client-id endpoint URL */
|
|
36
|
+
export declare function getClientIdUrl(): string;
|
|
37
|
+
/** Device completion endpoint URL */
|
|
38
|
+
export declare function getDeviceCompleteUrl(): string;
|
|
19
39
|
/**
|
|
20
40
|
* Check if we're using a custom (non-production) API URL.
|
|
21
41
|
*
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,yBAAyB;AACzB,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,yDAAyD;AACzD,eAAO,MAAM,eAAe,QAAgB,CAAC;AAE7C,6CAA6C;AAC7C,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,4DAA4D;AAC5D,eAAO,MAAM,UAAU,UAAsC,CAAC;AAE9D,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI,MAAM,CAexC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,yBAAyB;AACzB,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,yDAAyD;AACzD,eAAO,MAAM,eAAe,QAAgB,CAAC;AAE7C,6CAA6C;AAC7C,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,4DAA4D;AAC5D,eAAO,MAAM,UAAU,UAAsC,CAAC;AAE9D,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI,MAAM,CAexC;AAID,sDAAsD;AACtD,eAAO,MAAM,sBAAsB,yCAAyC,CAAC;AAE7E,2CAA2C;AAC3C,eAAO,MAAM,uBAAuB,gDAAgD,CAAC;AAErF,uEAAuE;AACvE,eAAO,MAAM,sBAAsB,iDAAiD,CAAC;AAErF,gEAAgE;AAChE,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,sFAAsF;AACtF,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,yGAAyG;AACzG,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,8BAA8B;AAC9B,eAAO,MAAM,cAAc,qBAAqB,CAAC;AAEjD,sCAAsC;AACtC,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAE7D,6BAA6B;AAC7B,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,qCAAqC;AACrC,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAOD;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAajD"}
|
package/dist/constants.js
CHANGED
|
@@ -33,6 +33,32 @@ export function getMcpServerUrl() {
|
|
|
33
33
|
// Default to production
|
|
34
34
|
return 'https://api.ceetrix.com/mcp';
|
|
35
35
|
}
|
|
36
|
+
// --- Device Flow constants (Story 224) ---
|
|
37
|
+
/** GitHub device authorization endpoint (RFC 8628) */
|
|
38
|
+
export const GITHUB_DEVICE_CODE_URL = 'https://github.com/login/device/code';
|
|
39
|
+
/** GitHub device token polling endpoint */
|
|
40
|
+
export const GITHUB_DEVICE_TOKEN_URL = 'https://github.com/login/oauth/access_token';
|
|
41
|
+
/** OAuth grant type for device authorization (RFC 8628 section 3.4) */
|
|
42
|
+
export const DEVICE_FLOW_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';
|
|
43
|
+
/** Minimum poll interval in seconds per RFC 8628 section 3.5 */
|
|
44
|
+
export const DEVICE_POLL_INTERVAL_SECONDS = 5;
|
|
45
|
+
/** Interval increase when GitHub returns slow_down (seconds, RFC 8628 section 3.5) */
|
|
46
|
+
export const DEVICE_POLL_SLOWDOWN_INCREMENT_SECONDS = 5;
|
|
47
|
+
/** Maximum time to wait for device flow authorization (seconds). Matches GitHub's device_code expiry. */
|
|
48
|
+
export const DEVICE_FLOW_TIMEOUT_SECONDS = 900;
|
|
49
|
+
/** Client-id endpoint path */
|
|
50
|
+
export const CLIENT_ID_PATH = '/setup/client-id';
|
|
51
|
+
/** Device completion endpoint path */
|
|
52
|
+
export const DEVICE_COMPLETE_PATH = '/setup/device-complete';
|
|
53
|
+
/** Client-id endpoint URL */
|
|
54
|
+
export function getClientIdUrl() {
|
|
55
|
+
return `${getApiBaseUrl()}${CLIENT_ID_PATH}`;
|
|
56
|
+
}
|
|
57
|
+
/** Device completion endpoint URL */
|
|
58
|
+
export function getDeviceCompleteUrl() {
|
|
59
|
+
return `${getApiBaseUrl()}${DEVICE_COMPLETE_PATH}`;
|
|
60
|
+
}
|
|
61
|
+
// --- End Device Flow constants ---
|
|
36
62
|
/** Production API base URL (for comparison) */
|
|
37
63
|
const PRODUCTION_API_URL = 'https://api.ceetrix.com';
|
|
38
64
|
/**
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB,CAAC;AAClE,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,WAAW;IACzB,OAAO,GAAG,aAAa,EAAE,QAAQ,CAAC;AACpC,CAAC;AAED,yDAAyD;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;AAElC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAE9D,6DAA6D;AAC7D,MAAM,UAAU,eAAe;IAC7B,4CAA4C;IAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACrC,CAAC;IAED,iEAAiE;IACjE,6FAA6F;IAC7F,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,GAAG,MAAM,MAAM,CAAC;IACzB,CAAC;IAED,wBAAwB;IACxB,OAAO,6BAA6B,CAAC;AACvC,CAAC;AAED,+CAA+C;AAC/C,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,yCAAyC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO,UAAU,KAAK,kBAAkB,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC3C,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,IAAI,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,wEAAwE;QACxE,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,oBAAoB,QAAQ,OAAO,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;QACvD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,8BAA8B,CAAC;IAC3D,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub OAuth Device Flow (RFC 8628)
|
|
3
|
+
* Story 224: CLI device flow + Linux support
|
|
4
|
+
*
|
|
5
|
+
* For terminal-only environments where a browser can't be opened.
|
|
6
|
+
* The CLI displays a code; the user enters it at github.com/login/device
|
|
7
|
+
* on any device (phone, another computer). The CLI polls until authorized.
|
|
8
|
+
*/
|
|
9
|
+
/** Parameters for running the device flow */
|
|
10
|
+
export interface DeviceFlowSpec {
|
|
11
|
+
repo?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Successful result from device flow completion */
|
|
14
|
+
export interface DeviceFlowResult {
|
|
15
|
+
apiKey: string;
|
|
16
|
+
username: string;
|
|
17
|
+
repos: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Run the full GitHub OAuth Device Flow.
|
|
21
|
+
*
|
|
22
|
+
* 1. Fetch client_id from Ceetrix server
|
|
23
|
+
* 2. Request device code from GitHub
|
|
24
|
+
* 3. Display user code for copy/paste
|
|
25
|
+
* 4. Poll GitHub until authorized
|
|
26
|
+
* 5. Complete setup with Ceetrix server
|
|
27
|
+
*
|
|
28
|
+
* @returns DeviceFlowResult on success, null on cancellation/expiry/denial
|
|
29
|
+
*/
|
|
30
|
+
export declare function runDeviceFlow(spec: DeviceFlowSpec): Promise<DeviceFlowResult | null>;
|
|
31
|
+
//# sourceMappingURL=device-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../src/device-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA0ND;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA6C1F"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub OAuth Device Flow (RFC 8628)
|
|
3
|
+
* Story 224: CLI device flow + Linux support
|
|
4
|
+
*
|
|
5
|
+
* For terminal-only environments where a browser can't be opened.
|
|
6
|
+
* The CLI displays a code; the user enters it at github.com/login/device
|
|
7
|
+
* on any device (phone, another computer). The CLI polls until authorized.
|
|
8
|
+
*/
|
|
9
|
+
import { GITHUB_DEVICE_CODE_URL, GITHUB_DEVICE_TOKEN_URL, DEVICE_FLOW_GRANT_TYPE, DEVICE_POLL_INTERVAL_SECONDS, DEVICE_POLL_SLOWDOWN_INCREMENT_SECONDS, DEVICE_FLOW_TIMEOUT_SECONDS, getClientIdUrl, getDeviceCompleteUrl, } from './constants.js';
|
|
10
|
+
/** Milliseconds per second */
|
|
11
|
+
const MS_PER_SECOND = 1000;
|
|
12
|
+
/**
|
|
13
|
+
* Fetch the GitHub App client_id from the Ceetrix server.
|
|
14
|
+
*
|
|
15
|
+
* The client_id is needed to initiate device flow with GitHub.
|
|
16
|
+
* It's public by design (appears in every OAuth redirect URL).
|
|
17
|
+
*/
|
|
18
|
+
async function fetchClientId() {
|
|
19
|
+
const url = getClientIdUrl();
|
|
20
|
+
const response = await fetch(url, {
|
|
21
|
+
headers: { 'Accept': 'application/json' },
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new Error(`Failed to fetch client ID from ${url} (HTTP ${response.status})`);
|
|
25
|
+
}
|
|
26
|
+
const data = await response.json();
|
|
27
|
+
if (!data.client_id) {
|
|
28
|
+
throw new Error('Server returned empty client_id');
|
|
29
|
+
}
|
|
30
|
+
return data.client_id;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Request a device code from GitHub.
|
|
34
|
+
*
|
|
35
|
+
* POST https://github.com/login/device/code
|
|
36
|
+
*/
|
|
37
|
+
async function requestDeviceCode(clientId) {
|
|
38
|
+
const response = await fetch(GITHUB_DEVICE_CODE_URL, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Accept': 'application/json',
|
|
42
|
+
'Content-Type': 'application/json',
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({ client_id: clientId }),
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const text = await response.text();
|
|
48
|
+
throw new Error(`GitHub device code request failed (HTTP ${response.status}): ${text}`);
|
|
49
|
+
}
|
|
50
|
+
const data = await response.json();
|
|
51
|
+
if (data.error) {
|
|
52
|
+
if (data.error === 'unsupported_grant_type') {
|
|
53
|
+
throw new Error('Device flow is not enabled for this GitHub App.\n' +
|
|
54
|
+
'The app administrator must enable "Device Flow" in GitHub App settings.');
|
|
55
|
+
}
|
|
56
|
+
throw new Error(`GitHub device code error: ${data.error} - ${data.error_description || ''}`);
|
|
57
|
+
}
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Display the user code prominently for copy/paste.
|
|
62
|
+
*/
|
|
63
|
+
function displayUserCode(userCode, verificationUri) {
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log('┌─────────────────────────────────────────────┐');
|
|
66
|
+
console.log('│ To authenticate, visit: │');
|
|
67
|
+
console.log(`│ ${verificationUri.padEnd(43)}│`);
|
|
68
|
+
console.log('│ │');
|
|
69
|
+
console.log(`│ Enter code: ${userCode.padEnd(31)}│`);
|
|
70
|
+
console.log('└─────────────────────────────────────────────┘');
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log('Waiting for authorization...');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Sleep for the specified number of milliseconds.
|
|
76
|
+
*/
|
|
77
|
+
function sleep(ms) {
|
|
78
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Poll GitHub for the access token.
|
|
82
|
+
*
|
|
83
|
+
* Handles authorization_pending, slow_down, expired_token, and access_denied
|
|
84
|
+
* per RFC 8628 section 3.5.
|
|
85
|
+
*
|
|
86
|
+
* @returns access_token on success, null on expiry/denial
|
|
87
|
+
*/
|
|
88
|
+
async function pollForToken(clientId, deviceCode, initialInterval) {
|
|
89
|
+
let intervalSeconds = initialInterval;
|
|
90
|
+
const deadline = Date.now() + DEVICE_FLOW_TIMEOUT_SECONDS * MS_PER_SECOND;
|
|
91
|
+
while (Date.now() < deadline) {
|
|
92
|
+
await sleep(intervalSeconds * MS_PER_SECOND);
|
|
93
|
+
const response = await fetch(GITHUB_DEVICE_TOKEN_URL, {
|
|
94
|
+
method: 'POST',
|
|
95
|
+
headers: {
|
|
96
|
+
'Accept': 'application/json',
|
|
97
|
+
'Content-Type': 'application/json',
|
|
98
|
+
},
|
|
99
|
+
body: JSON.stringify({
|
|
100
|
+
client_id: clientId,
|
|
101
|
+
device_code: deviceCode,
|
|
102
|
+
grant_type: DEVICE_FLOW_GRANT_TYPE,
|
|
103
|
+
}),
|
|
104
|
+
});
|
|
105
|
+
const data = await response.json();
|
|
106
|
+
// Success — got token
|
|
107
|
+
if (data.access_token) {
|
|
108
|
+
return data.access_token;
|
|
109
|
+
}
|
|
110
|
+
switch (data.error) {
|
|
111
|
+
case 'authorization_pending':
|
|
112
|
+
// User hasn't authorized yet — keep polling at current interval
|
|
113
|
+
break;
|
|
114
|
+
case 'slow_down':
|
|
115
|
+
// GitHub is asking us to slow down — increase interval per RFC 8628
|
|
116
|
+
intervalSeconds += DEVICE_POLL_SLOWDOWN_INCREMENT_SECONDS;
|
|
117
|
+
break;
|
|
118
|
+
case 'expired_token':
|
|
119
|
+
console.error('\n✗ Device code expired. Run `npx ceetrix` again to retry.\n');
|
|
120
|
+
return null;
|
|
121
|
+
case 'access_denied':
|
|
122
|
+
console.error('\n✗ Authorization was denied.\n');
|
|
123
|
+
return null;
|
|
124
|
+
case 'unsupported_grant_type':
|
|
125
|
+
console.error('\n✗ Device flow is not enabled for this GitHub App.');
|
|
126
|
+
console.error(' The app administrator must enable "Device Flow" in GitHub App settings.\n');
|
|
127
|
+
return null;
|
|
128
|
+
case 'incorrect_device_code':
|
|
129
|
+
console.error('\n✗ Invalid device code. Run `npx ceetrix` again to retry.\n');
|
|
130
|
+
return null;
|
|
131
|
+
default:
|
|
132
|
+
console.error(`\n✗ Unexpected error: ${data.error} - ${data.error_description || ''}\n`);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
console.error('\n✗ Timed out waiting for authorization. Run `npx ceetrix` again to retry.\n');
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Complete setup with Ceetrix server.
|
|
141
|
+
*
|
|
142
|
+
* Sends the GitHub access token to POST /setup/device-complete
|
|
143
|
+
* which resolves the user, checks app installation, and returns an API key.
|
|
144
|
+
*/
|
|
145
|
+
async function completeWithServer(accessToken, repo) {
|
|
146
|
+
const url = getDeviceCompleteUrl();
|
|
147
|
+
const body = { access_token: accessToken };
|
|
148
|
+
if (repo) {
|
|
149
|
+
body.repo = repo;
|
|
150
|
+
}
|
|
151
|
+
const response = await fetch(url, {
|
|
152
|
+
method: 'POST',
|
|
153
|
+
headers: {
|
|
154
|
+
'Content-Type': 'application/json',
|
|
155
|
+
'Accept': 'application/json',
|
|
156
|
+
},
|
|
157
|
+
body: JSON.stringify(body),
|
|
158
|
+
});
|
|
159
|
+
if (!response.ok) {
|
|
160
|
+
const data = await response.json().catch(() => ({}));
|
|
161
|
+
throw new Error(data.error || `Server error (HTTP ${response.status})`);
|
|
162
|
+
}
|
|
163
|
+
return await response.json();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Run the full GitHub OAuth Device Flow.
|
|
167
|
+
*
|
|
168
|
+
* 1. Fetch client_id from Ceetrix server
|
|
169
|
+
* 2. Request device code from GitHub
|
|
170
|
+
* 3. Display user code for copy/paste
|
|
171
|
+
* 4. Poll GitHub until authorized
|
|
172
|
+
* 5. Complete setup with Ceetrix server
|
|
173
|
+
*
|
|
174
|
+
* @returns DeviceFlowResult on success, null on cancellation/expiry/denial
|
|
175
|
+
*/
|
|
176
|
+
export async function runDeviceFlow(spec) {
|
|
177
|
+
// Step 1: Get client_id
|
|
178
|
+
console.log('Preparing device authentication...');
|
|
179
|
+
const clientId = await fetchClientId();
|
|
180
|
+
// Step 2: Request device code from GitHub
|
|
181
|
+
const deviceCode = await requestDeviceCode(clientId);
|
|
182
|
+
// Step 3: Display code for user
|
|
183
|
+
displayUserCode(deviceCode.user_code, deviceCode.verification_uri);
|
|
184
|
+
// Step 4: Poll for token
|
|
185
|
+
const interval = Math.max(deviceCode.interval, DEVICE_POLL_INTERVAL_SECONDS);
|
|
186
|
+
const accessToken = await pollForToken(clientId, deviceCode.device_code, interval);
|
|
187
|
+
if (!accessToken) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
console.log('✓ GitHub authorization received\n');
|
|
191
|
+
// Step 5: Complete with Ceetrix server
|
|
192
|
+
console.log('Completing setup...');
|
|
193
|
+
const result = await completeWithServer(accessToken, spec.repo);
|
|
194
|
+
// Handle app-not-installed case
|
|
195
|
+
if (result.install_url) {
|
|
196
|
+
console.log('');
|
|
197
|
+
console.log('┌─────────────────────────────────────────────────────────────────┐');
|
|
198
|
+
console.log('│ GitHub App not installed on this repository. │');
|
|
199
|
+
console.log('│ │');
|
|
200
|
+
console.log('│ Install it here: │');
|
|
201
|
+
console.log(`│ ${result.install_url.padEnd(63)}│`);
|
|
202
|
+
console.log('│ │');
|
|
203
|
+
console.log('│ Then run `npx ceetrix` again to complete setup. │');
|
|
204
|
+
console.log('└─────────────────────────────────────────────────────────────────┘');
|
|
205
|
+
console.log('');
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
apiKey: result.api_key,
|
|
210
|
+
username: result.username,
|
|
211
|
+
repos: result.repos,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=device-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../src/device-flow.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0CH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA6G1C"}
|
package/dist/index.js
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
import { detectGitRemote } from './git.js';
|
|
5
5
|
import { checkExistingConfig, removeExistingConfig } from './config.js';
|
|
6
6
|
import { startCallbackServer } from './server.js';
|
|
7
|
-
import { openBrowser } from './browser.js';
|
|
7
|
+
import { openBrowser, canLaunchBrowser } from './browser.js';
|
|
8
8
|
import { promptForRepo, promptExistingConfig } from './prompts.js';
|
|
9
9
|
import { checkClaudeCli, addConfig, writeConfigToFile } from './claude.js';
|
|
10
10
|
import { getSetupUrl, AUTH_TIMEOUT_MS, getMcpServerUrl, isCustomApiUrl, getAutoConfigPath } from './constants.js';
|
|
11
11
|
import { printDebugInfo } from './debug.js';
|
|
12
12
|
import { enforceLatestVersion } from './version-check.js';
|
|
13
13
|
import { requestPermissionOrExit } from './permissions.js';
|
|
14
|
-
import {
|
|
14
|
+
import { runDeviceFlow } from './device-flow.js';
|
|
15
15
|
/** Parse command line arguments */
|
|
16
16
|
function parseArgs() {
|
|
17
17
|
const args = process.argv.slice(2);
|
|
@@ -24,6 +24,7 @@ function parseArgs() {
|
|
|
24
24
|
return {
|
|
25
25
|
debug: args.includes('--debug') || args.includes('-d'),
|
|
26
26
|
configPath,
|
|
27
|
+
noBrowser: args.includes('--no-browser'),
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
30
|
/** Supported platforms for this release */
|
|
@@ -54,8 +55,6 @@ export async function main() {
|
|
|
54
55
|
console.log('─────────────\n');
|
|
55
56
|
// Version check - refuse to run outdated cached versions
|
|
56
57
|
await enforceLatestVersion();
|
|
57
|
-
// Invite code check - gate access before setup
|
|
58
|
-
await runInviteFlow();
|
|
59
58
|
// Platform check - macOS and Linux only
|
|
60
59
|
if (!SUPPORTED_PLATFORMS.includes(process.platform)) {
|
|
61
60
|
console.error(`✗ Unsupported platform: ${process.platform}\n`);
|
|
@@ -123,8 +122,17 @@ export async function main() {
|
|
|
123
122
|
}
|
|
124
123
|
repo = await promptForRepo();
|
|
125
124
|
}
|
|
126
|
-
//
|
|
127
|
-
|
|
125
|
+
// Select auth flow: device flow for headless/--no-browser, browser flow otherwise
|
|
126
|
+
const useDeviceFlow = cliContext.noBrowser || !canLaunchBrowser();
|
|
127
|
+
if (useDeviceFlow) {
|
|
128
|
+
if (!cliContext.noBrowser) {
|
|
129
|
+
console.log('No display server detected. Using device code authentication.\n');
|
|
130
|
+
}
|
|
131
|
+
await runDeviceSetupFlow(repo, cliContext.configPath);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
await runBrowserSetupFlow(repo, cliContext.configPath);
|
|
135
|
+
}
|
|
128
136
|
}
|
|
129
137
|
/**
|
|
130
138
|
* Handle case when Ceetrix is already configured.
|
|
@@ -167,28 +175,57 @@ async function handleExistingConfig() {
|
|
|
167
175
|
}
|
|
168
176
|
}
|
|
169
177
|
/**
|
|
170
|
-
* Run the
|
|
178
|
+
* Run the device flow setup (Story 224).
|
|
179
|
+
*
|
|
180
|
+
* Uses GitHub OAuth Device Flow (RFC 8628) — no browser needed.
|
|
181
|
+
* The CLI displays a code; user enters it at github.com/login/device on any device.
|
|
171
182
|
*
|
|
172
183
|
* @param repo - The repository to set up (owner/repo)
|
|
173
184
|
* @param configPath - Optional custom config file path (null = use claude mcp add)
|
|
174
185
|
*/
|
|
175
|
-
async function
|
|
186
|
+
async function runDeviceSetupFlow(repo, configPath) {
|
|
187
|
+
const result = await runDeviceFlow({ repo });
|
|
188
|
+
if (!result) {
|
|
189
|
+
// User denied, code expired, or app not installed — messages already printed
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
// Show success
|
|
193
|
+
console.log(`✓ Authenticated as @${result.username}`);
|
|
194
|
+
if (result.repos.length > 0) {
|
|
195
|
+
console.log(`✓ Access granted to: ${result.repos.join(', ')}\n`);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.log('');
|
|
199
|
+
}
|
|
200
|
+
// Write config (same as browser flow)
|
|
201
|
+
await writeConfig(result.apiKey, configPath);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Run the browser-based OAuth setup flow (existing behaviour).
|
|
205
|
+
*
|
|
206
|
+
* Opens a browser for GitHub OAuth; receives callback on localhost.
|
|
207
|
+
* Falls back to device flow if the browser fails to open.
|
|
208
|
+
*
|
|
209
|
+
* @param repo - The repository to set up (owner/repo)
|
|
210
|
+
* @param configPath - Optional custom config file path (null = use claude mcp add)
|
|
211
|
+
*/
|
|
212
|
+
async function runBrowserSetupFlow(repo, configPath) {
|
|
176
213
|
// Start callback server
|
|
177
214
|
const { port, waitForCallback, close } = await startCallbackServer();
|
|
178
215
|
try {
|
|
179
216
|
// Build setup URL
|
|
180
217
|
const callbackUrl = `http://localhost:${port}/callback`;
|
|
181
218
|
const setupUrl = `${getSetupUrl()}?callback=${encodeURIComponent(callbackUrl)}&repo=${encodeURIComponent(repo)}`;
|
|
182
|
-
//
|
|
219
|
+
// Try to open browser
|
|
183
220
|
const opened = await openBrowser(setupUrl);
|
|
184
221
|
if (!opened) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
console.log(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
console.log('Opening browser for GitHub authentication...');
|
|
222
|
+
// Browser failed — fall back to device flow explicitly (not silently)
|
|
223
|
+
close();
|
|
224
|
+
console.log('Could not open browser. Switching to device code authentication.\n');
|
|
225
|
+
await runDeviceSetupFlow(repo, configPath);
|
|
226
|
+
return;
|
|
191
227
|
}
|
|
228
|
+
console.log('Opening browser for GitHub authentication...');
|
|
192
229
|
console.log('Waiting for authentication...\n');
|
|
193
230
|
// Wait for callback with timeout
|
|
194
231
|
const authTimeout = createCancellableTimeout(AUTH_TIMEOUT_MS);
|
|
@@ -211,26 +248,34 @@ async function runSetupFlow(repo, configPath) {
|
|
|
211
248
|
else {
|
|
212
249
|
console.log('');
|
|
213
250
|
}
|
|
214
|
-
//
|
|
215
|
-
|
|
216
|
-
// Write directly to custom config file (non-destructive to ~/.claude.json)
|
|
217
|
-
console.log(`Writing Ceetrix config to ${configPath}...`);
|
|
218
|
-
await writeConfigToFile(result.apiKey, getMcpServerUrl(), configPath);
|
|
219
|
-
console.log('✓ Configuration written\n');
|
|
220
|
-
printCustomConfigNotice(configPath);
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
// Use claude mcp add (writes to ~/.claude.json)
|
|
224
|
-
console.log('Adding Ceetrix to Claude Code...');
|
|
225
|
-
await addConfig(result.apiKey);
|
|
226
|
-
console.log('✓ Configuration added\n');
|
|
227
|
-
printRestartNotice();
|
|
228
|
-
}
|
|
251
|
+
// Write config
|
|
252
|
+
await writeConfig(result.apiKey, configPath);
|
|
229
253
|
}
|
|
230
254
|
finally {
|
|
231
255
|
close();
|
|
232
256
|
}
|
|
233
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Write MCP config to Claude Code or a custom file.
|
|
260
|
+
*
|
|
261
|
+
* Shared by both browser and device flow paths.
|
|
262
|
+
*/
|
|
263
|
+
async function writeConfig(apiKey, configPath) {
|
|
264
|
+
if (configPath) {
|
|
265
|
+
// Write directly to custom config file (non-destructive to ~/.claude.json)
|
|
266
|
+
console.log(`Writing Ceetrix config to ${configPath}...`);
|
|
267
|
+
await writeConfigToFile(apiKey, getMcpServerUrl(), configPath);
|
|
268
|
+
console.log('✓ Configuration written\n');
|
|
269
|
+
printCustomConfigNotice(configPath);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
// Use claude mcp add (writes to ~/.claude.json)
|
|
273
|
+
console.log('Adding Ceetrix to Claude Code...');
|
|
274
|
+
await addConfig(apiKey);
|
|
275
|
+
console.log('✓ Configuration added\n');
|
|
276
|
+
printRestartNotice();
|
|
277
|
+
}
|
|
278
|
+
}
|
|
234
279
|
/**
|
|
235
280
|
* Create a cancellable timeout promise.
|
|
236
281
|
*
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAsB,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ceetrix",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.19",
|
|
4
4
|
"description": "Set up Ceetrix backlog management for Claude Code",
|
|
5
5
|
"bin": {
|
|
6
6
|
"ceetrix": "./bin/ceetrix.js"
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"dev": "tsc --watch",
|
|
15
15
|
"test": "vitest",
|
|
16
16
|
"test:run": "vitest run",
|
|
17
|
+
"test:mutate": "stryker run",
|
|
17
18
|
"lint": "eslint src tests",
|
|
18
19
|
"prepublishOnly": "npm run build"
|
|
19
20
|
},
|
|
@@ -23,6 +24,9 @@
|
|
|
23
24
|
"which": "^6.0.0"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
27
|
+
"@stryker-mutator/core": "^9.5.1",
|
|
28
|
+
"@stryker-mutator/typescript-checker": "^9.5.1",
|
|
29
|
+
"@stryker-mutator/vitest-runner": "^9.5.1",
|
|
26
30
|
"@types/node": "^20.0.0",
|
|
27
31
|
"@types/which": "^3.0.4",
|
|
28
32
|
"typescript": "^5.0.0",
|