@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.
- package/README.md +13 -25
- package/dist/src/cli/constants.d.ts +20 -0
- package/dist/src/cli/constants.d.ts.map +1 -0
- package/dist/src/cli/constants.js +25 -0
- package/dist/src/cli/constants.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +25 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/setup.d.ts +6 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +334 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/types.d.ts +38 -0
- package/dist/src/cli/types.d.ts.map +1 -0
- package/dist/src/cli/types.js +5 -0
- package/dist/src/cli/types.js.map +1 -0
- package/dist/src/cli/utils/config.d.ts +19 -0
- package/dist/src/cli/utils/config.d.ts.map +1 -0
- package/dist/src/cli/utils/config.js +86 -0
- package/dist/src/cli/utils/config.js.map +1 -0
- package/dist/src/cli/utils/detect.d.ts +14 -0
- package/dist/src/cli/utils/detect.d.ts.map +1 -0
- package/dist/src/cli/utils/detect.js +57 -0
- package/dist/src/cli/utils/detect.js.map +1 -0
- package/dist/src/cli/utils/env.d.ts +10 -0
- package/dist/src/cli/utils/env.d.ts.map +1 -0
- package/dist/src/cli/utils/env.js +54 -0
- package/dist/src/cli/utils/env.js.map +1 -0
- package/dist/src/cli/utils/validation.d.ts +17 -0
- package/dist/src/cli/utils/validation.d.ts.map +1 -0
- package/dist/src/cli/utils/validation.js +77 -0
- package/dist/src/cli/utils/validation.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/package.json +11 -4
- package/dist/tests/error-handling.test.d.ts +0 -2
- package/dist/tests/error-handling.test.d.ts.map +0 -1
- package/dist/tests/error-handling.test.js +0 -114
- package/dist/tests/error-handling.test.js.map +0 -1
- package/dist/tests/fixtures.d.ts +0 -87
- package/dist/tests/fixtures.d.ts.map +0 -1
- package/dist/tests/fixtures.js +0 -130
- package/dist/tests/fixtures.js.map +0 -1
- package/dist/tests/integration.test.d.ts +0 -2
- package/dist/tests/integration.test.d.ts.map +0 -1
- package/dist/tests/integration.test.js +0 -115
- package/dist/tests/integration.test.js.map +0 -1
- package/dist/tests/resources.test.d.ts +0 -2
- package/dist/tests/resources.test.d.ts.map +0 -1
- package/dist/tests/resources.test.js +0 -73
- package/dist/tests/resources.test.js.map +0 -1
- package/dist/tests/setup.d.ts +0 -8
- package/dist/tests/setup.d.ts.map +0 -1
- package/dist/tests/setup.js +0 -8
- package/dist/tests/setup.js.map +0 -1
- package/dist/tests/tools.test.d.ts +0 -2
- package/dist/tests/tools.test.d.ts.map +0 -1
- package/dist/tests/tools.test.js +0 -224
- package/dist/tests/tools.test.js.map +0 -1
- 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
|
-
##
|
|
15
|
+
## Quick Start
|
|
16
|
+
|
|
17
|
+
**One command to set up everything:**
|
|
16
18
|
|
|
17
19
|
```bash
|
|
18
|
-
|
|
20
|
+
npx @pcircle/footprint setup
|
|
19
21
|
```
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
The interactive wizard will:
|
|
22
24
|
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|