psycgod-sage 2.5.5 → 2.5.7

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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=postinstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../../src/cli/postinstall.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ const message = `
3
+ SAGE installed.
4
+
5
+ Next step:
6
+ sage install
7
+
8
+ That connects this machine, activates SAGE for local AI agents, and verifies
9
+ that future terminal commands are routed through SAGE.
10
+
11
+ If you only want to wrap one command now:
12
+ sage run -- pytest
13
+
14
+ Shortcuts also work:
15
+ sage pytest
16
+ sage npm test
17
+ sage git status
18
+ `;
19
+ console.log(message.trim());
20
+ export {};
21
+ //# sourceMappingURL=postinstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../../src/cli/postinstall.ts"],"names":[],"mappings":";AAEA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;CAgBf,CAAC;AAEF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/python/bridge.ts"],"names":[],"mappings":"AAEA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAmBD,wBAAgB,UAAU,IAAI,aAAa,GAAG,IAAI,CAYjD;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CA0B1C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAQpD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAQzC;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAQjD"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/python/bridge.ts"],"names":[],"mappings":"AAEA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAmBD,wBAAgB,UAAU,IAAI,aAAa,GAAG,IAAI,CAYjD;AAgCD,wBAAgB,gBAAgB,IAAI,OAAO,CAa1C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAuBpD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAQzC;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAQjD"}
@@ -25,6 +25,25 @@ export function findPython() {
25
25
  }
26
26
  return null;
27
27
  }
28
+ function pythonSageImportable(python) {
29
+ // Cheap probe: imports the package without loading the full CLI.
30
+ return runCandidate(python, ['-c', 'import sage']).status === 0;
31
+ }
32
+ function installPythonSage(python) {
33
+ console.log('Installing Python SAGE core from PyPI...');
34
+ const install = runCandidate(python, ['-m', 'pip', 'install', '--upgrade', 'psycgod-sage'], 'inherit');
35
+ if (install.status === 0) {
36
+ return true;
37
+ }
38
+ // PEP 668 "externally managed environment" (Debian/Ubuntu/Homebrew Python)
39
+ // rejects plain pip installs; retry as a user install.
40
+ const userInstall = runCandidate(python, ['-m', 'pip', 'install', '--upgrade', '--user', '--break-system-packages', 'psycgod-sage'], 'inherit');
41
+ if (userInstall.status !== 0) {
42
+ console.error('Failed to install Python SAGE core: psycgod-sage');
43
+ return false;
44
+ }
45
+ return true;
46
+ }
28
47
  export function ensurePythonSage() {
29
48
  const python = findPython();
30
49
  if (!python) {
@@ -32,25 +51,32 @@ export function ensurePythonSage() {
32
51
  console.error('Install Python, then retry: npm install -g psycgod-sage');
33
52
  return false;
34
53
  }
35
- const probe = runCandidate(python, ['-m', 'sage', '--version']);
36
- if (probe.status === 0) {
54
+ if (pythonSageImportable(python)) {
37
55
  return true;
38
56
  }
39
- console.log('Installing Python SAGE core from PyPI...');
40
- const install = runCandidate(python, ['-m', 'pip', 'install', '--upgrade', 'psycgod-sage'], 'inherit');
41
- if (install.status !== 0) {
42
- console.error('Failed to install Python SAGE core: psycgod-sage');
43
- return false;
44
- }
45
- return runCandidate(python, ['-m', 'sage', '--version']).status === 0;
57
+ return installPythonSage(python) && pythonSageImportable(python);
46
58
  }
47
59
  export function runPythonSage(args) {
48
60
  const python = findPython();
49
- if (!python || !ensurePythonSage()) {
61
+ if (!python) {
62
+ console.error('SAGE npm launcher needs Python 3.10+ on PATH.');
63
+ console.error('Install Python, then retry: npm install -g psycgod-sage');
50
64
  return 1;
51
65
  }
66
+ // Run directly: the common case pays one Python start, not three. Only when
67
+ // the run fails AND the package is missing do we install and retry once.
52
68
  const result = runCandidate(python, ['-m', 'sage', ...args], 'inherit');
53
- return typeof result.status === 'number' ? result.status : 1;
69
+ if (result.status === 0) {
70
+ return 0;
71
+ }
72
+ if (pythonSageImportable(python)) {
73
+ return typeof result.status === 'number' ? result.status : 1;
74
+ }
75
+ if (!installPythonSage(python)) {
76
+ return 1;
77
+ }
78
+ const retry = runCandidate(python, ['-m', 'sage', ...args], 'inherit');
79
+ return typeof retry.status === 'number' ? retry.status : 1;
54
80
  }
55
81
  export function setupPythonSage() {
56
82
  const python = findPython();
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/python/bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/python/bridge.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "psycgod-sage",
3
- "version": "2.5.5",
3
+ "version": "2.5.7",
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",
@@ -20,6 +20,7 @@
20
20
  "dev": "tsc --watch",
21
21
  "test": "vitest",
22
22
  "lint": "eslint src",
23
+ "postinstall": "node ./dist/cli/postinstall.js",
23
24
  "prepublishOnly": "npm run build"
24
25
  },
25
26
  "dependencies": {},