forgecode / shell-plugin /README.md
SaylorTwift's picture
SaylorTwift HF Staff
Add files using upload-large-folder tool
1244914 verified
|
Raw
History Blame Contribute Delete
8.11 kB
# 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 <conversation_id>
```
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 <conversation_id>
```
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
```