007
無料Security audit, hardening, threat modeling (STRIDE/PASTA), Red/Blue Team, OWASP checks, code review, incident response, and infrastructure security for any project.
日本語の概要は準備中です。原文の説明を表示しています。
Use this skill when the user asks about ARIA, ARIA roles, ARIA attributes, aria-label, aria-labelledby, aria-describedby, aria-expanded, aria-hidden, aria-live, aria-required, aria-invalid, "WAI-ARIA", "ARIA Authoring Practices", "APG pattern", "accessible name", "accessible description", live regions, custom widgets, dialogs, menus, tabs, accordions, comboboxes, tooltips, tree views, carousels, or is building any custom interactive component that requires ARIA roles and keyboard behavior beyond native HTML elements.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Skill type: Reference. This is teaching/pattern content — it explains the WAI-ARIA APG keyboard contracts and ARIA state rules for custom widgets. It is not a scanner. For static review of existing ARIA usage, use
/a11y-review. For runtime verification of ARIA validity against resolved roles, use thea11y-testingskill to set up real axe.
ARIA (Accessible Rich Internet Applications) extends HTML semantics for custom, dynamic UI components. It supplements — never replaces — native HTML.
The ARIA First Principles:
<button> before role="button". Use <select> before a custom combobox.ARIA adds three things to elements in the accessibility tree:
role="dialog", role="tab")aria-label, aria-required)aria-expanded, aria-checked, aria-invalid)Every interactive element needs an accessible name. The browser computes it in this priority order:
aria-labelledby (references another element's text — highest priority)aria-label (inline text string)<label for="id">)title attribute (last resort — inconsistent screen reader support)<!-- Priority 1: aria-labelledby -->
<h2 id="section-title">Billing Address</h2>
<section aria-labelledby="section-title">...</section>
<!-- Priority 2: aria-label (when no visible text exists) -->
<button aria-label="Close dialog">
<svg aria-hidden="true">...</svg>
</button>
<!-- Priority 3: Associated label -->
<label for="card-number">Card Number</label>
<input id="card-number" type="text">
<!-- Priority 4: Button text -->
<button>Submit Order</button>
aria-describedby provides supplementary information — announced after the name, often as a separate speech unit:
<label for="password">Password</label>
<input
id="password"
type="password"
aria-describedby="password-hint password-error"
>
<p id="password-hint">Must be at least 8 characters.</p>
<p id="password-error" aria-live="polite"></p>
Multiple IDs in aria-describedby are read in order.
<!-- Background content inert when modal open -->
<main inert aria-hidden="true">...</main>
<div
role="dialog"
aria-modal="true"
aria-labelledby="dialog-title"
aria-describedby="dialog-desc"
>
<h2 id="dialog-title">Confirm Deletion</h2>
<p id="dialog-desc">This action cannot be undone.</p>
<button type="button">Cancel</button>
<button type="button">Delete</button>
</div>
Required behavior:
Tab and Shift+Tab within the dialogEscape: Close dialog, return focus to the trigger elementrole="alertdialog" — for urgent dialogs requiring immediate response (e.g., unsaved changes warning). Screen readers interrupt current speech to announce it.
<div role="tablist" aria-label="Settings Sections">
<button role="tab" aria-selected="true" aria-controls="panel-general" id="tab-general">General</button>
<button role="tab" aria-selected="false" aria-controls="panel-security" id="tab-security" tabindex="-1">Security</button>
<button role="tab" aria-selected="false" aria-controls="panel-billing" id="tab-billing" tabindex="-1">Billing</button>
</div>
<div role="tabpanel" id="panel-general" aria-labelledby="tab-general">...</div>
<div role="tabpanel" id="panel-security" aria-labelledby="tab-security" hidden>...</div>
<div role="tabpanel" id="panel-billing" aria-labelledby="tab-billing" hidden>...</div>
Keyboard behavior (roving tabindex):
| Key | Action |
|---|---|
Tab | Enter tablist on active tab; Tab again exits to tabpanel |
→ / ← | Move to next/previous tab (wraps); auto-activates tab |
Home | Move to first tab |
End | Move to last tab |
Enter / Space | Activate tab (manual activation variant) |
Roving tabindex: Only the active tab has tabindex="0". All others have tabindex="-1". JavaScript updates both on navigation.
<h3>
<button
type="button"
aria-expanded="false"
aria-controls="faq-1-content"
id="faq-1-btn"
>
What is your return policy?
</button>
</h3>
<div id="faq-1-content" role="region" aria-labelledby="faq-1-btn" hidden>
<p>You may return items within 30 days...</p>
</div>
Rules:
aria-expanded="true/false" on the trigger button — must be JS-driven, never hardcodedaria-controls links button to its panel (ID reference)hidden / aria-hidden="true" on collapsed panels<label for="country-input">Country</label>
<div role="combobox"
aria-expanded="false"
aria-haspopup="listbox"
aria-owns="country-listbox">
<input
id="country-input"
type="text"
autocomplete="off"
aria-autocomplete="list"
aria-controls="country-listbox"
aria-activedescendant=""
>
</div>
<ul id="country-listbox" role="listbox" aria-label="Countries">
<li role="option" id="opt-us" aria-selected="false">United States</li>
<li role="option" id="opt-ca" aria-selected="false">Canada</li>
</ul>
Keyboard behavior:
| Key | Action |
|---|---|
↓ | Open list, move to first option |
↑ / ↓ | Navigate options |
Enter | Select focused option |
Escape | Close list |
Home / End | Jump to first/last option |
Update aria-activedescendant on the input to the ID of the currently highlighted option.
Use role="menu" for application menus (File, Edit, View), NOT for navigation. Use <nav> + <ul> for site navigation.
<button
type="button"
aria-haspopup="menu"
aria-expanded="false"
aria-controls="actions-menu"
id="actions-btn"
>
Actions ▾
</button>
<ul role="menu" id="actions-menu" aria-labelledby="actions-btn">
<li role="menuitem"><button type="button">Edit</button></li>
<li role="menuitem"><button type="button">Duplicate</button></li>
<li role="separator"></li>
<li role="menuitem" aria-disabled="true"><button type="button" disabled>Archive</button></li>
<li role="menuitem"><button type="button">Delete</button></li>
</ul>
Keyboard behavior:
| Key | Action |
|---|---|
↓ / ↑ | Navigate items (wraps) |
Enter / Space | Activate item |
Escape | Close menu, return focus to trigger |
Home / End | Jump to first/last item |
A–Z | Type-ahead selection |
Live regions announce dynamic content changes to screen readers without requiring a focus move.
aria-live Values| Value | Behavior | Use For |
|---|---|---|
polite | Waits for user to finish current action | Status updates, form feedback, search results loading |
assertive | Interrupts immediately | Critical errors, urgent alerts |
off (default) | No announcement | Most content |
<!-- Status messages (polite) -->
<div role="status" aria-live="polite" aria-atomic="true">
<!-- Inject text here when status changes -->
</div>
<!-- Error alerts (assertive) -->
<div role="alert" aria-live="assertive">
<!-- Inject critical error message here -->
</div>
role="alert" = implicit aria-live="assertive" + aria-atomic="true"role="status" = implicit aria-live="polite" + aria-atomic="true"role="log" = implicit aria-live="polite" for sequential messages (chat, audit trail)role="timer" = implicit aria-live="off" — only announce value when directly focusedToast notifications:
<!-- Single persistent container in DOM; inject/clear text dynamically -->
<div id="toast-region" role="status" aria-live="polite" aria-atomic="true" class="sr-only">
<!-- JS sets textContent here; empty string clears it -->
</div>
Loading state:
<div aria-busy="true" aria-live="polite">
<p>Loading search results...</p>
</div>
<!-- When complete, set aria-busy="false" and replace content -->
Form error summary:
<div role="alert" aria-live="assertive" id="error-summary">
<!-- Inject on submit: "3 errors found. Please correct: Email is required, ..." -->
</div>
Critical rule: The live region container must exist in the DOM before you inject content into it. Adding both the container and the content simultaneously often fails to trigger announcements.
aria-hidden="true" removes an element and all its descendants from the accessibility tree.
<!-- Decorative icon inside a labeled button -->
<button type="button" aria-label="Close">
<svg aria-hidden="true" focusable="false">...</svg>
</button>
<!-- Decorative image -->
<img src="hero-bg.jpg" alt="" aria-hidden="true">
<!-- Modal: hide background content -->
<main aria-hidden="true" inert>...</main>
<!-- ❌ CRITICAL: aria-hidden on a focusable element -->
<button aria-hidden="true">Submit</button>
<!-- Screen reader can't see it; keyboard user can still Tab to it — disorienting -->
<!-- ❌ CRITICAL: aria-hidden ancestor contains focusable descendants -->
<div aria-hidden="true">
<button>Click me</button> <!-- Keyboard reaches it; screen reader can't -->
</div>
<!-- ❌ Never hide content that provides information without a visible alternative -->
<nav aria-hidden="true">
<a href="/">Home</a> <!-- Navigation is now invisible to AT users -->
</nav>
Rule: If aria-hidden="true" is on an element, that element and all its children must be non-focusable. Use inert attribute as the modern alternative (removes focus AND hides from AT simultaneously).
// ❌ WRONG: String "true"/"false" — technically works, but brittle
<button aria-expanded="true">Toggle</button>
// ✅ CORRECT: JSX boolean expression — stays in sync with state
const [isOpen, setIsOpen] = useState(false);
<button aria-expanded={isOpen}>Toggle</button>
// ✅ CORRECT: Radix passes all ARIA props through asChild
<Dialog.Trigger asChild>
<Button variant="outline"> {/* Button must spread props + forwardRef */}
Open
</Button>
</Dialog.Trigger>
// ❌ WRONG: Custom component that swallows props
const Button = ({ children, onClick }) => (
<button onClick={onClick}>{children}</button>
// Missing: {...props} spread — loses aria-haspopup, aria-expanded, etc.
);
Used in: tablist, toolbar, menu, listbox, tree, radiogroup, grid
const [focusedIndex, setFocusedIndex] = useState(0);
const itemRefs = useRef([]);
function handleKeyDown(e, index) {
const count = items.length;
if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {
const next = (index + 1) % count;
setFocusedIndex(next);
itemRefs.current[next]?.focus();
}
if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {
const prev = (index - 1 + count) % count;
setFocusedIndex(prev);
itemRefs.current[prev]?.focus();
}
if (e.key === 'Home') { setFocusedIndex(0); itemRefs.current[0]?.focus(); }
if (e.key === 'End') { const last = count-1; setFocusedIndex(last); itemRefs.current[last]?.focus(); }
}
return (
<div role="tablist">
{items.map((item, i) => (
<button
key={item.id}
role="tab"
tabIndex={i === focusedIndex ? 0 : -1}
aria-selected={i === focusedIndex}
ref={el => itemRefs.current[i] = el}
onKeyDown={e => handleKeyDown(e, i)}
onClick={() => setFocusedIndex(i)}
>
{item.label}
</button>
))}
</div>
);
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Security audit, hardening, threat modeling (STRIDE/PASTA), Red/Blue Team, OWASP checks, code review, incident response, and infrastructure security for any project.
日本語の概要は準備中です。原文の説明を表示しています。
Guides the creation of agile user stories and Gherkin feature files. Use when the user wants to create a user story, write acceptance criteria, define Gherkin scenarios, or author BDD feature files. This should trigger for requests such as Create a user story; Write a user story; I need to write a user story. Part of cursor-rules-java project
日本語の概要は準備中です。原文の説明を表示しています。
Facilitates conversational discovery to create Architectural Decision Records (ADRs) for non-functional requirements using the ISO/IEC 25010:2023 quality model. Use when the user wants to document quality attributes, NFR decisions, security/performance/scalability architecture, or design systems with measurable quality criteria. This should trigger for requests such as Create ADR for Non-functional requirements; Document Non-functional requirements; Capture Non-functional requirements; Generate Non-functional requirements in an ADR. Part of cursor-rules-java project
日本語の概要は準備中です。原文の説明を表示しています。
Run a health check on an existing project: dependency audit, security scan, test runner detection, CI/CD evaluation, and missing configuration analysis. Maps the three execution gates (pre/in/post) from /10x-bootstrapper to an assessment framework for existing codebases. Reads optional context/foundation/stack-assessment.md from /10x-stack-assess to focus checks on identified gaps. Writes context/foundation/health-check.md with findings, prioritized fixes, and an agent-readiness verdict. Use when the user has an existing project and wants to verify its health before working with an agent. Trigger phrases: "health check", "check my project", "audit my project", "is my project healthy", "sprawdź projekt", "audyt projektu", "health-check", "project health". Use AFTER /10x-stack-assess (brownfield chain), BEFORE agent onboarding (m1-l4).
日本語の概要は準備中です。原文の説明を表示しています。
You MUST use this when building projects end-to-end. Orchestrates all 12 team roles — automatically switches between CTO, architect, PM, engineers, SRE, security, DBA, QA, and EM based on the current phase of work. Starts with brainstorming before any implementation.
日本語の概要は準備中です。原文の説明を表示しています。
Use when you need to add or configure Maven plugins in your pom.xml — including quality tools (enforcer, surefire, failsafe, jacoco, pitest, spotbugs, pmd), security scanning (OWASP), code formatting (Spotless), version management, container image build (Jib), build information tracking, and benchmarking (JMH) — through a consultative, modular step-by-step approach that only adds what you actually need. This should trigger for requests such as Add Maven plugins in pom.xml; Improve Maven plugins in pom.xml. Part of cursor-rules-java project
日本語の概要は準備中です。原文の説明を表示しています。