@pantion/installer 0.2.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.
Files changed (81) hide show
  1. package/dist/adapters/claude-code.d.ts +3 -0
  2. package/dist/adapters/claude-code.d.ts.map +1 -0
  3. package/dist/adapters/claude-code.js +35 -0
  4. package/dist/adapters/claude-code.js.map +1 -0
  5. package/dist/adapters/codex.d.ts +3 -0
  6. package/dist/adapters/codex.d.ts.map +1 -0
  7. package/dist/adapters/codex.js +22 -0
  8. package/dist/adapters/codex.js.map +1 -0
  9. package/dist/adapters/cursor.d.ts +3 -0
  10. package/dist/adapters/cursor.d.ts.map +1 -0
  11. package/dist/adapters/cursor.js +22 -0
  12. package/dist/adapters/cursor.js.map +1 -0
  13. package/dist/adapters/gemini-cli.d.ts +3 -0
  14. package/dist/adapters/gemini-cli.d.ts.map +1 -0
  15. package/dist/adapters/gemini-cli.js +22 -0
  16. package/dist/adapters/gemini-cli.js.map +1 -0
  17. package/dist/adapters/registry.d.ts +5 -0
  18. package/dist/adapters/registry.d.ts.map +1 -0
  19. package/dist/adapters/registry.js +19 -0
  20. package/dist/adapters/registry.js.map +1 -0
  21. package/dist/adapters/types.d.ts +13 -0
  22. package/dist/adapters/types.d.ts.map +1 -0
  23. package/dist/adapters/types.js +2 -0
  24. package/dist/adapters/types.js.map +1 -0
  25. package/dist/adapters/windsurf.d.ts +3 -0
  26. package/dist/adapters/windsurf.d.ts.map +1 -0
  27. package/dist/adapters/windsurf.js +22 -0
  28. package/dist/adapters/windsurf.js.map +1 -0
  29. package/dist/cli.d.ts +24 -0
  30. package/dist/cli.d.ts.map +1 -0
  31. package/dist/cli.js +94 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/commands/doctor.d.ts +3 -0
  34. package/dist/commands/doctor.d.ts.map +1 -0
  35. package/dist/commands/doctor.js +56 -0
  36. package/dist/commands/doctor.js.map +1 -0
  37. package/dist/commands/install.d.ts +3 -0
  38. package/dist/commands/install.d.ts.map +1 -0
  39. package/dist/commands/install.js +92 -0
  40. package/dist/commands/install.js.map +1 -0
  41. package/dist/commands/restore.d.ts +9 -0
  42. package/dist/commands/restore.d.ts.map +1 -0
  43. package/dist/commands/restore.js +49 -0
  44. package/dist/commands/restore.js.map +1 -0
  45. package/dist/commands/uninstall.d.ts +3 -0
  46. package/dist/commands/uninstall.d.ts.map +1 -0
  47. package/dist/commands/uninstall.js +91 -0
  48. package/dist/commands/uninstall.js.map +1 -0
  49. package/dist/commands/verify.d.ts +3 -0
  50. package/dist/commands/verify.d.ts.map +1 -0
  51. package/dist/commands/verify.js +66 -0
  52. package/dist/commands/verify.js.map +1 -0
  53. package/dist/index.d.ts +3 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +44 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/types.d.ts +51 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +2 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/utils/backup.d.ts +2 -0
  62. package/dist/utils/backup.d.ts.map +1 -0
  63. package/dist/utils/backup.js +22 -0
  64. package/dist/utils/backup.js.map +1 -0
  65. package/dist/utils/json-merge.d.ts +7 -0
  66. package/dist/utils/json-merge.d.ts.map +1 -0
  67. package/dist/utils/json-merge.js +58 -0
  68. package/dist/utils/json-merge.js.map +1 -0
  69. package/dist/utils/output.d.ts +7 -0
  70. package/dist/utils/output.d.ts.map +1 -0
  71. package/dist/utils/output.js +20 -0
  72. package/dist/utils/output.js.map +1 -0
  73. package/dist/utils/prereqs.d.ts +5 -0
  74. package/dist/utils/prereqs.d.ts.map +1 -0
  75. package/dist/utils/prereqs.js +27 -0
  76. package/dist/utils/prereqs.js.map +1 -0
  77. package/dist/utils/toml-merge.d.ts +5 -0
  78. package/dist/utils/toml-merge.d.ts.map +1 -0
  79. package/dist/utils/toml-merge.js +54 -0
  80. package/dist/utils/toml-merge.js.map +1 -0
  81. package/package.json +27 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAUpE,MAAM,UAAU,OAAO,CAAC,UAAkB,EAAE,MAAe;IACzD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAElD,8BAA8B;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QAC7C,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,0BAA0B,UAAU,EAAE,EAAE,CAAC;IACvG,CAAC;IAED,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,2DAA2D,UAAU,EAAE,CAAC,CAAC;QAC9E,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;IAC9F,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE/B,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;QACjC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACnD,CAAC;IAED,mDAAmD;IACnD,IAAI,gBAAoC,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,MAAM;YAAE,gBAAgB,GAAG,MAAM,CAAC;IACxC,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1F,CAAC;IAED,EAAE,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IAC9B,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAI,CAAC,oBAAoB,gBAAgB,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,EAAE,CAAC;IAER,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ClientId, UninstallResult } from '../types.js';
2
+ export declare function uninstall(clients: ClientId[], dryRun: boolean, homeDir?: string): UninstallResult[];
3
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA4D7D,wBAAgB,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CA0CnG"}
@@ -0,0 +1,91 @@
1
+ import * as fs from 'node:fs';
2
+ import { getAdapter } from '../adapters/registry.js';
3
+ import { createBackup } from '../utils/backup.js';
4
+ import { heading, ok, fail, info, blank } from '../utils/output.js';
5
+ import { verify } from './verify.js';
6
+ function uninstallOne(clientId, dryRun, homeDir) {
7
+ const adapter = getAdapter(clientId);
8
+ const configPath = adapter.configPath(homeDir);
9
+ if (!fs.existsSync(configPath)) {
10
+ return { clientId, success: true, action: 'not-installed', configPath };
11
+ }
12
+ let content;
13
+ try {
14
+ content = fs.readFileSync(configPath, 'utf-8');
15
+ }
16
+ catch (err) {
17
+ return {
18
+ clientId,
19
+ success: false,
20
+ action: 'failed',
21
+ configPath,
22
+ error: `Cannot read ${configPath}: ${err instanceof Error ? err.message : String(err)}`,
23
+ };
24
+ }
25
+ if (!adapter.hasPantionEntry(content)) {
26
+ return { clientId, success: true, action: 'not-installed', configPath };
27
+ }
28
+ const updated = adapter.removePantionEntry(content);
29
+ if (dryRun) {
30
+ info(`Would write to ${configPath}:`);
31
+ console.log(updated);
32
+ return { clientId, success: true, action: 'removed', configPath };
33
+ }
34
+ // Backup before modifying
35
+ let backupPath;
36
+ const backup = createBackup(configPath);
37
+ if (backup)
38
+ backupPath = backup;
39
+ try {
40
+ fs.writeFileSync(configPath, updated, 'utf-8');
41
+ }
42
+ catch (err) {
43
+ return {
44
+ clientId,
45
+ success: false,
46
+ action: 'failed',
47
+ configPath,
48
+ backupPath,
49
+ error: `Cannot write ${configPath}: ${err instanceof Error ? err.message : String(err)}`,
50
+ };
51
+ }
52
+ return { clientId, success: true, action: 'removed', configPath, backupPath };
53
+ }
54
+ export function uninstall(clients, dryRun, homeDir) {
55
+ const results = [];
56
+ heading(dryRun ? 'Uninstall (dry run)' : 'Uninstall');
57
+ for (const clientId of clients) {
58
+ const adapter = getAdapter(clientId);
59
+ const result = uninstallOne(clientId, dryRun, homeDir);
60
+ results.push(result);
61
+ switch (result.action) {
62
+ case 'removed':
63
+ if (!dryRun) {
64
+ ok(`${adapter.displayName}: Pantion entry removed`);
65
+ if (result.backupPath) {
66
+ info(` Backup: ${result.backupPath}`);
67
+ }
68
+ }
69
+ break;
70
+ case 'not-installed':
71
+ ok(`${adapter.displayName}: no Pantion entry found`);
72
+ break;
73
+ case 'failed':
74
+ fail(`${adapter.displayName}: ${result.error}`);
75
+ break;
76
+ }
77
+ }
78
+ blank();
79
+ // Post-uninstall verify: confirm Pantion is gone
80
+ const removed = results.filter((r) => r.action === 'removed');
81
+ if (!dryRun && removed.length > 0) {
82
+ const removedClients = removed.map((r) => r.clientId);
83
+ const verifyResults = verify(removedClients, homeDir);
84
+ const allGone = verifyResults.every((v) => !v.hasPantionEntry);
85
+ if (!allGone) {
86
+ fail('Post-uninstall verify: Pantion entry still present in some configs');
87
+ }
88
+ }
89
+ return results;
90
+ }
91
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ClientId, VerifyResult } from '../types.js';
2
+ export declare function verify(clients: ClientId[], homeDir?: string): VerifyResult[];
3
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA4C1D,wBAAgB,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CA0B5E"}
@@ -0,0 +1,66 @@
1
+ import * as fs from 'node:fs';
2
+ import { getAdapter } from '../adapters/registry.js';
3
+ import { heading, ok, warn, fail, blank } from '../utils/output.js';
4
+ function verifyOne(clientId, homeDir) {
5
+ const adapter = getAdapter(clientId);
6
+ const configPath = adapter.configPath(homeDir);
7
+ if (!fs.existsSync(configPath)) {
8
+ return {
9
+ clientId,
10
+ configExists: false,
11
+ configPath,
12
+ hasPantionEntry: false,
13
+ entryCorrect: false,
14
+ };
15
+ }
16
+ let content;
17
+ try {
18
+ content = fs.readFileSync(configPath, 'utf-8');
19
+ }
20
+ catch (err) {
21
+ return {
22
+ clientId,
23
+ configExists: true,
24
+ configPath,
25
+ hasPantionEntry: false,
26
+ entryCorrect: false,
27
+ error: `Cannot read ${configPath}: ${err instanceof Error ? err.message : String(err)}`,
28
+ };
29
+ }
30
+ const hasEntry = adapter.hasPantionEntry(content);
31
+ const correct = hasEntry ? adapter.isPantionEntryCorrect(content) : false;
32
+ return {
33
+ clientId,
34
+ configExists: true,
35
+ configPath,
36
+ hasPantionEntry: hasEntry,
37
+ entryCorrect: correct,
38
+ };
39
+ }
40
+ export function verify(clients, homeDir) {
41
+ const results = [];
42
+ heading('Verify');
43
+ for (const clientId of clients) {
44
+ const adapter = getAdapter(clientId);
45
+ const result = verifyOne(clientId, homeDir);
46
+ results.push(result);
47
+ if (result.error) {
48
+ fail(`${adapter.displayName}: ${result.error}`);
49
+ }
50
+ else if (!result.configExists) {
51
+ fail(`${adapter.displayName}: config file not found (${result.configPath})`);
52
+ }
53
+ else if (!result.hasPantionEntry) {
54
+ warn(`${adapter.displayName}: config exists but no Pantion entry`);
55
+ }
56
+ else if (!result.entryCorrect) {
57
+ warn(`${adapter.displayName}: Pantion entry found but incorrect`);
58
+ }
59
+ else {
60
+ ok(`${adapter.displayName}: correctly configured`);
61
+ }
62
+ }
63
+ blank();
64
+ return results;
65
+ }
66
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEpE,SAAS,SAAS,CAAC,QAAkB,EAAE,OAAgB;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,QAAQ;YACR,YAAY,EAAE,KAAK;YACnB,UAAU;YACV,eAAe,EAAE,KAAK;YACtB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,QAAQ;YACR,YAAY,EAAE,IAAI;YAClB,UAAU;YACV,eAAe,EAAE,KAAK;YACtB,YAAY,EAAE,KAAK;YACnB,KAAK,EAAE,eAAe,UAAU,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SACxF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE1E,OAAO;QACL,QAAQ;QACR,YAAY,EAAE,IAAI;QAClB,UAAU;QACV,eAAe,EAAE,QAAQ;QACzB,YAAY,EAAE,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAmB,EAAE,OAAgB;IAC1D,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElB,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,4BAA4B,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,sCAAsC,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,qCAAqC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,wBAAwB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK,EAAE,CAAC;IAER,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs, printHelp } from './cli.js';
3
+ import { doctor } from './commands/doctor.js';
4
+ import { install } from './commands/install.js';
5
+ import { verify } from './commands/verify.js';
6
+ import { uninstall } from './commands/uninstall.js';
7
+ import { restore } from './commands/restore.js';
8
+ const parsed = parseArgs(process.argv);
9
+ switch (parsed.command) {
10
+ case 'doctor':
11
+ doctor();
12
+ break;
13
+ case 'install': {
14
+ const results = install(parsed.clients, parsed.dryRun);
15
+ const anyFailed = results.some((r) => !r.success);
16
+ if (anyFailed)
17
+ process.exitCode = 1;
18
+ break;
19
+ }
20
+ case 'verify': {
21
+ const results = verify(parsed.clients);
22
+ const anyFailed = results.some((r) => !r.entryCorrect);
23
+ if (anyFailed)
24
+ process.exitCode = 1;
25
+ break;
26
+ }
27
+ case 'uninstall': {
28
+ const results = uninstall(parsed.clients, parsed.dryRun);
29
+ const anyFailed = results.some((r) => !r.success);
30
+ if (anyFailed)
31
+ process.exitCode = 1;
32
+ break;
33
+ }
34
+ case 'restore': {
35
+ const result = restore(parsed.backupFile, parsed.dryRun);
36
+ if (!result.success)
37
+ process.exitCode = 1;
38
+ break;
39
+ }
40
+ case 'help':
41
+ printHelp();
42
+ break;
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvC,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,KAAK,QAAQ;QACX,MAAM,EAAE,CAAC;QACT,MAAM;IAER,KAAK,SAAS,CAAC,CAAC,CAAC;QACf,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,SAAS;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpC,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,SAAS;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpC,MAAM;IACR,CAAC;IAED,KAAK,WAAW,CAAC,CAAC,CAAC;QACjB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,SAAS;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpC,MAAM;IACR,CAAC;IAED,KAAK,SAAS,CAAC,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC1C,MAAM;IACR,CAAC;IAED,KAAK,MAAM;QACT,SAAS,EAAE,CAAC;QACZ,MAAM;AACV,CAAC"}
@@ -0,0 +1,51 @@
1
+ export type ClientId = 'claude-code' | 'cursor' | 'windsurf' | 'gemini-cli' | 'codex';
2
+ export declare const ALL_CLIENT_IDS: ClientId[];
3
+ export interface PantionMcpEntry {
4
+ command: string;
5
+ args: string[];
6
+ }
7
+ export interface McpConfig {
8
+ mcpServers?: Record<string, PantionMcpEntry>;
9
+ [key: string]: unknown;
10
+ }
11
+ export interface InstallResult {
12
+ clientId: ClientId;
13
+ success: boolean;
14
+ action: 'installed' | 'already-installed' | 'failed';
15
+ configPath: string;
16
+ backupPath?: string;
17
+ error?: string;
18
+ }
19
+ export interface VerifyResult {
20
+ clientId: ClientId;
21
+ configExists: boolean;
22
+ configPath: string;
23
+ hasPantionEntry: boolean;
24
+ entryCorrect: boolean;
25
+ error?: string;
26
+ }
27
+ export interface UninstallResult {
28
+ clientId: ClientId;
29
+ success: boolean;
30
+ action: 'removed' | 'not-installed' | 'failed';
31
+ configPath: string;
32
+ backupPath?: string;
33
+ error?: string;
34
+ }
35
+ export interface PrereqCheck {
36
+ name: string;
37
+ passed: boolean;
38
+ version?: string;
39
+ message: string;
40
+ }
41
+ export interface ClientStatus {
42
+ clientId: ClientId;
43
+ displayName: string;
44
+ installed: boolean;
45
+ hasPantionConfig: boolean;
46
+ }
47
+ export interface DoctorResult {
48
+ prereqs: PrereqCheck[];
49
+ clients: ClientStatus[];
50
+ }
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;AAEtF,eAAO,MAAM,cAAc,EAAE,QAAQ,EAAiE,CAAC;AAEvG,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,eAAe,GAAG,QAAQ,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export const ALL_CLIENT_IDS = ['claude-code', 'cursor', 'windsurf', 'gemini-cli', 'codex'];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAe,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createBackup(filePath: string): string | null;
2
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/utils/backup.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB5D"}
@@ -0,0 +1,22 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ export function createBackup(filePath) {
4
+ if (!fs.existsSync(filePath)) {
5
+ return null;
6
+ }
7
+ const now = new Date();
8
+ const timestamp = [
9
+ now.getFullYear().toString(),
10
+ (now.getMonth() + 1).toString().padStart(2, '0'),
11
+ now.getDate().toString().padStart(2, '0'),
12
+ '-',
13
+ now.getHours().toString().padStart(2, '0'),
14
+ now.getMinutes().toString().padStart(2, '0'),
15
+ ].join('');
16
+ const dir = path.dirname(filePath);
17
+ const base = path.basename(filePath);
18
+ const backupPath = path.join(dir, `${base}.bak-${timestamp}`);
19
+ fs.copyFileSync(filePath, backupPath);
20
+ return backupPath;
21
+ }
22
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/utils/backup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG;QAChB,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QAC5B,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAChD,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACzC,GAAG;QACH,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC1C,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;KAC7C,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,QAAQ,SAAS,EAAE,CAAC,CAAC;IAE9D,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PantionMcpEntry } from '../types.js';
2
+ export declare function getPantionEntry(): PantionMcpEntry;
3
+ export declare function hasPantionEntry(json: string): boolean;
4
+ export declare function isPantionEntryCorrect(json: string): boolean;
5
+ export declare function mergePantionEntry(json: string): string;
6
+ export declare function removePantionEntry(json: string): string;
7
+ //# sourceMappingURL=json-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-merge.d.ts","sourceRoot":"","sources":["../../src/utils/json-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,aAAa,CAAC;AAO9D,wBAAgB,eAAe,IAAI,eAAe,CAEjD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAa3D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAetD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAavD"}
@@ -0,0 +1,58 @@
1
+ const DEFAULT_PANTION_ENTRY = {
2
+ command: 'npx',
3
+ args: ['@pantion/dialog'],
4
+ };
5
+ export function getPantionEntry() {
6
+ return { ...DEFAULT_PANTION_ENTRY, args: [...DEFAULT_PANTION_ENTRY.args] };
7
+ }
8
+ export function hasPantionEntry(json) {
9
+ try {
10
+ const config = JSON.parse(json);
11
+ return config.mcpServers?.pantion !== undefined;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ export function isPantionEntryCorrect(json) {
18
+ try {
19
+ const config = JSON.parse(json);
20
+ const entry = config.mcpServers?.pantion;
21
+ if (!entry)
22
+ return false;
23
+ const expected = getPantionEntry();
24
+ return entry.command === expected.command
25
+ && Array.isArray(entry.args)
26
+ && entry.args.length === expected.args.length
27
+ && entry.args.every((arg, i) => arg === expected.args[i]);
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ export function mergePantionEntry(json) {
34
+ let config;
35
+ try {
36
+ config = JSON.parse(json);
37
+ }
38
+ catch {
39
+ config = {};
40
+ }
41
+ if (!config.mcpServers) {
42
+ config.mcpServers = {};
43
+ }
44
+ config.mcpServers.pantion = getPantionEntry();
45
+ return JSON.stringify(config, null, 2) + '\n';
46
+ }
47
+ export function removePantionEntry(json) {
48
+ const config = JSON.parse(json);
49
+ if (config.mcpServers?.pantion !== undefined) {
50
+ delete config.mcpServers.pantion;
51
+ }
52
+ // Keep empty mcpServers object — safest for all clients
53
+ if (!config.mcpServers) {
54
+ config.mcpServers = {};
55
+ }
56
+ return JSON.stringify(config, null, 2) + '\n';
57
+ }
58
+ //# sourceMappingURL=json-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-merge.js","sourceRoot":"","sources":["../../src/utils/json-merge.ts"],"names":[],"mappings":"AAEA,MAAM,qBAAqB,GAAoB;IAC7C,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,iBAAiB,CAAC;CAC1B,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,GAAG,qBAAqB,EAAE,IAAI,EAAE,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;QAC7C,OAAO,MAAM,CAAC,UAAU,EAAE,OAAO,KAAK,SAAS,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;eACpC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;eACzB,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM;eAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,MAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG,eAAe,EAAE,CAAC;IAE9C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;IAE7C,IAAI,MAAM,CAAC,UAAU,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function heading(text: string): void;
2
+ export declare function ok(text: string): void;
3
+ export declare function warn(text: string): void;
4
+ export declare function fail(text: string): void;
5
+ export declare function info(text: string): void;
6
+ export declare function blank(): void;
7
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1C;AAED,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAErC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,KAAK,IAAI,IAAI,CAE5B"}
@@ -0,0 +1,20 @@
1
+ export function heading(text) {
2
+ console.log(`\n${text}`);
3
+ console.log('─'.repeat(text.length));
4
+ }
5
+ export function ok(text) {
6
+ console.log(` ✓ ${text}`);
7
+ }
8
+ export function warn(text) {
9
+ console.log(` ⚠ ${text}`);
10
+ }
11
+ export function fail(text) {
12
+ console.log(` ✗ ${text}`);
13
+ }
14
+ export function info(text) {
15
+ console.log(` ${text}`);
16
+ }
17
+ export function blank() {
18
+ console.log();
19
+ }
20
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,EAAE,CAAC,IAAY;IAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PrereqCheck } from '../types.js';
2
+ export declare function checkNodeVersion(): PrereqCheck;
3
+ export declare function checkNpx(): PrereqCheck;
4
+ export declare function checkAllPrereqs(): PrereqCheck[];
5
+ //# sourceMappingURL=prereqs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prereqs.d.ts","sourceRoot":"","sources":["../../src/utils/prereqs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,gBAAgB,IAAI,WAAW,CAW9C;AAED,wBAAgB,QAAQ,IAAI,WAAW,CAOtC;AAED,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C"}
@@ -0,0 +1,27 @@
1
+ import { execSync } from 'node:child_process';
2
+ export function checkNodeVersion() {
3
+ try {
4
+ const version = process.version;
5
+ const major = parseInt(version.slice(1).split('.')[0], 10);
6
+ if (major >= 20) {
7
+ return { name: 'Node.js', passed: true, version, message: `Node.js ${version} (>= 20 required)` };
8
+ }
9
+ return { name: 'Node.js', passed: false, version, message: `Node.js ${version} found, but >= 20 required` };
10
+ }
11
+ catch {
12
+ return { name: 'Node.js', passed: false, message: 'Node.js not found' };
13
+ }
14
+ }
15
+ export function checkNpx() {
16
+ try {
17
+ const output = execSync('npx --version', { encoding: 'utf-8', timeout: 10000 }).trim();
18
+ return { name: 'npx', passed: true, version: output, message: `npx ${output}` };
19
+ }
20
+ catch {
21
+ return { name: 'npx', passed: false, message: 'npx not found — install Node.js >= 20' };
22
+ }
23
+ }
24
+ export function checkAllPrereqs() {
25
+ return [checkNodeVersion(), checkNpx()];
26
+ }
27
+ //# sourceMappingURL=prereqs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prereqs.js","sourceRoot":"","sources":["../../src/utils/prereqs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,OAAO,mBAAmB,EAAE,CAAC;QACpG,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,OAAO,4BAA4B,EAAE,CAAC;IAC9G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,EAAE,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function hasPantionEntry(toml: string): boolean;
2
+ export declare function isPantionEntryCorrect(toml: string): boolean;
3
+ export declare function mergePantionEntry(toml: string): string;
4
+ export declare function removePantionEntry(toml: string): string;
5
+ //# sourceMappingURL=toml-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toml-merge.d.ts","sourceRoot":"","sources":["../../src/utils/toml-merge.ts"],"names":[],"mappings":"AAwBA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM3D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOvD"}
@@ -0,0 +1,54 @@
1
+ const SECTION_HEADER = '[mcp_servers.pantion]';
2
+ const EXPECTED_COMMAND = 'command = "npx"';
3
+ const EXPECTED_ARGS = 'args = ["@pantion/dialog"]';
4
+ const PANTION_SECTION = `${SECTION_HEADER}
5
+ ${EXPECTED_COMMAND}
6
+ ${EXPECTED_ARGS}`;
7
+ /**
8
+ * Find the start and end index of the [mcp_servers.pantion] section.
9
+ * Returns null if not found.
10
+ */
11
+ function findPantionSection(toml) {
12
+ const headerIndex = toml.indexOf(SECTION_HEADER);
13
+ if (headerIndex === -1)
14
+ return null;
15
+ // Find the end: next section header or end of string
16
+ const afterHeader = headerIndex + SECTION_HEADER.length;
17
+ const nextSection = toml.indexOf('\n[', afterHeader);
18
+ const end = nextSection === -1 ? toml.length : nextSection;
19
+ return { start: headerIndex, end };
20
+ }
21
+ export function hasPantionEntry(toml) {
22
+ return toml.includes(SECTION_HEADER);
23
+ }
24
+ export function isPantionEntryCorrect(toml) {
25
+ const section = findPantionSection(toml);
26
+ if (!section)
27
+ return false;
28
+ const sectionText = toml.slice(section.start, section.end);
29
+ return sectionText.includes(EXPECTED_COMMAND) && sectionText.includes(EXPECTED_ARGS);
30
+ }
31
+ export function mergePantionEntry(toml) {
32
+ const section = findPantionSection(toml);
33
+ if (section) {
34
+ // Replace existing section
35
+ const before = toml.slice(0, section.start);
36
+ const after = toml.slice(section.end);
37
+ return (before + PANTION_SECTION + after).replace(/\n{3,}/g, '\n\n').trim() + '\n';
38
+ }
39
+ // Append new section
40
+ const trimmed = toml.trim();
41
+ if (trimmed.length === 0) {
42
+ return PANTION_SECTION + '\n';
43
+ }
44
+ return trimmed + '\n\n' + PANTION_SECTION + '\n';
45
+ }
46
+ export function removePantionEntry(toml) {
47
+ const section = findPantionSection(toml);
48
+ if (!section)
49
+ return toml;
50
+ const before = toml.slice(0, section.start);
51
+ const after = toml.slice(section.end);
52
+ return (before + after).replace(/\n{3,}/g, '\n\n').trim() + '\n';
53
+ }
54
+ //# sourceMappingURL=toml-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toml-merge.js","sourceRoot":"","sources":["../../src/utils/toml-merge.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAC/C,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAC3C,MAAM,aAAa,GAAG,4BAA4B,CAAC;AAEnD,MAAM,eAAe,GAAG,GAAG,cAAc;EACvC,gBAAgB;EAChB,aAAa,EAAE,CAAC;AAElB;;;GAGG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,WAAW,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,qDAAqD;IACrD,MAAM,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;IAE3D,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAI,OAAO,EAAE,CAAC;QACZ,2BAA2B;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,GAAG,eAAe,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IACrF,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,eAAe,GAAG,IAAI,CAAC;IAChC,CAAC;IACD,OAAO,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;AACnE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@pantion/installer",
3
+ "version": "0.2.0",
4
+ "description": "MCP configuration installer for coding tools — one command to connect Pantion to Claude Code, Cursor, Windsurf, or Gemini CLI",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "pantion-installer": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "test": "vitest run --passWithNoTests"
16
+ },
17
+ "author": "Tom Neijman <tom.neijman@pantion.org>",
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/getpantion/pantion.git",
22
+ "directory": "packages/installer"
23
+ },
24
+ "engines": {
25
+ "node": ">=20.0.0"
26
+ }
27
+ }