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 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
@@ -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
@@ -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"}
@@ -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
  *
@@ -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;AAKD;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAajD"}
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
  /**
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwCH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAuG1C"}
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 { runInviteFlow } from './invite.js';
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
- // Run the setup flow
127
- await runSetupFlow(repo, cliContext.configPath);
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 OAuth setup flow.
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 runSetupFlow(repo, configPath) {
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
- // Open browser
219
+ // Try to open browser
183
220
  const opened = await openBrowser(setupUrl);
184
221
  if (!opened) {
185
- console.log('Could not open browser automatically.');
186
- console.log('Please open this URL manually:\n');
187
- console.log(` ${setupUrl}\n`);
188
- }
189
- else {
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
- // Add to Claude config
215
- if (configPath) {
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;AAC3C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C,mCAAmC;AACnC,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,wBAAwB;IACxB,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;IAC9E,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtD,UAAU;KACX,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,UAAU,GAAG,SAAS,EAAE,CAAC;IAE/B,sBAAsB;IACtB,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,0DAA0D;IAC1D,0EAA0E;IAC1E,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,cAAc,EAAE,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,CAAC,UAAU,GAAG,QAAQ,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE/B,yDAAyD;IACzD,MAAM,oBAAoB,EAAE,CAAC;IAE7B,+CAA+C;IAC/C,MAAM,aAAa,EAAE,CAAC;IAEtB,wCAAwC;IACxC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,2BAA2B,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iFAAiF;IACjF,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,uBAAuB,EAAE,CAAC;IAClC,CAAC;IAED,kFAAkF;IAClF,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,MAAM,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YAChF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,sEAAsE;QACtE,MAAM,cAAc,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACnD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC5C,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,2CAA2C;QAC7C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,4BAA4B;IAC5B,IAAI,SAA6B,CAAC;IAClC,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,SAAS,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,IAAY,CAAC;IAEjB,IAAI,SAAS,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,mCAAmC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;QACnE,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,aAAa;gBAChB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;gBACjE,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,MAAM;QACV,CAAC;QACD,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,oBAAoB;IACjC,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAE5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAElB,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,oBAAoB,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,OAAO,MAAM,CAAC;QAEhB,KAAK,QAAQ;YACX,kDAAkD;YAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,oBAAoB,EAAE,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,UAAU,CAAC;QAEpB,KAAK,UAAU;YACb,4BAA4B;YAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,UAAU,CAAC;QAEpB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,UAAyB;IACjE,wBAAwB;IACxB,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAErE,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;QACxD,MAAM,QAAQ,GAAG,GAAG,WAAW,EAAE,aAAa,kBAAkB,CAAC,WAAW,CAAC,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAEjH,eAAe;QACf,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,iCAAiC;QACjC,MAAM,WAAW,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,eAAe,EAAE;YACjB,WAAW,CAAC,OAAO;SACpB,CAAC,CAAC;QACH,sDAAsD;QACtD,WAAW,CAAC,MAAM,EAAE,CAAC;QAErB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,eAAe;QACf,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,uBAAuB;QACvB,IAAI,UAAU,EAAE,CAAC;YACf,2EAA2E;YAC3E,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,KAAK,CAAC,CAAC;YAC1D,MAAM,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,gDAAgD;YAChD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,kBAAkB,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAUD;;;;;GAKG;AACH,SAAS,wBAAwB,CAAC,EAAU;IAC1C,IAAI,SAAwC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,UAAkB;IACjD,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;AACvF,CAAC"}
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,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AASjD,mCAAmC;AACnC,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,wBAAwB;IACxB,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;IAC9E,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtD,UAAU;QACV,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,UAAU,GAAG,SAAS,EAAE,CAAC;IAE/B,sBAAsB;IACtB,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,0DAA0D;IAC1D,0EAA0E;IAC1E,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,cAAc,EAAE,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,CAAC,UAAU,GAAG,QAAQ,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE/B,yDAAyD;IACzD,MAAM,oBAAoB,EAAE,CAAC;IAE7B,wCAAwC;IACxC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,2BAA2B,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iFAAiF;IACjF,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,uBAAuB,EAAE,CAAC;IAClC,CAAC;IAED,kFAAkF;IAClF,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,MAAM,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YAChF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,sEAAsE;QACtE,MAAM,cAAc,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACnD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC5C,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,2CAA2C;QAC7C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,4BAA4B;IAC5B,IAAI,SAA6B,CAAC;IAClC,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,SAAS,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,IAAY,CAAC;IAEjB,IAAI,SAAS,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,mCAAmC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;QACnE,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,aAAa;gBAChB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;gBACjE,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,MAAM;QACV,CAAC;QACD,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,kFAAkF;IAClF,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAElE,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,oBAAoB;IACjC,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAE5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAElB,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,oBAAoB,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,OAAO,MAAM,CAAC;QAEhB,KAAK,QAAQ;YACX,kDAAkD;YAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,oBAAoB,EAAE,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,UAAU,CAAC;QAEpB,KAAK,UAAU;YACb,4BAA4B;YAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,UAAU,CAAC;QAEpB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAyB;IACvE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,6EAA6E;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,sCAAsC;IACtC,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,UAAyB;IACxE,wBAAwB;IACxB,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAErE,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;QACxD,MAAM,QAAQ,GAAG,GAAG,WAAW,EAAE,aAAa,kBAAkB,CAAC,WAAW,CAAC,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAEjH,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,sEAAsE;YACtE,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;YAClF,MAAM,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,iCAAiC;QACjC,MAAM,WAAW,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,eAAe,EAAE;YACjB,WAAW,CAAC,OAAO;SACpB,CAAC,CAAC;QACH,sDAAsD;QACtD,WAAW,CAAC,MAAM,EAAE,CAAC;QAErB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,eAAe;QACf,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,eAAe;QACf,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,UAAyB;IAClE,IAAI,UAAU,EAAE,CAAC;QACf,2EAA2E;QAC3E,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,KAAK,CAAC,CAAC;QAC1D,MAAM,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,kBAAkB,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAUD;;;;;GAKG;AACH,SAAS,wBAAwB,CAAC,EAAU;IAC1C,IAAI,SAAwC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,UAAkB;IACjD,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;AACvF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ceetrix",
3
- "version": "1.0.17",
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",