@pcircle/footprint 1.2.1 → 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 (63) hide show
  1. package/README.md +13 -25
  2. package/dist/src/cli/constants.d.ts +20 -0
  3. package/dist/src/cli/constants.d.ts.map +1 -0
  4. package/dist/src/cli/constants.js +25 -0
  5. package/dist/src/cli/constants.js.map +1 -0
  6. package/dist/src/cli/index.d.ts +3 -0
  7. package/dist/src/cli/index.d.ts.map +1 -0
  8. package/dist/src/cli/index.js +25 -0
  9. package/dist/src/cli/index.js.map +1 -0
  10. package/dist/src/cli/setup.d.ts +6 -0
  11. package/dist/src/cli/setup.d.ts.map +1 -0
  12. package/dist/src/cli/setup.js +334 -0
  13. package/dist/src/cli/setup.js.map +1 -0
  14. package/dist/src/cli/types.d.ts +38 -0
  15. package/dist/src/cli/types.d.ts.map +1 -0
  16. package/dist/src/cli/types.js +5 -0
  17. package/dist/src/cli/types.js.map +1 -0
  18. package/dist/src/cli/utils/config.d.ts +19 -0
  19. package/dist/src/cli/utils/config.d.ts.map +1 -0
  20. package/dist/src/cli/utils/config.js +86 -0
  21. package/dist/src/cli/utils/config.js.map +1 -0
  22. package/dist/src/cli/utils/detect.d.ts +14 -0
  23. package/dist/src/cli/utils/detect.d.ts.map +1 -0
  24. package/dist/src/cli/utils/detect.js +57 -0
  25. package/dist/src/cli/utils/detect.js.map +1 -0
  26. package/dist/src/cli/utils/env.d.ts +10 -0
  27. package/dist/src/cli/utils/env.d.ts.map +1 -0
  28. package/dist/src/cli/utils/env.js +54 -0
  29. package/dist/src/cli/utils/env.js.map +1 -0
  30. package/dist/src/cli/utils/validation.d.ts +17 -0
  31. package/dist/src/cli/utils/validation.d.ts.map +1 -0
  32. package/dist/src/cli/utils/validation.js +77 -0
  33. package/dist/src/cli/utils/validation.js.map +1 -0
  34. package/dist/src/index.d.ts +1 -0
  35. package/dist/src/index.d.ts.map +1 -1
  36. package/dist/src/index.js +5 -3
  37. package/dist/src/index.js.map +1 -1
  38. package/package.json +11 -4
  39. package/dist/tests/error-handling.test.d.ts +0 -2
  40. package/dist/tests/error-handling.test.d.ts.map +0 -1
  41. package/dist/tests/error-handling.test.js +0 -114
  42. package/dist/tests/error-handling.test.js.map +0 -1
  43. package/dist/tests/fixtures.d.ts +0 -87
  44. package/dist/tests/fixtures.d.ts.map +0 -1
  45. package/dist/tests/fixtures.js +0 -130
  46. package/dist/tests/fixtures.js.map +0 -1
  47. package/dist/tests/integration.test.d.ts +0 -2
  48. package/dist/tests/integration.test.d.ts.map +0 -1
  49. package/dist/tests/integration.test.js +0 -115
  50. package/dist/tests/integration.test.js.map +0 -1
  51. package/dist/tests/resources.test.d.ts +0 -2
  52. package/dist/tests/resources.test.d.ts.map +0 -1
  53. package/dist/tests/resources.test.js +0 -73
  54. package/dist/tests/resources.test.js.map +0 -1
  55. package/dist/tests/setup.d.ts +0 -8
  56. package/dist/tests/setup.d.ts.map +0 -1
  57. package/dist/tests/setup.js +0 -8
  58. package/dist/tests/setup.js.map +0 -1
  59. package/dist/tests/tools.test.d.ts +0 -2
  60. package/dist/tests/tools.test.d.ts.map +0 -1
  61. package/dist/tests/tools.test.js +0 -224
  62. package/dist/tests/tools.test.js.map +0 -1
  63. package/dist/ui-tmp/ui/export.html +0 -409
package/README.md CHANGED
@@ -12,39 +12,27 @@ Model Context Protocol (MCP) server that automatically captures and encrypts LLM
12
12
  - **Privacy First** - End-to-end encrypted, locally stored
13
13
  - **Legally Valid** - Git timestamps + SHA-256 checksums
14
14
 
15
- ## Installation
15
+ ## Quick Start
16
+
17
+ **One command to set up everything:**
16
18
 
17
19
  ```bash
18
- npm install -g @pcircle/footprint
20
+ npx @pcircle/footprint setup
19
21
  ```
20
22
 
21
- ## Quick Start
23
+ The interactive wizard will:
22
24
 
23
- 1. **Set environment variables:**
25
+ - Auto-detect your system (OS, shell, Claude Desktop config)
26
+ - ✅ Validate your encryption password strength
27
+ - ✅ Configure Claude Desktop automatically
28
+ - ✅ Set up environment variables in your shell
29
+ - ✅ Create backup of existing config
24
30
 
25
- ```bash
26
- export FOOTPRINT_DB_PATH="./evidence.db"
27
- export FOOTPRINT_PASSWORD="your-secure-password"
28
- ```
31
+ **That's it!** Restart Claude Desktop and your conversations are being captured.
29
32
 
30
- 2. **Configure Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json`):
31
-
32
- ```json
33
- {
34
- "mcpServers": {
35
- "footprint": {
36
- "command": "npx",
37
- "args": ["footprint"],
38
- "env": {
39
- "FOOTPRINT_DB_PATH": "/path/to/evidence.db",
40
- "FOOTPRINT_PASSWORD": "your-password"
41
- }
42
- }
43
- }
44
- }
45
- ```
33
+ ### Advanced Installation
46
34
 
47
- 3. **Restart Claude Desktop** - Evidence collection starts automatically
35
+ For manual setup or custom configurations, see the [full installation guide](https://github.com/PCIRCLE-AI/footprint-mcp#installation).
48
36
 
49
37
  ## Features
50
38
 
@@ -0,0 +1,20 @@
1
+ export declare const DEFAULT_DATA_DIR: string;
2
+ export declare const CLAUDE_CONFIG_PATHS: {
3
+ darwin: string;
4
+ linux: string;
5
+ win32: string;
6
+ };
7
+ export declare const SHELL_RC_FILES: {
8
+ bash: string;
9
+ zsh: string;
10
+ fish: string;
11
+ };
12
+ export declare const MIN_PASSWORD_SCORE = 2;
13
+ export declare const MIN_PASSWORD_LENGTH = 12;
14
+ export declare const COLORS: {
15
+ success: string;
16
+ error: string;
17
+ warning: string;
18
+ info: string;
19
+ };
20
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,QAAwC,CAAC;AAEtE,eAAO,MAAM,mBAAmB;;;;CAU/B,CAAC;AAEF,eAAO,MAAM,cAAc;;;;CAI1B,CAAC;AAEF,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,eAAO,MAAM,MAAM;;;;;CAKlB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * CLI constants for setup process
3
+ */
4
+ import * as os from "os";
5
+ import * as path from "path";
6
+ export const DEFAULT_DATA_DIR = path.join(os.homedir(), ".footprint");
7
+ export const CLAUDE_CONFIG_PATHS = {
8
+ darwin: path.join(os.homedir(), "Library/Application Support/Claude/claude_desktop_config.json"),
9
+ linux: path.join(os.homedir(), ".config/Claude/claude_desktop_config.json"),
10
+ win32: path.join(os.homedir(), "AppData/Roaming/Claude/claude_desktop_config.json"),
11
+ };
12
+ export const SHELL_RC_FILES = {
13
+ bash: ".bashrc",
14
+ zsh: ".zshrc",
15
+ fish: ".config/fish/config.fish",
16
+ };
17
+ export const MIN_PASSWORD_SCORE = 2; // zxcvbn score (0-4)
18
+ export const MIN_PASSWORD_LENGTH = 12;
19
+ export const COLORS = {
20
+ success: "#00FF00",
21
+ error: "#FF0000",
22
+ warning: "#FFA500",
23
+ info: "#00BFFF",
24
+ };
25
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,IAAI,CAAC,IAAI,CACf,EAAE,CAAC,OAAO,EAAE,EACZ,+DAA+D,CAChE;IACD,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,2CAA2C,CAAC;IAC3E,KAAK,EAAE,IAAI,CAAC,IAAI,CACd,EAAE,CAAC,OAAO,EAAE,EACZ,mDAAmD,CACpD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,0BAA0B;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC,qBAAqB;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;CAChB,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/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ /* global console, process */
3
+ import { runSetup } from "./setup.js";
4
+ const args = process.argv.slice(2);
5
+ const command = args[0];
6
+ async function main() {
7
+ switch (command) {
8
+ case "setup": {
9
+ await runSetup();
10
+ break;
11
+ }
12
+ default: {
13
+ // No command or unknown command - start MCP server
14
+ // Import and run server
15
+ const { main: startServer } = await import("../index.js");
16
+ await startServer();
17
+ break;
18
+ }
19
+ }
20
+ }
21
+ main().catch((error) => {
22
+ console.error("Error:", error);
23
+ process.exit(1);
24
+ });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA,6BAA6B;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QACR,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,mDAAmD;YACnD,wBAAwB;YACxB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Main setup flow with transaction-like rollback on failure
4
+ */
5
+ export declare function runSetup(): Promise<void>;
6
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":";AAuXA;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAyE9C"}
@@ -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":"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"}
@@ -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"}