<< All versions
Skill v1.0.1
currentLLM-judged scan90/100diegosouzapw/awesome-omni-skill/create-hook
1 files
──Details
PublishedJune 24, 2026 at 09:36 PM
Content Hashsha256:c48613ac07d9076b...
Git SHAa6b3c3005ced
Bump Typepatch
──Files
Files (1 file, 3.5 KB)
SKILL.md3.5 KBactive
SKILL.md · 79 lines · 3.5 KB
version: "1.0.1" name: create-hook description: Creates or adds Cursor agent lifecycle hooks. Use when the user asks to create a hook, add a hook, set up a lifecycle hook, or automate something on agent stop, afterFileEdit, afterAgentResponse, or other Cursor hook events. Hooks live in .cursor/hooks/ and are registered in .cursor/hooks.json.
Create Hook
Type: Utility skill (procedural, no agentic lead or sub-agents).
Adds a Cursor lifecycle hook: a script that runs when a specific agent event fires. Hooks are project-level only (.cursor/hooks/ and .cursor/hooks.json).
1. Choose the lifecycle event
Register the hook under one of these keys in hooks.json:
| Event | When it runs | |
|---|---|---|
stop | When the agent stops (end of turn) | |
afterFileEdit | After the agent edits a file | |
afterAgentResponse | After the agent sends a response | |
beforeSubmitPrompt | Before the user's prompt is submitted | |
beforeReadFile / afterShellExecution / etc. | See Cursor docs for full list |
2. Add the script
- Path:
.cursor/hooks/<name>.js(or.shif shell). Use a clear name (e.g.memory-reminder.js,on-stop.js). - Runtime: Node.js is typical; command in
hooks.jsonis run with Cursor's working directory set so thatnode hooks/<name>.jsresolves (run from.cursor). - Input: The hook receives a single JSON object on stdin. Read it like this:
javascript
let input = "";process.stdin.setEncoding("utf8");process.stdin.on("data", (chunk) => {input += chunk;});process.stdin.on("end", () => {const payload = JSON.parse(input);const roots = payload.workspace_roots || [process.cwd()];const root = path.resolve(roots[0]); // repo root// ... use root for paths like path.join(root, '.cursor', 'next-step.md')});
- Payload: Often includes
workspace_roots(array of repo roots). Use the first root as the project root for paths. Event-specific payloads may includefile_path,prompt, etc. - Output: Hook can write files (e.g.
.cursor/next-step.md), log to stderr, or exit; avoid writing to stdout if the protocol expects JSON there. - Shebang: Start Node scripts with
#!/usr/bin/env node.
3. Register in hooks.json
- Path:
.cursor/hooks.json - Format:
json
{"version": 1,"hooks": {"stop": [{ "command": "node hooks/on-stop.js" },{ "command": "node hooks/my-new-hook.js" }]}}
- Append to the array for the chosen event; do not remove existing hooks unless the user asks to replace them.
Checklist
- [ ] Script created under
.cursor/hooks/<name>.js(or.sh) - [ ] Script reads JSON from stdin and uses
workspace_rootsfor repo root when needed - [ ] Entry added to
.cursor/hooks.jsonunder the correct event key - [ ] Command is
node hooks/<name>.js(or./hooks/<name>.sh); path is relative to.cursor
Reference
- Existing hooks in this repo:
.cursor/hooks/on-stop.js,.cursor/hooks/after-file-edit.js,.cursor/hooks/memory-reminder.js— use them as patterns for stdin handling andpath.join(root, ...). - Project memory (
.cursor/memory.md) notes that new hooks should be added under.cursor/hooks/and registered in.cursor/hooks.json.