control-ui
Use to reproduce, verify, or profile web, IDE, or Electron behavior through a local browser harness.
Skill by Camgineer
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/camgineer-control-ui
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: design
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/control-ui
What's inside
- Skill name
control-ui- Description
- Use to reproduce, verify, or profile web, IDE, or Electron behavior through a local browser harness.
- License
- MIT
- Metadata
- source: control-ui from Cursor Team Kit by Cursor, https://github.com/cursor/plugins/tree/23e4138daa01c42d4969f7a5465f82704e64f798/cursor-team-kit/skills/control-ui
- Instructions
- 108 lines in SKILL.md · view on GitHub
Files (4)
- LICENSE
- SKILL.md
- openai.yaml · agents/
- origin.json
SKILL.md (first lines)
# Control UI
Use local browser automation to verify UI behavior with evidence. Reuse the repo's own Playwright, browser, or Electron harness when it exists, or a project verification skill from **create-verification-skill**. Otherwise assemble a temporary local harness around the app's dev server or Chromium debug port.
## Uses
- Reproducing UI bugs that depend on real browser focus, keyboard input, scrolling, resizing, or rendering.
- Verifying visual or accessibility changes with screenshots and snapshots.
- Checking local web, IDE, or Electron behavior before shipping.
- Capturing console logs, network logs, CPU profiles, traces, or heap snapshots.
- Producing before and after evidence for the [prove-it-works](../principles/prove-it-works.md) reference.
## Setup
1. Start the app locally with the repo's documented dev command.
2. Discover existing local harnesses: Playwright tests, Cypress specs, Storybook, browser scripts, Electron launch scripts, or snapshot tools.
3. For a web app, connect to the local URL with the existing browser tooling.
4. For Electron or Chromium, enable a remote debugging port when supported.
5. Select the page by stable app markers rather than tab order.
6. Target elements by accessibility role, label, or stable `data-*` selector rather than coordinates.
## Generic web harness
Use the browser tooling the repo or environment already provides. When the repo already has Playwright, a minimal one-off probe looks like this. Run it with the repo's script runner.
```javascript
import { chromium } from "playwright";
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1280, height: 800 } });
await page.goto("http://127.0.0.1:<port>");
await page.getByRole("button", { name: /submit/i }).click();
await page.screenshot({ path: "<tmp-dir>/ui-harness-after.png", fullPage: true });
await browser.close();
```
Keep the project's dependencies unchanged for a probe. Add Playwright as a dependency only when the user asks.
## Generic CDP harness
For Electron or a Chromium app launched with `--remote-debugging-port=<port>`, connect over CDP:
```javascript
import { chromium } from "playwright";
const browser = await chromium.connectOverCDP("http://127.0.0.1:<debug-port>");
const pages = browser.contexts().flatMap((context) => context.pages());
let page;
for (const candidate of pages) {
if (await candidate.locator("<app-root-selector>").count()) {
page = candidate;
break;
}
}
if (!page) {
console.log(await Promise.all(pages.map(async (p) => ({
title: await p.title(),
url: p.url(),
}))));
throw new Error("No matching app page found");
}
await page.screenshot({ path: "<tmp-dir>/ui-harness-cdp.png", fullPage: true });
await browser.close();
```
Replace `<app-root-selector>` with a stable marker from the current repo, such as a root app node, a landmark, or a product-specific `data-*` attribute. Replace `<tmp-dir>` with `tmp/<task>/` inside the project.
## Interaction loop
1. Capture a page snapshot or screenshot before acting.
2. Choose a target from the latest page structure.
3. Perform one structural action: click, type, keypress, drag, scroll, navigate, or resize.
4. Capture a fresh snapshot or screenshot.
5. Verify the expected state change.
6. Save before and after artifacts when the user asked for proof.
## CDP capabilities
Use raw CDP when higher-level browser APIs fall short:
- Performance: CPU profiles, traces, paint flashing, FPS meter, layout shift inspection.
- Memory: heap snapshots and forced GC for leak investigations.
- Network: request blocking, throttling, cache disablement, request and response logs.
- Rendering: viewport changes, color scheme emulation, reduced motion, accessibility checks.
- Debugging: console streaming, exception capture, DOM snapshots.
## Page selection
When several app windows or tabs share a debug port:
- Match a positive marker for the surface under test, such as an app root selector.
- Add a negative marker to exclude the wrong surface when needed.
- When no page matches, list the available page titles and URLs and choose from them.
## Guardrails
- Re-query elements after navigation or structural changes.
- Click by coordinates only right after a fresh screenshot.
- Keep test data local and disposable.
- Ask before saving screenshots or heap snapshots from privacy-sensitive workspaces.
- Discover selectors, ports, and script paths from the current repo.
- Stop dev servers, debug sessions, and temporary profiles when done.
Keep scratch files in a gitignored `tmp/<task>/` at the project root, out of commits, and remove the task folder when work is merged or dropped unless someone still needs its evidence; leave test-owned temporary directories alone.From Camgineer/cstack, MIT.
More from Camgineer/cstack
- 0.569score
domain-modeling
Camgineer
Use when defining domain terms, editing a glossary, or recording an architecture decision.
SkillAFreshness: AClaude Code +9 - 0.569score
architect
Camgineer
Use when code needs a new module, public interface, or design choice.
SkillAFreshness: AClaude Code +9 - 0.569score
create-verification-skill
Camgineer
Use when an app lacks repeatable user-path verification, or its verification skill or feature map needs updating.
SkillAFreshness: AClaude Code +9 - 0.567score
design-ui
Camgineer
Use before building, changing, or critiquing UI appearance.
SkillAFreshness: AClaude Code +9 - 0.565score
csharp-best-practices
Camgineer
Use when reading or editing C#.
SkillAFreshness: AClaude Code +9 - 0.564score
correct
Camgineer
Use when agents repeat a mistake.
SkillAFreshness: AClaude Code +9 - 0.564score
blast-radius
Camgineer
Use when assessing what a change could break beyond its diff.
SkillAFreshness: AClaude Code +9 - 0.564score
deslop
Camgineer
Use when cleaning AI-generated code from a branch diff before commit.
SkillAFreshness: AClaude Code +9 - 0.561score
benchmark-checklist
Camgineer
Use before running a benchmark or reporting a measured speedup or regression.
SkillAFreshness: AClaude Code +9 - 0.558score
align
Camgineer
Use before a substantial change to agree scope, design, acceptance criteria, and verification in a signed spec.
SkillAFreshness: AClaude Code +9 - 0.558score
control-cli
Camgineer
Use to reproduce, verify, or profile interactive CLI behavior through a repeatable terminal harness.
SkillAFreshness: AClaude Code +9 - 0.539score
authoring-a-skill
Camgineer
Use when the user asks for authoring a skill.
SkillAFreshness: AClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Oct 12, 2026 (17 days ago)
- Last release
- Oct 16, 2026 (13 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/Camgineer/cstack
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from Camgineer
- 0.570score
swag
Camgineer
Use for look-and-feel work across web and native interfaces, terminal UIs and CLI output, diagrams, slides, generated images, and charts.
SkillAFreshness: AClaude Code +9 - 0.569score
architect
Camgineer
Use when code needs a new module, public interface, or design choice.
SkillAFreshness: AClaude Code +9 - 0.569score
domain-modeling
Camgineer
Use when defining domain terms, editing a glossary, or recording an architecture decision.
SkillAFreshness: AClaude Code +9 - 0.569score
create-verification-skill
Camgineer
Use when an app lacks repeatable user-path verification, or its verification skill or feature map needs updating.
SkillAFreshness: AClaude Code +9 - 0.567score
design-ui
Camgineer
Use before building, changing, or critiquing UI appearance.
SkillAFreshness: AClaude Code +9 - 0.565score
csharp-best-practices
Camgineer
Use when reading or editing C#.
SkillAFreshness: AClaude Code +9
Cite this page
control-ui skill. Agent Mart. https://agentmart.dev/skills/camgineer-control-ui (last updated 2026-10-24)