Developing Internal Hooks
SkillAI & modelsCreate, configure, and develop custom automation hooks, slash commands, event hooks, and dynamic skills under internal-hooks/
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Developing Internal Hooks skill
What this skill tells your AI
The instructions your AI receives, as published by rudycity/superagent in .agents/skills/internal-hooks/SKILL.md and read by ahel’s review.
Overview
Internal Hooks are custom user-defined scripts placed in subdirectories under internal-hooks/ at the root of the project. They are loaded dynamically at startup and allow extending Superagent's functionality in four powerful ways:
- AI Agent Tools: Dynamic custom tools available for AI agent execution.
- Custom Slash Commands: Custom command shortcuts available directly in the terminal CLI interface (e.g.
/my-command). - Event Hooks: Event-driven hooks executed during critical lifecycle points (e.g. pre-tool, post-tool, pre-command, post-command).
- Dynamic Skills: Custom agent instruction bundles (
skills/<skill_name>/SKILL.md) packaged directly inside your hook folder.
Hook File Structure
Every hook must be placed in a subdirectory: internal-hooks/<hook_name>/. The structure MUST contain the following:
internal-hooks/<hook_name>/
├── hook.json # Root schema mapping tools, slash commands, and event hooks
├── package.json # Dependency and script management
├── index.js # Entrypoint script executing logic
├── test-payload.json # Stdin mock argument payload for local dev loop testing
├── README.md # [Mandatory] Hook documentation
├── CHANGELOG.md # [Mandatory] Hook release notes
└── skills/ # [Optional] Dynamic agent skills directory
└── <my-custom-skill>/
└── SKILL.md # Skill markdown documentation for agent instruction
Mandatory Setup Requirements
All internal hooks are strictly required to have:
- README.md: Clear documentation explaining the hook's features, input arguments, environment variables, outputs, and how it behaves.
- CHANGELOG.md: A semantic versioning changelog following the Keep a Changelog format, tracking all versions, improvements, bug fixes, and breaking changes.
- Git Initialization: The hook subdirectory must be initialized as its own local Git repository (
git init). This is done automatically by/ih init <hook_name>, which scaffolds the mandatory files and configures git.
1. hook.json Configuration
Defines the dynamic tools, custom slash commands, and event hooks.
{
"name": "my_hook_tool",
"description": "Expose this custom tool to the AI agent. Describe what it does.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query."
}
},
"required": ["query"]
},
"command": "node index.js --tool",
"slash_commands": [
{
"name": "my-cmd",
"aliases": ["mc"],
"description": "Trigger my custom command manually in the terminal.",
"command": "node index.js --cmd"
}
],
"event_hooks": [
{
"event": "pre_tool",
"command": "node index.js --event pre_tool"
},
{
"event": "post_tool",
"command": "node index.js --event post_tool"
},
{
"event": "pre_command",
"command": "node index.js --event pre_command"
},
{
"event": "post_command",
"command": "node index.js --event post_command"
}
]
}
2. Script Logic (index.js)
Scripts can handle inputs depending on whether they are triggered as a tool, command, or event.
- AI Agent Tools: Stdin receives the parameter JSON from the agent.
- Custom Slash Commands: Stdin is unused. Arguments typed after the command are appended as command line parameters (e.g.
/my-cmd hellocallsnode index.js --cmd hello). - Event Hooks: Stdin receives a JSON string containing event metadata.
pre_tool/post_tool:{ "toolName": string, "args": object, "result"?: any, "cwd": string }pre_command/post_command:{ "command": string, "name": string, "args": string }
import fs from "fs";
// Read piped stdin if present
const stdinContent = fs.readFileSync(0, "utf-8").trim();
let stdinData = {};
if (stdinContent) {
try {
stdinData = JSON.parse(stdinContent);
} catch (e) {
stdinData = { raw: stdinContent };
}
}
const args = process.argv.slice(2);
console.log("Hook executed successfully!");
console.log("Arguments passed:", args);
console.log("Stdin JSON read:", JSON.stringify(stdinData));
Dynamic Skills
If an active hook contains a skills/ subdirectory, any skill bundles nested inside it (e.g. skills/my-skill/SKILL.md) will automatically be loaded on startup.
- They will appear in
/skillslist. - They will have tab autocomplete suggestions (
/skill-my-skillor/skill my-skill). - The AI agent will be able to reference and read them automatically.
Activating Hooks
Hooks are loaded and activated on a per-project basis. There are three ways hooks can be activated:
- Auto-Activation upon Initialization: When you initialize a new hook using
/ih init <hook_name>, it is automatically added to the active list for the current project. - Interactive Selection via CLI: Run
/ih activein the terminal to open an interactive multi-select checkbox list. Checked hooks are activated, and unchecked hooks are deactivated. - Persisted Configuration: The active status of hooks is stored inside the global settings file
~/.superagent-r/model-config.jsonunder theactiveHooksobject, keyed by the project's absolute folder path. To activate a hook programmatically, add its directory name to the array mapping for your project path.
Commands Reference
- Initialize hook project:
/ih init <hook_name> - Run local development loop:
/ih dev <hook_name>(Runs thedevscript inpackage.jsonwithtest-payload.jsonpiped as stdin) - Toggle active hooks:
/ih active(Opens an interactive checklist to toggle which hooks are active)
Best Practices
- Autocomplete Integration: Dynamic slash commands registered by hooks are automatically indexed by the terminal's autocomplete suggestion system.
- Standard Outputs: Print clean output to
stdoutto return values to the agent or terminal. - Errors: Run error messages to
stderrand terminate with a non-zero exit code (process.exit(1)) to indicate failures. - Interactive Guards: Avoid interactive CLI prompts since agent tools and event hooks run headlessly in the background.
- Environment Variables: Access the hook directory using
process.env.SUPERAGENT_HOOK_DIR, the active workspace directory usingprocess.env.SUPERAGENT_CWD, and the lifecycle event type viaprocess.env.SUPERAGENT_EVENT(for event hooks). - Mandatory Documentation & Versioning: Ensure all hook workspaces are initialized as Git repositories and contain both a
README.mdand aCHANGELOG.mdto track usage instructions and history.
Signals
- GitHub stars
- 21
- Forks
- 3
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
developing-internal-hooks- Source
- github.com/rudycity/superagent