@pcircle/footprint 1.2.2 → 1.3.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 (96) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +31 -43
  3. package/SKILL.md +45 -45
  4. package/dist/src/cli/constants.d.ts +20 -0
  5. package/dist/src/cli/constants.d.ts.map +1 -0
  6. package/dist/src/cli/constants.js +25 -0
  7. package/dist/src/cli/constants.js.map +1 -0
  8. package/dist/src/cli/index.d.ts +3 -0
  9. package/dist/src/cli/index.d.ts.map +1 -0
  10. package/dist/src/cli/index.js +25 -0
  11. package/dist/src/cli/index.js.map +1 -0
  12. package/dist/src/cli/setup.d.ts +6 -0
  13. package/dist/src/cli/setup.d.ts.map +1 -0
  14. package/dist/src/cli/setup.js +334 -0
  15. package/dist/src/cli/setup.js.map +1 -0
  16. package/dist/src/cli/types.d.ts +38 -0
  17. package/dist/src/cli/types.d.ts.map +1 -0
  18. package/dist/src/cli/types.js +5 -0
  19. package/dist/src/cli/types.js.map +1 -0
  20. package/dist/src/cli/utils/config.d.ts +19 -0
  21. package/dist/src/cli/utils/config.d.ts.map +1 -0
  22. package/dist/src/cli/utils/config.js +86 -0
  23. package/dist/src/cli/utils/config.js.map +1 -0
  24. package/dist/src/cli/utils/detect.d.ts +14 -0
  25. package/dist/src/cli/utils/detect.d.ts.map +1 -0
  26. package/dist/src/cli/utils/detect.js +57 -0
  27. package/dist/src/cli/utils/detect.js.map +1 -0
  28. package/dist/src/cli/utils/env.d.ts +10 -0
  29. package/dist/src/cli/utils/env.d.ts.map +1 -0
  30. package/dist/src/cli/utils/env.js +54 -0
  31. package/dist/src/cli/utils/env.js.map +1 -0
  32. package/dist/src/cli/utils/validation.d.ts +17 -0
  33. package/dist/src/cli/utils/validation.d.ts.map +1 -0
  34. package/dist/src/cli/utils/validation.js +77 -0
  35. package/dist/src/cli/utils/validation.js.map +1 -0
  36. package/dist/src/index.d.ts +1 -0
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/index.js +13 -11
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/lib/storage/export.d.ts +2 -2
  41. package/dist/src/lib/storage/export.d.ts.map +1 -1
  42. package/dist/src/lib/storage/export.js +39 -39
  43. package/dist/src/lib/storage/export.js.map +1 -1
  44. package/dist/src/tools/capture-footprint.js +1 -1
  45. package/dist/src/tools/capture-footprint.js.map +1 -1
  46. package/dist/src/tools/delete-footprints.d.ts +2 -2
  47. package/dist/src/tools/delete-footprints.d.ts.map +1 -1
  48. package/dist/src/tools/delete-footprints.js +4 -4
  49. package/dist/src/tools/delete-footprints.js.map +1 -1
  50. package/dist/src/tools/export-footprints.d.ts +4 -4
  51. package/dist/src/tools/export-footprints.d.ts.map +1 -1
  52. package/dist/src/tools/export-footprints.js +6 -6
  53. package/dist/src/tools/export-footprints.js.map +1 -1
  54. package/dist/src/tools/get-footprint.js +19 -19
  55. package/dist/src/tools/get-footprint.js.map +1 -1
  56. package/dist/src/tools/list-footprints.d.ts +2 -2
  57. package/dist/src/tools/list-footprints.js +11 -11
  58. package/dist/src/tools/list-footprints.js.map +1 -1
  59. package/dist/src/tools/search-footprints.d.ts +2 -2
  60. package/dist/src/tools/search-footprints.js +11 -11
  61. package/dist/src/tools/search-footprints.js.map +1 -1
  62. package/dist/src/tools/suggest-capture.js +1 -1
  63. package/dist/src/tools/suggest-capture.js.map +1 -1
  64. package/dist/src/tools/verify-footprint.js +11 -11
  65. package/dist/src/tools/verify-footprint.js.map +1 -1
  66. package/dist/src/ui/register.js +2 -2
  67. package/dist/src/ui/register.js.map +1 -1
  68. package/dist/ui/dashboard.html +49 -49
  69. package/dist/ui/detail.html +9 -9
  70. package/dist/ui/export.html +17 -17
  71. package/package.json +13 -6
  72. package/dist/tests/error-handling.test.d.ts +0 -2
  73. package/dist/tests/error-handling.test.d.ts.map +0 -1
  74. package/dist/tests/error-handling.test.js +0 -114
  75. package/dist/tests/error-handling.test.js.map +0 -1
  76. package/dist/tests/fixtures.d.ts +0 -87
  77. package/dist/tests/fixtures.d.ts.map +0 -1
  78. package/dist/tests/fixtures.js +0 -130
  79. package/dist/tests/fixtures.js.map +0 -1
  80. package/dist/tests/integration.test.d.ts +0 -2
  81. package/dist/tests/integration.test.d.ts.map +0 -1
  82. package/dist/tests/integration.test.js +0 -115
  83. package/dist/tests/integration.test.js.map +0 -1
  84. package/dist/tests/resources.test.d.ts +0 -2
  85. package/dist/tests/resources.test.d.ts.map +0 -1
  86. package/dist/tests/resources.test.js +0 -73
  87. package/dist/tests/resources.test.js.map +0 -1
  88. package/dist/tests/setup.d.ts +0 -8
  89. package/dist/tests/setup.d.ts.map +0 -1
  90. package/dist/tests/setup.js +0 -8
  91. package/dist/tests/setup.js.map +0 -1
  92. package/dist/tests/tools.test.d.ts +0 -2
  93. package/dist/tests/tools.test.d.ts.map +0 -1
  94. package/dist/tests/tools.test.js +0 -224
  95. package/dist/tests/tools.test.js.map +0 -1
  96. package/dist/ui-tmp/ui/export.html +0 -409
@@ -0,0 +1,334 @@
1
+ #!/usr/bin/env node
2
+ /* global console, process, Buffer, NodeJS */
3
+ import prompts from "prompts";
4
+ import chalk from "chalk";
5
+ import ora from "ora";
6
+ import { timingSafeEqual } from "crypto";
7
+ import * as path from "path";
8
+ import { detectSystem } from "./utils/detect.js";
9
+ import { validatePassword, validatePath } from "./utils/validation.js";
10
+ import { readClaudeConfig, writeClaudeConfig, backupConfig, addFootprintToConfig, } from "./utils/config.js";
11
+ import { generateEnvExport, appendToShellRc } from "./utils/env.js";
12
+ import { DEFAULT_DATA_DIR } from "./constants.js";
13
+ import * as fs from "fs";
14
+ /**
15
+ * Extract error message from unknown error type
16
+ */
17
+ function getErrorMessage(error) {
18
+ return error instanceof Error ? error.message : String(error);
19
+ }
20
+ /**
21
+ * Timing-safe string comparison to prevent timing attacks
22
+ */
23
+ function safeCompare(a, b) {
24
+ if (a.length !== b.length)
25
+ return false;
26
+ // Convert strings to buffers for timing-safe comparison
27
+ const bufA = Buffer.from(a, "utf-8");
28
+ const bufB = Buffer.from(b, "utf-8");
29
+ return timingSafeEqual(bufA, bufB);
30
+ }
31
+ /**
32
+ * Welcome message
33
+ */
34
+ function printWelcome() {
35
+ console.log(chalk.bold.cyan("\n🦶 Welcome to Footprint Setup!\n"));
36
+ console.log("Let's configure your AI audit trail in 3 simple steps.\n");
37
+ }
38
+ /**
39
+ * Print system info
40
+ */
41
+ function printSystemInfo(system) {
42
+ console.log(chalk.gray("Detected System:"));
43
+ console.log(chalk.gray(` OS: ${system.platform}`));
44
+ console.log(chalk.gray(` Shell: ${system.shell}`));
45
+ if (system.claudeConfigPath) {
46
+ console.log(chalk.green(` ✅ Claude Desktop found at: ${system.claudeConfigPath}`));
47
+ }
48
+ else {
49
+ console.log(chalk.yellow(` ⚠️ Claude Desktop config not found`));
50
+ }
51
+ console.log("");
52
+ }
53
+ /**
54
+ * Prompt for setup configuration
55
+ */
56
+ async function promptSetup(system) {
57
+ const response = await prompts([
58
+ {
59
+ type: "text",
60
+ name: "dataDir",
61
+ message: "Where should we store your data?",
62
+ initial: DEFAULT_DATA_DIR,
63
+ validate: (value) => {
64
+ const result = validatePath(value);
65
+ return result.valid ? true : result.message;
66
+ },
67
+ },
68
+ {
69
+ type: "password",
70
+ name: "passphrase",
71
+ message: "Create a secure passphrase (min 12 characters):",
72
+ validate: (value) => {
73
+ const result = validatePassword(value);
74
+ return result.valid ? true : result.message;
75
+ },
76
+ },
77
+ {
78
+ type: "password",
79
+ name: "confirmPassphrase",
80
+ message: "Confirm your passphrase:",
81
+ validate: (value, previous) => {
82
+ // Use timing-safe comparison to prevent timing attacks
83
+ return safeCompare(value, previous.passphrase)
84
+ ? true
85
+ : "Passphrases do not match";
86
+ },
87
+ },
88
+ {
89
+ type: system.claudeConfigPath ? "confirm" : null,
90
+ name: "autoConfig",
91
+ message: "Auto-configure Claude Desktop?",
92
+ initial: true,
93
+ },
94
+ ]);
95
+ if (!response.passphrase) {
96
+ return null; // User cancelled
97
+ }
98
+ return {
99
+ dataDir: response.dataDir,
100
+ passphrase: response.passphrase,
101
+ autoConfig: response.autoConfig ?? false,
102
+ };
103
+ }
104
+ /**
105
+ * Print security warning about password storage
106
+ */
107
+ function printSecurityWarning() {
108
+ console.log(chalk.bold.yellow("\n⚠️ Security Notice:\n"));
109
+ console.log(chalk.yellow("Your passphrase will be stored in configuration files on this system."));
110
+ console.log(chalk.yellow("We set restrictive permissions (600/700), but anyone with system access"));
111
+ console.log(chalk.yellow("or file system backups may be able to access it.\n"));
112
+ console.log(chalk.gray("Recommendations:"));
113
+ console.log(chalk.gray(" • Use a unique passphrase (not reused elsewhere)"));
114
+ console.log(chalk.gray(" • Ensure only you have access to this user account"));
115
+ console.log(chalk.gray(" • Encrypt your backups if they contain config files\n"));
116
+ }
117
+ /**
118
+ * Configure Claude Desktop with improved error handling
119
+ */
120
+ async function configureClaudeDesktop(configPath, config) {
121
+ const spinner = ora("Configuring Claude Desktop...").start();
122
+ try {
123
+ // Backup existing config
124
+ if (fs.existsSync(configPath)) {
125
+ const backupPath = backupConfig(configPath);
126
+ spinner.info(chalk.gray(`Backed up existing config to: ${backupPath}`));
127
+ }
128
+ // Read and update config
129
+ const claudeConfig = readClaudeConfig(configPath);
130
+ const updatedConfig = addFootprintToConfig(claudeConfig, config.dataDir, config.passphrase);
131
+ writeClaudeConfig(configPath, updatedConfig);
132
+ spinner.succeed(chalk.green("Claude Desktop configured!"));
133
+ }
134
+ catch (error) {
135
+ spinner.fail(chalk.red(`Failed to configure Claude Desktop: ${getErrorMessage(error)}`));
136
+ throw error;
137
+ }
138
+ }
139
+ /**
140
+ * Setup environment variables with improved error handling
141
+ */
142
+ async function setupEnvironment(system, config) {
143
+ if (!system.shellRcPath) {
144
+ console.log(chalk.yellow("\n⚠️ Shell RC file not found. Manual setup required:"));
145
+ console.log(chalk.gray(generateEnvExport(system.shell, config.dataDir, config.passphrase)));
146
+ return;
147
+ }
148
+ const { setupEnv } = await prompts({
149
+ type: "confirm",
150
+ name: "setupEnv",
151
+ message: `Add environment variables to ${system.shellRcPath}?`,
152
+ initial: true,
153
+ });
154
+ if (!setupEnv)
155
+ return;
156
+ const spinner = ora("Setting up environment variables...").start();
157
+ try {
158
+ const envExport = generateEnvExport(system.shell, config.dataDir, config.passphrase);
159
+ appendToShellRc(system.shellRcPath, envExport);
160
+ spinner.succeed(chalk.green("Environment variables configured!"));
161
+ }
162
+ catch (error) {
163
+ spinner.fail(chalk.red(`Failed to setup environment: ${getErrorMessage(error)}`));
164
+ throw error; // Propagate error for rollback
165
+ }
166
+ }
167
+ /**
168
+ * Create data directory with secure permissions (0o700)
169
+ */
170
+ async function createDataDirectory(dataDir) {
171
+ const spinner = ora("Creating data directory...").start();
172
+ const normalized = validatePath(dataDir).normalizedPath;
173
+ try {
174
+ fs.mkdirSync(normalized, { recursive: true, mode: 0o700 });
175
+ spinner.succeed(chalk.green(`Data directory created: ${normalized}`));
176
+ }
177
+ catch (error) {
178
+ const nodeError = error;
179
+ if (nodeError.code === "EEXIST") {
180
+ spinner.info(chalk.gray(`Data directory already exists: ${normalized}`));
181
+ // Ensure secure permissions on existing directory
182
+ try {
183
+ fs.chmodSync(normalized, 0o700);
184
+ }
185
+ catch (chmodError) {
186
+ spinner.warn(chalk.yellow(`Could not set permissions: ${getErrorMessage(chmodError)}`));
187
+ }
188
+ return;
189
+ }
190
+ spinner.fail(chalk.red(`Failed to create directory: ${getErrorMessage(error)}`));
191
+ throw error;
192
+ }
193
+ }
194
+ /**
195
+ * Print manual configuration instructions when Claude Desktop not found
196
+ */
197
+ function printManualConfigInstructions(config) {
198
+ console.log(chalk.yellow("\n⚠️ Claude Desktop not found. Manual configuration required."));
199
+ console.log(chalk.gray("Add to claude_desktop_config.json:"));
200
+ console.log(chalk.gray(JSON.stringify({
201
+ mcpServers: {
202
+ footprint: {
203
+ command: "npx",
204
+ args: ["@pcircle/footprint"],
205
+ env: {
206
+ FOOTPRINT_DATA_DIR: config.dataDir,
207
+ FOOTPRINT_PASSPHRASE: config.passphrase,
208
+ },
209
+ },
210
+ },
211
+ }, null, 2)));
212
+ }
213
+ /**
214
+ * Print next steps
215
+ */
216
+ function printNextSteps(_config) {
217
+ console.log(chalk.bold.green("\n🎉 Setup Complete!\n"));
218
+ console.log(chalk.bold("Next steps:"));
219
+ console.log(chalk.gray(" 1. Close Claude Desktop completely"));
220
+ console.log(chalk.gray(" 2. Reopen Claude Desktop"));
221
+ console.log(chalk.gray(' 3. Say "capture this conversation" to test\n'));
222
+ console.log(chalk.yellow("⚠️ Important: Keep your passphrase safe!"));
223
+ console.log(chalk.gray(" Loss means permanent data loss.\n"));
224
+ }
225
+ /**
226
+ * Create rollback action for directory removal
227
+ */
228
+ function createDirectoryRollback(dirPath) {
229
+ return () => {
230
+ try {
231
+ if (fs.existsSync(dirPath)) {
232
+ fs.rmSync(dirPath, { recursive: true });
233
+ console.log(chalk.gray(` Rolled back: Removed ${dirPath}`));
234
+ }
235
+ }
236
+ catch (error) {
237
+ console.warn(chalk.yellow(` Warning: Failed to remove ${dirPath}: ${getErrorMessage(error)}`));
238
+ }
239
+ };
240
+ }
241
+ /**
242
+ * Create rollback action for config restoration
243
+ */
244
+ function createConfigRollback(backupPath, configPath) {
245
+ return () => {
246
+ try {
247
+ if (fs.existsSync(backupPath)) {
248
+ fs.copyFileSync(backupPath, configPath);
249
+ console.log(chalk.gray(` Rolled back: Restored config from backup`));
250
+ }
251
+ }
252
+ catch (error) {
253
+ console.warn(chalk.yellow(` Warning: Failed to restore config: ${getErrorMessage(error)}`));
254
+ }
255
+ };
256
+ }
257
+ /**
258
+ * Find the most recent backup file for a config
259
+ */
260
+ function findLatestBackup(configPath) {
261
+ const dir = path.dirname(configPath);
262
+ const basename = path.basename(configPath);
263
+ const backupFiles = fs
264
+ .readdirSync(dir)
265
+ .filter((f) => f.startsWith(`${basename}.backup`));
266
+ if (backupFiles.length === 0)
267
+ return null;
268
+ return path.join(dir, backupFiles[backupFiles.length - 1]);
269
+ }
270
+ /**
271
+ * Main setup flow with transaction-like rollback on failure
272
+ */
273
+ export async function runSetup() {
274
+ // Track all changes for potential rollback
275
+ const rollbackActions = [];
276
+ try {
277
+ printWelcome();
278
+ const system = detectSystem();
279
+ printSystemInfo(system);
280
+ const config = await promptSetup(system);
281
+ if (!config) {
282
+ console.log(chalk.yellow("\nSetup cancelled."));
283
+ process.exit(0);
284
+ }
285
+ // Print security warning about password storage
286
+ printSecurityWarning();
287
+ // Create data directory (tracked for rollback)
288
+ const normalized = validatePath(config.dataDir).normalizedPath;
289
+ const directoryCreated = !fs.existsSync(normalized);
290
+ await createDataDirectory(config.dataDir);
291
+ if (directoryCreated) {
292
+ rollbackActions.push(createDirectoryRollback(normalized));
293
+ }
294
+ // Configure Claude Desktop if requested (tracked for rollback)
295
+ if (config.autoConfig && system.claudeConfigPath) {
296
+ await configureClaudeDesktop(system.claudeConfigPath, config);
297
+ // Track config backup for rollback
298
+ const backupPath = findLatestBackup(system.claudeConfigPath);
299
+ if (backupPath) {
300
+ rollbackActions.push(createConfigRollback(backupPath, system.claudeConfigPath));
301
+ }
302
+ }
303
+ else if (!system.claudeConfigPath) {
304
+ printManualConfigInstructions(config);
305
+ }
306
+ // Setup environment variables (tracked for rollback)
307
+ await setupEnvironment(system, config);
308
+ // If we get here, setup succeeded - discard rollback actions
309
+ rollbackActions.length = 0;
310
+ printNextSteps(config);
311
+ }
312
+ catch (error) {
313
+ console.error(chalk.red(`\n❌ Setup failed: ${getErrorMessage(error)}`));
314
+ // Perform rollback if any changes were made
315
+ if (rollbackActions.length > 0) {
316
+ console.log(chalk.yellow("\n🔄 Rolling back changes...\n"));
317
+ // Execute rollback actions in reverse order
318
+ for (const action of rollbackActions.reverse()) {
319
+ await action();
320
+ }
321
+ console.log(chalk.green("\n✅ Rollback complete. No changes were made.\n"));
322
+ }
323
+ console.log(chalk.gray("\nTroubleshooting:"));
324
+ console.log(chalk.gray(" • Check file permissions"));
325
+ console.log(chalk.gray(" • Ensure Claude Desktop is not running"));
326
+ console.log(chalk.gray(" • Verify disk space is available\n"));
327
+ process.exit(1);
328
+ }
329
+ }
330
+ // Run if executed directly
331
+ if (import.meta.url === `file://${process.argv[1]}`) {
332
+ runSetup();
333
+ }
334
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":";AACA,6CAA6C;AAE7C,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;GAEG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,wDAAwD;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAS,YAAY;IACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAuC;IAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEpD,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CACvE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CACxB,MAAuC;IAEvC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,kCAAkC;YAC3C,OAAO,EAAE,gBAAgB;YACzB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBACnC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAQ,CAAC;YAC/C,CAAC;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,iDAAiD;YAC1D,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACvC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAQ,CAAC;YAC/C,CAAC;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,0BAA0B;YACnC,QAAQ,EAAE,CAAC,KAAa,EAAE,QAAgC,EAAE,EAAE;gBAC5D,uDAAuD;gBACvD,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;oBAC5C,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,0BAA0B,CAAC;YACjC,CAAC;SACF;QACD;YACE,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YAChD,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,gCAAgC;YACzC,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,CAAC,iBAAiB;IAChC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,KAAK;KACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,uEAAuE,CACxE,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,yEAAyE,CAC1E,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CACnE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CACnE,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CACtE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,UAAkB,EAClB,MAAmB;IAEnB,MAAM,OAAO,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7D,IAAI,CAAC;QACH,yBAAyB;QACzB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,yBAAyB;QACzB,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,oBAAoB,CACxC,YAAY,EACZ,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,UAAU,CAClB,CAAC;QAEF,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC7C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,GAAG,CACP,uCAAuC,eAAe,CAAC,KAAK,CAAC,EAAE,CAChE,CACF,CAAC;QACF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,MAAuC,EACvC,MAAmB;IAEnB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,uDAAuD,CAAC,CACtE,CAAC;QACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CACnE,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC;QACjC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,gCAAgC,MAAM,CAAC,WAAW,GAAG;QAC9D,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,MAAM,OAAO,GAAG,GAAG,CAAC,qCAAqC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,iBAAiB,CACjC,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,UAAU,CAClB,CAAC;QACF,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC/C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,GAAG,CAAC,gCAAgC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CACpE,CAAC;QACF,MAAM,KAAK,CAAC,CAAC,+BAA+B;IAC9C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAAe;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,cAAe,CAAC;IAEzD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,KAA8B,CAAC;QAEjD,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC,CAAC;YACzE,kDAAkD;YAClD,IAAI,CAAC;gBACH,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,UAAmB,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,8BAA8B,eAAe,CAAC,UAAU,CAAC,EAAE,CAC5D,CACF,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,GAAG,CAAC,+BAA+B,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CACnE,CAAC;QACF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,6BAA6B,CAAC,MAAmB;IACxD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,gEAAgE,CACjE,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,SAAS,CACZ;QACE,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,oBAAoB,CAAC;gBAC5B,GAAG,EAAE;oBACH,kBAAkB,EAAE,MAAM,CAAC,OAAO;oBAClC,oBAAoB,EAAE,MAAM,CAAC,UAAU;iBACxC;aACF;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CACF,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAoB;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;AACjE,CAAC;AAOD;;GAEG;AACH,SAAS,uBAAuB,CAAC,OAAe;IAC9C,OAAO,GAAG,EAAE;QACV,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,+BAA+B,OAAO,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CACpE,CACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,UAAkB,EAClB,UAAkB;IAElB,OAAO,GAAG,EAAE;QACV,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,wCAAwC,eAAe,CAAC,KAAK,CAAC,EAAE,CACjE,CACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,EAAE;SACnB,WAAW,CAAC,GAAG,CAAC;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC,CAAC;IACrD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,2CAA2C;IAC3C,MAAM,eAAe,GAAqB,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,YAAY,EAAE,CAAC;QAEf,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,eAAe,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,gDAAgD;QAChD,oBAAoB,EAAE,CAAC;QAEvB,+CAA+C;QAC/C,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAe,CAAC;QAChE,MAAM,gBAAgB,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,gBAAgB,EAAE,CAAC;YACrB,eAAe,CAAC,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,+DAA+D;QAC/D,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACjD,MAAM,sBAAsB,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YAE9D,mCAAmC;YACnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC7D,IAAI,UAAU,EAAE,CAAC;gBACf,eAAe,CAAC,IAAI,CAClB,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACpC,6BAA6B,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,qDAAqD;QACrD,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEvC,6DAA6D;QAC7D,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAE3B,cAAc,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAExE,4CAA4C;QAC5C,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC5D,4CAA4C;YAC5C,KAAK,MAAM,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC/C,MAAM,MAAM,EAAE,CAAC;YACjB,CAAC;YACD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAC9D,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAEhE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,QAAQ,EAAE,CAAC;AACb,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * CLI types for interactive setup
3
+ */
4
+ export interface SetupConfig {
5
+ /** Directory to store Footprint data */
6
+ dataDir: string;
7
+ /** Encryption passphrase */
8
+ passphrase: string;
9
+ /** Auto-configure Claude Desktop */
10
+ autoConfig: boolean;
11
+ /** Skip backup of existing config */
12
+ skipBackup?: boolean;
13
+ }
14
+ export interface SystemInfo {
15
+ /** Operating system platform */
16
+ platform: "darwin" | "linux" | "win32";
17
+ /** Default shell */
18
+ shell: "bash" | "zsh" | "fish" | "powershell";
19
+ /** Path to Claude Desktop config */
20
+ claudeConfigPath: string | null;
21
+ /** User home directory */
22
+ homeDir: string;
23
+ /** Shell RC file path */
24
+ shellRcPath: string | null;
25
+ }
26
+ export interface ClaudeConfig {
27
+ mcpServers?: Record<string, {
28
+ command: string;
29
+ args: string[];
30
+ env?: Record<string, string>;
31
+ }>;
32
+ }
33
+ export interface ValidationResult {
34
+ valid: boolean;
35
+ message?: string;
36
+ score?: number;
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACvC,oBAAoB;IACpB,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,CAAC;IAC9C,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CACjB,MAAM,EACN;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC9B,CACF,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CLI types for interactive setup
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,19 @@
1
+ import type { ClaudeConfig } from "../types.js";
2
+ /**
3
+ * Read Claude Desktop config file
4
+ */
5
+ export declare function readClaudeConfig(configPath: string): ClaudeConfig;
6
+ /**
7
+ * Write Claude Desktop config file with secure permissions (0o600)
8
+ * CRITICAL: Config contains passphrase, must be owner-only readable
9
+ */
10
+ export declare function writeClaudeConfig(configPath: string, config: ClaudeConfig): void;
11
+ /**
12
+ * Backup existing config file with secure permissions (0o600)
13
+ */
14
+ export declare function backupConfig(configPath: string): string;
15
+ /**
16
+ * Add Footprint to Claude config
17
+ */
18
+ export declare function addFootprintToConfig(config: ClaudeConfig, dataDir: string, passphrase: string): ClaudeConfig;
19
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0BhD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAcjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,GACnB,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAYvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,YAAY,CAed"}
@@ -0,0 +1,86 @@
1
+ /* global console, NodeJS */
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ /** Secure file permissions: owner read/write only */
5
+ const SECURE_FILE_MODE = 0o600;
6
+ /** Secure directory permissions: owner read/write/execute only */
7
+ const SECURE_DIR_MODE = 0o700;
8
+ /**
9
+ * Safely set file permissions with warning on failure
10
+ */
11
+ function setSecurePermissions(filePath, showManualHint = false) {
12
+ try {
13
+ fs.chmodSync(filePath, SECURE_FILE_MODE);
14
+ }
15
+ catch (error) {
16
+ const message = error instanceof Error ? error.message : String(error);
17
+ console.warn(`Warning: Could not set secure permissions on ${filePath}: ${message}`);
18
+ if (showManualHint) {
19
+ console.warn(" Please manually restrict access to this file (chmod 600 on Unix).");
20
+ }
21
+ }
22
+ }
23
+ /**
24
+ * Read Claude Desktop config file
25
+ */
26
+ export function readClaudeConfig(configPath) {
27
+ try {
28
+ if (!fs.existsSync(configPath)) {
29
+ return {};
30
+ }
31
+ return JSON.parse(fs.readFileSync(configPath, "utf-8"));
32
+ }
33
+ catch (error) {
34
+ const nodeError = error;
35
+ if (nodeError.code === "ENOENT") {
36
+ return {};
37
+ }
38
+ const message = error instanceof Error ? error.message : String(error);
39
+ throw new Error(`Failed to read config at ${configPath}: ${message}`);
40
+ }
41
+ }
42
+ /**
43
+ * Write Claude Desktop config file with secure permissions (0o600)
44
+ * CRITICAL: Config contains passphrase, must be owner-only readable
45
+ */
46
+ export function writeClaudeConfig(configPath, config) {
47
+ const dir = path.dirname(configPath);
48
+ if (!fs.existsSync(dir)) {
49
+ fs.mkdirSync(dir, { recursive: true, mode: SECURE_DIR_MODE });
50
+ }
51
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
52
+ setSecurePermissions(configPath, true);
53
+ }
54
+ /**
55
+ * Backup existing config file with secure permissions (0o600)
56
+ */
57
+ export function backupConfig(configPath) {
58
+ if (!fs.existsSync(configPath)) {
59
+ throw new Error("Config file does not exist");
60
+ }
61
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
62
+ const backupPath = `${configPath}.backup-${timestamp}`;
63
+ fs.copyFileSync(configPath, backupPath);
64
+ setSecurePermissions(backupPath);
65
+ return backupPath;
66
+ }
67
+ /**
68
+ * Add Footprint to Claude config
69
+ */
70
+ export function addFootprintToConfig(config, dataDir, passphrase) {
71
+ return {
72
+ ...config,
73
+ mcpServers: {
74
+ ...config.mcpServers,
75
+ footprint: {
76
+ command: "npx",
77
+ args: ["@pcircle/footprint"],
78
+ env: {
79
+ FOOTPRINT_DATA_DIR: dataDir,
80
+ FOOTPRINT_PASSPHRASE: passphrase,
81
+ },
82
+ },
83
+ },
84
+ };
85
+ }
86
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/cli/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SystemInfo } from '../types.js';
2
+ /**
3
+ * Detect current operating system and environment
4
+ */
5
+ export declare function detectSystem(): SystemInfo;
6
+ /**
7
+ * Detect user's default shell
8
+ */
9
+ export declare function detectShell(): SystemInfo['shell'];
10
+ /**
11
+ * Find Claude Desktop config file path
12
+ */
13
+ export declare function findClaudeConfig(): string | null;
14
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/detect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,CAczC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,UAAU,CAAC,OAAO,CAAC,CASjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAOhD"}
@@ -0,0 +1,57 @@
1
+ import * as os from 'os';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { CLAUDE_CONFIG_PATHS, SHELL_RC_FILES } from '../constants.js';
5
+ /**
6
+ * Detect current operating system and environment
7
+ */
8
+ export function detectSystem() {
9
+ const platform = os.platform();
10
+ const shell = detectShell();
11
+ const homeDir = os.homedir();
12
+ const claudeConfigPath = findClaudeConfig();
13
+ const shellRcPath = findShellRcPath(shell, homeDir);
14
+ return {
15
+ platform,
16
+ shell,
17
+ claudeConfigPath,
18
+ homeDir,
19
+ shellRcPath,
20
+ };
21
+ }
22
+ /**
23
+ * Detect user's default shell
24
+ */
25
+ export function detectShell() {
26
+ const shellEnv = process.env.SHELL || '';
27
+ if (shellEnv.includes('zsh'))
28
+ return 'zsh';
29
+ if (shellEnv.includes('bash'))
30
+ return 'bash';
31
+ if (shellEnv.includes('fish'))
32
+ return 'fish';
33
+ if (process.platform === 'win32')
34
+ return 'powershell';
35
+ return 'bash'; // Default fallback
36
+ }
37
+ /**
38
+ * Find Claude Desktop config file path
39
+ */
40
+ export function findClaudeConfig() {
41
+ const platform = os.platform();
42
+ const configPath = CLAUDE_CONFIG_PATHS[platform];
43
+ if (!configPath)
44
+ return null;
45
+ return fs.existsSync(configPath) ? configPath : null;
46
+ }
47
+ /**
48
+ * Find shell RC file path
49
+ */
50
+ function findShellRcPath(shell, homeDir) {
51
+ const rcFile = SHELL_RC_FILES[shell];
52
+ if (!rcFile)
53
+ return null;
54
+ const rcPath = path.join(homeDir, rcFile);
55
+ return fs.existsSync(rcPath) ? rcPath : null;
56
+ }
57
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../../src/cli/utils/detect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAA4B,CAAC;IACzD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,gBAAgB,GAAG,gBAAgB,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO;QACL,QAAQ;QACR,KAAK;QACL,gBAAgB;QAChB,OAAO;QACP,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAEzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,YAAY,CAAC;IAEtD,OAAO,MAAM,CAAC,CAAC,mBAAmB;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAsC,CAAC;IACnE,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa,EAAE,OAAe;IACrD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAoC,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Generate environment variable export statement with proper escaping
3
+ * Note: _shell parameter reserved for future shell-specific syntax (e.g., fish)
4
+ */
5
+ export declare function generateEnvExport(_shell: string, dataDir: string, passphrase: string): string;
6
+ /**
7
+ * Append environment variables to shell RC file with secure permissions (0o600)
8
+ */
9
+ export declare function appendToShellRc(rcPath: string, content: string): void;
10
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/env.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM,CAQR;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA8BrE"}