pinax-tracker 0.1.2__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.
- pinax_tracker-0.1.2/LICENSE +21 -0
- pinax_tracker-0.1.2/PKG-INFO +10 -0
- pinax_tracker-0.1.2/README.md +105 -0
- pinax_tracker-0.1.2/pinax/__init__.py +1 -0
- pinax_tracker-0.1.2/pinax/__main__.py +985 -0
- pinax_tracker-0.1.2/pinax/all_branches.py +138 -0
- pinax_tracker-0.1.2/pinax/append.py +217 -0
- pinax_tracker-0.1.2/pinax/commands/__init__.py +1 -0
- pinax_tracker-0.1.2/pinax/commands/add.py +147 -0
- pinax_tracker-0.1.2/pinax/commands/annul.py +113 -0
- pinax_tracker-0.1.2/pinax/commands/block.py +104 -0
- pinax_tracker-0.1.2/pinax/commands/board_cmd.py +72 -0
- pinax_tracker-0.1.2/pinax/commands/claim.py +92 -0
- pinax_tracker-0.1.2/pinax/commands/dep.py +188 -0
- pinax_tracker-0.1.2/pinax/commands/dispatch.py +199 -0
- pinax_tracker-0.1.2/pinax/commands/doctor_cmd.py +321 -0
- pinax_tracker-0.1.2/pinax/commands/done.py +114 -0
- pinax_tracker-0.1.2/pinax/commands/init.py +229 -0
- pinax_tracker-0.1.2/pinax/commands/metrics_cmd.py +92 -0
- pinax_tracker-0.1.2/pinax/commands/next_cmd.py +66 -0
- pinax_tracker-0.1.2/pinax/commands/note.py +183 -0
- pinax_tracker-0.1.2/pinax/commands/overview.py +612 -0
- pinax_tracker-0.1.2/pinax/commands/park.py +93 -0
- pinax_tracker-0.1.2/pinax/commands/priority.py +173 -0
- pinax_tracker-0.1.2/pinax/commands/ready.py +79 -0
- pinax_tracker-0.1.2/pinax/commands/reconcile.py +434 -0
- pinax_tracker-0.1.2/pinax/commands/registry_cmd.py +209 -0
- pinax_tracker-0.1.2/pinax/commands/replay_cmd.py +76 -0
- pinax_tracker-0.1.2/pinax/commands/report_cmd.py +198 -0
- pinax_tracker-0.1.2/pinax/commands/status_cmd.py +242 -0
- pinax_tracker-0.1.2/pinax/commands/verify.py +235 -0
- pinax_tracker-0.1.2/pinax/doctor.py +511 -0
- pinax_tracker-0.1.2/pinax/event.py +155 -0
- pinax_tracker-0.1.2/pinax/fold.py +1668 -0
- pinax_tracker-0.1.2/pinax/ids.py +94 -0
- pinax_tracker-0.1.2/pinax/metrics.py +167 -0
- pinax_tracker-0.1.2/pinax/projection.py +670 -0
- pinax_tracker-0.1.2/pinax/remote.py +367 -0
- pinax_tracker-0.1.2/pinax/replay.py +165 -0
- pinax_tracker-0.1.2/pinax/separation.py +138 -0
- pinax_tracker-0.1.2/pinax/statusview.py +298 -0
- pinax_tracker-0.1.2/pinax/visibility.py +127 -0
- pinax_tracker-0.1.2/pinax_tracker.egg-info/PKG-INFO +10 -0
- pinax_tracker-0.1.2/pinax_tracker.egg-info/SOURCES.txt +86 -0
- pinax_tracker-0.1.2/pinax_tracker.egg-info/dependency_links.txt +1 -0
- pinax_tracker-0.1.2/pinax_tracker.egg-info/entry_points.txt +2 -0
- pinax_tracker-0.1.2/pinax_tracker.egg-info/requires.txt +4 -0
- pinax_tracker-0.1.2/pinax_tracker.egg-info/top_level.txt +1 -0
- pinax_tracker-0.1.2/pyproject.toml +30 -0
- pinax_tracker-0.1.2/setup.cfg +4 -0
- pinax_tracker-0.1.2/tests/test_all_branches.py +335 -0
- pinax_tracker-0.1.2/tests/test_annul.py +437 -0
- pinax_tracker-0.1.2/tests/test_append.py +206 -0
- pinax_tracker-0.1.2/tests/test_append_concurrency.py +311 -0
- pinax_tracker-0.1.2/tests/test_append_guard.py +195 -0
- pinax_tracker-0.1.2/tests/test_board.py +80 -0
- pinax_tracker-0.1.2/tests/test_chain_merge.py +315 -0
- pinax_tracker-0.1.2/tests/test_chain_multishard.py +238 -0
- pinax_tracker-0.1.2/tests/test_console_ascii.py +192 -0
- pinax_tracker-0.1.2/tests/test_cross_platform.py +180 -0
- pinax_tracker-0.1.2/tests/test_dep_cli.py +445 -0
- pinax_tracker-0.1.2/tests/test_doctor.py +694 -0
- pinax_tracker-0.1.2/tests/test_double_claim.py +442 -0
- pinax_tracker-0.1.2/tests/test_fold_determinism.py +393 -0
- pinax_tracker-0.1.2/tests/test_integrity.py +244 -0
- pinax_tracker-0.1.2/tests/test_merge_safety.py +1156 -0
- pinax_tracker-0.1.2/tests/test_next_critical_path.py +703 -0
- pinax_tracker-0.1.2/tests/test_note_lint.py +525 -0
- pinax_tracker-0.1.2/tests/test_overview.py +673 -0
- pinax_tracker-0.1.2/tests/test_overview_markdown.py +360 -0
- pinax_tracker-0.1.2/tests/test_overview_remote.py +558 -0
- pinax_tracker-0.1.2/tests/test_phase_seq_order.py +208 -0
- pinax_tracker-0.1.2/tests/test_precommit_hook.py +266 -0
- pinax_tracker-0.1.2/tests/test_priority.py +624 -0
- pinax_tracker-0.1.2/tests/test_projection.py +621 -0
- pinax_tracker-0.1.2/tests/test_ready_next.py +676 -0
- pinax_tracker-0.1.2/tests/test_reconcile.py +624 -0
- pinax_tracker-0.1.2/tests/test_reconcile_roundtrip.py +315 -0
- pinax_tracker-0.1.2/tests/test_registry.py +340 -0
- pinax_tracker-0.1.2/tests/test_replay.py +444 -0
- pinax_tracker-0.1.2/tests/test_report.py +252 -0
- pinax_tracker-0.1.2/tests/test_root_guard.py +385 -0
- pinax_tracker-0.1.2/tests/test_separation_negative.py +340 -0
- pinax_tracker-0.1.2/tests/test_status_view.py +200 -0
- pinax_tracker-0.1.2/tests/test_two_clone_divergence.py +336 -0
- pinax_tracker-0.1.2/tests/test_typed_edge_fold.py +788 -0
- pinax_tracker-0.1.2/tests/test_verify_fix.py +255 -0
- pinax_tracker-0.1.2/tests/test_visibility.py +196 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Georgios Antikatzidis
|
|
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,10 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pinax-tracker
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: Git-native, deterministic build tracker
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Provides-Extra: test
|
|
8
|
+
Requires-Dist: pytest; extra == "test"
|
|
9
|
+
Requires-Dist: pytest-timeout; extra == "test"
|
|
10
|
+
Dynamic: license-file
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Pinax
|
|
2
|
+
|
|
3
|
+
Pinax is a Git-native tracker for software delivery work. It stores an
|
|
4
|
+
append-only JSONL event log in the repository, derives the current board from
|
|
5
|
+
that log, and commits the generated Markdown board alongside the code.
|
|
6
|
+
|
|
7
|
+
The tracker gives a team one durable record of items, dependencies, ownership,
|
|
8
|
+
status, and completion briefings. Git carries the record between clones and
|
|
9
|
+
branches. There is no service to host, database to operate, or account to
|
|
10
|
+
create.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
Pinax requires Python 3.10 or later and Git.
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pipx install pinax-tracker
|
|
18
|
+
pinax --help
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The same package installs with pip:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python -m pip install pinax-tracker
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
To work from a checkout:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
git clone https://github.com/antikas/pinax-tracker.git
|
|
31
|
+
cd pinax-tracker
|
|
32
|
+
python -m pip install -e .
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Start tracking a repository
|
|
36
|
+
|
|
37
|
+
Run `pinax init` at the root of the repository you want to track. It creates
|
|
38
|
+
`.ergon/`, records the initial events, configures the log's merge attributes,
|
|
39
|
+
and installs a pre-commit verification hook when Git allows it.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pinax init --actor alex@laptop
|
|
43
|
+
pinax add --title "Ship the widget" --actor alex@laptop
|
|
44
|
+
pinax claim <item-id> --actor alex@laptop
|
|
45
|
+
pinax done <item-id> --briefing completion.md --actor alex@laptop
|
|
46
|
+
pinax status
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`completion.md` is a short work record. It stays with the item in the
|
|
50
|
+
generated projection.
|
|
51
|
+
|
|
52
|
+
## Everyday commands
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
pinax add --title TEXT
|
|
56
|
+
pinax claim ITEM_ID
|
|
57
|
+
pinax done ITEM_ID --briefing FILE
|
|
58
|
+
pinax block ITEM_ID --gate scope|decision|destructive|proposal
|
|
59
|
+
pinax park ITEM_ID --reason TEXT
|
|
60
|
+
pinax dep add FROM_ID --blocks TO_ID
|
|
61
|
+
pinax ready
|
|
62
|
+
pinax next
|
|
63
|
+
pinax status [--json]
|
|
64
|
+
pinax board [--json]
|
|
65
|
+
pinax report [--json]
|
|
66
|
+
pinax verify [--fix]
|
|
67
|
+
pinax replay --at GIT_REF
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`pinax verify` checks that every physical parsed event has a valid event hash
|
|
71
|
+
unless it is covered by a valid tombstone, then compares the generated board
|
|
72
|
+
and item pages with the committed projection. `--fix` regenerates only a
|
|
73
|
+
drifted projection. It refuses invalid event history without changing the log
|
|
74
|
+
or projection.
|
|
75
|
+
|
|
76
|
+
## Storage model
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
.ergon/
|
|
80
|
+
log/*.jsonl append-only event shards
|
|
81
|
+
board.md generated project board
|
|
82
|
+
items/<id>.md generated item pages
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Each event has a content-derived identifier. The fold sorts events by
|
|
86
|
+
`(seq, ts, actor, id)`, deduplicates by identifier, and applies the resulting
|
|
87
|
+
stream deterministically. Git's union merge driver preserves concurrent JSONL
|
|
88
|
+
appends; a duplicated line is a no-op in the fold.
|
|
89
|
+
|
|
90
|
+
Claims resolve during the fold. If two claims name one item, the earliest
|
|
91
|
+
`(ts, actor, id)` claim wins and the other becomes a reported supersession.
|
|
92
|
+
Dependency edges drive `ready` and `next`.
|
|
93
|
+
|
|
94
|
+
The predecessor field is a local consistency check. It can report a dangling
|
|
95
|
+
predecessor reference, but version 1 does not hash the predecessor field or
|
|
96
|
+
provide remote anchoring, signatures, or hostile-writer authentication.
|
|
97
|
+
|
|
98
|
+
The event envelope, integrity rules, and projection model are described in
|
|
99
|
+
[DESIGN.md](DESIGN.md). The executable event handlers and renderers are the
|
|
100
|
+
authoritative implementation details.
|
|
101
|
+
Architecture decisions are in [docs/decisions](docs/decisions).
|
|
102
|
+
|
|
103
|
+
## Licence
|
|
104
|
+
|
|
105
|
+
Pinax is available under the [MIT License](LICENSE).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.2"
|