@dynamicu/chromedebug-mcp 2.6.4 → 2.6.7
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/CLAUDE.md +25 -0
- package/chrome-extension/activation-manager.js +18 -4
- package/chrome-extension/background.js +439 -53
- package/chrome-extension/browser-recording-manager.js +256 -0
- package/chrome-extension/content.js +167 -97
- package/chrome-extension/data-buffer.js +206 -17
- package/chrome-extension/frame-capture.js +52 -15
- package/chrome-extension/manifest.free.json +3 -4
- package/chrome-extension/popup.html +109 -5
- package/chrome-extension/popup.js +597 -159
- package/config/chromedebug-config.json +101 -0
- package/dist/chromedebug-extension-free.zip +0 -0
- package/package.json +1 -1
- package/scripts/package-pro-extension.js +1 -1
- package/scripts/webpack.config.free.cjs +4 -1
- package/scripts/webpack.config.pro.cjs +4 -1
- package/src/chrome-controller.js +7 -7
- package/src/cli.js +6 -0
- package/src/database.js +6 -2
- package/src/http-server.js +3 -2
- package/src/index.js +6 -1
- package/src/services/unified-session-manager.js +22 -2
- package/src/validation/schemas.js +36 -6
package/CLAUDE.md
CHANGED
|
@@ -23,6 +23,9 @@ npm run server # Run standalone server
|
|
|
23
23
|
npm run single-server # Run with --single-server flag
|
|
24
24
|
npm run cleanup # Clean up stale Chrome processes
|
|
25
25
|
npm run cleanup-force # Force cleanup of all Chrome processes
|
|
26
|
+
|
|
27
|
+
# Persistent server (won't be killed by other instances)
|
|
28
|
+
chromedebug-mcp --persistent # Start a persistent server for manual debugging
|
|
26
29
|
```
|
|
27
30
|
|
|
28
31
|
### Testing
|
|
@@ -235,8 +238,30 @@ Chrome Debug provides a CLI tool that can be used directly:
|
|
|
235
238
|
```bash
|
|
236
239
|
chromedebug-mcp # Runs the MCP server (equivalent to npm start)
|
|
237
240
|
npx chromedebug-mcp # Run without global installation
|
|
241
|
+
|
|
242
|
+
# Persistent server mode
|
|
243
|
+
chromedebug-mcp --persistent # Won't be killed by other instances
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Persistent Server Mode
|
|
247
|
+
|
|
248
|
+
The `--persistent` flag marks a server as persistent, preventing it from being killed when other ChromeDebug instances start. This is useful for:
|
|
249
|
+
|
|
250
|
+
- **Manual debugging servers**: Keep a debug server running while using Claude Code
|
|
251
|
+
- **Multiple projects**: Run persistent servers for different projects simultaneously
|
|
252
|
+
- **Development workflows**: Maintain a stable server instance across multiple Claude Code sessions
|
|
253
|
+
|
|
254
|
+
Example:
|
|
255
|
+
```bash
|
|
256
|
+
# Terminal 1: Start persistent debug server
|
|
257
|
+
chromedebug-mcp --persistent --verbose
|
|
258
|
+
|
|
259
|
+
# Terminal 2: Use Claude Code normally
|
|
260
|
+
# Claude's MCP server will NOT kill the persistent server
|
|
238
261
|
```
|
|
239
262
|
|
|
263
|
+
See `PERSISTENT-FLAG-README.md` for detailed documentation and examples.
|
|
264
|
+
|
|
240
265
|
The package name is `chromedebug-mcp` but the project is commonly referred to as Chrome Debug.
|
|
241
266
|
|
|
242
267
|
## Additional Architecture Notes
|
|
@@ -23,9 +23,13 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|
|
23
23
|
async function loadActivations() {
|
|
24
24
|
try {
|
|
25
25
|
// Get license key and instance ID from storage
|
|
26
|
-
|
|
26
|
+
// Note: ls_instance_id is the LemonSqueezy instance ID set during activation
|
|
27
|
+
const stored = await chrome.storage.local.get(['ls_license_key', 'ls_instance_id']);
|
|
27
28
|
licenseKey = stored.ls_license_key;
|
|
28
|
-
currentInstanceId = stored.
|
|
29
|
+
currentInstanceId = stored.ls_instance_id;
|
|
30
|
+
|
|
31
|
+
console.log('[Activation Manager] Current instance ID:', currentInstanceId);
|
|
32
|
+
console.log('[Activation Manager] Storage:', stored);
|
|
29
33
|
|
|
30
34
|
if (!licenseKey) {
|
|
31
35
|
showError('License key not found. Please activate your license first.');
|
|
@@ -36,6 +40,9 @@ async function loadActivations() {
|
|
|
36
40
|
const data = await licenseClient.listActivations(licenseKey);
|
|
37
41
|
activations = data.activations || [];
|
|
38
42
|
|
|
43
|
+
console.log('[Activation Manager] Fetched activations:', JSON.stringify(activations, null, 2));
|
|
44
|
+
console.log('[Activation Manager] Comparing against current instance ID:', currentInstanceId);
|
|
45
|
+
|
|
39
46
|
// Show activation status
|
|
40
47
|
document.getElementById('activation-status').textContent =
|
|
41
48
|
`${data.activationUsage} of ${data.activationLimit} activations used`;
|
|
@@ -72,8 +79,15 @@ function renderActivations() {
|
|
|
72
79
|
item.className = 'activation-item';
|
|
73
80
|
|
|
74
81
|
// Check if this is the current device
|
|
75
|
-
|
|
76
|
-
|
|
82
|
+
// Compare against identifier (unique per activation), not name (same for all activations from this device)
|
|
83
|
+
const isCurrentDevice = currentInstanceId && activation.identifier === currentInstanceId;
|
|
84
|
+
|
|
85
|
+
console.log('[Activation Manager] Activation', index + 1, ':', {
|
|
86
|
+
name: activation.name,
|
|
87
|
+
identifier: activation.identifier,
|
|
88
|
+
currentInstanceId: currentInstanceId,
|
|
89
|
+
isCurrentDevice: isCurrentDevice
|
|
90
|
+
});
|
|
77
91
|
|
|
78
92
|
if (isCurrentDevice) {
|
|
79
93
|
item.classList.add('current-device');
|