airfine
Version:
A minimal LLM-based text refinement CLI
379 lines (256 loc) • 10 kB
Markdown
# airfine: A Minimal LLM-based Text Refinement CLI

AIrfine (pronounced "Air-fine") is a lightweight, versatile CLI connector for LLM APIs (OpenAI, Claude, Gemini) that enables seamless text transformation through simple commands. The name combines "Air" and "Refine" - reflecting our vision of AI that exists like air, omnipresent and accessible in any environment, while continuously refining text to perfection.
This minimal tool serves as an atomic building block that can be integrated with various tools and workflows to enhance text processing capabilities.
## Why AIrfine?
AIrfine was designed with the following principles in mind:
- **Simplicity**: Minimal interface with maximum flexibility
- **Composability**: Works well with other tools in the Unix philosophy
- **Integration**: Easy to incorporate into scripts, automation workflows, or GUI wrappers
- **Extensibility**: Support for multiple LLM providers with a consistent interface
Once set up, AIrfine becomes a powerful component in your toolkit that can be accessed via shell commands or integrated into GUI applications, enabling you to easily incorporate LLM capabilities into your existing workflows.

## Quick Start
You can use airfine without installation using npx:
```bash
npx airfine --help
```
> **Note**: If npx is not available on your system, you need to install Node.js (version 18.0.0 or higher) from [nodejs.org](https://nodejs.org/).
>
> The package is fully bundled, so no additional dependencies are needed when running with npx.
### Example with npx
```bash
npx airfine transform --prompt "Improve this text" --context "Make it more professional"
```
## Installation
If you use airfine frequently, you may want to install it globally:
### Install from npm
```bash
npm install -g airfine
```
### Install from source
```bash
git clone https://github.com/yukimi-inu/airfine.git
cd airfine
npm install
npm run build
npm link
```
## Usage
### Setup
On first use, you need to configure API keys for the LLM providers:
```bash
airfine setup
```
Follow the prompts to enter your API keys. For security, API keys are masked with asterisks (\*) as you type.
Configuration is saved to:
- **Windows**: `%APPDATA%\airfine\config.json` (typically `C:\Users\<username>\AppData\Roaming\airfine\config.json`)
- **macOS/Linux**: `~/.config/airfine/config.json`
You can also configure default settings:
- **Default Provider**: Set which provider to use when none is specified
- **Default Models**: Set which model to use for each provider when none is specified
```bash
# To set the default provider
airfine setup
# Select "Set default provider" from the menu
# To set default models for each provider
airfine setup
# Select "Set default models" from the menu
```
### List Available Models
To see which models are available with your API keys:
```bash
airfine models
```
This command queries each configured provider's API and displays a list of available models.
### Text Transformation
To transform text, use the following command:
```bash
airfine transform --prompt "Text to transform" [--context "System message"] [--provider "Provider name"] [--model "Model name"] [--quiet]
```
#### Options
- `--prompt`, `-p`: Text to transform (if not provided, reads from stdin)
- `--context`, `-c`: System message (optional) - This is treated as a higher-level instruction that guides the LLM's behavior and takes precedence over the prompt text
- `--provider`, `-r`: LLM provider to use (optional, uses the first provider with a configured API key)
- `--model`, `-m`: Model to use (optional, provider-specific default will be used if not specified)
- `--quiet`, `-q`: Output only the result text without any logs (optional)
- `--raw`: Alias for --quiet
- `--before-after`, `-b`: Show before and after text side by side (optional)
### Examples
1. Expand a list:
```bash
airfine transform \
--context "Expand the following list into a well-structured document" \
--prompt "- Requirements gathering\n- Implementation plan\n- Deployment procedure"
```
2. Free-form transformation:
```bash
airfine transform \
--prompt "Please format this text in Markdown with proper paragraphs to make it more readable"
```
3. Specify provider and model:
```bash
airfine transform \
--provider "openai" \
--model "gpt-4o" \
--prompt "Summarize this article in three bullet points"
```
4. Output only the result (useful for scripting):
```bash
airfine transform \
--prompt "Translate this to French" \
--quiet > output.txt
```
5. Read prompt from stdin:
```bash
# Stdin is used by default when no --prompt is provided
echo "This is text to improve" | airfine transform
# Show before and after comparison
echo "This is text to improve" | airfine transform --before-after
# Combine --prompt with stdin input
echo "This is the actual text to improve" | airfine transform --prompt "Improve this text by making it more professional:"
```
## Integration Examples
AIrfine can be easily integrated with other tools and workflows:
### Shell Pipelines
```bash
# Translate a file to French
cat document.txt | airfine transform --prompt "Translate this to French" --quiet > document_fr.txt
# Summarize meeting notes
cat meeting_notes.md | airfine transform --prompt "Summarize these meeting notes in bullet points" --quiet
# Process file content directly (stdin is automatically detected)
cat document.txt | airfine transform --context "You are a professional editor. Improve this text." > improved_document.txt
```
The CLI automatically reads from stdin when no `--prompt` option is provided, making it ideal for use in pipelines. You can also combine `--prompt` with stdin input, where the prompt text is followed by the stdin content - useful for providing instructions along with the text to transform.
### Script Integration
```bash
#!/bin/bash
# Example script that processes multiple files
for file in *.txt; do
echo "Processing $file..."
airfine transform --prompt "Improve this text" --quiet < "$file" > "improved_$file"
done
```
### GUI Wrappers
AIrfine's simple CLI interface makes it ideal for building GUI wrappers around it:
- Text editors with LLM-powered features
- Desktop applications for content creation
- Browser extensions for text refinement
### macOS Automator Integration
You can integrate airfine with macOS Automator to create Quick Actions that transform selected text in any application:
#### Creating a Text Transformation Service
1. Open Automator and create a new "Quick Action"
2. Configure the workflow to receive text from any application:
- Workflow receives current: "text"
- in: "any application"
3. Add "Run Shell Script" action with the following settings:
- Shell: `/bin/bash`
- Pass input: "as stdin"
- Script:
```bash
/path/to/npx airfine transform -q
```
4. Save the Quick Action with a descriptive name (e.g., "Improve Text with AI")
Now you can select text in any application, right-click, and choose your Quick Action from the Services menu.
#### Adding Sound Feedback
You can enhance your Automator workflow by adding sound feedback:
1. Add "Run AppleScript" action at the beginning of your workflow:
```applescript
on run {input, parameters}
-- Play a sound
do shell script "afplay /System/Library/Sounds/Purr.aiff &"
-- Pass the input to the next action
return input
end run
```
This will play a sound when the transformation starts, providing audible feedback that the action is in progress.
## Supported Providers and Models
### OpenAI
- gpt-4o
- gpt-4o-mini
- o1
- o1-mini
- o3-mini
### Anthropic (Claude)
- claude-3-7-sonnet-latest
- claude-3-5-sonnet-latest
- claude-3-5-haiku-latest
### Google (Gemini)
- gemini-2.0-flash
- gemini-2.0-flash-lite
- gemini-1.5-pro
Please check other models with `npx airfine models`
## Development
### Testing
Run tests with:
```bash
npm test
```
Run tests in watch mode:
```bash
npm run test:watch
```
Generate test coverage:
```bash
npm run test:coverage
```
### Code Formatting
Format code with Biome:
```bash
npm run format
```
Lint code:
```bash
npm run lint
```
## Publishing to npm
### Prerequisites
1. Create an npm account at [npmjs.com](https://www.npmjs.com/signup)
2. Log in to npm from your terminal:
```bash
npm login
```
3. Set up the `NPM_TOKEN` secret in your GitHub repository:
- Generate an npm access token: `npm token create`
- Go to your GitHub repository → Settings → Secrets and variables → Actions
- Create a new repository secret named `NPM_TOKEN` with the value of your npm token
### Manual Publishing
To manually publish to npm:
```bash
# Update version in package.json
npm version patch # or minor, or major
npm publish
```
### Automatic Publishing via GitHub Actions
This project is configured to automatically publish to npm when a new version tag is pushed to GitHub.
To release a new version:
1. Update the version in package.json:
```bash
npm version patch # or minor, or major
```
2. Push the changes and the new tag:
```bash
git push && git push --tags
```
The GitHub Actions workflow will automatically build, test, and publish the package to npm.
### Publishing Checklist
Before publishing, ensure:
1. All tests pass: `npm test`
2. The package builds correctly: `npm run build`
3. The version in package.json is updated
4. The package.json contains all necessary metadata:
- name, version, description
- main, bin, files
- keywords, author, license
- repository, bugs, homepage
- publishConfig (for public packages)
5. The README is up-to-date
6. The .npmignore or files field in package.json is correctly configured
## Requirements
- Node.js 18.0.0 or higher
- API keys for at least one of the supported LLM providers
## License
MIT
## Future Enhancements
- Support for binary files. PDF, images, etc.
- Distribution via Brew, apt, and as a single binary