kramme-cc-workflow/skills/kramme:pr:ux-review/SKILL.md
Audit UI, UX, and product experience of PR and local changes using specialized agents for usability heuristics, product thinking, visual consistency, and accessibility. Supports inline report output with --inline. Use --team for multi-agent cross-validation.
npx skillsauth add abildtoft/kramme-cc-workflow kramme:pr:ux-reviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Audit the UI, UX, and product experience of a PR's changes, including local staged/unstaged/untracked work, using specialized agents.
Arguments: "$ARGUMENTS"
If $ARGUMENTS contains --team, remove that flag, read references/team-mode.md, and follow that workflow instead of the standard workflow below. Pass the remaining arguments through as the team-mode arguments.
http or equals auto → store as app_url (enables visual mode for agents)--categories flag → parse comma-separated list. Valid values: a11y, ux, product, visual, all--threshold N → store as custom_threshold (0-100). Overrides each agent's default confidence threshold. Only findings with confidence >= N will be reported. Default thresholds if not specified: a11y = 90, ux/product/visual = 70.--base <branch> → store as BASE_BRANCH_OVERRIDE--parallel (or deprecated bare parallel for backward compatibility) → launch agents in parallel instead of sequentially--team → use Team Mode and remove it from the remaining arguments--inline → set INLINE_MODE=true and do not write UX_REVIEW_OVERVIEW.mdBefore selecting files or launching agents:
AGENTS.md, CLAUDE.md, .github/copilot-instructions.md, markdown instruction files in repo-root .claude/, or equivalents).Use the shared plugin script to resolve the base branch and build the unified change scope (committed PR diff + staged + unstaged + untracked). It uses the same 3-tier strategy: explicit --base, PR target branch, then origin/HEAD/origin/main/origin/master. It runs in strict mode, so fetch failures stop the workflow with the script's stderr message.
COLLECT_ARGS=(--strict --format json)
[ -n "${BASE_BRANCH_OVERRIDE:-}" ] && COLLECT_ARGS+=(--base "$BASE_BRANCH_OVERRIDE")
RESOLVED=$("${CLAUDE_PLUGIN_ROOT}/scripts/collect-review-diff.sh" "${COLLECT_ARGS[@]}") || {
echo "Base/diff collection failed; see the message above and stop." >&2
exit 1
}
REVIEW_DIFF_FIELDS=$(mktemp "${TMPDIR:-/tmp}/review-diff.XXXXXX") || {
echo "Could not create temporary review-diff file; stop." >&2
exit 1
}
"${CLAUDE_PLUGIN_ROOT}/scripts/collect-review-diff.sh" --decode-json \
<<< "$RESOLVED" > "$REVIEW_DIFF_FIELDS" || {
rm -f "$REVIEW_DIFF_FIELDS"
echo "Base/diff decoding failed; see the message above and stop." >&2
exit 1
}
if ! {
IFS= read -r -d '' BASE_REF \
&& IFS= read -r -d '' BASE_BRANCH \
&& IFS= read -r -d '' MERGE_BASE \
&& IFS= read -r -d '' CHANGED_FILES
} < "$REVIEW_DIFF_FIELDS"; then
rm -f "$REVIEW_DIFF_FIELDS"
echo "Decoded review-diff fields were incomplete; stop." >&2
exit 1
fi
rm -f "$REVIEW_DIFF_FIELDS"
The shared JSON decoder sets BASE_REF, BASE_BRANCH, MERGE_BASE, and newline-delimited CHANGED_FILES. Use CHANGED_FILES for the file filtering below.
Read references/ui-relevance-heuristics.md, then filter for UI-relevant files using this contract marker: UI relevance path contract: ui-relevance-path-contract-v1.
A file is UI-relevant when it matches any of these categories:
*.tsx, *.jsx, *.vue, *.svelte, *.astro, *.mdx, *.component.ts, *.component.html*.html, *.htm, *.hbs, *.ejs, *.pug*.css, *.scss, *.sass, *.less, *.styl, *.styled.ts, *.styled.js, *.module.css, *.module.scsstailwind.config.*, theme.*, files under design-tokens/pages/, views/, screens/, routes/, or app/component/, components/, ui/, widgets/, layouts/, or templates/styles/ or css/public/, static/, or assets/ (*.svg, *.png, *.jpg, *.jpeg, *.gif, *.webp, *.avif, *.ico)After identifying the changed UI files, discover any additional nested instruction files that apply to those files (for example AGENTS.md, CLAUDE.md, .github/copilot-instructions.md, markdown instruction files in a nearby .claude/ directory, or tool-specific equivalents) and merge those constraints into the conventions from Step 2 before launching reviewer agents.
If no UI-relevant files found:
No UI-relevant files detected in this PR or local working tree.
Changed files: {list file types}
No UI/UX changes detected to audit.
Action: Stop.
If UX_REVIEW_OVERVIEW.md exists in the project root:
PROD-NNN, VIS-NNN, and A11Y-NNN) from older UX audit reports as previously addressed identifiers; new UX audit reports use artifact-scoped UX-NNN IDs. Remove this legacy-ID acceptance once existing UX_REVIEW_OVERVIEW.md artifacts contain only UX-NNN IDs (i.e., once reports generated before the UX-NNN switch are no longer in circulation).Always launch (if UI files changed):
Conditionally launch:
kramme:a11y-auditor — accessibility (WCAG 2.1 AA)
Only launch if accessibility is a project requirement:
accessibility, a11y, WCAG, aria, screen readerpackage.json for a11y tooling: eslint-plugin-jsx-a11y, axe-core, pa11y, @axe-core/*.accessibilityrc, a11y rules in ESLint/Biome config--categories a11y or --categories allNote: A11y audit skipped — no accessibility requirements detected in this project.
Use `--categories a11y` to run it explicitly.
Respect --categories filter:
--categories ux → only launch kramme:ux-reviewer--categories a11y → launch kramme:a11y-auditor regardless of detection--categories product,visual → launch kramme:product-reviewer and kramme:visual-reviewer--categories all → launch all 4 agents (a11y included regardless of detection)--categories flag → launch the 3 core agents + a11y only if detectedIf app_url was provided:
If app_url is auto, resolve it with the shared dev-server detector before checking browser automation:
if ${CLAUDE_PLUGIN_ROOT}/scripts/dev-server/detect-url.sh auto; then
:
else
printf '%s\n' "__DETECTOR_UNAVAILABLE__"
fi
http://... or https://... — replace app_url with the resolved URL.__MULTIPLE_URLS__ — list candidates and ask the user to choose one; if non-interactive, clear app_url, warn, and continue in code-only mode.__NO_RUNNING_SERVER__ — clear app_url, warn, and continue in code-only mode.__DETECTOR_UNAVAILABLE__ — ask the user for the dev-server URL; if non-interactive, clear app_url, warn that the shared detector is unavailable, and continue in code-only mode.Check for available browser MCP tools (in priority order):
mcp__claude-in-chrome__* toolsmcp__chrome-devtools__* toolsmcp__playwright__* toolsIf found → pass app_url and browser MCP type to agents so they can take screenshots
If none found:
Warning: No browser automation MCP detected. Using code-only analysis.
For visual review, install one of:
- Claude in Chrome extension (recommended)
- Chrome DevTools MCP
- Playwright MCP
Continue in code-only mode.
For each applicable agent, launch the reviewer using the platform's agent-invocation primitive with:
BASE_BRANCH, BASE_REF, and MERGE_BASE from Step 3, so agents use the correct diff scopegit diff "$MERGE_BASE"...HEAD (using the base resolved in Step 3)git diff --cachedgit diffgit ls-files --others --exclude-standard (agents should treat these as new files and review full file content)app_url and browser MCP type (if visual mode)custom_threshold was provided: instruct the agent to use this threshold instead of its default (e.g., "Only report findings with confidence >= {custom_threshold}")Sequential (default): Launch agents one at a time. Easier to read and act on.
Parallel (if user passes --parallel): Launch all agents simultaneously. Faster but results come back together.
Mode field: If app_url was provided, set Mode to Visual + Code in the output template; otherwise Code-only.
Agent failure handling. If a selected reviewer agent is unavailable, times out, or returns output that cannot be parsed as findings, record the failed agent name and what was attempted. Continue only if at least one selected reviewer succeeded, and include a degraded-coverage banner in the final report: Coverage degraded: <agent names> failed; findings below exclude <categories>. If all selected reviewers fail, or if the relevance validator fails, stop without writing UX_REVIEW_OVERVIEW.md. Do not fabricate findings or present a partial audit as complete.
After collecting findings from all agents:
BASE_BRANCHIf UX_REVIEW_OVERVIEW.md was found in Step 4:
After validation and filtering, organize findings:
If INLINE_MODE=true:
assets/ux-review-report-format.mdUX_REVIEW_OVERVIEW.mdOtherwise, write to UX_REVIEW_OVERVIEW.md in the project root using the report format from assets/ux-review-report-format.md. Include all sections even if empty (with count of 0).
When file output is used, UX_REVIEW_OVERVIEW.md is a working artifact — it should NOT be committed. It is intended to be cleaned up by /kramme:workflow-artifacts:cleanup when that skill is installed.
If Critical or Important issues found, suggest running /kramme:pr:resolve-review to address them.
Full UX audit (code-only):
/kramme:pr:ux-review
UX audit with visual review:
/kramme:pr:ux-review http://localhost:3000
Specific categories:
/kramme:pr:ux-review --categories ux,product
# Only usability and product review
/kramme:pr:ux-review --categories a11y
# Accessibility only (runs regardless of project detection)
/kramme:pr:ux-review --categories visual
# Visual consistency and responsive only
Custom threshold (only report high-confidence findings):
/kramme:pr:ux-review --threshold 90
# Only findings with confidence >= 90 are reported
/kramme:pr:ux-review --threshold 50
# Lower bar — more findings, including lower-confidence suggestions
Parallel execution:
/kramme:pr:ux-review --parallel
# All applicable agents run simultaneously
Combined:
/kramme:pr:ux-review http://localhost:4200 --categories ux,visual --threshold 85 --parallel
Inline report (no markdown file):
/kramme:pr:ux-review --inline
/kramme:pr:ux-review http://localhost:3000 --categories ux,visual --inline
kramme:a11y-auditor:
kramme:ux-reviewer:
kramme:product-reviewer:
kramme:visual-reviewer:
tools
Requires Linear MCP. Implements one Linear issue end to end, selects applicable code-review, convention, and PR-refactor gates, runs them to bounded convergence, verifies, and optionally opens the PR and iterates on CI and review feedback until green. Use when the user wants a single Linear issue taken from implementation through a clean Pull Request. Not for implementation-only work, SIW-tracked issues, stacked PRs, existing PR updates, or post-merge rollout.
development
Reviews PR and local changes for convention drift and overcaution against documented rules and mined peer-file practice. Use for new patterns, dependencies, abstractions, or defensive complexity that departs from established practice; every finding cites evidence. Supports --inline. Not for general code quality (use kramme:pr:code-review) or spec review (use kramme:siw:spec-audit --team).
testing
Charts huge or foggy initiatives into a local `.context` decision map and resolves one typed frontier ticket per session until the work is ready for SIW or another execution workflow. Use when the route to a destination cannot fit in one agent session or parallel workspaces need coordinated planning state. Not for clear specs, ordinary issue decomposition, implementation, or Linear-native tracking.
development
Investigates a question against primary sources and saves one cited Markdown artifact. Use for reading legwork: official docs/API facts, source-code or spec checks, standards, and first-party service behavior before planning or implementation. Not for making product or architecture decisions, implementing code, broad web search, secondary blog summaries, or uncited answers.