# Forge ZSH Plugin A powerful ZSH plugin that provides intelligent command transformation, file tagging, and conversation management for the Forge AI assistant. ## Features - **Smart Command Transformation**: Convert `:command` syntax into forge executions - **Agent Selection**: Tab completion for available agents using `:agent_name` - **File Tagging**: Interactive file selection with `@[filename]` syntax - **Syntax Highlighting**: Visual feedback for commands and tagged files - **Conversation Continuity**: Automatic session management across commands - **Interactive Completion**: Fuzzy finding for files and agents via built-in picker ## Prerequisites Before using this plugin, ensure you have the following tools installed: - **fd** - Fast file finder (alternative to find) - **forge** - The Forge CLI tool ### Installation of Prerequisites ```bash # macOS (using Homebrew) brew install fd # Ubuntu/Debian sudo apt install fd-find # Arch Linux sudo pacman -S fd ``` ## Usage ### Starting a Conversation Begin any command with `:` followed by your prompt: ```bash : Get the current time ``` This automatically starts a new conversation with the default Forge agent. ### Using Specific Agents Specify an agent by name after the colon: ```bash :sage How does caching work in this system? :muse Create a deployment strategy for my app ``` **Tab Completion**: Type `:` followed by partial agent name and press `TAB` for interactive selection. ### File Tagging Tag files in your commands using the `@[filename]` syntax: ```bash : Review this code @[src/main.rs] : Explain the configuration in @[config.yaml] ``` **Interactive Selection**: Type `@` and press `TAB` to search and select files interactively using fuzzy finder. ### Conversation Continuity Commands within the same session maintain context: ```bash # First command : My project uses React and TypeScript # Second command (remembers previous context) : How can I optimize the build process? ``` The plugin automatically manages conversation IDs to maintain context across related commands. ### Command Naming Shell commands should follow the **Object-Action** format. Examples: - `:provider-login` - `:sync-status` For backward compatibility, `:login` remains available as an alias for `:provider-login`. ### Session Management #### Starting New Sessions Clear the current conversation context and start fresh: ```bash :new # or use the alias :n ``` This will: - Clear the current conversation ID - Show the banner with helpful information - Reset the session state - Display a confirmation message with timestamp #### System Information View system and project information: ```bash :info # or use the alias :i ``` This displays: - System information - Project details - Current configuration - Current configuration #### Switching Conversations Browse and switch between conversations interactively: ```bash :conversation # or use the alias :c ``` This will display an interactive list of all conversations with preview, allowing you to select and switch. Switch to a specific conversation by ID: ```bash :conversation ``` Toggle between current and previous conversation (like `cd -`): ```bash :conversation - # or :c - ``` The plugin remembers your previous conversation, allowing you to quickly toggle back and forth. This works just like `cd -` in your shell, and **also works with `:new`** - when you start a new conversation, you can toggle back to your previous one. If there's no previous conversation tracked (e.g., first time using the plugin), `:c -` will show the conversation list popup, allowing you to select a conversation. This is useful when: - You need to temporarily check another conversation and come back - You're comparing or referencing information between two conversations - You want to quickly switch context between related tasks - You started a new conversation but want to reference the previous one #### Cloning Conversations Create a copy of an existing conversation with interactive selection: ```bash :clone ``` This will: - Display an interactive list of all conversations with preview - Allow you to select a conversation to clone - Create a new conversation with the same content - Automatically switch to the cloned conversation - Show the cloned conversation content and details You can also clone a specific conversation by providing its ID: ```bash :clone ``` This is useful when you want to: - Create a backup before making significant changes - Start a new conversation branch from an existing context - Experiment with different approaches while preserving the original #### Session Status The plugin automatically displays session information including: - Conversation ID when starting new sessions - Active agent information - New session confirmations with timestamps ## Syntax Highlighting The plugin provides visual feedback through syntax highlighting: - **Tagged Files** (`@[filename]`): Displayed in **green bold** - **Agent Commands** (`:agent`): Agent names in **yellow bold** - **Command Text**: Remaining text in **white bold** ## Configuration Customize the plugin behavior by setting these variables before loading the plugin: ```bash # Custom forge binary location export FORGE_BIN="/path/to/custom/forge" ``` ### Available Configuration Variables - `FORGE_BIN`: Path to the forge executable (default: `forge`) - `FORGE_EDITOR`: Editor command to use for `:edit` command (default: `$EDITOR` or `nano`) - `FORGE_SYNC_ENABLED`: Enable/disable automatic workspace sync (default: `true`) - `FORGE_MAX_COMMIT_DIFF`: Maximum diff size for commit message generation in bytes (default: `100000`) - `FORGE_SKIP_INTERACTIVE`: Skip interactive prompts (internal use) - `FORGE_CURRENCY_SYMBOL`: Currency symbol for cost display in ZSH theme (default: `"$"`) - `FORGE_CURRENCY_CONVERSION_RATE`: Conversion rate for currency display (default: `1.0`) - `NERD_FONT`: Enable Nerd Font icons in ZSH theme (default: auto-detected, set to `"1"` or `"true"` to enable, `"0"` or `"false"` to disable) - `USE_NERD_FONT`: Alternative variable for enabling Nerd Font icons (same behavior as `NERD_FONT`) - Internal pattern matching for conversation syntax (`:`) - New session command keyword: `:new` or `:n` ### Codebase Indexing Sync your codebase for semantic search: ```bash :sync ``` This will index the current directory for semantic code search. ### Environment Diagnostics Run comprehensive environment diagnostics to check your Forge setup: ```bash :doctor ``` This will check: - ZSH version and terminal information - Forge installation and version - Plugin and theme loading status - Completions availability - Dependencies (fd, bat) - ZSH plugins (autosuggestions, syntax-highlighting) - Editor configuration and PATH setup - Nerd Font support for icons ### .forge Directory The plugin creates a `.forge` directory in your current working directory (similar to `.git`) for temporary files: - `FORGE_EDITMSG.md`: Temporary file used when opening an external editor with `:edit` ## Advanced Features ### Command History All transformed commands are properly saved to ZSH history, allowing you to: - Navigate command history with arrow keys - Search previous forge commands with `Ctrl+R` - Reuse complex commands with file tags ### Keyboard Shortcuts - **Tab**: Interactive completion for files (`@`) and agents (`:`) - **Enter**: Transform and execute `:commands` - **Ctrl+C**: Interrupt running forge commands ## Examples ### Basic Usage ```bash : What's the weather like? :sage Explain the MVC pattern :planner Help me structure this project ``` ### With File Tagging ```bash : Review this implementation @[src/auth.rs] : Debug the issue in @[logs/error.log] @[config/app.yml] ``` ### Session Flow ```bash : I'm working on a Rust web API : What are the best practices for error handling? : Show me an example with @[src/errors.rs] :info :new : New conversation starts here ``` ### Codebase Indexing ```bash # Sync current directory for semantic search :sync ```