A structured initialization framework for collaborative human & AI coding projects
Project description
Bora
Brazilian Portuguese for slang for let's go. It's a contraction of the more formal "vamos embora"
A structured initialization framework for collaborative human & AI coding projects
bora is a small CLI that scaffolds and maintains a documentation
convention designed for working with AI coding agents across multiple
sessions and multiple models. The files it generates live alongside your
code in version control, so any model — Claude, GPT, Gemini, or local models — can read them and get oriented before writing a line.
Why
When you collaborate with AI on a project that takes more than one session, two problems compound:
- Context decay. Every new chat starts from zero. You re-explain the project from memory, often inconsistently.
- Model switching cost. Different models see different versions of your project. Switching means re-briefing.
bora addresses both by keeping a small, structured set of Markdown
files in your repo:
AGENTS.md— operating instructions for AI agents.docs/ai/Project.md— what we're building and why.docs/ai/Architecture.md— how we've decided to build it, plus a decision log.docs/ai/Tasks.md— auto-generated dashboard of current work.docs/ai/tickets/*.md— the tickets themselves, with YAML frontmatter and Markdown body.
Start a new project by creating a blank repository and initialize bora. Then edit the Project.md file with what you want to build. Collaborate with your deired agent on the Architecture.md file to encapsulate design choices. Then, collaborate with your agent to create task Tickets. The 'Tasks.md' file is auto generated by bora to give you a status view of the current state of your project.
The CLI handles the mechanics: ticket creation with chronological IDs, status updates, frontmatter validation, dashboard regeneration, and briefing assembly with an optional token budget.
Installation
bora is a Python CLI. The recommended way to install Python CLIs
globally is pipx, which puts the bora command on your PATH
without polluting your system Python.
Option 1: pipx (recommended)
If you don't already have pipx:
# macOS
brew install pipx
pipx ensurepath
# Linux / WSL
python3 -m pip install --user pipx
python3 -m pipx ensurepath
# Windows (PowerShell)
python -m pip install --user pipx
python -m pipx ensurepath
After pipx ensurepath you may need to open a new terminal so the
updated PATH takes effect.
Then install bora:
# Once published to PyPI:
pipx install bora
# Until then, install directly from GitHub:
pipx install git+https://github.com/yourname/bora.git
Verify:
bora --version
To upgrade later:
pipx upgrade bora
To uninstall:
pipx uninstall bora
Option 2: pip --user
If you don't want to install pipx, you can use pip --user:
pip install --user bora
# or, from GitHub:
pip install --user git+https://github.com/yourname/bora.git
This installs into your user site-packages and puts the bora script
in your user binary directory (typically ~/.local/bin on Linux/macOS,
%APPDATA%\Python\Scripts on Windows). If bora isn't found after
install, see Troubleshooting PATH below.
Option 3: Development install
If you've cloned the repository and want to hack on bora:
git clone https://github.com/yourname/bora.git
cd bora
pip install -e .
The -e flag installs in editable mode, so changes to the source take
effect without reinstalling.
Troubleshooting PATH
If you installed with pip --user and get bora: command not found,
your user binary directory probably isn't on PATH.
Find where pip installed the script:
python3 -m site --user-base
The script lives in <user-base>/bin on Linux/macOS or
<user-base>\Scripts on Windows. Add that directory to your shell's
PATH — for bash/zsh, append to ~/.bashrc or ~/.zshrc:
export PATH="$HOME/.local/bin:$PATH"
Then source the file or open a new terminal.
This is the main reason pipx is recommended: it handles PATH for you.
Quick start
cd /path/to/your/repo
bora init # scaffold AGENTS.md and docs/ai/
$EDITOR docs/ai/Project.md # describe what you're building
bora ticket new "Set up database" --priority high
bora ticket set 01 status in-progress # fuzzy id match works
bora status # regenerate Tasks.md
bora context --budget 8000 # print briefing for a fresh model session
To brief a new chat session with a model, bora context prints all the
files an AI agent should read, in order. Pipe it to your clipboard:
bora context | pbcopy # macOS
bora context | xclip -selection clipboard # Linux with xclip
bora context | clip # Windows
Paste it as the first message of your conversation.
Commands
| Command | What it does |
|---|---|
bora init |
Scaffold AGENTS.md and docs/ai/ in the current dir. |
bora ticket new "<title>" |
Create a new ticket. Options: --type, --priority, --parent. |
bora ticket list |
List tickets. Filters: --status, --type, --priority, --blocked. |
bora ticket show <id> |
Print a ticket's contents. Fuzzy ID match supported. |
bora ticket set <id> <field> <value> |
Update a frontmatter field. |
bora ticket subtask <id> <sub-id> <status> |
Update a frontmatter subtask's status. |
bora ticket note <id> "<text>" |
Append a dated entry to the body Notes section. |
bora status |
Regenerate Tasks.md. |
bora context [--budget N] |
Print briefing content, optionally token-bounded. |
bora lint |
Validate frontmatter and cross-references. |
bora decision new "<title>" |
Append a templated decision entry to Architecture.md. |
Run bora <command> --help for full options on any command.
Conventions
- Ticket IDs are
YYYYMMDD-NN-slug. The CLI generates them; don't pick your own. Tasks.mdis auto-generated. Never hand-edit it. Update tickets and runbora status.- Subtasks live in two places by design. Major subtasks go in
frontmatter (queryable, appear in
Tasks.mdaggregation). Small subtasks are body checkboxes (counted but not aggregated by id). - Decisions append to
Architecture.md. Don't rewrite history; add new entries when the design evolves. - AGENTS.md is the entry point for any AI tool. Tools like Claude Code, Cursor, and others increasingly look for this file at repo root.
Working with multiple models
bora is model-agnostic by design. It produces plain Markdown and YAML
that any LLM can read. Patterns that work well:
- For chat-only models (web Claude, ChatGPT, etc.), run
bora context --budget <N>and paste the output as your first message. The model now has the same briefing every other model gets. - For agentic tools with file access (Claude Code, Cursor, Aider),
the model reads
AGENTS.mdand follows its instructions to discover the rest. The CLI is callable from the agent's shell, so the model can runbora ticket set ...directly as work progresses. - For local models, the same flow works. Smaller models (under ~14B)
may struggle with structured frontmatter — run
bora lintafter any model writes to a ticket file to catch errors.
Contributing
Contributions welcome. The code is in bora/:
paths.py— repo-root detection and shared constants.ticket.py— frontmatter parsing, fuzzy ID matching, body progress.templates.py— scaffolded files (AGENTS.md, Project.md, etc.).lint.py— validation rules.status.py—Tasks.mdgeneration.create.py— chronological ID generation.context.py— briefing assembly.cli.py— Click-based command surface.
Before opening a PR, run through the smoke test in a scratch directory:
mkdir /tmp/test-bora && cd /tmp/test-bora && git init
bora init
bora ticket new "Test ticket" --priority high
bora ticket set 01 status in-progress
bora status
bora lint
Publishing to PyPI (maintainer notes)
When you're ready to publish:
-
Confirm the package name
borais available at https://pypi.org/project/bora/. If taken, changenameinpyproject.toml(considerbora-cliwhile keeping the command itself asbora). -
Update
authorsand the[project.urls]block inpyproject.tomlto point at your GitHub. -
Bump
versionin bothpyproject.tomlandbora/__init__.py. -
Build and upload:
pip install --upgrade build twine python -m build twine upload dist/*
-
Tag the release in git:
git tag v0.1.0 git push --tags
License
MIT. See LICENSE if added, or change in pyproject.toml to taste.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bora-0.1.0.tar.gz.
File metadata
- Download URL: bora-0.1.0.tar.gz
- Upload date:
- Size: 26.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40986ca5a9bb25bbb921242c9c97670c3eaf71415f766bc5627801ccb209fe47
|
|
| MD5 |
483cad58bbd5412e2837b5d8e268b5a7
|
|
| BLAKE2b-256 |
0f798f8a3de23a06df6792c74db09f2aad4db532fe2da9aa036f2e4fce3afa3f
|
Provenance
The following attestation bundles were made for bora-0.1.0.tar.gz:
Publisher:
publish.yml on tonyknight/Bora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bora-0.1.0.tar.gz -
Subject digest:
40986ca5a9bb25bbb921242c9c97670c3eaf71415f766bc5627801ccb209fe47 - Sigstore transparency entry: 1399258310
- Sigstore integration time:
-
Permalink:
tonyknight/Bora@59c0bc8576e954d6a72ca0f03b4de62ec9f9b47e -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/tonyknight
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@59c0bc8576e954d6a72ca0f03b4de62ec9f9b47e -
Trigger Event:
push
-
Statement type:
File details
Details for the file bora-0.1.0-py3-none-any.whl.
File metadata
- Download URL: bora-0.1.0-py3-none-any.whl
- Upload date:
- Size: 26.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d2d1f8565971c0df70242b0b496a027fbee8a01d740020345863cd564bbbc60
|
|
| MD5 |
dcbc489801c75ad81e593e2538e1fc0d
|
|
| BLAKE2b-256 |
5a57d47f96ef3101619b35f4e6bd068d36485eb86aa26f114d9e34a9bd832162
|
Provenance
The following attestation bundles were made for bora-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on tonyknight/Bora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bora-0.1.0-py3-none-any.whl -
Subject digest:
1d2d1f8565971c0df70242b0b496a027fbee8a01d740020345863cd564bbbc60 - Sigstore transparency entry: 1399258321
- Sigstore integration time:
-
Permalink:
tonyknight/Bora@59c0bc8576e954d6a72ca0f03b4de62ec9f9b47e -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/tonyknight
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@59c0bc8576e954d6a72ca0f03b4de62ec9f9b47e -
Trigger Event:
push
-
Statement type: