# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Overview `iamwaiting` is a Babashka CLI tool that sends Discord webhook notifications when Claude Code is waiting for user input. It's designed to be used as a hook in Claude Code to notify users on Discord when their attention is needed. ## Architecture ### Core Concept The tool integrates with Claude Code's hook system to send real-time notifications to Discord when Claude is waiting for user input. This allows users to be notified on Discord when they need to return to their terminal/editor. ### Code Structure The entire implementation is a single Babashka script (`iamwaiting`) with these key functions: - `load-config` - Loads webhook URL and toggles from config file or environment variable - `send-discord-webhook` - Makes HTTP POST request to Discord webhook API - `format-waiting-message` - Formats the notification message with project context - `setup-config` - Interactive setup wizard for webhook configuration - `test-webhook` - Sends a test message to verify configuration - `send-waiting-notification` - Main function that sends the notification (respects toggles) - `toggle-feature` - Toggle notification features on or off via CLI - `show-toggle-status` - Display current toggle status - `-main` - CLI argument parsing and entry point ### Configuration Configuration is stored in `~/.iamwaiting/config.edn` with the following structure: ```clojure {:webhook-url "https://discord.com/api/webhooks/..." :user-id "123456789012345678" ; Optional: Discord user ID for @mentions :toggles {:idle-prompt true ; Enable idle prompt notifications :permission-prompt true ; Enable permission prompt notifications :permission-prompt-ping true}} ; Enable @mentions on permission prompts ``` Alternatively, configuration can be set via environment variables: - `IAMWAITING_WEBHOOK_URL` - Discord webhook URL (required) - `IAMWAITING_USER_ID` - Discord user ID for @mentions (optional) ### Notification Toggles Control which types of notifications are sent using the `:toggles` configuration key. If toggles are not specified, both notification types are enabled by default (backwards compatible). **Managing toggles via CLI:** ```bash # Show current toggle status iamwaiting toggle status # Disable idle prompt notifications iamwaiting toggle idle-prompt off # Enable permission prompt notifications iamwaiting toggle permission-prompt on # Disable @mentions on permission prompts iamwaiting toggle permission-prompt-ping off ``` **Manually editing config file:** ```clojure ;; Only get notified for permission prompts {:webhook-url "https://discord.com/api/webhooks/..." :toggles {:idle-prompt false :permission-prompt true :permission-prompt-ping true}} ;; Get permission prompt notifications but don't @mention {:webhook-url "https://discord.com/api/webhooks/..." :user-id "123456789012345678" :toggles {:idle-prompt true :permission-prompt true :permission-prompt-ping false}} ;; Disable all notifications {:webhook-url "https://discord.com/api/webhooks/..." :toggles {:idle-prompt false :permission-prompt false :permission-prompt-ping false}} ``` **Default behavior:** If toggles are not specified in the config file, all notification features are enabled. ### Permission Prompt Pings The `:permission-prompt-ping` toggle controls whether you get @mentioned (pinged) on permission prompts. This is useful when: - You want to disable pings during focus time - You want notifications but not intrusive @mentions - You want to keep your user ID configured without getting pinged **Note:** This toggle only has effect if you have a user ID configured. The ping toggle defaults to `true` for backwards compatibility. ## Installation Install via bbin (recommended): ```bash bbin install git@git.ajet.fyi:ajet-industries/iamwaiting.git ``` This installs `iamwaiting` to `~/.local/bin/iamwaiting` (ensure `~/.local/bin` is in your PATH). ## Common Commands **Note:** These examples assume `iamwaiting` is in your PATH. ### Setup ```bash # Initial setup - configure Discord webhook iamwaiting setup # Test the webhook configuration iamwaiting test ``` ### Usage ```bash # Send a basic waiting notification iamwaiting # Send notification with event data (used by hooks) iamwaiting '{"cwd": "/path/to/project"}' ``` ### Toggle Management ```bash # Show current toggle status iamwaiting toggle status # Disable idle prompt notifications iamwaiting toggle idle-prompt off # Enable permission prompt notifications iamwaiting toggle permission-prompt on # Enable idle prompt notifications iamwaiting toggle idle-prompt on # Disable permission prompt notifications iamwaiting toggle permission-prompt off # Disable @mentions on permission prompts iamwaiting toggle permission-prompt-ping off # Enable @mentions on permission prompts iamwaiting toggle permission-prompt-ping on ``` ### Running via Babashka Tasks ```bash bb setup # Run setup wizard bb test # Test webhook bb run # Send notification ``` ## Hook Integration To use with Claude Code hooks, add to `~/.claude/settings.json`: ```json { "hooks": { "Notification": [ { "matcher": "idle_prompt", "hooks": [{"type": "command", "command": "iamwaiting"}] }, { "matcher": "permission_prompt", "hooks": [{"type": "command", "command": "iamwaiting"}] } ] } } ``` This configuration triggers notifications for both idle prompts and permission requests. ## Important Implementation Details ### Discord Webhook API The tool uses Discord's webhook API which requires: - Webhook URL from Discord (Server Settings > Integrations > Webhooks) - POST request with JSON payload containing `content`, `username`, and `avatar_url` - No authentication required (webhook URL acts as the credential) ### Message Format Notifications include: - ⏳ Waiting indicator - 📁 Current working directory / project name - 🕐 Timestamp (HH:mm:ss format) - @mention (if user ID is configured, it's a permission prompt, and ping toggle is enabled) Example message (idle prompt): ``` ⏳ **Claude is waiting** in `ajet-industries` 📁 Path: `/home/user/repos/ajet-industries` 🕐 Time: 14:23:45 ``` Example message (permission prompt with ping enabled): ``` <@123456789012345678> ⏳ **Claude is waiting** in `ajet-industries` 📁 Path: `/home/user/repos/ajet-industries` 🕐 Time: 14:23:45 📢 Type: `permission_prompt` ``` Example message (permission prompt with ping disabled): ``` ⏳ **Claude is waiting** in `ajet-industries` 📁 Path: `/home/user/repos/ajet-industries` 🕐 Time: 14:23:45 📢 Type: `permission_prompt` ``` ### Error Handling - Missing configuration prompts user to run `./iamwaiting setup` - Failed webhook requests exit with code 1 and display error message - Invalid webhook URLs are caught and reported - Network errors are caught and reported gracefully ### Dependencies Uses Babashka standard libraries: - `babashka.http-client` - HTTP requests to Discord API - `babashka.fs` - File system operations for config management - `cheshire.core` - JSON encoding/decoding - `clojure.string` - String manipulation ## Development The script is self-contained with minimal dependencies. To modify: 1. Edit the `iamwaiting` script directly 2. Test changes using `iamwaiting test` (or `./iamwaiting test` if running from the repo directory) 3. The script is executable via shebang `#!/usr/bin/env bb` ## Security Considerations - Webhook URL should be kept secret (it allows posting to your Discord channel) - Config file at `~/.iamwaiting/config.edn` has standard file permissions - No sensitive data is sent in notifications beyond directory paths - Webhook URLs are never logged or displayed (except during setup) ## Context: Monorepo Usage This tool is part of the ajet-industries monorepo and can be used with any project. It's particularly useful when working on long-running tasks where Claude may need user input while the user is away from their terminal. Other tools in the monorepo: - `commitly/` - Multi-repo commit and push tool - `service-manager/` - Microservice orchestration - `www/` - Dashboard website - `gateway/` - Nginx reverse proxy ## Future Enhancements Possible improvements: - Support for multiple notification channels - Customizable message templates - Integration with other notification services (Slack, Telegram, etc.) - Retry logic for failed webhook requests - Rate limiting to avoid spam