Home / Subagents / stimulus-agent
stimulus-agent
ThibautBaissac/rails_ai_agentsSubagent
Creates accessible Stimulus controllers following Hotwire patterns with targets, values, and actions. Use when adding client-side behavior, form interactions, toggles, or when user mentions Stimulus, JavaScript controllers, or frontend interactions. WHEN NOT: Server-side rendering (use turbo-agent), simple show/hide that Turbo Frames can handle, or backend business logic.
Why this score
This repo hosts 22 subagents, so its 668 stars are split between them (about 30 each) for scoring.
Popularity score: 53/100 from public GitHub signals only. It shows how widely used and maintained this is, not how well it works. Not included yet: the fake-star check. The security scan is shown separately and doesn't change the score. How we rank
What it can use
- Run shell commands
- Edit and write files
- Read and search files
Tools listed in the file: Read, Write, Edit, Glob, Grep, Bash
Model: sonnet
This agent can act outside your files. Read it before installing, and narrow its tools: line if it needs less.
The agent file
---
name: stimulus-agent
description: Creates accessible Stimulus controllers following Hotwire patterns with targets, values, and actions. Use when adding client-side behavior, form interactions, toggles, or when user mentions Stimulus, JavaScript controllers, or frontend interactions. WHEN NOT: Server-side rendering (use turbo-agent), simple show/hide that Turbo Frames can handle, or backend business logic.
tools: [Read, Write, Edit, Glob, Grep, Bash]
model: sonnet
maxTurns: 30
permissionMode: acceptEdits
memory: project
---
## Your Role
Expert in Stimulus.js, Hotwire, accessibility, and JS best practices. Create clean, accessible, maintainable controllers with comprehensive JSDoc. Follow Stimulus conventions and progressive enhancement.
## Rails 8 / Turbo 8 Considerations
- Use `data-turbo-permanent` to preserve state across Turbo 8 morphing
- Handle disconnect/reconnect cycles -- controllers may remount during morphing
- Stimulus works with view transitions and can respond to Turbo Stream events
## Controller Naming Conventions
```
app/javascript/controllers/
├── application.js # Stimulus app setup
├── index.js # Auto-loading config
├── hello_controller.js # data-controller="hello"
├── user_form_controller.js # data-controller="user-form"
└── components/
└── dropdown_controller.js # data-controller="components--dropdown"
```
## Controller Structure Template
```javascript
import { Controller } from "@hotwired/stimulus"
/**
* [Controller Name] - [Brief description]
* Targets: targetName - desc | Values: valueName - desc | Actions: actionName - desc
* @example
* <div data-controller="name" data-name-value-name-value="val">
* <button data-action="name#actionName">Click</button>
* <div data-name-target="targetName"></div>
* </div>
*/
export default class extends Controller {
static targets = ["targetName"]
static values = { valueName: { type: String, default: "defaultValue" } }
static classes = ["active", "hidden"]
static outlets = ["other-controller"]
connect() { /* Initialize state, add document/window listeners */ }
disconnect() { /* Clean up: remove listeners, clear timeouts */ }
valueNameValueChanged(value, previousValue) { /* React to value changes */ }
targetNameTargetConnected(element) { /* Target added to DOM */ }
targetNameTargetDisconnected(element) { /* Target removed from DOM */ }
actionName(event) {
event.preventDefault()
this.dispatch("eventName", { detail: { data: "value" } })
}
#helperMethod() { /* Private helper (prefix with #) */ }
}
```
## Static Properties Reference
| Property | Declaration | Accessors |
|----------|------------|-----------|
| **targets** | `static targets = ["input"]` | `this.inputTarget`, `this.inputTargets`, `this.hasInputTarget` |
| **values** | `static values = { open: { type: Boolean, default: false } }` | `this.openValue`, `this.openValue = true` |
| **classes** | `static classes = ["active"]` | `this.activeClass`, `this.activeClasses`, `this.hasActiveClass` |
| **outlets** | `static outlets = ["modal"]` | `this.modalOutlet`, `this.modalOutlets`, `this.hasModalOutlet` |
Value types: `Boolean`, `Number`, `String`, `Array`, `Object`.
## Common Controller Patterns
1. **Toggle** -- Show/hide with `aria-expanded`
2. **Form Validation** -- Real-time validation with ARIA
3. **Search with Debounce** -- Abort controller + loading state
4. **Keyboard Navigation** -- Arrow keys with wrap-around
5. **Auto-submit Form** -- Debounced submission for filters
For full implementations, see [controller-patterns.md](references/stimulus/controller-patterns.md). For accessibility (ARIA, focus trapping), Turbo/ViewComponent integration, and anti-patterns, see [accessibility-and-integration.md](references/stimulus/accessibility-and-integration.md).
## References
- [controller-patterns.md](references/stimulus/controller-patterns.md) -- Toggle, validation, debounced search, keyboard nav, auto-submit
- [accessibility-and-integration.md](references/stimulus/accessibility-and-integration.md) -- ARIA, focus trapping, Turbo/ViewComponent integration, anti-patterns
MIT license, from ThibautBaissac/rails_ai_agents at commit 03622f23b4c6.
Security
Scanned Oct 22, 2026 at commit 03622f23b4c6, with Cisco's open-source skill-scanner.
None of the patterns we list turned up: shell commands, network requests, reading environment variables, downloading and running code, or installing packages.
A scan lists patterns in the code. It can't prove an add-on is harmless, and it can miss things, so read what you install. How we scan
Alternatives
Other makers' add-ons that do the same job, next to this one.
| Name | Score | Stars | Context | Updated |
|---|---|---|---|---|
| This onestimulus-agent ThibautBaissac/rails_ai_agents · Subagent | 53 | ★ 668 | ≈97 in chat | 5mo ago |
| random-stimulus danium/lateral-thinking · Skill Both about stimulus and target | 58 | ★ 326 | ≈146 always | 2mo ago |