personal-backlog 0.3.3__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.
- personal_backlog-0.3.3/LICENSE +21 -0
- personal_backlog-0.3.3/PKG-INFO +303 -0
- personal_backlog-0.3.3/README.md +278 -0
- personal_backlog-0.3.3/pyproject.toml +44 -0
- personal_backlog-0.3.3/setup.cfg +4 -0
- personal_backlog-0.3.3/src/personal_backlog/__init__.py +3 -0
- personal_backlog-0.3.3/src/personal_backlog/__main__.py +5 -0
- personal_backlog-0.3.3/src/personal_backlog/assistant.py +163 -0
- personal_backlog-0.3.3/src/personal_backlog/assistant_assets/__init__.py +1 -0
- personal_backlog-0.3.3/src/personal_backlog/assistant_assets/apple_intelligence.swift +84 -0
- personal_backlog-0.3.3/src/personal_backlog/board.py +19 -0
- personal_backlog-0.3.3/src/personal_backlog/board_web/__init__.py +1 -0
- personal_backlog-0.3.3/src/personal_backlog/board_web/app.js +155 -0
- personal_backlog-0.3.3/src/personal_backlog/board_web/index.html +102 -0
- personal_backlog-0.3.3/src/personal_backlog/board_web/styles.css +326 -0
- personal_backlog-0.3.3/src/personal_backlog/cli.py +417 -0
- personal_backlog-0.3.3/src/personal_backlog/model.py +134 -0
- personal_backlog-0.3.3/src/personal_backlog/ports.py +41 -0
- personal_backlog-0.3.3/src/personal_backlog/server.py +271 -0
- personal_backlog-0.3.3/src/personal_backlog/storage.py +745 -0
- personal_backlog-0.3.3/src/personal_backlog/task_web/__init__.py +1 -0
- personal_backlog-0.3.3/src/personal_backlog/task_web/task-detail.css +26 -0
- personal_backlog-0.3.3/src/personal_backlog/task_web/task-detail.js +90 -0
- personal_backlog-0.3.3/src/personal_backlog/toon.py +151 -0
- personal_backlog-0.3.3/src/personal_backlog/web/__init__.py +1 -0
- personal_backlog-0.3.3/src/personal_backlog/web/app.js +460 -0
- personal_backlog-0.3.3/src/personal_backlog/web/index.html +211 -0
- personal_backlog-0.3.3/src/personal_backlog/web/styles.css +600 -0
- personal_backlog-0.3.3/src/personal_backlog.egg-info/PKG-INFO +303 -0
- personal_backlog-0.3.3/src/personal_backlog.egg-info/SOURCES.txt +39 -0
- personal_backlog-0.3.3/src/personal_backlog.egg-info/dependency_links.txt +1 -0
- personal_backlog-0.3.3/src/personal_backlog.egg-info/entry_points.txt +2 -0
- personal_backlog-0.3.3/src/personal_backlog.egg-info/top_level.txt +1 -0
- personal_backlog-0.3.3/tests/test_assistant.py +55 -0
- personal_backlog-0.3.3/tests/test_board.py +93 -0
- personal_backlog-0.3.3/tests/test_cli.py +228 -0
- personal_backlog-0.3.3/tests/test_dev_script.py +47 -0
- personal_backlog-0.3.3/tests/test_ports.py +31 -0
- personal_backlog-0.3.3/tests/test_server.py +131 -0
- personal_backlog-0.3.3/tests/test_storage.py +163 -0
- personal_backlog-0.3.3/tests/test_toon.py +63 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 pulimento
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: personal-backlog
|
|
3
|
+
Version: 0.3.3
|
|
4
|
+
Summary: A tiny, Git-friendly Markdown backlog for personal projects
|
|
5
|
+
Author: pulimento
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/pulimento/personalBacklog
|
|
8
|
+
Project-URL: Repository, https://github.com/pulimento/personalBacklog
|
|
9
|
+
Project-URL: Issues, https://github.com/pulimento/personalBacklog/issues
|
|
10
|
+
Keywords: backlog,markdown,git,cli,ai-agents,task-management,codex
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Utilities
|
|
20
|
+
Classifier: Topic :: Software Development :: Bug Tracking
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Dynamic: license-file
|
|
25
|
+
|
|
26
|
+
# Personal Backlog
|
|
27
|
+
|
|
28
|
+
A tiny, Git-friendly Markdown backlog for side projects. Tasks live in the
|
|
29
|
+
project repository, remain readable without this tool, and can be managed from
|
|
30
|
+
the command line, a local browser UI, or an AI coding agent.
|
|
31
|
+
|
|
32
|
+
There are deliberately no sprints, assignees, labels, databases, accounts, or
|
|
33
|
+
remote services. Tool is extremely simple by design.
|
|
34
|
+
|
|
35
|
+
> The idea is to have something very simple to build a backlog, that moves alongside the code. You (Or your agents) can use it via an easy CLI.
|
|
36
|
+
|
|
37
|
+
## AI setup (recommended)
|
|
38
|
+
|
|
39
|
+
After installing the tool, initialize each tracked project with:
|
|
40
|
+
|
|
41
|
+
```console
|
|
42
|
+
backlog init --add-agent-instructions
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
This creates `backlog/` and safely creates or appends a managed pointer in the
|
|
46
|
+
project's root `AGENTS.md`. It never replaces existing project instructions and
|
|
47
|
+
will not duplicate its managed block. The pointer tells Codex to read the detailed, generated
|
|
48
|
+
`backlog/AGENTS.md` and use the `backlog` CLI.
|
|
49
|
+
|
|
50
|
+
Use this prompt when a conversation contains knowledge worth preserving:
|
|
51
|
+
|
|
52
|
+
> Read `backlog/AGENTS.md`, then extract the actionable project context from this
|
|
53
|
+
> conversation into the backlog. Inspect existing tasks first, update instead of
|
|
54
|
+
> duplicating, create one task per independently actionable outcome, preserve
|
|
55
|
+
> decisions and rationale in the Markdown body, omit conversational filler and
|
|
56
|
+
> secrets, run `backlog check`, and report the task IDs you created or updated.
|
|
57
|
+
|
|
58
|
+
The root `AGENTS.md` in the Personal Backlog source repository is not installed
|
|
59
|
+
into consumer projects and would not be discovered there. What the package does
|
|
60
|
+
ship is the template used to generate `backlog/AGENTS.md`; the explicit init flag
|
|
61
|
+
adds the missing project-root discovery pointer.
|
|
62
|
+
|
|
63
|
+
A separately installed Codex skill is sufficient if you want Personal Backlog to
|
|
64
|
+
be globally discoverable in Codex without changing every repository, but that is
|
|
65
|
+
Codex-specific and is not installed by `pip`. An MCP server would make operations
|
|
66
|
+
discoverable across configured MCP clients, at the cost of per-client setup and a
|
|
67
|
+
larger runtime surface. For ordinary local coding agents, the generated files and
|
|
68
|
+
CLI remain the simplest integration.
|
|
69
|
+
|
|
70
|
+
## Install
|
|
71
|
+
|
|
72
|
+
From PyPI with `uv tool` (recommended):
|
|
73
|
+
|
|
74
|
+
```console
|
|
75
|
+
uv tool install personal-backlog
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Or with `pipx` / `pip`:
|
|
79
|
+
|
|
80
|
+
```console
|
|
81
|
+
pipx install personal-backlog
|
|
82
|
+
# or
|
|
83
|
+
pip install personal-backlog
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
From GitHub:
|
|
87
|
+
|
|
88
|
+
```console
|
|
89
|
+
uv tool install "git+https://github.com/pulimento/personalBacklog.git@v0.3.3"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
For local development:
|
|
93
|
+
|
|
94
|
+
```console
|
|
95
|
+
uv tool install --editable .
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The installed command is `backlog`.
|
|
99
|
+
|
|
100
|
+
## Start a project backlog
|
|
101
|
+
|
|
102
|
+
Run this from a pet project's root:
|
|
103
|
+
|
|
104
|
+
```console
|
|
105
|
+
backlog init --add-agent-instructions
|
|
106
|
+
backlog add "Add offline cache" --release next --priority 1 --size M
|
|
107
|
+
backlog add "Improve import errors"
|
|
108
|
+
backlog list
|
|
109
|
+
backlog upgrade
|
|
110
|
+
backlog web
|
|
111
|
+
backlog serve
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
`backlog init` creates:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
backlog/
|
|
118
|
+
├── backlog.toml
|
|
119
|
+
├── README.md
|
|
120
|
+
├── AGENTS.md
|
|
121
|
+
└── tasks/
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The CLI searches the current directory and its parents for that backlog, so it
|
|
125
|
+
also works from nested project directories. Use `--backlog PATH` to select one
|
|
126
|
+
explicitly.
|
|
127
|
+
|
|
128
|
+
## Commands
|
|
129
|
+
|
|
130
|
+
```console
|
|
131
|
+
backlog init [PATH] [--add-agent-instructions]
|
|
132
|
+
backlog upgrade [--apply] [--json | --toon]
|
|
133
|
+
backlog add TITLE [--release RELEASE] [--priority 1|2|3|4|5] [--size S|M|L|none] [--tag TAG ...] [--body TEXT | --body-file PATH | --template NAME]
|
|
134
|
+
backlog add-batch [--file PATH] [--json | --toon]
|
|
135
|
+
backlog add-assistant REQUEST [--provider apple-intelligence] [--apply] [--json | --toon]
|
|
136
|
+
backlog list [--state STATE] [--release RELEASE] [--tag TAG ...] [--json | --toon]
|
|
137
|
+
backlog show ID [--json | --toon]
|
|
138
|
+
backlog update ID [--title TITLE] [--state todo|in_progress|done] [--release RELEASE] [--priority 1|2|3|4|5] [--size S|M|L|none] [--tag TAG ... | --clear-tags] [--body TEXT | --body-file PATH]
|
|
139
|
+
backlog check [--json | --toon]
|
|
140
|
+
backlog web [--port 8765] [--no-browser] [--read-only]
|
|
141
|
+
backlog serve [--port 8765] [--no-browser] [--read-only]
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Use `none`, `null`, or `-` for an unassigned release. Use `--size none` to clear
|
|
145
|
+
a size. Tags are optional: repeat `--tag` for each label (for example, `--tag bug
|
|
146
|
+
--tag ios`), and use `--clear-tags` to remove them during an update. Repeat `--tag`
|
|
147
|
+
with `backlog list` to require one or more tags. `--body-file -` reads Markdown from standard input, which is convenient
|
|
148
|
+
for scripts and agents. `--template standard`, `feature`, `bug`, or `agent`
|
|
149
|
+
initializes a Markdown body; `--context`, `--outcome`, and repeatable `--criteria`
|
|
150
|
+
fill standard sections. Projects can define additional bodies in `[templates]` in
|
|
151
|
+
`backlog.toml`. `--body`/`--body-file` cannot be combined with a template.
|
|
152
|
+
|
|
153
|
+
`backlog upgrade` previews updates to the generated `backlog/README.md`,
|
|
154
|
+
`backlog/AGENTS.md`, and the managed block in the project-root `AGENTS.md`. Run it
|
|
155
|
+
with `--apply` to write those updates; on an interactive terminal the preview ends
|
|
156
|
+
with `Apply now? [y/N]`. Every initialized or upgraded project tracks
|
|
157
|
+
the installed integration version in `backlog/.version`; commit that tiny file with
|
|
158
|
+
the rest of the backlog. It is separate from `backlog.toml`'s data schema version.
|
|
159
|
+
|
|
160
|
+
`backlog add-batch --file tasks.json` creates a JSON array of task objects (or an
|
|
161
|
+
object containing only `tasks`) after validating the full batch; if any entry is
|
|
162
|
+
invalid, no task is created. Accepted fields are `title`, `release`, `priority`,
|
|
163
|
+
`size`, `state`, and `body`. Use `--file -` (the default) to read from stdin.
|
|
164
|
+
`add`, `add-batch`, and `update` all accept `--json` or `--toon` to return the
|
|
165
|
+
created or final task object(s) for scripts.
|
|
166
|
+
|
|
167
|
+
### Local AI task proposals
|
|
168
|
+
|
|
169
|
+
`backlog add-assistant "Add an accessibility audit to the current release, top priority"`
|
|
170
|
+
asks the selected provider for one structured, validated task proposal. It is
|
|
171
|
+
proposal-only by default: review the result, then repeat the command with
|
|
172
|
+
`--apply` only when you want to create the task.
|
|
173
|
+
|
|
174
|
+
> **Device Compatibility:** The `apple-intelligence` provider runs entirely
|
|
175
|
+
> on-device using Apple's Foundation Models framework via a local Swift bridge.
|
|
176
|
+
> It requires a supported Apple Silicon device running macOS 15.1+ (Sequoia or later)
|
|
177
|
+
> with Apple Intelligence enabled and its local model downloaded. On unsupported
|
|
178
|
+
> platforms (Linux, Windows, Intel Macs) or devices without Apple Intelligence,
|
|
179
|
+
> this provider is unavailable. No API key or remote AI provider is configured
|
|
180
|
+
> by this tool. Other providers can be added behind the same provider interface
|
|
181
|
+
> without changing task validation or creation.
|
|
182
|
+
|
|
183
|
+
`backlog web` opens the local browser UI (binding safely to `127.0.0.1` on port `8765` by default). It includes both an interactive three-column Kanban board (Todo, In progress, Done) and a list/editor workspace, with a quick view switcher in the header. Use `--read-only` (or toggle the read-only switch in the UI) to browse tasks safely without allowing modifications. `backlog serve` is supported as an alias.
|
|
184
|
+
|
|
185
|
+
When it can determine one, the web app initially selects the earliest release that still has unfinished work; if that calculation is unavailable, it shows all releases. Selecting a card in board view opens its full Markdown details in a dialog; in editor view, selecting a task displays its details in the sidebar where you can edit and save changes. Detects conflicting concurrent edits before saving.
|
|
186
|
+
|
|
187
|
+
The prompt above intentionally asks for an extraction, not a raw transcript dump.
|
|
188
|
+
A backlog task should retain enough context for a future human or agent to continue:
|
|
189
|
+
|
|
190
|
+
- why the task exists;
|
|
191
|
+
- the desired outcome;
|
|
192
|
+
- decisions and constraints already established;
|
|
193
|
+
- current progress and the next useful action;
|
|
194
|
+
- relevant file paths, links, or commands.
|
|
195
|
+
|
|
196
|
+
The agent can read metadata with `backlog list --json`, or use `--toon` for a more
|
|
197
|
+
compact LLM-oriented representation. JSON remains the interoperability format.
|
|
198
|
+
TOON renders task tags as one display-only scalar such as `bug · ios` (or `null`
|
|
199
|
+
when absent), keeping task lists tabular; JSON and Markdown retain the canonical
|
|
200
|
+
array.
|
|
201
|
+
Full bodies are available through `backlog show ID --json` or `--toon`; longer
|
|
202
|
+
Markdown can be written using `--body-file PATH` or `--body-file -`.
|
|
203
|
+
|
|
204
|
+
## Releases and packages
|
|
205
|
+
|
|
206
|
+
The CI workflow tests Python 3.11–3.13 and attaches wheel/source distributions to
|
|
207
|
+
each workflow run. The Release workflow runs automatically for every pushed `v*`
|
|
208
|
+
tag: it tests the tagged source, verifies that the tag equals the version in
|
|
209
|
+
`pyproject.toml`, builds both distributions, creates a GitHub Release with
|
|
210
|
+
generated notes, and publishes the package to PyPI via Trusted Publishing.
|
|
211
|
+
|
|
212
|
+
```console
|
|
213
|
+
# First update the version in pyproject.toml and src/personal_backlog/__init__.py
|
|
214
|
+
git commit -am "Release 0.3.3"
|
|
215
|
+
git tag -a v0.3.3 -m "Personal Backlog 0.3.3"
|
|
216
|
+
git push origin main --tags
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
To create the missing GitHub Release for the already-pushed `v0.1.0` tag after
|
|
220
|
+
this workflow reaches `main`, open **Actions → Release → Run workflow**, enter
|
|
221
|
+
`v0.1.0`, and run it. Releases are published automatically to PyPI and attached
|
|
222
|
+
as wheel/sdist assets to GitHub Releases.
|
|
223
|
+
|
|
224
|
+
## Dogfooding this repository
|
|
225
|
+
|
|
226
|
+
This repository is itself a tracked project: its live backlog is the `backlog/`
|
|
227
|
+
folder. From the repository root, use it exactly like any other project:
|
|
228
|
+
|
|
229
|
+
```console
|
|
230
|
+
backlog list
|
|
231
|
+
backlog show T0001
|
|
232
|
+
backlog check
|
|
233
|
+
backlog web
|
|
234
|
+
backlog serve
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
That is the whole dogfood mechanism. Changes made through the CLI or web app are
|
|
238
|
+
ordinary Git changes to `backlog/tasks/*.md` and should be reviewed and committed
|
|
239
|
+
with the code they describe.
|
|
240
|
+
|
|
241
|
+
## Task format
|
|
242
|
+
|
|
243
|
+
Each task is a Markdown file such as `T0001-add-offline-cache.md`:
|
|
244
|
+
|
|
245
|
+
```markdown
|
|
246
|
+
---
|
|
247
|
+
id: "T0001"
|
|
248
|
+
title: "Add offline cache"
|
|
249
|
+
release: "next"
|
|
250
|
+
priority: 1
|
|
251
|
+
size: "M"
|
|
252
|
+
state: "in_progress"
|
|
253
|
+
tags: ["bug", "ios"]
|
|
254
|
+
created: "2026-07-13T10:30:00+02:00"
|
|
255
|
+
done: null
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Context
|
|
259
|
+
|
|
260
|
+
Previously loaded data should remain available offline.
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
The task itself is Markdown with YAML front matter. The parser supports a flat,
|
|
264
|
+
intentionally small subset of YAML; JSON-style quoted strings, ordinary unquoted
|
|
265
|
+
strings, integers, and `null` are accepted. JSON is only an optional CLI and HTTP
|
|
266
|
+
API representation—it is not the on-disk backlog format. TOON is an additional
|
|
267
|
+
CLI-only output optimized for compact LLM context; it follows the working-draft
|
|
268
|
+
[TOON 3.3 specification](https://toonformat.dev/reference/spec) for the
|
|
269
|
+
JSON-shaped values emitted by this tool.
|
|
270
|
+
|
|
271
|
+
- IDs and creation timestamps never change.
|
|
272
|
+
- Priority is a five-bucket release ordering mechanism: `1` required for its
|
|
273
|
+
assigned release; `2` important for it; `3` normal/default; `4` can move later;
|
|
274
|
+
`5` parked idea. Do not use unique priorities to simulate drag ordering.
|
|
275
|
+
- Release is `next`, any project-specific release string, or `null`.
|
|
276
|
+
- Size `S` is an isolated, readily testable change; `M` is multiple related changes
|
|
277
|
+
in one layer; `L` is a cross-cutting feature or new app; `null` means it is not
|
|
278
|
+
understood yet. Split work that grows beyond `L` into actionable outcomes.
|
|
279
|
+
- State is `todo`, `in_progress`, or `done`. Keep most work in `todo`, normally one
|
|
280
|
+
main task (occasionally two) in `in_progress`; use `done` only after tests,
|
|
281
|
+
documentation, and manual validation are complete. No sprint ceremony is needed.
|
|
282
|
+
- Completing and reopening tasks maintains the `done` timestamp automatically.
|
|
283
|
+
- Tags are optional short labels. A task can have more than one, including `bug`;
|
|
284
|
+
leave them absent when they add no useful context.
|
|
285
|
+
- The Markdown body has no required structure.
|
|
286
|
+
|
|
287
|
+
## Development
|
|
288
|
+
|
|
289
|
+
The project requires Python 3.11+ and has no runtime dependencies.
|
|
290
|
+
|
|
291
|
+
```console
|
|
292
|
+
PYTHONPATH=src python3 -m unittest discover -s tests -v
|
|
293
|
+
PYTHONPATH=src python3 -m personal_backlog --help
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
To exercise the checkout without using the globally installed `backlog` command,
|
|
297
|
+
run the development launcher. It resolves this repository's `src/` directory and
|
|
298
|
+
replaces `PYTHONPATH`, so the current source is always the one executed:
|
|
299
|
+
|
|
300
|
+
```console
|
|
301
|
+
./scripts/backlog-dev --help
|
|
302
|
+
./scripts/backlog-dev --backlog ./backlog list
|
|
303
|
+
```
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# Personal Backlog
|
|
2
|
+
|
|
3
|
+
A tiny, Git-friendly Markdown backlog for side projects. Tasks live in the
|
|
4
|
+
project repository, remain readable without this tool, and can be managed from
|
|
5
|
+
the command line, a local browser UI, or an AI coding agent.
|
|
6
|
+
|
|
7
|
+
There are deliberately no sprints, assignees, labels, databases, accounts, or
|
|
8
|
+
remote services. Tool is extremely simple by design.
|
|
9
|
+
|
|
10
|
+
> The idea is to have something very simple to build a backlog, that moves alongside the code. You (Or your agents) can use it via an easy CLI.
|
|
11
|
+
|
|
12
|
+
## AI setup (recommended)
|
|
13
|
+
|
|
14
|
+
After installing the tool, initialize each tracked project with:
|
|
15
|
+
|
|
16
|
+
```console
|
|
17
|
+
backlog init --add-agent-instructions
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
This creates `backlog/` and safely creates or appends a managed pointer in the
|
|
21
|
+
project's root `AGENTS.md`. It never replaces existing project instructions and
|
|
22
|
+
will not duplicate its managed block. The pointer tells Codex to read the detailed, generated
|
|
23
|
+
`backlog/AGENTS.md` and use the `backlog` CLI.
|
|
24
|
+
|
|
25
|
+
Use this prompt when a conversation contains knowledge worth preserving:
|
|
26
|
+
|
|
27
|
+
> Read `backlog/AGENTS.md`, then extract the actionable project context from this
|
|
28
|
+
> conversation into the backlog. Inspect existing tasks first, update instead of
|
|
29
|
+
> duplicating, create one task per independently actionable outcome, preserve
|
|
30
|
+
> decisions and rationale in the Markdown body, omit conversational filler and
|
|
31
|
+
> secrets, run `backlog check`, and report the task IDs you created or updated.
|
|
32
|
+
|
|
33
|
+
The root `AGENTS.md` in the Personal Backlog source repository is not installed
|
|
34
|
+
into consumer projects and would not be discovered there. What the package does
|
|
35
|
+
ship is the template used to generate `backlog/AGENTS.md`; the explicit init flag
|
|
36
|
+
adds the missing project-root discovery pointer.
|
|
37
|
+
|
|
38
|
+
A separately installed Codex skill is sufficient if you want Personal Backlog to
|
|
39
|
+
be globally discoverable in Codex without changing every repository, but that is
|
|
40
|
+
Codex-specific and is not installed by `pip`. An MCP server would make operations
|
|
41
|
+
discoverable across configured MCP clients, at the cost of per-client setup and a
|
|
42
|
+
larger runtime surface. For ordinary local coding agents, the generated files and
|
|
43
|
+
CLI remain the simplest integration.
|
|
44
|
+
|
|
45
|
+
## Install
|
|
46
|
+
|
|
47
|
+
From PyPI with `uv tool` (recommended):
|
|
48
|
+
|
|
49
|
+
```console
|
|
50
|
+
uv tool install personal-backlog
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Or with `pipx` / `pip`:
|
|
54
|
+
|
|
55
|
+
```console
|
|
56
|
+
pipx install personal-backlog
|
|
57
|
+
# or
|
|
58
|
+
pip install personal-backlog
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
From GitHub:
|
|
62
|
+
|
|
63
|
+
```console
|
|
64
|
+
uv tool install "git+https://github.com/pulimento/personalBacklog.git@v0.3.3"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
For local development:
|
|
68
|
+
|
|
69
|
+
```console
|
|
70
|
+
uv tool install --editable .
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The installed command is `backlog`.
|
|
74
|
+
|
|
75
|
+
## Start a project backlog
|
|
76
|
+
|
|
77
|
+
Run this from a pet project's root:
|
|
78
|
+
|
|
79
|
+
```console
|
|
80
|
+
backlog init --add-agent-instructions
|
|
81
|
+
backlog add "Add offline cache" --release next --priority 1 --size M
|
|
82
|
+
backlog add "Improve import errors"
|
|
83
|
+
backlog list
|
|
84
|
+
backlog upgrade
|
|
85
|
+
backlog web
|
|
86
|
+
backlog serve
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`backlog init` creates:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
backlog/
|
|
93
|
+
├── backlog.toml
|
|
94
|
+
├── README.md
|
|
95
|
+
├── AGENTS.md
|
|
96
|
+
└── tasks/
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The CLI searches the current directory and its parents for that backlog, so it
|
|
100
|
+
also works from nested project directories. Use `--backlog PATH` to select one
|
|
101
|
+
explicitly.
|
|
102
|
+
|
|
103
|
+
## Commands
|
|
104
|
+
|
|
105
|
+
```console
|
|
106
|
+
backlog init [PATH] [--add-agent-instructions]
|
|
107
|
+
backlog upgrade [--apply] [--json | --toon]
|
|
108
|
+
backlog add TITLE [--release RELEASE] [--priority 1|2|3|4|5] [--size S|M|L|none] [--tag TAG ...] [--body TEXT | --body-file PATH | --template NAME]
|
|
109
|
+
backlog add-batch [--file PATH] [--json | --toon]
|
|
110
|
+
backlog add-assistant REQUEST [--provider apple-intelligence] [--apply] [--json | --toon]
|
|
111
|
+
backlog list [--state STATE] [--release RELEASE] [--tag TAG ...] [--json | --toon]
|
|
112
|
+
backlog show ID [--json | --toon]
|
|
113
|
+
backlog update ID [--title TITLE] [--state todo|in_progress|done] [--release RELEASE] [--priority 1|2|3|4|5] [--size S|M|L|none] [--tag TAG ... | --clear-tags] [--body TEXT | --body-file PATH]
|
|
114
|
+
backlog check [--json | --toon]
|
|
115
|
+
backlog web [--port 8765] [--no-browser] [--read-only]
|
|
116
|
+
backlog serve [--port 8765] [--no-browser] [--read-only]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Use `none`, `null`, or `-` for an unassigned release. Use `--size none` to clear
|
|
120
|
+
a size. Tags are optional: repeat `--tag` for each label (for example, `--tag bug
|
|
121
|
+
--tag ios`), and use `--clear-tags` to remove them during an update. Repeat `--tag`
|
|
122
|
+
with `backlog list` to require one or more tags. `--body-file -` reads Markdown from standard input, which is convenient
|
|
123
|
+
for scripts and agents. `--template standard`, `feature`, `bug`, or `agent`
|
|
124
|
+
initializes a Markdown body; `--context`, `--outcome`, and repeatable `--criteria`
|
|
125
|
+
fill standard sections. Projects can define additional bodies in `[templates]` in
|
|
126
|
+
`backlog.toml`. `--body`/`--body-file` cannot be combined with a template.
|
|
127
|
+
|
|
128
|
+
`backlog upgrade` previews updates to the generated `backlog/README.md`,
|
|
129
|
+
`backlog/AGENTS.md`, and the managed block in the project-root `AGENTS.md`. Run it
|
|
130
|
+
with `--apply` to write those updates; on an interactive terminal the preview ends
|
|
131
|
+
with `Apply now? [y/N]`. Every initialized or upgraded project tracks
|
|
132
|
+
the installed integration version in `backlog/.version`; commit that tiny file with
|
|
133
|
+
the rest of the backlog. It is separate from `backlog.toml`'s data schema version.
|
|
134
|
+
|
|
135
|
+
`backlog add-batch --file tasks.json` creates a JSON array of task objects (or an
|
|
136
|
+
object containing only `tasks`) after validating the full batch; if any entry is
|
|
137
|
+
invalid, no task is created. Accepted fields are `title`, `release`, `priority`,
|
|
138
|
+
`size`, `state`, and `body`. Use `--file -` (the default) to read from stdin.
|
|
139
|
+
`add`, `add-batch`, and `update` all accept `--json` or `--toon` to return the
|
|
140
|
+
created or final task object(s) for scripts.
|
|
141
|
+
|
|
142
|
+
### Local AI task proposals
|
|
143
|
+
|
|
144
|
+
`backlog add-assistant "Add an accessibility audit to the current release, top priority"`
|
|
145
|
+
asks the selected provider for one structured, validated task proposal. It is
|
|
146
|
+
proposal-only by default: review the result, then repeat the command with
|
|
147
|
+
`--apply` only when you want to create the task.
|
|
148
|
+
|
|
149
|
+
> **Device Compatibility:** The `apple-intelligence` provider runs entirely
|
|
150
|
+
> on-device using Apple's Foundation Models framework via a local Swift bridge.
|
|
151
|
+
> It requires a supported Apple Silicon device running macOS 15.1+ (Sequoia or later)
|
|
152
|
+
> with Apple Intelligence enabled and its local model downloaded. On unsupported
|
|
153
|
+
> platforms (Linux, Windows, Intel Macs) or devices without Apple Intelligence,
|
|
154
|
+
> this provider is unavailable. No API key or remote AI provider is configured
|
|
155
|
+
> by this tool. Other providers can be added behind the same provider interface
|
|
156
|
+
> without changing task validation or creation.
|
|
157
|
+
|
|
158
|
+
`backlog web` opens the local browser UI (binding safely to `127.0.0.1` on port `8765` by default). It includes both an interactive three-column Kanban board (Todo, In progress, Done) and a list/editor workspace, with a quick view switcher in the header. Use `--read-only` (or toggle the read-only switch in the UI) to browse tasks safely without allowing modifications. `backlog serve` is supported as an alias.
|
|
159
|
+
|
|
160
|
+
When it can determine one, the web app initially selects the earliest release that still has unfinished work; if that calculation is unavailable, it shows all releases. Selecting a card in board view opens its full Markdown details in a dialog; in editor view, selecting a task displays its details in the sidebar where you can edit and save changes. Detects conflicting concurrent edits before saving.
|
|
161
|
+
|
|
162
|
+
The prompt above intentionally asks for an extraction, not a raw transcript dump.
|
|
163
|
+
A backlog task should retain enough context for a future human or agent to continue:
|
|
164
|
+
|
|
165
|
+
- why the task exists;
|
|
166
|
+
- the desired outcome;
|
|
167
|
+
- decisions and constraints already established;
|
|
168
|
+
- current progress and the next useful action;
|
|
169
|
+
- relevant file paths, links, or commands.
|
|
170
|
+
|
|
171
|
+
The agent can read metadata with `backlog list --json`, or use `--toon` for a more
|
|
172
|
+
compact LLM-oriented representation. JSON remains the interoperability format.
|
|
173
|
+
TOON renders task tags as one display-only scalar such as `bug · ios` (or `null`
|
|
174
|
+
when absent), keeping task lists tabular; JSON and Markdown retain the canonical
|
|
175
|
+
array.
|
|
176
|
+
Full bodies are available through `backlog show ID --json` or `--toon`; longer
|
|
177
|
+
Markdown can be written using `--body-file PATH` or `--body-file -`.
|
|
178
|
+
|
|
179
|
+
## Releases and packages
|
|
180
|
+
|
|
181
|
+
The CI workflow tests Python 3.11–3.13 and attaches wheel/source distributions to
|
|
182
|
+
each workflow run. The Release workflow runs automatically for every pushed `v*`
|
|
183
|
+
tag: it tests the tagged source, verifies that the tag equals the version in
|
|
184
|
+
`pyproject.toml`, builds both distributions, creates a GitHub Release with
|
|
185
|
+
generated notes, and publishes the package to PyPI via Trusted Publishing.
|
|
186
|
+
|
|
187
|
+
```console
|
|
188
|
+
# First update the version in pyproject.toml and src/personal_backlog/__init__.py
|
|
189
|
+
git commit -am "Release 0.3.3"
|
|
190
|
+
git tag -a v0.3.3 -m "Personal Backlog 0.3.3"
|
|
191
|
+
git push origin main --tags
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
To create the missing GitHub Release for the already-pushed `v0.1.0` tag after
|
|
195
|
+
this workflow reaches `main`, open **Actions → Release → Run workflow**, enter
|
|
196
|
+
`v0.1.0`, and run it. Releases are published automatically to PyPI and attached
|
|
197
|
+
as wheel/sdist assets to GitHub Releases.
|
|
198
|
+
|
|
199
|
+
## Dogfooding this repository
|
|
200
|
+
|
|
201
|
+
This repository is itself a tracked project: its live backlog is the `backlog/`
|
|
202
|
+
folder. From the repository root, use it exactly like any other project:
|
|
203
|
+
|
|
204
|
+
```console
|
|
205
|
+
backlog list
|
|
206
|
+
backlog show T0001
|
|
207
|
+
backlog check
|
|
208
|
+
backlog web
|
|
209
|
+
backlog serve
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
That is the whole dogfood mechanism. Changes made through the CLI or web app are
|
|
213
|
+
ordinary Git changes to `backlog/tasks/*.md` and should be reviewed and committed
|
|
214
|
+
with the code they describe.
|
|
215
|
+
|
|
216
|
+
## Task format
|
|
217
|
+
|
|
218
|
+
Each task is a Markdown file such as `T0001-add-offline-cache.md`:
|
|
219
|
+
|
|
220
|
+
```markdown
|
|
221
|
+
---
|
|
222
|
+
id: "T0001"
|
|
223
|
+
title: "Add offline cache"
|
|
224
|
+
release: "next"
|
|
225
|
+
priority: 1
|
|
226
|
+
size: "M"
|
|
227
|
+
state: "in_progress"
|
|
228
|
+
tags: ["bug", "ios"]
|
|
229
|
+
created: "2026-07-13T10:30:00+02:00"
|
|
230
|
+
done: null
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Context
|
|
234
|
+
|
|
235
|
+
Previously loaded data should remain available offline.
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
The task itself is Markdown with YAML front matter. The parser supports a flat,
|
|
239
|
+
intentionally small subset of YAML; JSON-style quoted strings, ordinary unquoted
|
|
240
|
+
strings, integers, and `null` are accepted. JSON is only an optional CLI and HTTP
|
|
241
|
+
API representation—it is not the on-disk backlog format. TOON is an additional
|
|
242
|
+
CLI-only output optimized for compact LLM context; it follows the working-draft
|
|
243
|
+
[TOON 3.3 specification](https://toonformat.dev/reference/spec) for the
|
|
244
|
+
JSON-shaped values emitted by this tool.
|
|
245
|
+
|
|
246
|
+
- IDs and creation timestamps never change.
|
|
247
|
+
- Priority is a five-bucket release ordering mechanism: `1` required for its
|
|
248
|
+
assigned release; `2` important for it; `3` normal/default; `4` can move later;
|
|
249
|
+
`5` parked idea. Do not use unique priorities to simulate drag ordering.
|
|
250
|
+
- Release is `next`, any project-specific release string, or `null`.
|
|
251
|
+
- Size `S` is an isolated, readily testable change; `M` is multiple related changes
|
|
252
|
+
in one layer; `L` is a cross-cutting feature or new app; `null` means it is not
|
|
253
|
+
understood yet. Split work that grows beyond `L` into actionable outcomes.
|
|
254
|
+
- State is `todo`, `in_progress`, or `done`. Keep most work in `todo`, normally one
|
|
255
|
+
main task (occasionally two) in `in_progress`; use `done` only after tests,
|
|
256
|
+
documentation, and manual validation are complete. No sprint ceremony is needed.
|
|
257
|
+
- Completing and reopening tasks maintains the `done` timestamp automatically.
|
|
258
|
+
- Tags are optional short labels. A task can have more than one, including `bug`;
|
|
259
|
+
leave them absent when they add no useful context.
|
|
260
|
+
- The Markdown body has no required structure.
|
|
261
|
+
|
|
262
|
+
## Development
|
|
263
|
+
|
|
264
|
+
The project requires Python 3.11+ and has no runtime dependencies.
|
|
265
|
+
|
|
266
|
+
```console
|
|
267
|
+
PYTHONPATH=src python3 -m unittest discover -s tests -v
|
|
268
|
+
PYTHONPATH=src python3 -m personal_backlog --help
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
To exercise the checkout without using the globally installed `backlog` command,
|
|
272
|
+
run the development launcher. It resolves this repository's `src/` directory and
|
|
273
|
+
replaces `PYTHONPATH`, so the current source is always the one executed:
|
|
274
|
+
|
|
275
|
+
```console
|
|
276
|
+
./scripts/backlog-dev --help
|
|
277
|
+
./scripts/backlog-dev --backlog ./backlog list
|
|
278
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "personal-backlog"
|
|
7
|
+
version = "0.3.3"
|
|
8
|
+
description = "A tiny, Git-friendly Markdown backlog for personal projects"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
authors = [{ name = "pulimento" }]
|
|
14
|
+
keywords = ["backlog", "markdown", "git", "cli", "ai-agents", "task-management", "codex"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 4 - Beta",
|
|
17
|
+
"Environment :: Console",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"Operating System :: OS Independent",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.11",
|
|
22
|
+
"Programming Language :: Python :: 3.12",
|
|
23
|
+
"Programming Language :: Python :: 3.13",
|
|
24
|
+
"Topic :: Utilities",
|
|
25
|
+
"Topic :: Software Development :: Bug Tracking",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://github.com/pulimento/personalBacklog"
|
|
30
|
+
Repository = "https://github.com/pulimento/personalBacklog"
|
|
31
|
+
Issues = "https://github.com/pulimento/personalBacklog/issues"
|
|
32
|
+
|
|
33
|
+
[project.scripts]
|
|
34
|
+
backlog = "personal_backlog.cli:main"
|
|
35
|
+
|
|
36
|
+
[tool.setuptools]
|
|
37
|
+
package-dir = { "" = "src" }
|
|
38
|
+
include-package-data = true
|
|
39
|
+
|
|
40
|
+
[tool.setuptools.packages.find]
|
|
41
|
+
where = ["src"]
|
|
42
|
+
|
|
43
|
+
[tool.setuptools.package-data]
|
|
44
|
+
personal_backlog = ["web/*", "board_web/*", "task_web/*", "assistant_assets/*"]
|