runnrr 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- runnrr-0.1.0/PKG-INFO +120 -0
- runnrr-0.1.0/README.md +105 -0
- runnrr-0.1.0/pyproject.toml +30 -0
- runnrr-0.1.0/src/runnrr/__init__.py +35 -0
- runnrr-0.1.0/src/runnrr/cli/__init__.py +1 -0
- runnrr-0.1.0/src/runnrr/cli/main.py +727 -0
- runnrr-0.1.0/src/runnrr/core/__init__.py +1 -0
- runnrr-0.1.0/src/runnrr/core/db.py +150 -0
- runnrr-0.1.0/src/runnrr/core/filesystem.py +146 -0
- runnrr-0.1.0/src/runnrr/core/models.py +139 -0
- runnrr-0.1.0/src/runnrr/core/parser.py +268 -0
- runnrr-0.1.0/src/runnrr/core/state.py +40 -0
- runnrr-0.1.0/src/runnrr/exceptions.py +72 -0
- runnrr-0.1.0/src/runnrr/git/__init__.py +1 -0
- runnrr-0.1.0/src/runnrr/git/integration.py +42 -0
- runnrr-0.1.0/src/runnrr/sdk/__init__.py +1 -0
- runnrr-0.1.0/src/runnrr/sdk/client.py +170 -0
- runnrr-0.1.0/src/runnrr/services/__init__.py +1 -0
- runnrr-0.1.0/src/runnrr/services/action_service.py +127 -0
- runnrr-0.1.0/src/runnrr/services/adr_service.py +124 -0
- runnrr-0.1.0/src/runnrr/services/context_service.py +146 -0
- runnrr-0.1.0/src/runnrr/services/epic_service.py +136 -0
- runnrr-0.1.0/src/runnrr/services/link_service.py +76 -0
- runnrr-0.1.0/src/runnrr/services/search_service.py +20 -0
- runnrr-0.1.0/src/runnrr/services/ticket_service.py +202 -0
runnrr-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: runnrr
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Deterministic, file-based execution system for autonomous agents
|
|
5
|
+
Author: Viraj Trivedi
|
|
6
|
+
Author-email: Viraj Trivedi <inf3cti0n95@gmail.com>
|
|
7
|
+
Requires-Dist: click>=8.3.3
|
|
8
|
+
Requires-Dist: filelock>=3.29.0
|
|
9
|
+
Requires-Dist: gitpython>=3.1.49
|
|
10
|
+
Requires-Dist: pydantic>=2.13.3
|
|
11
|
+
Requires-Dist: python-frontmatter>=1.1.0
|
|
12
|
+
Requires-Dist: rich>=15.0.0
|
|
13
|
+
Requires-Python: >=3.11
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
|
|
16
|
+
# Runnrr
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Git for agent workspaces.
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Runnrr is a filesystem-native, markdown-based workspace protocol that gives coding agents (and humans) durable structured state, explicit task boundaries, and lightweight context retrieval.
|
|
23
|
+
|
|
24
|
+
It is **not** an autonomous loop runtime, a checkpoint engine, a multi-agent orchestrator, or a sprawling platform. It is simply the structured workspace that tools like Gemini CLI and Claude Code work inside to understand what to do next.
|
|
25
|
+
|
|
26
|
+
## The Five Commands That Matter
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
runnrr next # what should I work on?
|
|
30
|
+
runnrr context # what do I need to know?
|
|
31
|
+
runnrr log # what did I just do?
|
|
32
|
+
runnrr done # I finished this
|
|
33
|
+
runnrr adr # I made an architectural decision
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Everything else is in service of these five.
|
|
37
|
+
|
|
38
|
+
## The Stack
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
.runnrr/ Filesystem. Source of truth. Always.
|
|
42
|
+
├── tickets/ Markdown files. Folder = state.
|
|
43
|
+
├── epics/ Markdown files.
|
|
44
|
+
├── adrs/ Markdown files.
|
|
45
|
+
└── context/ conventions.md, glossary.md. Static. Human-maintained.
|
|
46
|
+
|
|
47
|
+
.runnrr/.db SQLite. Derived only. Gitignored.
|
|
48
|
+
Rebuilt anytime with: runnrr index rebuild
|
|
49
|
+
Used for: search, next-ticket ranking, context scoring
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Rule:** If `.db` is deleted, everything still works. It just gets slow. The markdown files are always the absolute source of truth.
|
|
53
|
+
|
|
54
|
+
## Core Entities
|
|
55
|
+
|
|
56
|
+
### Tickets
|
|
57
|
+
The atomic unit of work. Status is determined by which folder the markdown file lives in (`backlog`, `todo`, `in-progress`, `blocked`, `done`).
|
|
58
|
+
- `runnrr create "My first ticket"`
|
|
59
|
+
|
|
60
|
+
### Epics
|
|
61
|
+
Strategic groupings of tickets. Status is strictly computed from child ticket states. Never stored manually.
|
|
62
|
+
- `runnrr epic create "Auth System"`
|
|
63
|
+
|
|
64
|
+
### ADRs (Architecture Decision Records)
|
|
65
|
+
Append-only, immutable records of technical decisions. Once `accepted`, they are frozen.
|
|
66
|
+
- `runnrr adr create "Use JWT" --context "..." --decision "..."`
|
|
67
|
+
|
|
68
|
+
## The Agent Workflow
|
|
69
|
+
|
|
70
|
+
Runnrr shines when used alongside an LLM CLI.
|
|
71
|
+
|
|
72
|
+
### 1. Initialization and Context
|
|
73
|
+
The agent runs `runnrr exec` at the start of a session. This command automatically:
|
|
74
|
+
- Calls `runnrr next` to find the highest priority unblocked ticket.
|
|
75
|
+
- Calls `runnrr context` to dynamically assemble a token-budgeted, relevance-ranked context payload (including the ticket, blockers, Epics, related ADRs, and project conventions).
|
|
76
|
+
- Calculates the valid state machine actions the agent is allowed to take.
|
|
77
|
+
|
|
78
|
+
### 2. Execution
|
|
79
|
+
The agent starts the work via the CLI:
|
|
80
|
+
```bash
|
|
81
|
+
runnrr start TICKET-001
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
As the agent writes code, it logs progress directly into the ticket via the CLI to maintain a perfect audit trail:
|
|
85
|
+
```bash
|
|
86
|
+
runnrr log TICKET-001 "Provisioned local Elasticsearch container via Docker Compose."
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3. Content Modification (Markdown Direct Editing)
|
|
90
|
+
Runnrr relies on **direct file edits** for human-readable content. To mark a task or an acceptance criterion as complete, the agent opens the `.runnrr/tickets/<status>/<TICKET-001>.md` file in their editor and changes `- [ ]` to `- [x]`.
|
|
91
|
+
|
|
92
|
+
### 4. Completion
|
|
93
|
+
Once all acceptance criteria are checked off in the markdown file, the agent completes the work via the CLI:
|
|
94
|
+
```bash
|
|
95
|
+
runnrr done TICKET-001
|
|
96
|
+
```
|
|
97
|
+
(If any criteria are unchecked, the CLI parses the file and rejects the transition).
|
|
98
|
+
|
|
99
|
+
## Python SDK
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
from runnrr import RunnrrClient
|
|
103
|
+
|
|
104
|
+
client = RunnrrClient(root=".")
|
|
105
|
+
ticket = client.create_ticket("Build auth middleware", tags=["auth"])
|
|
106
|
+
client.link(ticket.id, "EPIC-001")
|
|
107
|
+
client.transition(ticket.id, "in-progress")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Development
|
|
111
|
+
|
|
112
|
+
Run tests:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
uv run pytest
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## License
|
|
119
|
+
|
|
120
|
+
MIT
|
runnrr-0.1.0/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Runnrr
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Git for agent workspaces.
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
Runnrr is a filesystem-native, markdown-based workspace protocol that gives coding agents (and humans) durable structured state, explicit task boundaries, and lightweight context retrieval.
|
|
8
|
+
|
|
9
|
+
It is **not** an autonomous loop runtime, a checkpoint engine, a multi-agent orchestrator, or a sprawling platform. It is simply the structured workspace that tools like Gemini CLI and Claude Code work inside to understand what to do next.
|
|
10
|
+
|
|
11
|
+
## The Five Commands That Matter
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
runnrr next # what should I work on?
|
|
15
|
+
runnrr context # what do I need to know?
|
|
16
|
+
runnrr log # what did I just do?
|
|
17
|
+
runnrr done # I finished this
|
|
18
|
+
runnrr adr # I made an architectural decision
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Everything else is in service of these five.
|
|
22
|
+
|
|
23
|
+
## The Stack
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
.runnrr/ Filesystem. Source of truth. Always.
|
|
27
|
+
├── tickets/ Markdown files. Folder = state.
|
|
28
|
+
├── epics/ Markdown files.
|
|
29
|
+
├── adrs/ Markdown files.
|
|
30
|
+
└── context/ conventions.md, glossary.md. Static. Human-maintained.
|
|
31
|
+
|
|
32
|
+
.runnrr/.db SQLite. Derived only. Gitignored.
|
|
33
|
+
Rebuilt anytime with: runnrr index rebuild
|
|
34
|
+
Used for: search, next-ticket ranking, context scoring
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Rule:** If `.db` is deleted, everything still works. It just gets slow. The markdown files are always the absolute source of truth.
|
|
38
|
+
|
|
39
|
+
## Core Entities
|
|
40
|
+
|
|
41
|
+
### Tickets
|
|
42
|
+
The atomic unit of work. Status is determined by which folder the markdown file lives in (`backlog`, `todo`, `in-progress`, `blocked`, `done`).
|
|
43
|
+
- `runnrr create "My first ticket"`
|
|
44
|
+
|
|
45
|
+
### Epics
|
|
46
|
+
Strategic groupings of tickets. Status is strictly computed from child ticket states. Never stored manually.
|
|
47
|
+
- `runnrr epic create "Auth System"`
|
|
48
|
+
|
|
49
|
+
### ADRs (Architecture Decision Records)
|
|
50
|
+
Append-only, immutable records of technical decisions. Once `accepted`, they are frozen.
|
|
51
|
+
- `runnrr adr create "Use JWT" --context "..." --decision "..."`
|
|
52
|
+
|
|
53
|
+
## The Agent Workflow
|
|
54
|
+
|
|
55
|
+
Runnrr shines when used alongside an LLM CLI.
|
|
56
|
+
|
|
57
|
+
### 1. Initialization and Context
|
|
58
|
+
The agent runs `runnrr exec` at the start of a session. This command automatically:
|
|
59
|
+
- Calls `runnrr next` to find the highest priority unblocked ticket.
|
|
60
|
+
- Calls `runnrr context` to dynamically assemble a token-budgeted, relevance-ranked context payload (including the ticket, blockers, Epics, related ADRs, and project conventions).
|
|
61
|
+
- Calculates the valid state machine actions the agent is allowed to take.
|
|
62
|
+
|
|
63
|
+
### 2. Execution
|
|
64
|
+
The agent starts the work via the CLI:
|
|
65
|
+
```bash
|
|
66
|
+
runnrr start TICKET-001
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
As the agent writes code, it logs progress directly into the ticket via the CLI to maintain a perfect audit trail:
|
|
70
|
+
```bash
|
|
71
|
+
runnrr log TICKET-001 "Provisioned local Elasticsearch container via Docker Compose."
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3. Content Modification (Markdown Direct Editing)
|
|
75
|
+
Runnrr relies on **direct file edits** for human-readable content. To mark a task or an acceptance criterion as complete, the agent opens the `.runnrr/tickets/<status>/<TICKET-001>.md` file in their editor and changes `- [ ]` to `- [x]`.
|
|
76
|
+
|
|
77
|
+
### 4. Completion
|
|
78
|
+
Once all acceptance criteria are checked off in the markdown file, the agent completes the work via the CLI:
|
|
79
|
+
```bash
|
|
80
|
+
runnrr done TICKET-001
|
|
81
|
+
```
|
|
82
|
+
(If any criteria are unchecked, the CLI parses the file and rejects the transition).
|
|
83
|
+
|
|
84
|
+
## Python SDK
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
from runnrr import RunnrrClient
|
|
88
|
+
|
|
89
|
+
client = RunnrrClient(root=".")
|
|
90
|
+
ticket = client.create_ticket("Build auth middleware", tags=["auth"])
|
|
91
|
+
client.link(ticket.id, "EPIC-001")
|
|
92
|
+
client.transition(ticket.id, "in-progress")
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Development
|
|
96
|
+
|
|
97
|
+
Run tests:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
uv run pytest
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## License
|
|
104
|
+
|
|
105
|
+
MIT
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["uv_build>=0.9.25,<0.10.0"]
|
|
3
|
+
build-backend = "uv_build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "runnrr"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Deterministic, file-based execution system for autonomous agents"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
authors = [
|
|
11
|
+
{ name = "Viraj Trivedi", email = "inf3cti0n95@gmail.com" }
|
|
12
|
+
]
|
|
13
|
+
requires-python = ">=3.11"
|
|
14
|
+
dependencies = [
|
|
15
|
+
"click>=8.3.3",
|
|
16
|
+
"filelock>=3.29.0",
|
|
17
|
+
"gitpython>=3.1.49",
|
|
18
|
+
"pydantic>=2.13.3",
|
|
19
|
+
"python-frontmatter>=1.1.0",
|
|
20
|
+
"rich>=15.0.0",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
[project.scripts]
|
|
24
|
+
runnrr = "runnrr.cli.main:cli"
|
|
25
|
+
|
|
26
|
+
[dependency-groups]
|
|
27
|
+
dev = [
|
|
28
|
+
"pytest>=8.4.2",
|
|
29
|
+
"pytest-cov>=7.1.0",
|
|
30
|
+
]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Runnrr public package API."""
|
|
2
|
+
|
|
3
|
+
from .core.models import (
|
|
4
|
+
Epic,
|
|
5
|
+
EpicStatus,
|
|
6
|
+
EpicType,
|
|
7
|
+
Priority,
|
|
8
|
+
Ticket,
|
|
9
|
+
TicketStatus,
|
|
10
|
+
TicketType,
|
|
11
|
+
)
|
|
12
|
+
from .exceptions import (
|
|
13
|
+
IncompleteAcceptanceCriteria,
|
|
14
|
+
InvalidTransitionError,
|
|
15
|
+
RunnrrError,
|
|
16
|
+
TicketNotFoundError,
|
|
17
|
+
ValidationError,
|
|
18
|
+
)
|
|
19
|
+
from .sdk.client import RunnrrClient
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"RunnrrClient",
|
|
23
|
+
"Epic",
|
|
24
|
+
"EpicStatus",
|
|
25
|
+
"EpicType",
|
|
26
|
+
"Ticket",
|
|
27
|
+
"TicketStatus",
|
|
28
|
+
"TicketType",
|
|
29
|
+
"Priority",
|
|
30
|
+
"RunnrrError",
|
|
31
|
+
"TicketNotFoundError",
|
|
32
|
+
"InvalidTransitionError",
|
|
33
|
+
"ValidationError",
|
|
34
|
+
"IncompleteAcceptanceCriteria",
|
|
35
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""CLI package for Runnrr."""
|