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.
Files changed (41) hide show
  1. personal_backlog-0.3.3/LICENSE +21 -0
  2. personal_backlog-0.3.3/PKG-INFO +303 -0
  3. personal_backlog-0.3.3/README.md +278 -0
  4. personal_backlog-0.3.3/pyproject.toml +44 -0
  5. personal_backlog-0.3.3/setup.cfg +4 -0
  6. personal_backlog-0.3.3/src/personal_backlog/__init__.py +3 -0
  7. personal_backlog-0.3.3/src/personal_backlog/__main__.py +5 -0
  8. personal_backlog-0.3.3/src/personal_backlog/assistant.py +163 -0
  9. personal_backlog-0.3.3/src/personal_backlog/assistant_assets/__init__.py +1 -0
  10. personal_backlog-0.3.3/src/personal_backlog/assistant_assets/apple_intelligence.swift +84 -0
  11. personal_backlog-0.3.3/src/personal_backlog/board.py +19 -0
  12. personal_backlog-0.3.3/src/personal_backlog/board_web/__init__.py +1 -0
  13. personal_backlog-0.3.3/src/personal_backlog/board_web/app.js +155 -0
  14. personal_backlog-0.3.3/src/personal_backlog/board_web/index.html +102 -0
  15. personal_backlog-0.3.3/src/personal_backlog/board_web/styles.css +326 -0
  16. personal_backlog-0.3.3/src/personal_backlog/cli.py +417 -0
  17. personal_backlog-0.3.3/src/personal_backlog/model.py +134 -0
  18. personal_backlog-0.3.3/src/personal_backlog/ports.py +41 -0
  19. personal_backlog-0.3.3/src/personal_backlog/server.py +271 -0
  20. personal_backlog-0.3.3/src/personal_backlog/storage.py +745 -0
  21. personal_backlog-0.3.3/src/personal_backlog/task_web/__init__.py +1 -0
  22. personal_backlog-0.3.3/src/personal_backlog/task_web/task-detail.css +26 -0
  23. personal_backlog-0.3.3/src/personal_backlog/task_web/task-detail.js +90 -0
  24. personal_backlog-0.3.3/src/personal_backlog/toon.py +151 -0
  25. personal_backlog-0.3.3/src/personal_backlog/web/__init__.py +1 -0
  26. personal_backlog-0.3.3/src/personal_backlog/web/app.js +460 -0
  27. personal_backlog-0.3.3/src/personal_backlog/web/index.html +211 -0
  28. personal_backlog-0.3.3/src/personal_backlog/web/styles.css +600 -0
  29. personal_backlog-0.3.3/src/personal_backlog.egg-info/PKG-INFO +303 -0
  30. personal_backlog-0.3.3/src/personal_backlog.egg-info/SOURCES.txt +39 -0
  31. personal_backlog-0.3.3/src/personal_backlog.egg-info/dependency_links.txt +1 -0
  32. personal_backlog-0.3.3/src/personal_backlog.egg-info/entry_points.txt +2 -0
  33. personal_backlog-0.3.3/src/personal_backlog.egg-info/top_level.txt +1 -0
  34. personal_backlog-0.3.3/tests/test_assistant.py +55 -0
  35. personal_backlog-0.3.3/tests/test_board.py +93 -0
  36. personal_backlog-0.3.3/tests/test_cli.py +228 -0
  37. personal_backlog-0.3.3/tests/test_dev_script.py +47 -0
  38. personal_backlog-0.3.3/tests/test_ports.py +31 -0
  39. personal_backlog-0.3.3/tests/test_server.py +131 -0
  40. personal_backlog-0.3.3/tests/test_storage.py +163 -0
  41. 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/*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """A tiny, Git-friendly Markdown backlog."""
2
+
3
+ __version__ = "0.3.3"
@@ -0,0 +1,5 @@
1
+ from personal_backlog.cli import main
2
+
3
+
4
+ if __name__ == "__main__":
5
+ raise SystemExit(main())