ceetrix 1.0.7 → 1.0.10
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/claude.d.ts +5 -0
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +39 -25
- package/dist/claude.js.map +1 -1
- package/dist/debug.d.ts +3 -0
- package/dist/debug.d.ts.map +1 -1
- package/dist/debug.js +37 -32
- package/dist/debug.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/permissions.d.ts +21 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +63 -0
- package/dist/permissions.js.map +1 -0
- package/dist/version-check.d.ts +28 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +84 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +1 -1
package/dist/claude.d.ts
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
* Uses the `which` package for cross-platform executable detection.
|
|
5
5
|
* This handles non-login shells (e.g., npx context) where PATH may not
|
|
6
6
|
* include user-configured directories like /opt/homebrew/bin.
|
|
7
|
+
*
|
|
8
|
+
* Verifies found binaries are actually Claude Code (not stale npm installs)
|
|
9
|
+
* by checking --version output contains "Claude Code".
|
|
10
|
+
*
|
|
11
|
+
* Permission is requested once upfront in index.ts, not per-command.
|
|
7
12
|
*/
|
|
8
13
|
/**
|
|
9
14
|
* Check if the Claude CLI is available.
|
package/dist/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuFH;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAGvD;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB7D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAY5D;AAED;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlD"}
|
package/dist/claude.js
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
* Uses the `which` package for cross-platform executable detection.
|
|
5
5
|
* This handles non-login shells (e.g., npx context) where PATH may not
|
|
6
6
|
* include user-configured directories like /opt/homebrew/bin.
|
|
7
|
+
*
|
|
8
|
+
* Verifies found binaries are actually Claude Code (not stale npm installs)
|
|
9
|
+
* by checking --version output contains "Claude Code".
|
|
10
|
+
*
|
|
11
|
+
* Permission is requested once upfront in index.ts, not per-command.
|
|
7
12
|
*/
|
|
8
13
|
import { exec } from 'child_process';
|
|
9
14
|
import { promisify } from 'util';
|
|
@@ -12,6 +17,10 @@ import { getMcpServerUrl } from './constants.js';
|
|
|
12
17
|
const execAsync = promisify(exec);
|
|
13
18
|
/** Timeout for Claude CLI commands in milliseconds */
|
|
14
19
|
const CLAUDE_COMMAND_TIMEOUT_MS = 10000;
|
|
20
|
+
/** Short timeout for version check (old versions may hang) */
|
|
21
|
+
const VERSION_CHECK_TIMEOUT_MS = 3000;
|
|
22
|
+
/** Expected string in Claude Code version output */
|
|
23
|
+
const CLAUDE_CODE_VERSION_MARKER = 'Claude Code';
|
|
15
24
|
/** Common installation paths for Claude CLI (fallback when not in PATH) */
|
|
16
25
|
const COMMON_CLAUDE_PATHS = [
|
|
17
26
|
'/opt/homebrew/bin/claude', // macOS Homebrew ARM
|
|
@@ -21,29 +30,45 @@ const COMMON_CLAUDE_PATHS = [
|
|
|
21
30
|
/** Cached path to claude executable */
|
|
22
31
|
let cachedClaudePath = null;
|
|
23
32
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
33
|
+
* Verify a path is actually Claude Code by checking version output.
|
|
34
|
+
*
|
|
35
|
+
* @param path - Path to executable
|
|
36
|
+
* @returns true if responds with "Claude Code" in version output
|
|
37
|
+
*/
|
|
38
|
+
async function isClaudeCode(path) {
|
|
39
|
+
try {
|
|
40
|
+
const { stdout } = await execAsync(`"${path}" --version`, {
|
|
41
|
+
timeout: VERSION_CHECK_TIMEOUT_MS,
|
|
42
|
+
});
|
|
43
|
+
return stdout.includes(CLAUDE_CODE_VERSION_MARKER);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Timeout, error, or doesn't respond correctly
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Find claude executable by checking candidates in order.
|
|
52
|
+
* Verifies each candidate is actually Claude Code (not a stale npm install).
|
|
26
53
|
*
|
|
27
54
|
* @returns Full path to claude executable, or null if not found
|
|
28
55
|
*/
|
|
29
56
|
async function findClaudePath() {
|
|
30
|
-
|
|
57
|
+
const candidates = [];
|
|
58
|
+
// Try which first
|
|
31
59
|
try {
|
|
32
|
-
|
|
60
|
+
candidates.push(await which('claude'));
|
|
33
61
|
}
|
|
34
62
|
catch {
|
|
35
|
-
// Not in PATH
|
|
63
|
+
// Not in PATH
|
|
36
64
|
}
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
65
|
+
// Add common fallback paths
|
|
66
|
+
candidates.push(...COMMON_CLAUDE_PATHS);
|
|
67
|
+
// Find first candidate that is actually Claude Code
|
|
68
|
+
for (const path of candidates) {
|
|
69
|
+
if (await isClaudeCode(path)) {
|
|
42
70
|
return path;
|
|
43
71
|
}
|
|
44
|
-
catch {
|
|
45
|
-
// Try next path
|
|
46
|
-
}
|
|
47
72
|
}
|
|
48
73
|
return null;
|
|
49
74
|
}
|
|
@@ -65,17 +90,7 @@ async function getClaudePath() {
|
|
|
65
90
|
*/
|
|
66
91
|
export async function checkClaudeCli() {
|
|
67
92
|
const claudePath = await getClaudePath();
|
|
68
|
-
|
|
69
|
-
return false;
|
|
70
|
-
try {
|
|
71
|
-
await execAsync(`"${claudePath}" --version`, {
|
|
72
|
-
timeout: CLAUDE_COMMAND_TIMEOUT_MS,
|
|
73
|
-
});
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
93
|
+
return claudePath !== '';
|
|
79
94
|
}
|
|
80
95
|
/**
|
|
81
96
|
* Add Ceetrix MCP server configuration to Claude Code.
|
|
@@ -96,7 +111,6 @@ export async function addConfig(apiKey) {
|
|
|
96
111
|
},
|
|
97
112
|
};
|
|
98
113
|
const configJson = JSON.stringify(config);
|
|
99
|
-
// Escape single quotes for shell
|
|
100
114
|
const escaped = configJson.replace(/'/g, "'\\''");
|
|
101
115
|
await execAsync(`"${claudePath}" mcp add-json ceetrix '${escaped}' --scope user`, {
|
|
102
116
|
timeout: CLAUDE_COMMAND_TIMEOUT_MS,
|
package/dist/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/debug.d.ts
CHANGED
package/dist/debug.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAiGpD"}
|
package/dist/debug.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Debug diagnostics for troubleshooting installation issues
|
|
3
|
+
*
|
|
4
|
+
* Note: --debug mode runs without permission prompt since it's
|
|
5
|
+
* explicitly invoked by the user for diagnostic purposes.
|
|
3
6
|
*/
|
|
4
7
|
import { exec } from 'child_process';
|
|
5
8
|
import { promisify } from 'util';
|
|
@@ -13,6 +16,10 @@ const COMMON_CLAUDE_PATHS = [
|
|
|
13
16
|
];
|
|
14
17
|
/** Command timeout for diagnostics */
|
|
15
18
|
const DIAG_TIMEOUT_MS = 5000;
|
|
19
|
+
/** Short timeout for version verification */
|
|
20
|
+
const VERSION_CHECK_TIMEOUT_MS = 3000;
|
|
21
|
+
/** Expected marker in Claude Code version output */
|
|
22
|
+
const CLAUDE_CODE_MARKER = 'Claude Code';
|
|
16
23
|
/**
|
|
17
24
|
* Print debug diagnostics and exit.
|
|
18
25
|
*/
|
|
@@ -37,44 +44,42 @@ export async function printDebugInfo() {
|
|
|
37
44
|
// Claude CLI detection
|
|
38
45
|
console.log('Claude CLI Detection');
|
|
39
46
|
console.log('────────────────────');
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
const foundPath = await which('claude');
|
|
43
|
-
console.log(` which('claude'): ${foundPath}`);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
console.log(` which('claude'): NOT FOUND`);
|
|
47
|
-
}
|
|
48
|
-
// Try common paths
|
|
49
|
-
for (const path of COMMON_CLAUDE_PATHS) {
|
|
47
|
+
// Helper to check if path is real Claude Code
|
|
48
|
+
async function checkClaudeCode(path) {
|
|
50
49
|
try {
|
|
51
|
-
await
|
|
52
|
-
|
|
50
|
+
const { stdout } = await execAsync(`"${path}" --version`, {
|
|
51
|
+
timeout: VERSION_CHECK_TIMEOUT_MS,
|
|
52
|
+
});
|
|
53
|
+
if (stdout.includes(CLAUDE_CODE_MARKER)) {
|
|
54
|
+
return `✓ Claude Code (${stdout.trim()})`;
|
|
55
|
+
}
|
|
56
|
+
return `✗ NOT Claude Code (responds: ${stdout.trim().slice(0, 40)})`;
|
|
53
57
|
}
|
|
54
|
-
catch {
|
|
55
|
-
|
|
58
|
+
catch (e) {
|
|
59
|
+
const err = e;
|
|
60
|
+
if (err.killed)
|
|
61
|
+
return '✗ TIMEOUT (possibly stale install)';
|
|
62
|
+
return '✗ NOT FOUND or ERROR';
|
|
56
63
|
}
|
|
57
64
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
console.log('Claude CLI Version');
|
|
61
|
-
console.log('──────────────────');
|
|
65
|
+
// Try which
|
|
66
|
+
let whichPath = null;
|
|
62
67
|
try {
|
|
63
|
-
|
|
64
|
-
|
|
68
|
+
whichPath = await which('claude');
|
|
69
|
+
const status = await checkClaudeCode(whichPath);
|
|
70
|
+
console.log(` which('claude'): ${whichPath}`);
|
|
71
|
+
console.log(` ${status}`);
|
|
65
72
|
}
|
|
66
73
|
catch {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
}
|
|
74
|
+
console.log(` which('claude'): NOT IN PATH`);
|
|
75
|
+
}
|
|
76
|
+
// Try common paths
|
|
77
|
+
for (const path of COMMON_CLAUDE_PATHS) {
|
|
78
|
+
if (path === whichPath)
|
|
79
|
+
continue; // Already checked
|
|
80
|
+
const status = await checkClaudeCode(path);
|
|
81
|
+
console.log(` ${path}:`);
|
|
82
|
+
console.log(` ${status}`);
|
|
78
83
|
}
|
|
79
84
|
console.log('');
|
|
80
85
|
// Existing MCP config
|
|
@@ -94,7 +99,7 @@ export async function printDebugInfo() {
|
|
|
94
99
|
console.log(` Status: NOT CONFIGURED`);
|
|
95
100
|
}
|
|
96
101
|
}
|
|
97
|
-
catch
|
|
102
|
+
catch {
|
|
98
103
|
console.log(` Status: UNABLE TO CHECK (claude mcp list failed)`);
|
|
99
104
|
}
|
|
100
105
|
console.log('');
|
package/dist/debug.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.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;AAeH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAkE1C"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,8 @@ import { openBrowser } from './browser.js';
|
|
|
8
8
|
import { promptForRepo, promptExistingConfig } from './prompts.js';
|
|
9
9
|
import { checkClaudeCli, addConfig } from './claude.js';
|
|
10
10
|
import { getSetupUrl, AUTH_TIMEOUT_MS } from './constants.js';
|
|
11
|
+
import { enforceLatestVersion } from './version-check.js';
|
|
12
|
+
import { requestPermissionOrExit } from './permissions.js';
|
|
11
13
|
/** Supported platform for this release */
|
|
12
14
|
const SUPPORTED_PLATFORM = 'darwin';
|
|
13
15
|
/**
|
|
@@ -16,6 +18,8 @@ const SUPPORTED_PLATFORM = 'darwin';
|
|
|
16
18
|
export async function main() {
|
|
17
19
|
console.log('\nCeetrix Setup');
|
|
18
20
|
console.log('─────────────\n');
|
|
21
|
+
// Version check - refuse to run outdated cached versions
|
|
22
|
+
await enforceLatestVersion();
|
|
19
23
|
// Platform check - macOS only for now
|
|
20
24
|
if (process.platform !== SUPPORTED_PLATFORM) {
|
|
21
25
|
console.error(`✗ Unsupported platform: ${process.platform}\n`);
|
|
@@ -25,6 +29,8 @@ export async function main() {
|
|
|
25
29
|
console.error('Join the Discord for updates: https://ceetrix.com/discord\n');
|
|
26
30
|
process.exit(1);
|
|
27
31
|
}
|
|
32
|
+
// Single upfront permission for all CLI operations
|
|
33
|
+
await requestPermissionOrExit();
|
|
28
34
|
// Check Claude CLI is available
|
|
29
35
|
const claudeAvailable = await checkClaudeCli();
|
|
30
36
|
if (!claudeAvailable) {
|
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,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission-based execution module
|
|
3
|
+
*
|
|
4
|
+
* Single upfront permission for all CLI operations.
|
|
5
|
+
* All-or-nothing: either user trusts ceetrix to run commands or exits.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Request upfront permission for all CLI operations.
|
|
9
|
+
* Must be called once at startup. Exits if denied.
|
|
10
|
+
*/
|
|
11
|
+
export declare function requestPermissionOrExit(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Check if permission has been granted.
|
|
14
|
+
* For internal use by other modules.
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasPermission(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Reset permission state (for testing).
|
|
19
|
+
*/
|
|
20
|
+
export declare function resetPermission(): void;
|
|
21
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;;GAGG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B7D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission-based execution module
|
|
3
|
+
*
|
|
4
|
+
* Single upfront permission for all CLI operations.
|
|
5
|
+
* All-or-nothing: either user trusts ceetrix to run commands or exits.
|
|
6
|
+
*/
|
|
7
|
+
import { confirm } from '@inquirer/prompts';
|
|
8
|
+
/** Whether permission has been granted for this session */
|
|
9
|
+
let permissionGranted = false;
|
|
10
|
+
/** Commands that will be executed */
|
|
11
|
+
const COMMANDS_DESCRIPTION = `
|
|
12
|
+
• which claude (find Claude CLI location)
|
|
13
|
+
• claude --version (verify it's Claude Code)
|
|
14
|
+
• claude mcp list (check existing config)
|
|
15
|
+
• claude mcp add-json (add Ceetrix server)
|
|
16
|
+
• claude mcp remove (if reconfiguring)
|
|
17
|
+
`;
|
|
18
|
+
/**
|
|
19
|
+
* Request upfront permission for all CLI operations.
|
|
20
|
+
* Must be called once at startup. Exits if denied.
|
|
21
|
+
*/
|
|
22
|
+
export async function requestPermissionOrExit() {
|
|
23
|
+
if (permissionGranted) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log('');
|
|
27
|
+
console.log('┌─ Permission Request ─────────────────────────────────────────┐');
|
|
28
|
+
console.log('│ │');
|
|
29
|
+
console.log('│ Ceetrix needs to run the following commands: │');
|
|
30
|
+
console.log('│ │');
|
|
31
|
+
for (const line of COMMANDS_DESCRIPTION.trim().split('\n')) {
|
|
32
|
+
console.log(`│ ${line.padEnd(58)}│`);
|
|
33
|
+
}
|
|
34
|
+
console.log('│ │');
|
|
35
|
+
console.log('│ All results stay local on your machine. │');
|
|
36
|
+
console.log('│ Nothing is sent externally unless you choose to share. │');
|
|
37
|
+
console.log('│ │');
|
|
38
|
+
console.log('└──────────────────────────────────────────────────────────────┘');
|
|
39
|
+
console.log('');
|
|
40
|
+
const allowed = await confirm({
|
|
41
|
+
message: 'Allow Ceetrix to run these commands?',
|
|
42
|
+
default: true,
|
|
43
|
+
});
|
|
44
|
+
if (!allowed) {
|
|
45
|
+
console.log('\nPermission denied. Exiting.\n');
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
permissionGranted = true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if permission has been granted.
|
|
52
|
+
* For internal use by other modules.
|
|
53
|
+
*/
|
|
54
|
+
export function hasPermission() {
|
|
55
|
+
return permissionGranted;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reset permission state (for testing).
|
|
59
|
+
*/
|
|
60
|
+
export function resetPermission() {
|
|
61
|
+
permissionGranted = false;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,2DAA2D;AAC3D,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAE9B,qCAAqC;AACrC,MAAM,oBAAoB,GAAG;;;;;;CAM5B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;QAC5B,OAAO,EAAE,sCAAsC;QAC/C,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,iBAAiB,GAAG,KAAK,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version check against npm registry
|
|
3
|
+
*
|
|
4
|
+
* Ensures user is running the latest version.
|
|
5
|
+
* npx caches old versions, so we enforce @latest.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get the current package version from package.json
|
|
9
|
+
*/
|
|
10
|
+
export declare function getCurrentVersion(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Fetch the latest version from npm registry
|
|
13
|
+
*
|
|
14
|
+
* @returns Latest version string, or null if fetch fails
|
|
15
|
+
*/
|
|
16
|
+
export declare function getLatestVersion(): Promise<string | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Compare two semver version strings
|
|
19
|
+
*
|
|
20
|
+
* @returns negative if a < b, 0 if equal, positive if a > b
|
|
21
|
+
*/
|
|
22
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
23
|
+
/**
|
|
24
|
+
* Check if current version is latest and exit if not.
|
|
25
|
+
* Skips check if unable to reach npm registry.
|
|
26
|
+
*/
|
|
27
|
+
export declare function enforceLatestVersion(): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=version-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqB/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB1D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version check against npm registry
|
|
3
|
+
*
|
|
4
|
+
* Ensures user is running the latest version.
|
|
5
|
+
* npx caches old versions, so we enforce @latest.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync } from 'fs';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { dirname, join } from 'path';
|
|
10
|
+
/** npm registry URL for version check */
|
|
11
|
+
const NPM_REGISTRY_URL = 'https://registry.npmjs.org/ceetrix/latest';
|
|
12
|
+
/** Timeout for npm registry request */
|
|
13
|
+
const REGISTRY_TIMEOUT_MS = 5000;
|
|
14
|
+
/**
|
|
15
|
+
* Get the current package version from package.json
|
|
16
|
+
*/
|
|
17
|
+
export function getCurrentVersion() {
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = dirname(__filename);
|
|
20
|
+
const packagePath = join(__dirname, '..', 'package.json');
|
|
21
|
+
const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
22
|
+
return packageJson.version;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fetch the latest version from npm registry
|
|
26
|
+
*
|
|
27
|
+
* @returns Latest version string, or null if fetch fails
|
|
28
|
+
*/
|
|
29
|
+
export async function getLatestVersion() {
|
|
30
|
+
try {
|
|
31
|
+
const controller = new AbortController();
|
|
32
|
+
const timeoutId = setTimeout(() => controller.abort(), REGISTRY_TIMEOUT_MS);
|
|
33
|
+
const response = await fetch(NPM_REGISTRY_URL, {
|
|
34
|
+
signal: controller.signal,
|
|
35
|
+
});
|
|
36
|
+
clearTimeout(timeoutId);
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const data = await response.json();
|
|
41
|
+
return data.version ?? null;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Network error, timeout, or parse error
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Compare two semver version strings
|
|
50
|
+
*
|
|
51
|
+
* @returns negative if a < b, 0 if equal, positive if a > b
|
|
52
|
+
*/
|
|
53
|
+
export function compareVersions(a, b) {
|
|
54
|
+
const partsA = a.split('.').map(Number);
|
|
55
|
+
const partsB = b.split('.').map(Number);
|
|
56
|
+
for (let i = 0; i < 3; i++) {
|
|
57
|
+
const diff = (partsA[i] || 0) - (partsB[i] || 0);
|
|
58
|
+
if (diff !== 0)
|
|
59
|
+
return diff;
|
|
60
|
+
}
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if current version is latest and exit if not.
|
|
65
|
+
* Skips check if unable to reach npm registry.
|
|
66
|
+
*/
|
|
67
|
+
export async function enforceLatestVersion() {
|
|
68
|
+
const current = getCurrentVersion();
|
|
69
|
+
const latest = await getLatestVersion();
|
|
70
|
+
if (latest === null) {
|
|
71
|
+
// Can't reach npm registry, allow to proceed
|
|
72
|
+
// (might be offline, corporate firewall, etc.)
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (compareVersions(current, latest) < 0) {
|
|
76
|
+
console.error(`\n✗ Outdated version: ${current} (latest: ${latest})\n`);
|
|
77
|
+
console.error('npx caches old versions. Run with @latest:\n');
|
|
78
|
+
console.error(' npx ceetrix@latest\n');
|
|
79
|
+
console.error('Or clear the cache:\n');
|
|
80
|
+
console.error(' rm -rf ~/.npm/_npx && npx ceetrix\n');
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"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"}
|