psycgod-sage 1.0.26 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -1,14 +1,87 @@
1
1
  #!/usr/bin/env node
2
- // npm/npx SAGE launcher.
3
- //
4
- // The Python package `psycgod-sage` is the canonical SAGE implementation.
5
- // This npm package exists for Node users who prefer:
6
- // npx -y psycgod-sage run -- <command>
7
- //
8
- // To keep PyPI and npm behavior identical, every CLI invocation is forwarded
9
- // to `python -m sage` after ensuring the Python core is installed.
10
- import { runPythonSage } from '../python/bridge.js';
11
- const args = process.argv.slice(2);
12
- const exitCode = runPythonSage(args);
13
- process.exit(exitCode);
2
+ import { spawnSync } from 'node:child_process';
3
+ import { readFileSync } from 'node:fs';
4
+ function packageVersion() {
5
+ try {
6
+ const packageUrl = new URL('../../package.json', import.meta.url);
7
+ const metadata = JSON.parse(readFileSync(packageUrl, 'utf8'));
8
+ return metadata.version || 'unknown';
9
+ }
10
+ catch {
11
+ return 'unknown';
12
+ }
13
+ }
14
+ function usage() {
15
+ console.log('Usage: sage <command> [args...]');
16
+ console.log(' sage run -- <command> [args...]');
17
+ }
18
+ function runPythonSage(args) {
19
+ const candidates = process.platform === 'win32'
20
+ ? ['py', 'python']
21
+ : ['python3', 'python'];
22
+ for (const executable of candidates) {
23
+ const probe = spawnSync(executable, ['-c', 'import sage'], {
24
+ cwd: process.cwd(),
25
+ env: process.env,
26
+ stdio: 'ignore',
27
+ shell: false,
28
+ });
29
+ if (probe.error || probe.status !== 0)
30
+ continue;
31
+ const result = spawnSync(executable, ['-m', 'sage', ...args], {
32
+ cwd: process.cwd(),
33
+ env: process.env,
34
+ stdio: 'inherit',
35
+ shell: false,
36
+ });
37
+ if (result.error) {
38
+ console.error(`[SAGE npm] ${result.error.message}`);
39
+ return 1;
40
+ }
41
+ return result.status ?? 1;
42
+ }
43
+ console.error('[SAGE npm] The full SAGE CLI requires the Python package.');
44
+ console.error('[SAGE npm] Install it with: pip install psycgod-sage');
45
+ return 1;
46
+ }
47
+ function main(args) {
48
+ if (args.length === 1 && (args[0] === '--version' || args[0] === '-V')) {
49
+ console.log(packageVersion());
50
+ return 0;
51
+ }
52
+ if (args[0] !== 'run') {
53
+ return runPythonSage(args);
54
+ }
55
+ const separator = args.indexOf('--');
56
+ const commandParts = separator >= 0 ? args.slice(separator + 1) : args.slice(1);
57
+ if (commandParts.length === 0) {
58
+ usage();
59
+ return 1;
60
+ }
61
+ const [command, ...commandArgs] = commandParts;
62
+ const stdinFile = process.env.SAGE_STDIN_FILE?.trim();
63
+ let input;
64
+ if (stdinFile) {
65
+ try {
66
+ input = readFileSync(stdinFile);
67
+ }
68
+ catch (error) {
69
+ console.error(`[SAGE npm] Could not read SAGE_STDIN_FILE: ${error instanceof Error ? error.message : String(error)}`);
70
+ return 1;
71
+ }
72
+ }
73
+ const result = spawnSync(command, commandArgs, {
74
+ cwd: process.cwd(),
75
+ env: process.env,
76
+ stdio: input ? ['pipe', 'inherit', 'inherit'] : 'inherit',
77
+ input,
78
+ shell: process.platform === 'win32',
79
+ });
80
+ if (result.error) {
81
+ console.error(`[SAGE npm] ${result.error.message}`);
82
+ return 1;
83
+ }
84
+ return result.status ?? 1;
85
+ }
86
+ process.exit(main(process.argv.slice(2)));
14
87
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,yBAAyB;AACzB,EAAE;AACF,0EAA0E;AAC1E,qDAAqD;AACrD,yCAAyC;AACzC,EAAE;AACF,6EAA6E;AAC7E,mEAAmE;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AACrC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAoB,CAAC;QACjF,OAAO,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,KAAK;IACZ,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC7C,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE1B,KAAK,MAAM,UAAU,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE;YACzD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEhD,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;YAC5D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACtE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,IAAI,CAAC,IAAc;IAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,GAAG,YAAY,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,KAAyB,CAAC;IAC9B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtH,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE;QAC7C,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACzD,KAAK;QACL,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;KACpC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "psycgod-sage",
3
- "version": "1.0.26",
3
+ "version": "1.1.0",
4
4
  "mcpName": "io.github.PsYcGoD/sage",
5
5
  "description": "npm/npx launcher for the canonical PyPI SAGE CLI wrapper for AI coding agents",
6
6
  "author": "PsYcGoD",