Metadata-Version: 2.1
Name: bashbuddy
Version: 0.3.0
Summary: Hook an LLM up to a Bash terminal
License: MIT
Author: Omegastick
Author-email: isaac@poulton.dev
Requires-Python: >=3.11,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Requires-Dist: langchain (>=0.0.200,<0.0.201)
Requires-Dist: openai (>=0.27.8,<0.28.0)
Requires-Dist: platformdirs (>=3.2.0,<4.0.0)
Requires-Dist: pyfakefs (>=5.2.2,<6.0.0)
Requires-Dist: typer (>=0.9.0,<0.10.0)
Description-Content-Type: text/markdown

# bashbuddy

bashbuddy is an LLM hooked up to a Bash terminal. It's as dangerous as it sounds, but it's also a lot of fun. It's pretty much a proof of concept right now, so expect jank.

## WARNING

It's recommended to run bashbuddy in a VM. It's perfectly capable of running `rm -rf --no-preserve-root /` if you give it the right permissions, so run it as root on your main OS at your own risk.

## Installation

```
pip install bashbuddy
```

Or clone the repository and run:

```
poetry install
```

You'll also need to put your OpenAI API key in the `OPENAI_API_KEY` environment variable.

## Usage

You can directly give bashbuddy a command with this:
```
bashbuddy -c "<command>"
```

Or, you can create a "script" for bashbuddy by creating a file with a shebang like this:
```
#!/usr/bin/env bashbuddy

<command>
```

Then, make it executable and run it:
```
chmod +x <file>
./<file>
```

Or you can run it with `bashbuddy <file>`.

`.bb` is just a convention, you can use whatever extension you want. bashbuddy files like this are kind of like *"plain english shell scripts"*. They're super useful for quickly automating complex tasks that would normally require a lot of specicifity, edge case handling, or error handling. As an example:
```
#!/usr/bin/env bashbuddy

Pick a random image from my wallpapers directory and set it as my wallpaper. I don't remember where the directory is, but it's probably somewhere in /home/omegastick. I use `feh` to set my wallpapers.
```

## Configuration

You can change the model used by setting the `BASHBUDDY_MODEL` environment variable or setting it in `~/.config/bashbuddy/config.toml`:

```toml
model = "gpt-4-0613"  # defaults to gpt-3.5-turbo-0613
```

OpenAI's agent functions are supported, and will automatically be used if one of the `-0613` models is used. From my home testing, it pretty significantly improves capabilities (making `gpt-3.5-turbo` actually useful sometimes).

## Example

### Manual command
````
$ bashbuddy -c "Make a new directory called 'test', then put 3 files in it, each containing a haiku. The file name should be the title of the poem."


> Entering new AgentExecutor chain...
Question: What is the task?
Thought: I need to create a new directory called 'test' and then create 3 files in it, each containing a haiku. The file name should be the title of the poem.
Action:
```

{
"action": "Bash",
"action_input": "mkdir test && cd test && touch 'Autumn Moon.txt' 'Cherry Blossoms.txt' 'Winter Frost.txt' && echo 'An autumn moon\nfloats among the clouds;\nA perfect evening!' > 'Autumn Moon.txt' && echo 'Cherry blossoms bloom,\nSoftly falling petals kiss\nThe ground goodbye, love.' > 'Cherry Blossoms.txt' && echo 'Winter solitude -\nin a world of one color\nthe sound of wind.' > 'Winter Frost.txt'"
}

```

Observation:
Thought:I have successfully created the 'test' directory and added 3 files with haikus in them.
Action:
```

{
"action": "Bash",
"action_input": "ls test"
}

```

Observation: ls: cannot access 'test': No such file or directory

Thought:I need to change the directory to the parent directory first before running the ls command.
Action:
```

{
"action": "Bash",
"action_input": "cd .. && ls test"
}

```


Observation: Autumn Moon.txt
Cherry Blossoms.txt
Winter Frost.txt

Thought:The 'test' directory has been successfully created and contains 3 files with haikus in them.
Final Answer: The 'test' directory has been successfully created and contains 3 files with haikus in them.

> Finished chain.
The 'test' directory has been successfully created and contains 3 files with haikus in them.

$ cat test/*
An autumn moon
floats among the clouds;
A perfect evening!
Cherry blossoms bloom,
Softly falling petals kiss
The ground goodbye, love.
Winter solitude -
in a world of one color
the sound of wind.
````

### Command from a file
```
$ cat test.bb
#!/usr/bin/env bashbuddy

Make a new directory called 'test', then put 3 files in it, each containing a haiku. The file name should be the title of the poem.

$ chmod +x test.bb
$ ./test.bb


> Entering new AgentExecutor chain...
Question: What is the task?
...
```
