Many overall fixes - #18

Open
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main
Open

Many overall fixes#18
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main

Conversation

@hansottowirtz

@hansottowirtzhansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown

If you want to use these packages, they are published to npm: @adobe-fixed-uxp/uxp-devtools-helper, @adobe-fixed-uxp/uxp-devtools-cli and @adobe-fixed-uxp/uxp-devtools-core.

Changes in this PR:

  • Remove inspect-frontend
  • Remove templates
  • Remove webdriver
  • Remove feature package
  • Change to Typescript
  • Use pnpm and pnpm changesets
  • Fix closing server
  • Add Github Actions
  • Setup postinstall correctly for uxp-devtools-helper
  • Make multiple devtools clients possible
  • Node 20 needed

I use this branch in https://github.com/bubblydoo/uxp-toolkit
e.g. you can now run:

# Opens devtools in Chrome
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/uxp-cli open-devtools

or

# Starts an MCP server for Photoshop
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/photoshop-mcp

I already opened this PR once in 2023, but now I did it a bit more thorough (with a lot of Claude help), see #10

@hansottowirtzhansottowirtz changed the title Make this package work againMany overall fixesFeb 11, 2026
@jardicc

Copy link
Copy Markdown
Collaborator

I like that you took care of this. But I personally used Webdriver for very valuable e2e testing. But also hard to configure correctly. I think you don't count on E2E tests here anymore, right?

@hansottowirtz

Copy link
Copy Markdown
Author

That's interesting to know! I mainly made these changes to get Vitest to work over Chrome Devtools Protocol, which is now working in https://github.com/bubblydoo/uxp-toolkit/tree/main/packages/vitest-pool-uxp.
Is there any chance you can change your webdriver code to CDP code (e.g. with Puppeteer)? Or do you have these tests published anywhere open source so I can take a look?

@jardicc

jardicc commented Feb 11, 2026

Copy link
Copy Markdown
Collaborator

It is right here. In the templates you are about to remove as well: packages/uxp-templates-pack/uxp-wdio-automation-template/sample-tests/specs/starterScript.js

It uses wdio... there is not to much of documentation it was difficult to figure out how it actually works. Adobe uses robot.js as dependency which also uses C++ node library that can take control over your mouse and keyboard for more complex UI tests.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, I was playing with idea to have some CDP -> DAP -> CDP adapter. So it would be possible to debug in VSCode rather than UDT. https://microsoft.github.io/debug-adapter-protocol/

@hansottowirtz

Copy link
Copy Markdown
Author

Looking at wdio.conf.js, I think this "debuggerAddress" is also just a CDP address, so I think this should not be too hard to get to work.

In the Vitest integration I made sure debugging works, e.g. inside packages/uxp-tookit you can run UXP_INSPECT=1 pnpm run test:uxp debugger --run, it will wait for you to open the devtools link in Chrome, and then it will wait on the "debugger" statement inside the "debugger.uxp-test.ts" file.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, if you look under the hood of UDT inside it looks more or less like in this repo. They just packed it into .asar archive including source code and all node modules. Therefore size +1GB :-D

@hansottowirtz

Copy link
Copy Markdown
Author

Yes I also noticed it, but it's not really needed to use it in my opinion and that's why I deleted it. If you run the open-devtools command I posted above, you can just use Chrome to debug the apps and use the latest Devtools version.

@hansottowirtz

Copy link
Copy Markdown
Author

I actually got the debugger in VSCode to work with Vitest. I don't know how to automatically derive the websocketAddress from the terminal, but it works with this launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to websocket",
"type": "node",
"request": "attach",
"websocketAddress": "ws://127.0.0.1:14002/socket/cdt/a57f319c-5e63-42cd-a308-61dac5edbb2b"
}
]
}
Screenshot 2026-02-11 at 16 40 52

@jardicc

Copy link
Copy Markdown
Collaborator

Do you find any match with adress you need in these responses?
image
image

@hansottowirtz

hansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown
Author

I'm not sure if they are the same but they look similar. I'm not very sure why there are all these types of urls: /socket/cdt/<uuid>, /devtools/browser/<uuid> and /devtools/page/<uuid>. /socket/browser_cdt/<uuid> and /socket/cli also exist.
Where did you get this ":9123" port from?

@jardicc

Copy link
Copy Markdown
Collaborator

Back in the old days of UXP you could add debug file in same directory as your manifest file and specify port number for built-in Chrome Node.js debugger that would connect via CDP. This was before UDT existed. Later somewhere around PS 2023-2024 it broke.

@hansottowirtz

Copy link
Copy Markdown
Author

I did some more research on webdriver and it seems difficult to handle properly. It's a big protocol that is quite different from CDP, you can also maximize windows, etc. The existing package Adobe created was more of a bridge to CDP, and didn't support a lot of things and seems a bit hacky to me.
I will at least try to make a Puppeteer transport first.

@hansottowirtz

Copy link
Copy Markdown
Author

I made a @bubblydoo/uxp-puppeteer-transport package which you can use with Puppeteer, see for example:
https://github.com/bubblydoo/uxp-toolkit/blob/main/packages/example-puppeteer-integration/src/run.ts
(it's mostly vibecoded but it works)

The difficulty is that UXP CDP does not support pages etc, so those requests are intercepted. Also Runtime.evaluate with awaitPromise is not supported, so instead we poll for the promise to be done.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@hansottowirtz@jardicc@vamitul
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Many overall fixes - #18

Open
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main
Open

Many overall fixes#18
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main

Conversation

@hansottowirtz

@hansottowirtzhansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown

If you want to use these packages, they are published to npm: @adobe-fixed-uxp/uxp-devtools-helper, @adobe-fixed-uxp/uxp-devtools-cli and @adobe-fixed-uxp/uxp-devtools-core.

Changes in this PR:

  • Remove inspect-frontend
  • Remove templates
  • Remove webdriver
  • Remove feature package
  • Change to Typescript
  • Use pnpm and pnpm changesets
  • Fix closing server
  • Add Github Actions
  • Setup postinstall correctly for uxp-devtools-helper
  • Make multiple devtools clients possible
  • Node 20 needed

I use this branch in https://github.com/bubblydoo/uxp-toolkit
e.g. you can now run:

# Opens devtools in Chrome
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/uxp-cli open-devtools

or

# Starts an MCP server for Photoshop
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/photoshop-mcp

I already opened this PR once in 2023, but now I did it a bit more thorough (with a lot of Claude help), see #10

@hansottowirtzhansottowirtz changed the title Make this package work againMany overall fixesFeb 11, 2026
@jardicc

Copy link
Copy Markdown
Collaborator

I like that you took care of this. But I personally used Webdriver for very valuable e2e testing. But also hard to configure correctly. I think you don't count on E2E tests here anymore, right?

@hansottowirtz

Copy link
Copy Markdown
Author

That's interesting to know! I mainly made these changes to get Vitest to work over Chrome Devtools Protocol, which is now working in https://github.com/bubblydoo/uxp-toolkit/tree/main/packages/vitest-pool-uxp.
Is there any chance you can change your webdriver code to CDP code (e.g. with Puppeteer)? Or do you have these tests published anywhere open source so I can take a look?

@jardicc

jardicc commented Feb 11, 2026

Copy link
Copy Markdown
Collaborator

It is right here. In the templates you are about to remove as well: packages/uxp-templates-pack/uxp-wdio-automation-template/sample-tests/specs/starterScript.js

It uses wdio... there is not to much of documentation it was difficult to figure out how it actually works. Adobe uses robot.js as dependency which also uses C++ node library that can take control over your mouse and keyboard for more complex UI tests.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, I was playing with idea to have some CDP -> DAP -> CDP adapter. So it would be possible to debug in VSCode rather than UDT. https://microsoft.github.io/debug-adapter-protocol/

@hansottowirtz

Copy link
Copy Markdown
Author

Looking at wdio.conf.js, I think this "debuggerAddress" is also just a CDP address, so I think this should not be too hard to get to work.

In the Vitest integration I made sure debugging works, e.g. inside packages/uxp-tookit you can run UXP_INSPECT=1 pnpm run test:uxp debugger --run, it will wait for you to open the devtools link in Chrome, and then it will wait on the "debugger" statement inside the "debugger.uxp-test.ts" file.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, if you look under the hood of UDT inside it looks more or less like in this repo. They just packed it into .asar archive including source code and all node modules. Therefore size +1GB :-D

@hansottowirtz

Copy link
Copy Markdown
Author

Yes I also noticed it, but it's not really needed to use it in my opinion and that's why I deleted it. If you run the open-devtools command I posted above, you can just use Chrome to debug the apps and use the latest Devtools version.

@hansottowirtz

Copy link
Copy Markdown
Author

I actually got the debugger in VSCode to work with Vitest. I don't know how to automatically derive the websocketAddress from the terminal, but it works with this launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to websocket",
"type": "node",
"request": "attach",
"websocketAddress": "ws://127.0.0.1:14002/socket/cdt/a57f319c-5e63-42cd-a308-61dac5edbb2b"
}
]
}
Screenshot 2026-02-11 at 16 40 52

@jardicc

Copy link
Copy Markdown
Collaborator

Do you find any match with adress you need in these responses?
image
image

@hansottowirtz

hansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown
Author

I'm not sure if they are the same but they look similar. I'm not very sure why there are all these types of urls: /socket/cdt/<uuid>, /devtools/browser/<uuid> and /devtools/page/<uuid>. /socket/browser_cdt/<uuid> and /socket/cli also exist.
Where did you get this ":9123" port from?

@jardicc

Copy link
Copy Markdown
Collaborator

Back in the old days of UXP you could add debug file in same directory as your manifest file and specify port number for built-in Chrome Node.js debugger that would connect via CDP. This was before UDT existed. Later somewhere around PS 2023-2024 it broke.

@hansottowirtz

Copy link
Copy Markdown
Author

I did some more research on webdriver and it seems difficult to handle properly. It's a big protocol that is quite different from CDP, you can also maximize windows, etc. The existing package Adobe created was more of a bridge to CDP, and didn't support a lot of things and seems a bit hacky to me.
I will at least try to make a Puppeteer transport first.

@hansottowirtz

Copy link
Copy Markdown
Author

I made a @bubblydoo/uxp-puppeteer-transport package which you can use with Puppeteer, see for example:
https://github.com/bubblydoo/uxp-toolkit/blob/main/packages/example-puppeteer-integration/src/run.ts
(it's mostly vibecoded but it works)

The difficulty is that UXP CDP does not support pages etc, so those requests are intercepted. Also Runtime.evaluate with awaitPromise is not supported, so instead we poll for the promise to be done.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@hansottowirtz@jardicc@vamitul
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Many overall fixes - #18

Open
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main
Open

Many overall fixes#18
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main

Conversation

@hansottowirtz

@hansottowirtzhansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown

If you want to use these packages, they are published to npm: @adobe-fixed-uxp/uxp-devtools-helper, @adobe-fixed-uxp/uxp-devtools-cli and @adobe-fixed-uxp/uxp-devtools-core.

Changes in this PR:

  • Remove inspect-frontend
  • Remove templates
  • Remove webdriver
  • Remove feature package
  • Change to Typescript
  • Use pnpm and pnpm changesets
  • Fix closing server
  • Add Github Actions
  • Setup postinstall correctly for uxp-devtools-helper
  • Make multiple devtools clients possible
  • Node 20 needed

I use this branch in https://github.com/bubblydoo/uxp-toolkit
e.g. you can now run:

# Opens devtools in Chrome
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/uxp-cli open-devtools

or

# Starts an MCP server for Photoshop
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/photoshop-mcp

I already opened this PR once in 2023, but now I did it a bit more thorough (with a lot of Claude help), see #10

@hansottowirtzhansottowirtz changed the title Make this package work againMany overall fixesFeb 11, 2026
@jardicc

Copy link
Copy Markdown
Collaborator

I like that you took care of this. But I personally used Webdriver for very valuable e2e testing. But also hard to configure correctly. I think you don't count on E2E tests here anymore, right?

@hansottowirtz

Copy link
Copy Markdown
Author

That's interesting to know! I mainly made these changes to get Vitest to work over Chrome Devtools Protocol, which is now working in https://github.com/bubblydoo/uxp-toolkit/tree/main/packages/vitest-pool-uxp.
Is there any chance you can change your webdriver code to CDP code (e.g. with Puppeteer)? Or do you have these tests published anywhere open source so I can take a look?

@jardicc

jardicc commented Feb 11, 2026

Copy link
Copy Markdown
Collaborator

It is right here. In the templates you are about to remove as well: packages/uxp-templates-pack/uxp-wdio-automation-template/sample-tests/specs/starterScript.js

It uses wdio... there is not to much of documentation it was difficult to figure out how it actually works. Adobe uses robot.js as dependency which also uses C++ node library that can take control over your mouse and keyboard for more complex UI tests.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, I was playing with idea to have some CDP -> DAP -> CDP adapter. So it would be possible to debug in VSCode rather than UDT. https://microsoft.github.io/debug-adapter-protocol/

@hansottowirtz

Copy link
Copy Markdown
Author

Looking at wdio.conf.js, I think this "debuggerAddress" is also just a CDP address, so I think this should not be too hard to get to work.

In the Vitest integration I made sure debugging works, e.g. inside packages/uxp-tookit you can run UXP_INSPECT=1 pnpm run test:uxp debugger --run, it will wait for you to open the devtools link in Chrome, and then it will wait on the "debugger" statement inside the "debugger.uxp-test.ts" file.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, if you look under the hood of UDT inside it looks more or less like in this repo. They just packed it into .asar archive including source code and all node modules. Therefore size +1GB :-D

@hansottowirtz

Copy link
Copy Markdown
Author

Yes I also noticed it, but it's not really needed to use it in my opinion and that's why I deleted it. If you run the open-devtools command I posted above, you can just use Chrome to debug the apps and use the latest Devtools version.

@hansottowirtz

Copy link
Copy Markdown
Author

I actually got the debugger in VSCode to work with Vitest. I don't know how to automatically derive the websocketAddress from the terminal, but it works with this launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to websocket",
"type": "node",
"request": "attach",
"websocketAddress": "ws://127.0.0.1:14002/socket/cdt/a57f319c-5e63-42cd-a308-61dac5edbb2b"
}
]
}
Screenshot 2026-02-11 at 16 40 52

@jardicc

Copy link
Copy Markdown
Collaborator

Do you find any match with adress you need in these responses?
image
image

@hansottowirtz

hansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown
Author

I'm not sure if they are the same but they look similar. I'm not very sure why there are all these types of urls: /socket/cdt/<uuid>, /devtools/browser/<uuid> and /devtools/page/<uuid>. /socket/browser_cdt/<uuid> and /socket/cli also exist.
Where did you get this ":9123" port from?

@jardicc

Copy link
Copy Markdown
Collaborator

Back in the old days of UXP you could add debug file in same directory as your manifest file and specify port number for built-in Chrome Node.js debugger that would connect via CDP. This was before UDT existed. Later somewhere around PS 2023-2024 it broke.

@hansottowirtz

Copy link
Copy Markdown
Author

I did some more research on webdriver and it seems difficult to handle properly. It's a big protocol that is quite different from CDP, you can also maximize windows, etc. The existing package Adobe created was more of a bridge to CDP, and didn't support a lot of things and seems a bit hacky to me.
I will at least try to make a Puppeteer transport first.

@hansottowirtz

Copy link
Copy Markdown
Author

I made a @bubblydoo/uxp-puppeteer-transport package which you can use with Puppeteer, see for example:
https://github.com/bubblydoo/uxp-toolkit/blob/main/packages/example-puppeteer-integration/src/run.ts
(it's mostly vibecoded but it works)

The difficulty is that UXP CDP does not support pages etc, so those requests are intercepted. Also Runtime.evaluate with awaitPromise is not supported, so instead we poll for the promise to be done.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@hansottowirtz@jardicc@vamitul
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Many overall fixes - #18

Open
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main
Open

Many overall fixes#18
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main

Conversation

@hansottowirtz

@hansottowirtzhansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown

If you want to use these packages, they are published to npm: @adobe-fixed-uxp/uxp-devtools-helper, @adobe-fixed-uxp/uxp-devtools-cli and @adobe-fixed-uxp/uxp-devtools-core.

Changes in this PR:

  • Remove inspect-frontend
  • Remove templates
  • Remove webdriver
  • Remove feature package
  • Change to Typescript
  • Use pnpm and pnpm changesets
  • Fix closing server
  • Add Github Actions
  • Setup postinstall correctly for uxp-devtools-helper
  • Make multiple devtools clients possible
  • Node 20 needed

I use this branch in https://github.com/bubblydoo/uxp-toolkit
e.g. you can now run:

# Opens devtools in Chrome
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/uxp-cli open-devtools

or

# Starts an MCP server for Photoshop
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/photoshop-mcp

I already opened this PR once in 2023, but now I did it a bit more thorough (with a lot of Claude help), see #10

@hansottowirtzhansottowirtz changed the title Make this package work againMany overall fixesFeb 11, 2026
@jardicc

Copy link
Copy Markdown
Collaborator

I like that you took care of this. But I personally used Webdriver for very valuable e2e testing. But also hard to configure correctly. I think you don't count on E2E tests here anymore, right?

@hansottowirtz

Copy link
Copy Markdown
Author

That's interesting to know! I mainly made these changes to get Vitest to work over Chrome Devtools Protocol, which is now working in https://github.com/bubblydoo/uxp-toolkit/tree/main/packages/vitest-pool-uxp.
Is there any chance you can change your webdriver code to CDP code (e.g. with Puppeteer)? Or do you have these tests published anywhere open source so I can take a look?

@jardicc

jardicc commented Feb 11, 2026

Copy link
Copy Markdown
Collaborator

It is right here. In the templates you are about to remove as well: packages/uxp-templates-pack/uxp-wdio-automation-template/sample-tests/specs/starterScript.js

It uses wdio... there is not to much of documentation it was difficult to figure out how it actually works. Adobe uses robot.js as dependency which also uses C++ node library that can take control over your mouse and keyboard for more complex UI tests.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, I was playing with idea to have some CDP -> DAP -> CDP adapter. So it would be possible to debug in VSCode rather than UDT. https://microsoft.github.io/debug-adapter-protocol/

@hansottowirtz

Copy link
Copy Markdown
Author

Looking at wdio.conf.js, I think this "debuggerAddress" is also just a CDP address, so I think this should not be too hard to get to work.

In the Vitest integration I made sure debugging works, e.g. inside packages/uxp-tookit you can run UXP_INSPECT=1 pnpm run test:uxp debugger --run, it will wait for you to open the devtools link in Chrome, and then it will wait on the "debugger" statement inside the "debugger.uxp-test.ts" file.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, if you look under the hood of UDT inside it looks more or less like in this repo. They just packed it into .asar archive including source code and all node modules. Therefore size +1GB :-D

@hansottowirtz

Copy link
Copy Markdown
Author

Yes I also noticed it, but it's not really needed to use it in my opinion and that's why I deleted it. If you run the open-devtools command I posted above, you can just use Chrome to debug the apps and use the latest Devtools version.

@hansottowirtz

Copy link
Copy Markdown
Author

I actually got the debugger in VSCode to work with Vitest. I don't know how to automatically derive the websocketAddress from the terminal, but it works with this launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to websocket",
"type": "node",
"request": "attach",
"websocketAddress": "ws://127.0.0.1:14002/socket/cdt/a57f319c-5e63-42cd-a308-61dac5edbb2b"
}
]
}
Screenshot 2026-02-11 at 16 40 52

@jardicc

Copy link
Copy Markdown
Collaborator

Do you find any match with adress you need in these responses?
image
image

@hansottowirtz

hansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown
Author

I'm not sure if they are the same but they look similar. I'm not very sure why there are all these types of urls: /socket/cdt/<uuid>, /devtools/browser/<uuid> and /devtools/page/<uuid>. /socket/browser_cdt/<uuid> and /socket/cli also exist.
Where did you get this ":9123" port from?

@jardicc

Copy link
Copy Markdown
Collaborator

Back in the old days of UXP you could add debug file in same directory as your manifest file and specify port number for built-in Chrome Node.js debugger that would connect via CDP. This was before UDT existed. Later somewhere around PS 2023-2024 it broke.

@hansottowirtz

Copy link
Copy Markdown
Author

I did some more research on webdriver and it seems difficult to handle properly. It's a big protocol that is quite different from CDP, you can also maximize windows, etc. The existing package Adobe created was more of a bridge to CDP, and didn't support a lot of things and seems a bit hacky to me.
I will at least try to make a Puppeteer transport first.

@hansottowirtz

Copy link
Copy Markdown
Author

I made a @bubblydoo/uxp-puppeteer-transport package which you can use with Puppeteer, see for example:
https://github.com/bubblydoo/uxp-toolkit/blob/main/packages/example-puppeteer-integration/src/run.ts
(it's mostly vibecoded but it works)

The difficulty is that UXP CDP does not support pages etc, so those requests are intercepted. Also Runtime.evaluate with awaitPromise is not supported, so instead we poll for the promise to be done.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@hansottowirtz@jardicc@vamitul
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Many overall fixes - #18

Open
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main
Open

Many overall fixes#18
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main

Conversation

@hansottowirtz

@hansottowirtzhansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown

If you want to use these packages, they are published to npm: @adobe-fixed-uxp/uxp-devtools-helper, @adobe-fixed-uxp/uxp-devtools-cli and @adobe-fixed-uxp/uxp-devtools-core.

Changes in this PR:

  • Remove inspect-frontend
  • Remove templates
  • Remove webdriver
  • Remove feature package
  • Change to Typescript
  • Use pnpm and pnpm changesets
  • Fix closing server
  • Add Github Actions
  • Setup postinstall correctly for uxp-devtools-helper
  • Make multiple devtools clients possible
  • Node 20 needed

I use this branch in https://github.com/bubblydoo/uxp-toolkit
e.g. you can now run:

# Opens devtools in Chrome
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/uxp-cli open-devtools

or

# Starts an MCP server for Photoshop
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/photoshop-mcp

I already opened this PR once in 2023, but now I did it a bit more thorough (with a lot of Claude help), see #10

@hansottowirtzhansottowirtz changed the title Make this package work againMany overall fixesFeb 11, 2026
@jardicc

Copy link
Copy Markdown
Collaborator

I like that you took care of this. But I personally used Webdriver for very valuable e2e testing. But also hard to configure correctly. I think you don't count on E2E tests here anymore, right?

@hansottowirtz

Copy link
Copy Markdown
Author

That's interesting to know! I mainly made these changes to get Vitest to work over Chrome Devtools Protocol, which is now working in https://github.com/bubblydoo/uxp-toolkit/tree/main/packages/vitest-pool-uxp.
Is there any chance you can change your webdriver code to CDP code (e.g. with Puppeteer)? Or do you have these tests published anywhere open source so I can take a look?

@jardicc

jardicc commented Feb 11, 2026

Copy link
Copy Markdown
Collaborator

It is right here. In the templates you are about to remove as well: packages/uxp-templates-pack/uxp-wdio-automation-template/sample-tests/specs/starterScript.js

It uses wdio... there is not to much of documentation it was difficult to figure out how it actually works. Adobe uses robot.js as dependency which also uses C++ node library that can take control over your mouse and keyboard for more complex UI tests.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, I was playing with idea to have some CDP -> DAP -> CDP adapter. So it would be possible to debug in VSCode rather than UDT. https://microsoft.github.io/debug-adapter-protocol/

@hansottowirtz

Copy link
Copy Markdown
Author

Looking at wdio.conf.js, I think this "debuggerAddress" is also just a CDP address, so I think this should not be too hard to get to work.

In the Vitest integration I made sure debugging works, e.g. inside packages/uxp-tookit you can run UXP_INSPECT=1 pnpm run test:uxp debugger --run, it will wait for you to open the devtools link in Chrome, and then it will wait on the "debugger" statement inside the "debugger.uxp-test.ts" file.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, if you look under the hood of UDT inside it looks more or less like in this repo. They just packed it into .asar archive including source code and all node modules. Therefore size +1GB :-D

@hansottowirtz

Copy link
Copy Markdown
Author

Yes I also noticed it, but it's not really needed to use it in my opinion and that's why I deleted it. If you run the open-devtools command I posted above, you can just use Chrome to debug the apps and use the latest Devtools version.

@hansottowirtz

Copy link
Copy Markdown
Author

I actually got the debugger in VSCode to work with Vitest. I don't know how to automatically derive the websocketAddress from the terminal, but it works with this launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to websocket",
"type": "node",
"request": "attach",
"websocketAddress": "ws://127.0.0.1:14002/socket/cdt/a57f319c-5e63-42cd-a308-61dac5edbb2b"
}
]
}
Screenshot 2026-02-11 at 16 40 52

@jardicc

Copy link
Copy Markdown
Collaborator

Do you find any match with adress you need in these responses?
image
image

@hansottowirtz

hansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown
Author

I'm not sure if they are the same but they look similar. I'm not very sure why there are all these types of urls: /socket/cdt/<uuid>, /devtools/browser/<uuid> and /devtools/page/<uuid>. /socket/browser_cdt/<uuid> and /socket/cli also exist.
Where did you get this ":9123" port from?

@jardicc

Copy link
Copy Markdown
Collaborator

Back in the old days of UXP you could add debug file in same directory as your manifest file and specify port number for built-in Chrome Node.js debugger that would connect via CDP. This was before UDT existed. Later somewhere around PS 2023-2024 it broke.

@hansottowirtz

Copy link
Copy Markdown
Author

I did some more research on webdriver and it seems difficult to handle properly. It's a big protocol that is quite different from CDP, you can also maximize windows, etc. The existing package Adobe created was more of a bridge to CDP, and didn't support a lot of things and seems a bit hacky to me.
I will at least try to make a Puppeteer transport first.

@hansottowirtz

Copy link
Copy Markdown
Author

I made a @bubblydoo/uxp-puppeteer-transport package which you can use with Puppeteer, see for example:
https://github.com/bubblydoo/uxp-toolkit/blob/main/packages/example-puppeteer-integration/src/run.ts
(it's mostly vibecoded but it works)

The difficulty is that UXP CDP does not support pages etc, so those requests are intercepted. Also Runtime.evaluate with awaitPromise is not supported, so instead we poll for the promise to be done.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@hansottowirtz@jardicc@vamitul
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Many overall fixes - #18

Open
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main
Open

Many overall fixes#18
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main

Conversation

@hansottowirtz

@hansottowirtzhansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown

If you want to use these packages, they are published to npm: @adobe-fixed-uxp/uxp-devtools-helper, @adobe-fixed-uxp/uxp-devtools-cli and @adobe-fixed-uxp/uxp-devtools-core.

Changes in this PR:

  • Remove inspect-frontend
  • Remove templates
  • Remove webdriver
  • Remove feature package
  • Change to Typescript
  • Use pnpm and pnpm changesets
  • Fix closing server
  • Add Github Actions
  • Setup postinstall correctly for uxp-devtools-helper
  • Make multiple devtools clients possible
  • Node 20 needed

I use this branch in https://github.com/bubblydoo/uxp-toolkit
e.g. you can now run:

# Opens devtools in Chrome
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/uxp-cli open-devtools

or

# Starts an MCP server for Photoshop
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/photoshop-mcp

I already opened this PR once in 2023, but now I did it a bit more thorough (with a lot of Claude help), see #10

@hansottowirtzhansottowirtz changed the title Make this package work againMany overall fixesFeb 11, 2026
@jardicc

Copy link
Copy Markdown
Collaborator

I like that you took care of this. But I personally used Webdriver for very valuable e2e testing. But also hard to configure correctly. I think you don't count on E2E tests here anymore, right?

@hansottowirtz

Copy link
Copy Markdown
Author

That's interesting to know! I mainly made these changes to get Vitest to work over Chrome Devtools Protocol, which is now working in https://github.com/bubblydoo/uxp-toolkit/tree/main/packages/vitest-pool-uxp.
Is there any chance you can change your webdriver code to CDP code (e.g. with Puppeteer)? Or do you have these tests published anywhere open source so I can take a look?

@jardicc

jardicc commented Feb 11, 2026

Copy link
Copy Markdown
Collaborator

It is right here. In the templates you are about to remove as well: packages/uxp-templates-pack/uxp-wdio-automation-template/sample-tests/specs/starterScript.js

It uses wdio... there is not to much of documentation it was difficult to figure out how it actually works. Adobe uses robot.js as dependency which also uses C++ node library that can take control over your mouse and keyboard for more complex UI tests.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, I was playing with idea to have some CDP -> DAP -> CDP adapter. So it would be possible to debug in VSCode rather than UDT. https://microsoft.github.io/debug-adapter-protocol/

@hansottowirtz

Copy link
Copy Markdown
Author

Looking at wdio.conf.js, I think this "debuggerAddress" is also just a CDP address, so I think this should not be too hard to get to work.

In the Vitest integration I made sure debugging works, e.g. inside packages/uxp-tookit you can run UXP_INSPECT=1 pnpm run test:uxp debugger --run, it will wait for you to open the devtools link in Chrome, and then it will wait on the "debugger" statement inside the "debugger.uxp-test.ts" file.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, if you look under the hood of UDT inside it looks more or less like in this repo. They just packed it into .asar archive including source code and all node modules. Therefore size +1GB :-D

@hansottowirtz

Copy link
Copy Markdown
Author

Yes I also noticed it, but it's not really needed to use it in my opinion and that's why I deleted it. If you run the open-devtools command I posted above, you can just use Chrome to debug the apps and use the latest Devtools version.

@hansottowirtz

Copy link
Copy Markdown
Author

I actually got the debugger in VSCode to work with Vitest. I don't know how to automatically derive the websocketAddress from the terminal, but it works with this launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to websocket",
"type": "node",
"request": "attach",
"websocketAddress": "ws://127.0.0.1:14002/socket/cdt/a57f319c-5e63-42cd-a308-61dac5edbb2b"
}
]
}
Screenshot 2026-02-11 at 16 40 52

@jardicc

Copy link
Copy Markdown
Collaborator

Do you find any match with adress you need in these responses?
image
image

@hansottowirtz

hansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown
Author

I'm not sure if they are the same but they look similar. I'm not very sure why there are all these types of urls: /socket/cdt/<uuid>, /devtools/browser/<uuid> and /devtools/page/<uuid>. /socket/browser_cdt/<uuid> and /socket/cli also exist.
Where did you get this ":9123" port from?

@jardicc

Copy link
Copy Markdown
Collaborator

Back in the old days of UXP you could add debug file in same directory as your manifest file and specify port number for built-in Chrome Node.js debugger that would connect via CDP. This was before UDT existed. Later somewhere around PS 2023-2024 it broke.

@hansottowirtz

Copy link
Copy Markdown
Author

I did some more research on webdriver and it seems difficult to handle properly. It's a big protocol that is quite different from CDP, you can also maximize windows, etc. The existing package Adobe created was more of a bridge to CDP, and didn't support a lot of things and seems a bit hacky to me.
I will at least try to make a Puppeteer transport first.

@hansottowirtz

Copy link
Copy Markdown
Author

I made a @bubblydoo/uxp-puppeteer-transport package which you can use with Puppeteer, see for example:
https://github.com/bubblydoo/uxp-toolkit/blob/main/packages/example-puppeteer-integration/src/run.ts
(it's mostly vibecoded but it works)

The difficulty is that UXP CDP does not support pages etc, so those requests are intercepted. Also Runtime.evaluate with awaitPromise is not supported, so instead we poll for the promise to be done.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@hansottowirtz@jardicc@vamitul
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Many overall fixes - #18

Open
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main
Open

Many overall fixes#18
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main

Conversation

@hansottowirtz

@hansottowirtzhansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown

If you want to use these packages, they are published to npm: @adobe-fixed-uxp/uxp-devtools-helper, @adobe-fixed-uxp/uxp-devtools-cli and @adobe-fixed-uxp/uxp-devtools-core.

Changes in this PR:

  • Remove inspect-frontend
  • Remove templates
  • Remove webdriver
  • Remove feature package
  • Change to Typescript
  • Use pnpm and pnpm changesets
  • Fix closing server
  • Add Github Actions
  • Setup postinstall correctly for uxp-devtools-helper
  • Make multiple devtools clients possible
  • Node 20 needed

I use this branch in https://github.com/bubblydoo/uxp-toolkit
e.g. you can now run:

# Opens devtools in Chrome
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/uxp-cli open-devtools

or

# Starts an MCP server for Photoshop
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/photoshop-mcp

I already opened this PR once in 2023, but now I did it a bit more thorough (with a lot of Claude help), see #10

@hansottowirtzhansottowirtz changed the title Make this package work againMany overall fixesFeb 11, 2026
@jardicc

Copy link
Copy Markdown
Collaborator

I like that you took care of this. But I personally used Webdriver for very valuable e2e testing. But also hard to configure correctly. I think you don't count on E2E tests here anymore, right?

@hansottowirtz

Copy link
Copy Markdown
Author

That's interesting to know! I mainly made these changes to get Vitest to work over Chrome Devtools Protocol, which is now working in https://github.com/bubblydoo/uxp-toolkit/tree/main/packages/vitest-pool-uxp.
Is there any chance you can change your webdriver code to CDP code (e.g. with Puppeteer)? Or do you have these tests published anywhere open source so I can take a look?

@jardicc

jardicc commented Feb 11, 2026

Copy link
Copy Markdown
Collaborator

It is right here. In the templates you are about to remove as well: packages/uxp-templates-pack/uxp-wdio-automation-template/sample-tests/specs/starterScript.js

It uses wdio... there is not to much of documentation it was difficult to figure out how it actually works. Adobe uses robot.js as dependency which also uses C++ node library that can take control over your mouse and keyboard for more complex UI tests.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, I was playing with idea to have some CDP -> DAP -> CDP adapter. So it would be possible to debug in VSCode rather than UDT. https://microsoft.github.io/debug-adapter-protocol/

@hansottowirtz

Copy link
Copy Markdown
Author

Looking at wdio.conf.js, I think this "debuggerAddress" is also just a CDP address, so I think this should not be too hard to get to work.

In the Vitest integration I made sure debugging works, e.g. inside packages/uxp-tookit you can run UXP_INSPECT=1 pnpm run test:uxp debugger --run, it will wait for you to open the devtools link in Chrome, and then it will wait on the "debugger" statement inside the "debugger.uxp-test.ts" file.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, if you look under the hood of UDT inside it looks more or less like in this repo. They just packed it into .asar archive including source code and all node modules. Therefore size +1GB :-D

@hansottowirtz

Copy link
Copy Markdown
Author

Yes I also noticed it, but it's not really needed to use it in my opinion and that's why I deleted it. If you run the open-devtools command I posted above, you can just use Chrome to debug the apps and use the latest Devtools version.

@hansottowirtz

Copy link
Copy Markdown
Author

I actually got the debugger in VSCode to work with Vitest. I don't know how to automatically derive the websocketAddress from the terminal, but it works with this launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to websocket",
"type": "node",
"request": "attach",
"websocketAddress": "ws://127.0.0.1:14002/socket/cdt/a57f319c-5e63-42cd-a308-61dac5edbb2b"
}
]
}
Screenshot 2026-02-11 at 16 40 52

@jardicc

Copy link
Copy Markdown
Collaborator

Do you find any match with adress you need in these responses?
image
image

@hansottowirtz

hansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown
Author

I'm not sure if they are the same but they look similar. I'm not very sure why there are all these types of urls: /socket/cdt/<uuid>, /devtools/browser/<uuid> and /devtools/page/<uuid>. /socket/browser_cdt/<uuid> and /socket/cli also exist.
Where did you get this ":9123" port from?

@jardicc

Copy link
Copy Markdown
Collaborator

Back in the old days of UXP you could add debug file in same directory as your manifest file and specify port number for built-in Chrome Node.js debugger that would connect via CDP. This was before UDT existed. Later somewhere around PS 2023-2024 it broke.

@hansottowirtz

Copy link
Copy Markdown
Author

I did some more research on webdriver and it seems difficult to handle properly. It's a big protocol that is quite different from CDP, you can also maximize windows, etc. The existing package Adobe created was more of a bridge to CDP, and didn't support a lot of things and seems a bit hacky to me.
I will at least try to make a Puppeteer transport first.

@hansottowirtz

Copy link
Copy Markdown
Author

I made a @bubblydoo/uxp-puppeteer-transport package which you can use with Puppeteer, see for example:
https://github.com/bubblydoo/uxp-toolkit/blob/main/packages/example-puppeteer-integration/src/run.ts
(it's mostly vibecoded but it works)

The difficulty is that UXP CDP does not support pages etc, so those requests are intercepted. Also Runtime.evaluate with awaitPromise is not supported, so instead we poll for the promise to be done.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@hansottowirtz@jardicc@vamitul
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Many overall fixes - #18

Open
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main
Open

Many overall fixes#18
hansottowirtz wants to merge 45 commits into
adobe-uxp:mainfrom
bubblydoo:main

Conversation

@hansottowirtz

@hansottowirtzhansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown

If you want to use these packages, they are published to npm: @adobe-fixed-uxp/uxp-devtools-helper, @adobe-fixed-uxp/uxp-devtools-cli and @adobe-fixed-uxp/uxp-devtools-core.

Changes in this PR:

  • Remove inspect-frontend
  • Remove templates
  • Remove webdriver
  • Remove feature package
  • Change to Typescript
  • Use pnpm and pnpm changesets
  • Fix closing server
  • Add Github Actions
  • Setup postinstall correctly for uxp-devtools-helper
  • Make multiple devtools clients possible
  • Node 20 needed

I use this branch in https://github.com/bubblydoo/uxp-toolkit
e.g. you can now run:

# Opens devtools in Chrome
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/uxp-cli open-devtools

or

# Starts an MCP server for Photoshop
pnpm --allow-build=@adobe-fixed-uxp/uxp-devtools-helper dlx @bubblydoo/photoshop-mcp

I already opened this PR once in 2023, but now I did it a bit more thorough (with a lot of Claude help), see #10

@hansottowirtzhansottowirtz changed the title Make this package work againMany overall fixesFeb 11, 2026
@jardicc

Copy link
Copy Markdown
Collaborator

I like that you took care of this. But I personally used Webdriver for very valuable e2e testing. But also hard to configure correctly. I think you don't count on E2E tests here anymore, right?

@hansottowirtz

Copy link
Copy Markdown
Author

That's interesting to know! I mainly made these changes to get Vitest to work over Chrome Devtools Protocol, which is now working in https://github.com/bubblydoo/uxp-toolkit/tree/main/packages/vitest-pool-uxp.
Is there any chance you can change your webdriver code to CDP code (e.g. with Puppeteer)? Or do you have these tests published anywhere open source so I can take a look?

@jardicc

jardicc commented Feb 11, 2026

Copy link
Copy Markdown
Collaborator

It is right here. In the templates you are about to remove as well: packages/uxp-templates-pack/uxp-wdio-automation-template/sample-tests/specs/starterScript.js

It uses wdio... there is not to much of documentation it was difficult to figure out how it actually works. Adobe uses robot.js as dependency which also uses C++ node library that can take control over your mouse and keyboard for more complex UI tests.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, I was playing with idea to have some CDP -> DAP -> CDP adapter. So it would be possible to debug in VSCode rather than UDT. https://microsoft.github.io/debug-adapter-protocol/

@hansottowirtz

Copy link
Copy Markdown
Author

Looking at wdio.conf.js, I think this "debuggerAddress" is also just a CDP address, so I think this should not be too hard to get to work.

In the Vitest integration I made sure debugging works, e.g. inside packages/uxp-tookit you can run UXP_INSPECT=1 pnpm run test:uxp debugger --run, it will wait for you to open the devtools link in Chrome, and then it will wait on the "debugger" statement inside the "debugger.uxp-test.ts" file.

@jardicc

Copy link
Copy Markdown
Collaborator

Otherwise, if you look under the hood of UDT inside it looks more or less like in this repo. They just packed it into .asar archive including source code and all node modules. Therefore size +1GB :-D

@hansottowirtz

Copy link
Copy Markdown
Author

Yes I also noticed it, but it's not really needed to use it in my opinion and that's why I deleted it. If you run the open-devtools command I posted above, you can just use Chrome to debug the apps and use the latest Devtools version.

@hansottowirtz

Copy link
Copy Markdown
Author

I actually got the debugger in VSCode to work with Vitest. I don't know how to automatically derive the websocketAddress from the terminal, but it works with this launch.json:

{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to websocket",
"type": "node",
"request": "attach",
"websocketAddress": "ws://127.0.0.1:14002/socket/cdt/a57f319c-5e63-42cd-a308-61dac5edbb2b"
}
]
}
Screenshot 2026-02-11 at 16 40 52

@jardicc

Copy link
Copy Markdown
Collaborator

Do you find any match with adress you need in these responses?
image
image

@hansottowirtz

hansottowirtz commented Feb 11, 2026

Copy link
Copy Markdown
Author

I'm not sure if they are the same but they look similar. I'm not very sure why there are all these types of urls: /socket/cdt/<uuid>, /devtools/browser/<uuid> and /devtools/page/<uuid>. /socket/browser_cdt/<uuid> and /socket/cli also exist.
Where did you get this ":9123" port from?

@jardicc

Copy link
Copy Markdown
Collaborator

Back in the old days of UXP you could add debug file in same directory as your manifest file and specify port number for built-in Chrome Node.js debugger that would connect via CDP. This was before UDT existed. Later somewhere around PS 2023-2024 it broke.

@hansottowirtz

Copy link
Copy Markdown
Author

I did some more research on webdriver and it seems difficult to handle properly. It's a big protocol that is quite different from CDP, you can also maximize windows, etc. The existing package Adobe created was more of a bridge to CDP, and didn't support a lot of things and seems a bit hacky to me.
I will at least try to make a Puppeteer transport first.

@hansottowirtz

Copy link
Copy Markdown
Author

I made a @bubblydoo/uxp-puppeteer-transport package which you can use with Puppeteer, see for example:
https://github.com/bubblydoo/uxp-toolkit/blob/main/packages/example-puppeteer-integration/src/run.ts
(it's mostly vibecoded but it works)

The difficulty is that UXP CDP does not support pages etc, so those requests are intercepted. Also Runtime.evaluate with awaitPromise is not supported, so instead we poll for the promise to be done.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@hansottowirtz@jardicc@vamitul