@dynamicu/chromedebug-mcp 2.5.4 → 2.5.6

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 CHANGED
@@ -17,6 +17,8 @@ npm install -g @dynamicu/chromedebug-mcp
17
17
  npm install @dynamicu/chromedebug-mcp
18
18
  ```
19
19
 
20
+ > **Want unlimited recordings and advanced features?** See [Installing PRO Version](#installing-pro-version) below for automated PRO installation.
21
+
20
22
  ### Development Installation
21
23
 
22
24
  ```bash
@@ -26,6 +28,83 @@ cd ChromeDebug
26
28
  npm install
27
29
  ```
28
30
 
31
+ ## Installing PRO Version
32
+
33
+ ChromeDebug PRO adds advanced features including:
34
+ - **Function call tracking** - Record and replay function execution traces
35
+ - **Advanced debugging** - Enhanced breakpoint and inspection capabilities
36
+ - **Unlimited recordings** - No daily recording limits
37
+ - Priority support and updates
38
+
39
+ ### Installation Steps
40
+
41
+ After purchasing ChromeDebug PRO from [LemonSqueezy](https://chromedebug.com/buy/996773cb-682b-430f-b9e3-9ce2130bd967):
42
+
43
+ 1. **Download your PRO extension** from the purchase confirmation email (you'll receive a ZIP file named `chromedebug-pro-extension.zip`)
44
+ 2. **Run the installer**:
45
+ ```bash
46
+ chromedebug-mcp install-pro \
47
+ --license YOUR_LICENSE_KEY \
48
+ --extension-path ~/Downloads/chromedebug-pro-extension.zip
49
+ ```
50
+ 3. **Restart your terminal** to load the new environment variable
51
+ 4. **Launch Chrome** - PRO features are now active!
52
+
53
+ ### What the Installer Does
54
+
55
+ The `install-pro` command:
56
+ - ✓ Validates your license key format
57
+ - ✓ Extracts the PRO extension to `~/.chromedebug-pro/extension`
58
+ - ✓ Saves your license information securely to `~/.chromedebug-pro/license.json`
59
+ - ✓ Configures your shell environment automatically (exports `CHROMEDEBUG_EXTENSION_PATH`)
60
+ - ✓ Creates an installation log at `~/.chromedebug-pro/install.log` for troubleshooting
61
+
62
+ The environment variable `CHROMEDEBUG_EXTENSION_PATH` is automatically detected by Chrome Controller when launching Chrome, allowing it to load the PRO extension instead of the bundled FREE version.
63
+
64
+ ### Verifying PRO Installation
65
+
66
+ Check that PRO is correctly installed:
67
+
68
+ ```bash
69
+ # Verify environment variable is set
70
+ echo $CHROMEDEBUG_EXTENSION_PATH
71
+ # Should output: /Users/YOUR_USERNAME/.chromedebug-pro/extension
72
+
73
+ # Check license file
74
+ cat ~/.chromedebug-pro/license.json
75
+ ```
76
+
77
+ When you launch Chrome with `chromedebug-mcp`, you should see:
78
+ - "ChromeDebug MCP Assistant PRO" in `chrome://extensions/` (with function tracking features enabled)
79
+
80
+ ### Troubleshooting PRO Installation
81
+
82
+ **Environment variable not set after installation:**
83
+ - Restart your terminal or run: `source ~/.zshrc` (or `~/.bashrc` for Bash users)
84
+ - If still not set, manually add to your shell config:
85
+ ```bash
86
+ export CHROMEDEBUG_EXTENSION_PATH="$HOME/.chromedebug-pro/extension"
87
+ ```
88
+
89
+ **Chrome still loading FREE version:**
90
+ - Verify the environment variable is set: `echo $CHROMEDEBUG_EXTENSION_PATH`
91
+ - Close ALL Chrome windows and restart ChromeDebug MCP
92
+ - Check installation log: `cat ~/.chromedebug-pro/install.log`
93
+
94
+ **License validation errors:**
95
+ - Verify you copied the full license key from your purchase email
96
+ - License format should be: `LICENSEID-HASH` (e.g., `ABC12345-0123456789ABCDEF`)
97
+ - Check for extra spaces or line breaks when copying
98
+
99
+ **Extension ZIP file not found:**
100
+ - Verify the path to your downloaded ZIP file is correct
101
+ - Use `~` for home directory: `~/Downloads/chromedebug-pro-extension.zip`
102
+ - Check file permissions: `ls -la ~/Downloads/chromedebug-pro-extension.zip`
103
+
104
+ **Need help?**
105
+ - Check installation log: `~/.chromedebug-pro/install.log`
106
+ - Open an issue: [GitHub Issues](https://github.com/dynamicupgrade/ChromeDebug/issues)
107
+
29
108
  ## Usage
30
109
 
31
110
  ### As MCP Server
@@ -195,17 +274,19 @@ Install the FREE version directly from the Chrome Web Store:
195
274
  2. Enable "Developer mode"
196
275
  3. Click "Load unpacked" and select the `chrome-extension` directory
197
276
 
198
- #### Option 3: PRO Version (Unlimited)
277
+ #### Option 3: PRO Version (Unlimited) - Automated Installation
199
278
 
200
279
  For unlimited recordings and advanced features, purchase the PRO version:
201
280
 
202
- 💎 **[Get PRO Version](https://dynamicu.lemonsqueezy.com/buy/641143)**
281
+ 💎 **[Get PRO Version](https://chromedebug.com/buy/996773cb-682b-430f-b9e3-9ce2130bd967)**
203
282
 
204
283
  - ✅ Unlimited recordings
205
284
  - ✅ Advanced function tracing
206
285
  - ✅ Enhanced capture features
207
286
  - ✅ Priority support
208
287
 
288
+ **Installation:** PRO extension is automatically installed via the `chromedebug-mcp install-pro` command. See the [Installing PRO Version](#installing-pro-version) section above for detailed instructions.
289
+
209
290
  ### Using the Extension
210
291
 
211
292
  1. **Element Selection**
Binary file
Binary file
Binary file
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "manifest_version": 3,
3
- "name": "ChromeDebug MCP Assistant FREE v2.4.0",
4
- "version": "2.4.0",
5
- "description": "ChromeDebug MCP visual element selector [FREE Edition] [Build: 2025-01-20-v2.4.0]",
3
+ "name": "ChromeDebug MCP Assistant FREE v2.4.1",
4
+ "version": "2.4.1",
5
+ "description": "ChromeDebug MCP visual element selector [FREE Edition] [Build: 2025-01-20-v2.4.1]",
6
6
  "permissions": [
7
7
  "activeTab",
8
8
  "scripting",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamicu/chromedebug-mcp",
3
- "version": "2.5.4",
3
+ "version": "2.5.6",
4
4
  "description": "ChromeDebug MCP - MCP server that provides full control over a Chrome browser instance for debugging and automation with AI assistants like Claude Code",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -55,8 +55,10 @@
55
55
  "run-migration": "node scripts/migrate-dual-ids.js",
56
56
  "test:mcp": "NODE_OPTIONS='--experimental-vm-modules' jest tests/mcp-server.test.js",
57
57
  "tbv:microtest": "cd chrome-extension && npm run tbv:microtest",
58
- "build:free": "webpack --config scripts/webpack.config.free.cjs",
59
- "build:pro": "webpack --config scripts/webpack.config.pro.cjs",
58
+ "validate:free": "node scripts/validate-manifest.js free",
59
+ "validate:pro": "node scripts/validate-manifest.js pro",
60
+ "build:free": "npm run validate:free && webpack --config scripts/webpack.config.free.cjs",
61
+ "build:pro": "npm run validate:pro && webpack --config scripts/webpack.config.pro.cjs",
60
62
  "build:both": "npm run build:free && npm run build:pro",
61
63
  "package-pro": "node scripts/package-pro-extension.js",
62
64
  "package-webstore": "node scripts/package-webstore-extension.js"
@@ -90,7 +92,6 @@
90
92
  "chrome-extension/*.css",
91
93
  "chrome-extension/*.html",
92
94
  "chrome-extension/*.png",
93
- "chrome-extension/manifest.json",
94
95
  "chrome-extension/manifest.free.json",
95
96
  "chrome-extension/README.md",
96
97
  "config/",
@@ -104,6 +105,7 @@
104
105
  ],
105
106
  "dependencies": {
106
107
  "@modelcontextprotocol/sdk": "^1.0.4",
108
+ "adm-zip": "^0.5.16",
107
109
  "bcrypt": "^6.0.0",
108
110
  "better-sqlite3": "^12.2.0",
109
111
  "cors": "^2.8.5",
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Validate Chrome extension manifest file references
5
+ * Ensures all files referenced in manifest actually exist
6
+ *
7
+ * Usage: node scripts/validate-manifest.js <free|pro>
8
+ */
9
+
10
+ import { promises as fs } from 'fs';
11
+ import { join, dirname } from 'path';
12
+ import { fileURLToPath } from 'url';
13
+
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ const rootDir = join(__dirname, '..');
17
+ const extensionDir = join(rootDir, 'chrome-extension');
18
+
19
+ async function validateManifest(tier) {
20
+ if (!['free', 'pro'].includes(tier)) {
21
+ console.error('Usage: node scripts/validate-manifest.js <free|pro>');
22
+ process.exit(1);
23
+ }
24
+
25
+ console.log(`\n🔍 Validating ${tier.toUpperCase()} manifest...`);
26
+
27
+ // Read manifest file
28
+ const manifestPath = join(extensionDir, `manifest.${tier}.json`);
29
+ let manifest;
30
+
31
+ try {
32
+ const manifestContent = await fs.readFile(manifestPath, 'utf8');
33
+ manifest = JSON.parse(manifestContent);
34
+ } catch (error) {
35
+ console.error(`❌ Failed to read ${manifestPath}`);
36
+ console.error(error.message);
37
+ process.exit(1);
38
+ }
39
+
40
+ const missingFiles = [];
41
+ const foundFiles = [];
42
+
43
+ /**
44
+ * Check if a file exists in the extension directory
45
+ */
46
+ async function checkFile(filePath, description) {
47
+ const fullPath = join(extensionDir, filePath);
48
+ try {
49
+ await fs.access(fullPath);
50
+ foundFiles.push(` ✓ ${filePath} (${description})`);
51
+ return true;
52
+ } catch {
53
+ missingFiles.push(` ✗ ${filePath} (${description})`);
54
+ return false;
55
+ }
56
+ }
57
+
58
+ // Validate content_scripts
59
+ if (manifest.content_scripts) {
60
+ for (const [index, script] of manifest.content_scripts.entries()) {
61
+ if (script.js) {
62
+ for (const jsFile of script.js) {
63
+ await checkFile(jsFile, `content script #${index + 1}`);
64
+ }
65
+ }
66
+ if (script.css) {
67
+ for (const cssFile of script.css) {
68
+ await checkFile(cssFile, `content CSS #${index + 1}`);
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ // Validate background service worker
75
+ if (manifest.background?.service_worker) {
76
+ await checkFile(manifest.background.service_worker, 'background service worker');
77
+ }
78
+
79
+ // Validate action popup
80
+ if (manifest.action?.default_popup) {
81
+ await checkFile(manifest.action.default_popup, 'action popup');
82
+ }
83
+
84
+ // Validate action icons
85
+ if (manifest.action?.default_icon) {
86
+ const icons = manifest.action.default_icon;
87
+ for (const [size, iconPath] of Object.entries(icons)) {
88
+ await checkFile(iconPath, `action icon ${size}px`);
89
+ }
90
+ }
91
+
92
+ // Validate manifest icons
93
+ if (manifest.icons) {
94
+ for (const [size, iconPath] of Object.entries(manifest.icons)) {
95
+ await checkFile(iconPath, `manifest icon ${size}px`);
96
+ }
97
+ }
98
+
99
+ // Validate options page
100
+ if (manifest.options_page) {
101
+ await checkFile(manifest.options_page, 'options page');
102
+ }
103
+
104
+ // Validate web_accessible_resources
105
+ if (manifest.web_accessible_resources) {
106
+ for (const resource of manifest.web_accessible_resources) {
107
+ if (resource.resources) {
108
+ for (const resPath of resource.resources) {
109
+ // Skip wildcard patterns
110
+ if (!resPath.includes('*')) {
111
+ await checkFile(resPath, 'web accessible resource');
112
+ }
113
+ }
114
+ }
115
+ }
116
+ }
117
+
118
+ // Report results
119
+ console.log(`\n📊 Validation Results:`);
120
+ console.log(` Files found: ${foundFiles.length}`);
121
+ console.log(` Files missing: ${missingFiles.length}`);
122
+
123
+ if (foundFiles.length > 0) {
124
+ console.log(`\n✅ Found files:`);
125
+ foundFiles.forEach(f => console.log(f));
126
+ }
127
+
128
+ if (missingFiles.length > 0) {
129
+ console.log(`\n❌ Missing files:`);
130
+ missingFiles.forEach(f => console.log(f));
131
+ console.log(`\n❌ Manifest validation FAILED for ${tier.toUpperCase()}`);
132
+ console.log(` Please ensure all referenced files exist in chrome-extension/`);
133
+ process.exit(1);
134
+ }
135
+
136
+ console.log(`\n✅ Manifest validation PASSED for ${tier.toUpperCase()}`);
137
+ console.log(` All ${foundFiles.length} referenced files exist\n`);
138
+ process.exit(0);
139
+ }
140
+
141
+ // Get tier from command line argument
142
+ const tier = process.argv[2];
143
+ validateManifest(tier);
package/src/cli.js CHANGED
@@ -18,11 +18,17 @@ import {
18
18
  findActiveSessions
19
19
  } from './services/unified-session-manager.js';
20
20
  import logger from './utils/logger.js';
21
+ import { installPro } from './commands/install-pro.js';
21
22
 
22
23
  /**
23
24
  * Main CLI entry point
24
25
  */
25
26
  async function main() {
27
+ // Check for install-pro command
28
+ if (process.argv.includes('install-pro')) {
29
+ await installPro(process.argv.slice(2));
30
+ return;
31
+ }
26
32
  const app = new ChromePilotApp();
27
33
 
28
34
  // Parse arguments first to get session settings