sako 0.5.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.
- sako-0.5.0/.gitignore +16 -0
- sako-0.5.0/AGENTS.md +84 -0
- sako-0.5.0/CHANGELOG.md +44 -0
- sako-0.5.0/CONTRIBUTING.md +132 -0
- sako-0.5.0/LICENSE +21 -0
- sako-0.5.0/PKG-INFO +200 -0
- sako-0.5.0/README.md +171 -0
- sako-0.5.0/SAKO.md +319 -0
- sako-0.5.0/SECURITY.md +32 -0
- sako-0.5.0/docs/compatibility.md +129 -0
- sako-0.5.0/docs/demo.md +158 -0
- sako-0.5.0/docs/glossary.md +30 -0
- sako-0.5.0/docs/intake-recipes.md +82 -0
- sako-0.5.0/docs/limits.md +181 -0
- sako-0.5.0/docs/move-to-a-tracker.md +154 -0
- sako-0.5.0/docs/update-and-remove.md +89 -0
- sako-0.5.0/docs/validation.md +110 -0
- sako-0.5.0/pyproject.toml +60 -0
- sako-0.5.0/sako.py +1799 -0
- sako-0.5.0/skills/README.md +13 -0
- sako-0.5.0/skills/sako/SKILL.md +20 -0
- sako-0.5.0/templates/TASKS.md +10 -0
- sako-0.5.0/tests/demo.py +133 -0
- sako-0.5.0/tests/measure.py +70 -0
- sako-0.5.0/tests/planning-cases.md +44 -0
- sako-0.5.0/tests/selftest.py +1071 -0
- sako-0.5.0/tests/test_compatibility.py +580 -0
- sako-0.5.0/tests/test_footprint.py +669 -0
- sako-0.5.0/tests/test_gate.py +384 -0
- sako-0.5.0/tests/test_release.py +293 -0
- sako-0.5.0/tests/test_sako.py +218 -0
- sako-0.5.0/tests/test_workflow.py +481 -0
sako-0.5.0/.gitignore
ADDED
sako-0.5.0/AGENTS.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Working on SAKO
|
|
2
|
+
|
|
3
|
+
Rules and checks for agents that change this repository. They extend
|
|
4
|
+
[CONTRIBUTING.md](CONTRIBUTING.md), which people read first.
|
|
5
|
+
|
|
6
|
+
SAKO is a small execution kit: [SAKO.md](SAKO.md) is the method with its default
|
|
7
|
+
planner, `sako.py` is the runtime, `skills/` is the optional agent entry,
|
|
8
|
+
`templates/` holds the empty task table, and `docs/` holds the demo, the glossary,
|
|
9
|
+
the recipes, compatibility, limits, the lifecycle, and the guarantees with their
|
|
10
|
+
evidence (validation).
|
|
11
|
+
|
|
12
|
+
## Read path
|
|
13
|
+
|
|
14
|
+
1. This file, then [CONTRIBUTING.md](CONTRIBUTING.md) for the design budgets and the
|
|
15
|
+
[principles](README.md#why-it-stays-small) it points to.
|
|
16
|
+
2. [SAKO.md](SAKO.md) before changing behavior or planning, and the
|
|
17
|
+
[guarantees](docs/validation.md#guarantees) a change must keep.
|
|
18
|
+
3. `tests/selftest.py` to see what is proven.
|
|
19
|
+
|
|
20
|
+
## Laws
|
|
21
|
+
|
|
22
|
+
- One runtime file. `sako.py` stays standard-library Python 3.10 or newer, in one
|
|
23
|
+
file within the runtime budget in CONTRIBUTING.md. Count before adding (`wc -l
|
|
24
|
+
sako.py`). Over the budget, remove something or reopen the question of a heavier
|
|
25
|
+
tool; never add a second script.
|
|
26
|
+
- The principles, the guarantees and the maintainer's direction govern changes to
|
|
27
|
+
project conventions.
|
|
28
|
+
- Machinery only after an observed need. A new check, command or hook shows first
|
|
29
|
+
that the ledger row, the method or an existing command cannot hold it.
|
|
30
|
+
- Documents claim only what exists. A command that is not implemented is not
|
|
31
|
+
documented.
|
|
32
|
+
- Examples are synthetic: no real product, person, account, path or session identifier
|
|
33
|
+
in examples, fixtures or tests. Comparisons, recipes, install steps and client wiring
|
|
34
|
+
may name real tools; check what they say against each tool's current documentation.
|
|
35
|
+
- Plain language, no em dashes, in files, replies and commit messages.
|
|
36
|
+
- Git is the archive: delete retired material and commit the deletion.
|
|
37
|
+
|
|
38
|
+
## Traps
|
|
39
|
+
|
|
40
|
+
- `init` needs this checkout or the package built from it (`pyproject.toml` installs
|
|
41
|
+
`sako.py` as `sako/__init__.py`). The runtime copied into a project cannot seed
|
|
42
|
+
another project.
|
|
43
|
+
- The scenario suite starts `sleep` processes as stand-ins for agent sessions. An
|
|
44
|
+
interrupted run leaves them until they exit on their own, within an hour.
|
|
45
|
+
|
|
46
|
+
## Checks
|
|
47
|
+
|
|
48
|
+
From the checkout root:
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v
|
|
52
|
+
PYTHONDONTWRITEBYTECODE=1 python3 tests/selftest.py
|
|
53
|
+
git diff --check
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Run both suites on the oldest supported Python when it is available. A change to
|
|
57
|
+
`sako.py` without a green suite does not land.
|
|
58
|
+
|
|
59
|
+
## Commits
|
|
60
|
+
|
|
61
|
+
Commit under the author and committer identity already configured for this
|
|
62
|
+
repository; never replace it with a tool identity or change global settings.
|
|
63
|
+
|
|
64
|
+
Every agent-created commit ends, after a blank line, with one trailer per tool that
|
|
65
|
+
did the work, each exactly once:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
Co-authored-by: Codex <noreply@openai.com>
|
|
69
|
+
Co-authored-by: Claude <noreply@anthropic.com>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Use the Codex trailer for Codex work and the Claude trailer for Claude work. Credit both
|
|
73
|
+
only when both materially contributed. Review-only involvement belongs in review
|
|
74
|
+
evidence, not co-authorship. Commits made by a person alone carry no tool trailer.
|
|
75
|
+
Keep each trailer exactly once when amending or squashing. These trailers are the
|
|
76
|
+
whole attribution: no `Claude-Session` trailer, no session links.
|
|
77
|
+
|
|
78
|
+
Write the message in a file and commit with `git commit -F <file>`. Check the
|
|
79
|
+
resulting author, committer and message with `git show -s --format=full HEAD`, and the
|
|
80
|
+
parsed trailers with `git show -s --format='%(trailers:key=Co-authored-by,valueonly)' HEAD`.
|
|
81
|
+
|
|
82
|
+
`.claude/settings.json` supplies Claude Code's trailer text for this repository. A
|
|
83
|
+
Claude session that commits here from outside this project must receive that setting
|
|
84
|
+
explicitly. Codex follows this section; no automatic attribution setting is assumed.
|
sako-0.5.0/CHANGELOG.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Notable changes to SAKO, one entry per release. The format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow
|
|
5
|
+
[Semantic Versioning](https://semver.org/). SAKO is alpha software: commands and file
|
|
6
|
+
formats can change in any 0.x release.
|
|
7
|
+
|
|
8
|
+
## [0.5.0] - 2026-09-25
|
|
9
|
+
|
|
10
|
+
The first public release.
|
|
11
|
+
|
|
12
|
+
Install from your project's Git repository with `uvx sako init`. To update later, run
|
|
13
|
+
`uvx sako@latest init --update`.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- A task ledger in Markdown, `.sako/work/TASKS.md`, with a done record that keeps a
|
|
18
|
+
receipt for every closed task.
|
|
19
|
+
- A finish gate that checks, when a session stops, that its changes belong to a
|
|
20
|
+
claimed task, that closed work has a passing check for its content, and that
|
|
21
|
+
finished work is committed.
|
|
22
|
+
- Hooks for Claude Code and Codex, chosen by `init`; any other agent runs `start`,
|
|
23
|
+
`check --gate` and `end` itself.
|
|
24
|
+
- Claims and scope checks for parallel sessions in one repository and its linked
|
|
25
|
+
worktrees.
|
|
26
|
+
- Three footprints for the records: local (the default), their own repository, or
|
|
27
|
+
committed with the code.
|
|
28
|
+
- The method, `SAKO.md`, with a small default planner, and a `sako` skill for agents.
|
|
29
|
+
|
|
30
|
+
### Known issues
|
|
31
|
+
|
|
32
|
+
- Codex gets no hooks on Windows; there the agent runs the commands itself.
|
|
33
|
+
- No live client session has run on a Mac yet; macOS is tested in CI.
|
|
34
|
+
- See [limits](docs/limits.md) for the rest.
|
|
35
|
+
|
|
36
|
+
### Tested with
|
|
37
|
+
|
|
38
|
+
- Python 3.10 and 3.14 on Linux, macOS and Windows in CI; Python 3.10 and 3.12 on
|
|
39
|
+
WSL2 (Ubuntu 24.04).
|
|
40
|
+
- Git 2.31 or newer.
|
|
41
|
+
- Claude Code 2.1.280 on Linux and Codex 0.154.0 on Linux; Claude Code 2.1.220 hooks
|
|
42
|
+
on Windows.
|
|
43
|
+
|
|
44
|
+
[0.5.0]: https://github.com/Thakay/sako/releases/tag/v0.5.0
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Contributing to SAKO
|
|
2
|
+
|
|
3
|
+
SAKO is a task ledger and finish gate for coding agents. A useful change makes task
|
|
4
|
+
ownership, evidence, recovery, or adoption more dependable while preserving the
|
|
5
|
+
project's chosen workflow. A bug report, a result from your client, a documentation
|
|
6
|
+
fix and code are all welcome.
|
|
7
|
+
|
|
8
|
+
## Report a bug
|
|
9
|
+
|
|
10
|
+
Open an issue with the bug form. Give the smallest reproduction, the expected and
|
|
11
|
+
actual behavior, the versions the form asks for, and the command output that
|
|
12
|
+
explains the failure. Use synthetic examples and remove private project details. To
|
|
13
|
+
report a vulnerability, follow [SECURITY.md](SECURITY.md) instead.
|
|
14
|
+
|
|
15
|
+
## Propose a change
|
|
16
|
+
|
|
17
|
+
For new machinery, show the observed problem and why the existing task record,
|
|
18
|
+
instructions, or commands cannot handle it. Keep planning practices replaceable.
|
|
19
|
+
An external integration must define source identity, status ownership, and recovery.
|
|
20
|
+
A change serves the finish gate, the ledger, installing, or leaving cleanly, and
|
|
21
|
+
keeps to the [principles](README.md#why-it-stays-small); a change that serves none of
|
|
22
|
+
these waits.
|
|
23
|
+
|
|
24
|
+
A pull request explains the problem, the resulting behavior, how it was checked, and
|
|
25
|
+
any compatibility limits. Follow the writing and commit rules in
|
|
26
|
+
[AGENTS.md](AGENTS.md).
|
|
27
|
+
|
|
28
|
+
## Design budgets
|
|
29
|
+
|
|
30
|
+
Tests hold these limits. Over one, remove something before adding.
|
|
31
|
+
|
|
32
|
+
| Budget | Limit |
|
|
33
|
+
|---|---|
|
|
34
|
+
| Install | One command, no required flags |
|
|
35
|
+
| Reading for a normal task | About 1,500 words: the skill, the task template's preamble, a start context and the method's required part |
|
|
36
|
+
| Required ledger columns | 8 at most |
|
|
37
|
+
| Runtime | One standard-library file of at most 1,800 lines, counted with `wc -l sako.py` |
|
|
38
|
+
|
|
39
|
+
## Work from a checkout
|
|
40
|
+
|
|
41
|
+
Use Linux, WSL, macOS or Windows, Python 3.10 or newer, and Git 2.31 or newer; on
|
|
42
|
+
Windows, run the checks from Git Bash, with `python` where they say `python3`. The
|
|
43
|
+
runtime and the tests use Python's standard library; no package installation is
|
|
44
|
+
needed. Read [SAKO.md](SAKO.md) before changing behavior.
|
|
45
|
+
|
|
46
|
+
| Path | Purpose |
|
|
47
|
+
|---|---|
|
|
48
|
+
| [README.md](README.md) | The entry for people: what SAKO is, the quickstart, the footprints |
|
|
49
|
+
| [SAKO.md](SAKO.md) | The method installed in each project, with its default planner |
|
|
50
|
+
| [AGENTS.md](AGENTS.md) | Rules for agents changing this repository; `CLAUDE.md` imports it |
|
|
51
|
+
| [SECURITY.md](SECURITY.md) | How to report a vulnerability, and what SAKO reads and sends |
|
|
52
|
+
| `sako.py` | One Python file for records, presence, evidence, and installation |
|
|
53
|
+
| `pyproject.toml` | Builds the `sako` package from this checkout |
|
|
54
|
+
| `skills/sako/` | Optional agent entry to the installed method |
|
|
55
|
+
| `templates/` | The empty task table |
|
|
56
|
+
| `docs/` | Compatibility, the demo, the glossary, intake recipes, limits, moving to a tracker, update and removal, validation |
|
|
57
|
+
| `tests/` | Unit, concurrent-process, adoption, recovery and documentation checks |
|
|
58
|
+
| `.github/` | CI, the bug form and Dependabot |
|
|
59
|
+
|
|
60
|
+
## Check the change
|
|
61
|
+
|
|
62
|
+
From the checkout root:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v
|
|
66
|
+
PYTHONDONTWRITEBYTECODE=1 python3 tests/selftest.py
|
|
67
|
+
git diff --check
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Run both suites on Python 3.10 when available; CI runs them on Linux, Windows and
|
|
71
|
+
macOS. The scenario suite is also part of discovery, so the counts overlap. Tests use
|
|
72
|
+
temporary repositories and process stand-ins: they do not establish live-client
|
|
73
|
+
behavior or newcomer usability. Add a focused regression for a behavior bug.
|
|
74
|
+
|
|
75
|
+
## Documentation
|
|
76
|
+
|
|
77
|
+
- Each fact has one home; elsewhere, a sentence or two and a link. SAKO.md, the only
|
|
78
|
+
document installed in a project, is the home of behavior.
|
|
79
|
+
- Document only behavior that exists, in the words the
|
|
80
|
+
[glossary](docs/glossary.md) defines: plain language, second person, present
|
|
81
|
+
tense. History belongs in Git, not in the docs; owner deliberations and internal
|
|
82
|
+
planning notes stay out.
|
|
83
|
+
- The `Links` test in `tests/test_release.py` checks that every relative link and
|
|
84
|
+
heading anchor resolves, that the README's links to this repository point at real
|
|
85
|
+
files, and that no page has an em dash.
|
|
86
|
+
- The [demo](docs/demo.md) is generated: after a change to what it shows, run
|
|
87
|
+
`PYTHONDONTWRITEBYTECODE=1 python3 tests/demo.py > docs/demo.md` and never edit
|
|
88
|
+
the page by hand.
|
|
89
|
+
- Update [validation](docs/validation.md) when measured results or their scope
|
|
90
|
+
change; `PYTHONDONTWRITEBYTECODE=1 python3 tests/measure.py` reproduces the
|
|
91
|
+
measurements.
|
|
92
|
+
|
|
93
|
+
## Build and try the package
|
|
94
|
+
|
|
95
|
+
`pyproject.toml` installs the one runtime file as `sako/__init__.py` beside the
|
|
96
|
+
method, the task template and the skill; nothing moves in the checkout. The wheel
|
|
97
|
+
carries no tests or contributor documents. Building publishes nothing. To build it
|
|
98
|
+
and try it in a fresh Git repository:
|
|
99
|
+
|
|
100
|
+
```sh
|
|
101
|
+
uv build
|
|
102
|
+
wheel=$(ls -t "$PWD"/dist/sako-*.whl | head -1)
|
|
103
|
+
sako_example=$(mktemp -d)
|
|
104
|
+
git init "$sako_example" && cd "$sako_example"
|
|
105
|
+
uvx --from "$wheel" sako init
|
|
106
|
+
python3 .sako/sako.py next
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
A new repository has no sign of a client, so `init` installs the shared skill and no
|
|
110
|
+
hooks, and says how to add them:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
Hooks: none, no client found here. Agents read .agents/skills/sako/SKILL.md; run start, check --gate and end yourself (python3 .sako/sako.py start --session <id>). Change the client with: uvx sako init --client claude|codex|none.
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`next` then says nothing is ready and points to **No planner? Start here** in
|
|
117
|
+
`.sako/SAKO.md`. [Update and removal](docs/update-and-remove.md) covers the rest of
|
|
118
|
+
the kit's lifecycle.
|
|
119
|
+
|
|
120
|
+
## AI-assisted contributions
|
|
121
|
+
|
|
122
|
+
They are welcome under four rules: you reviewed the change and can explain it; both
|
|
123
|
+
suites pass; you wrote the pull request description yourself; and each commit names
|
|
124
|
+
the tools that helped, with a `Co-authored-by:` trailer as
|
|
125
|
+
[AGENTS.md](AGENTS.md#commits) describes. No session links.
|
|
126
|
+
|
|
127
|
+
## How the project runs
|
|
128
|
+
|
|
129
|
+
One maintainer reviews and decides; decisions live in issues and pull requests.
|
|
130
|
+
Expect a first reply within 7 days, and within 14 days for a security report. There
|
|
131
|
+
is no contributor license agreement: under GitHub's terms of service, a contribution
|
|
132
|
+
is licensed under the repository's MIT license.
|
sako-0.5.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kasra Aminiyeganeh
|
|
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.
|
sako-0.5.0/PKG-INFO
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: sako
|
|
3
|
+
Version: 0.5.0
|
|
4
|
+
Summary: A task ledger and finish gate for coding agents
|
|
5
|
+
Project-URL: Homepage, https://github.com/Thakay/sako
|
|
6
|
+
Project-URL: Documentation, https://github.com/Thakay/sako/tree/main/docs
|
|
7
|
+
Project-URL: Issues, https://github.com/Thakay/sako/issues
|
|
8
|
+
Project-URL: Source, https://github.com/Thakay/sako
|
|
9
|
+
Project-URL: Changelog, https://github.com/Thakay/sako/blob/main/CHANGELOG.md
|
|
10
|
+
Author: Kasra Aminiyeganeh
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: agentic development,claude code,codex,coding agents,finish gate,task ledger
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: Operating System :: MacOS
|
|
18
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
19
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
25
|
+
Classifier: Topic :: Software Development
|
|
26
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
27
|
+
Requires-Python: >=3.10
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# SAKO
|
|
31
|
+
|
|
32
|
+
SAKO helps you track coding-agent tasks and review the evidence behind finished
|
|
33
|
+
work. It keeps tasks in a Markdown **ledger** and uses a **finish gate** to flag
|
|
34
|
+
unrecorded changes, missing or stale check results, and finished work that needs a
|
|
35
|
+
commit.
|
|
36
|
+
|
|
37
|
+
If you use coding agents such as Claude Code or Codex in a Git repository, SAKO
|
|
38
|
+
helps you keep track of who is working on what, what has been checked, and what a
|
|
39
|
+
later session needs to pick up. You can use it with one agent or several sessions
|
|
40
|
+
working in the same repository.
|
|
41
|
+
|
|
42
|
+
SAKO fits alongside your planner, coding agent, and tests. Its focus is the link
|
|
43
|
+
between a task and the evidence that it is finished: the gate reads Git and the
|
|
44
|
+
latest check result, then points out gaps when a session stops. You choose the
|
|
45
|
+
work and decide whether the result meets your needs. The records are plain
|
|
46
|
+
Markdown, and the runtime is one Python file with no service or account to set up.
|
|
47
|
+
|
|
48
|
+
SAKO stands for Simple Agentic Kit for Operations, pronounced "sah-ko".
|
|
49
|
+
|
|
50
|
+
**Alpha:** commands and file formats can change in any 0.x release.
|
|
51
|
+
|
|
52
|
+
## Quickstart
|
|
53
|
+
|
|
54
|
+
You need Python 3.10 or newer, Git 2.31 or newer,
|
|
55
|
+
[uv](https://docs.astral.sh/uv/getting-started/installation/), and a coding agent
|
|
56
|
+
that can run commands. SAKO runs on Linux, WSL, macOS, and Windows.
|
|
57
|
+
|
|
58
|
+
On Windows, use `python` wherever these instructions say `python3`. Check that
|
|
59
|
+
`python --version` reports 3.10 or newer in Git Bash, where Claude Code runs
|
|
60
|
+
SAKO's hooks
|
|
61
|
+
([platform notes](https://github.com/Thakay/sako/blob/main/docs/limits.md#environment)).
|
|
62
|
+
|
|
63
|
+
From your project's Git repository, install SAKO:
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
uvx sako init
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
In a project containing `CLAUDE.md`, the installer sets up Claude Code's hooks and
|
|
70
|
+
prints:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
SAKO installed in .sako/ (local). Nothing tracked changed; the folder is listed in .git/info/exclude.
|
|
74
|
+
Records: .sako/work/TASKS.md and DONE.md. They are not in Git yet; git clean -x deletes them.
|
|
75
|
+
Keep their history, or share them privately: uvx sako init --repo [url]
|
|
76
|
+
Commit them with the code: uvx sako init --shared
|
|
77
|
+
Hooks written: Claude Code (.claude/settings.local.json), chosen from CLAUDE.md. Start a session to begin. Change the client with: uvx sako init --client claude|codex|none.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Next, set your project's check command in `.sako/config.json`. For example, a
|
|
81
|
+
Python project using unittest would set
|
|
82
|
+
`"verify_command": ["python3", "-B", "-m", "unittest"]`. Use the command that checks
|
|
83
|
+
your own project; `-B` in this example prevents Python from creating cache files
|
|
84
|
+
during the check.
|
|
85
|
+
|
|
86
|
+
Start a session in your coding client and ask for a change as usual. The start
|
|
87
|
+
context gives your agent the instructions for recording and checking the work.
|
|
88
|
+
SAKO sets up hooks for Claude Code and Codex when it detects them. Without hooks,
|
|
89
|
+
the agent runs `start`, `check --gate`, and `end` itself. See
|
|
90
|
+
[client compatibility](https://github.com/Thakay/sako/blob/main/docs/compatibility.md)
|
|
91
|
+
for setup details.
|
|
92
|
+
|
|
93
|
+
[What `init` changes](https://github.com/Thakay/sako/blob/main/docs/update-and-remove.md#what-init-changes)
|
|
94
|
+
lists every file the installer writes. To uninstall while keeping your task
|
|
95
|
+
records, run `python3 .sako/sako.py remove`.
|
|
96
|
+
|
|
97
|
+
## Done means
|
|
98
|
+
|
|
99
|
+
When a session stops, its hook checks that session's changes against three rules.
|
|
100
|
+
The agent can also run the gate with `check --gate`:
|
|
101
|
+
|
|
102
|
+
- **Recorded:** every changed file belongs to a task the session claimed or closed.
|
|
103
|
+
- **Proven:** a task closed after checked content changed has a passing check for
|
|
104
|
+
that content. A missing or failed check never counts as a pass.
|
|
105
|
+
- **Committed:** finished work is committed. If you keep the task records in Git,
|
|
106
|
+
they are committed too.
|
|
107
|
+
|
|
108
|
+
Each finding explains how to fix the problem. You can pause unfinished work while
|
|
109
|
+
keeping its task claimed.
|
|
110
|
+
|
|
111
|
+
Every closed task gets a **receipt** in `.sako/work/DONE.md`, recording its
|
|
112
|
+
completion condition, evidence, closing session, date, and check result. If no
|
|
113
|
+
automated check is configured, the receipt says so.
|
|
114
|
+
|
|
115
|
+
You still review and accept the result. A passing gate confirms that SAKO's rules
|
|
116
|
+
were met; the [method](https://github.com/Thakay/sako/blob/main/SAKO.md#done-means)
|
|
117
|
+
explains what they cover.
|
|
118
|
+
|
|
119
|
+
## See a complete task
|
|
120
|
+
|
|
121
|
+
[The demo](https://github.com/Thakay/sako/blob/main/docs/demo.md) follows a task
|
|
122
|
+
from an unclaimed change through a failed check, a fix, a receipt, and a commit.
|
|
123
|
+
A fresh session then picks up the next task from the records. It is a scripted
|
|
124
|
+
run with real command output, kept in sync by a test.
|
|
125
|
+
|
|
126
|
+
## SAKO is and is not
|
|
127
|
+
|
|
128
|
+
SAKO handles task ownership and checks the evidence behind finished work. Here
|
|
129
|
+
is how it fits with the rest of your tools:
|
|
130
|
+
|
|
131
|
+
| SAKO provides | Where other tools fit |
|
|
132
|
+
|---|---|
|
|
133
|
+
| Task records in Markdown, linked to the source of the work | Your planner or spec process; SAKO includes a small default planner |
|
|
134
|
+
| A finish gate connecting changed files, check results, and commits | Your tests and CI to check whether the code works |
|
|
135
|
+
| Claims and scope checks for sessions in one repository and its worktrees | A scheduler if you want agents launched or assigned automatically |
|
|
136
|
+
| Local records you can keep private or commit | A tracker for team sync or work across clones and machines |
|
|
137
|
+
|
|
138
|
+
SAKO uses only Python's standard library and sends no telemetry. The gate prompts
|
|
139
|
+
agents to fix gaps; it is not a security boundary. It blocks a stop once, and a
|
|
140
|
+
repeated stop or a hook's own error lets the session end.
|
|
141
|
+
|
|
142
|
+
## Where your records live
|
|
143
|
+
|
|
144
|
+
Your task records live in `.sako/`. The **footprint** determines how you keep and
|
|
145
|
+
share them:
|
|
146
|
+
|
|
147
|
+
| Footprint | Command | What you get |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| Local, the default | `init` | Records stay outside Git. Useful for trying SAKO or working on one machine |
|
|
150
|
+
| Repo | `init --repo [url]` | Records have their own Git history inside `.sako/`, with an optional remote for private sharing |
|
|
151
|
+
| Shared | `init --shared` | Records live with your code, with a separate copy on each branch. The installer prints the commit command |
|
|
152
|
+
|
|
153
|
+
Switching footprints preserves the records byte for byte.
|
|
154
|
+
|
|
155
|
+
## As your project grows
|
|
156
|
+
|
|
157
|
+
Start with one agent, one task, and the default planner. You can add more when
|
|
158
|
+
your work calls for it:
|
|
159
|
+
|
|
160
|
+
- **Bring an existing plan.** Use
|
|
161
|
+
[task intake](https://github.com/Thakay/sako/blob/main/docs/intake-recipes.md)
|
|
162
|
+
to turn your plan into tasks with priorities and references to their source.
|
|
163
|
+
- **Work in parallel.** Claims and scope checks help coordinate sessions in the
|
|
164
|
+
same repository, including linked worktrees.
|
|
165
|
+
- **Work across clones or machines.**
|
|
166
|
+
[Move task authority to a tracker](https://github.com/Thakay/sako/blob/main/docs/move-to-a-tracker.md).
|
|
167
|
+
Add a scheduler if you also need agents started and assigned for you.
|
|
168
|
+
|
|
169
|
+
## Why it stays small
|
|
170
|
+
|
|
171
|
+
1. **Keep evidence visible.** The gate reads Git and check results. A passing
|
|
172
|
+
check, a commit, and your acceptance each mean something different. You decide
|
|
173
|
+
whether the checks cover what the task needs to prove.
|
|
174
|
+
2. **Give each fact one home.** Your planner holds intent, the ledger holds
|
|
175
|
+
ownership and evidence, and Git holds the changes. Source references connect
|
|
176
|
+
them without copying the plan. Plain Markdown keeps the records readable by
|
|
177
|
+
people, agents, and other tools.
|
|
178
|
+
3. **Keep everyday use simple.** Install with one command and a short read. Bring
|
|
179
|
+
your own planner, agent, and checks; the agent runs the commands while you
|
|
180
|
+
guide the work and review the result.
|
|
181
|
+
4. **Make adoption reversible.** The default install leaves tracked files alone.
|
|
182
|
+
Add history and sharing when you need them. Removal and migration instructions
|
|
183
|
+
help you keep your records when you move on.
|
|
184
|
+
|
|
185
|
+
## Learn more
|
|
186
|
+
|
|
187
|
+
- [SAKO.md](https://github.com/Thakay/sako/blob/main/SAKO.md): the method your agent follows
|
|
188
|
+
- [Compatibility](https://github.com/Thakay/sako/blob/main/docs/compatibility.md): client setup and tested behavior
|
|
189
|
+
- [Limits](https://github.com/Thakay/sako/blob/main/docs/limits.md): supported environments and boundaries
|
|
190
|
+
- [Update and removal](https://github.com/Thakay/sako/blob/main/docs/update-and-remove.md): installation details, updates, and removal
|
|
191
|
+
- [Validation](https://github.com/Thakay/sako/blob/main/docs/validation.md): guarantees and their evidence
|
|
192
|
+
- [Glossary](https://github.com/Thakay/sako/blob/main/docs/glossary.md): terms used in the docs
|
|
193
|
+
|
|
194
|
+
## Contributing, security and license
|
|
195
|
+
|
|
196
|
+
Bug reports, client test results, and improvements are welcome. See
|
|
197
|
+
[CONTRIBUTING.md](https://github.com/Thakay/sako/blob/main/CONTRIBUTING.md) to get
|
|
198
|
+
started, and [SECURITY.md](https://github.com/Thakay/sako/blob/main/SECURITY.md) to
|
|
199
|
+
report a vulnerability. SAKO is released under the
|
|
200
|
+
[MIT license](https://github.com/Thakay/sako/blob/main/LICENSE).
|
sako-0.5.0/README.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# SAKO
|
|
2
|
+
|
|
3
|
+
SAKO helps you track coding-agent tasks and review the evidence behind finished
|
|
4
|
+
work. It keeps tasks in a Markdown **ledger** and uses a **finish gate** to flag
|
|
5
|
+
unrecorded changes, missing or stale check results, and finished work that needs a
|
|
6
|
+
commit.
|
|
7
|
+
|
|
8
|
+
If you use coding agents such as Claude Code or Codex in a Git repository, SAKO
|
|
9
|
+
helps you keep track of who is working on what, what has been checked, and what a
|
|
10
|
+
later session needs to pick up. You can use it with one agent or several sessions
|
|
11
|
+
working in the same repository.
|
|
12
|
+
|
|
13
|
+
SAKO fits alongside your planner, coding agent, and tests. Its focus is the link
|
|
14
|
+
between a task and the evidence that it is finished: the gate reads Git and the
|
|
15
|
+
latest check result, then points out gaps when a session stops. You choose the
|
|
16
|
+
work and decide whether the result meets your needs. The records are plain
|
|
17
|
+
Markdown, and the runtime is one Python file with no service or account to set up.
|
|
18
|
+
|
|
19
|
+
SAKO stands for Simple Agentic Kit for Operations, pronounced "sah-ko".
|
|
20
|
+
|
|
21
|
+
**Alpha:** commands and file formats can change in any 0.x release.
|
|
22
|
+
|
|
23
|
+
## Quickstart
|
|
24
|
+
|
|
25
|
+
You need Python 3.10 or newer, Git 2.31 or newer,
|
|
26
|
+
[uv](https://docs.astral.sh/uv/getting-started/installation/), and a coding agent
|
|
27
|
+
that can run commands. SAKO runs on Linux, WSL, macOS, and Windows.
|
|
28
|
+
|
|
29
|
+
On Windows, use `python` wherever these instructions say `python3`. Check that
|
|
30
|
+
`python --version` reports 3.10 or newer in Git Bash, where Claude Code runs
|
|
31
|
+
SAKO's hooks
|
|
32
|
+
([platform notes](https://github.com/Thakay/sako/blob/main/docs/limits.md#environment)).
|
|
33
|
+
|
|
34
|
+
From your project's Git repository, install SAKO:
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
uvx sako init
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
In a project containing `CLAUDE.md`, the installer sets up Claude Code's hooks and
|
|
41
|
+
prints:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
SAKO installed in .sako/ (local). Nothing tracked changed; the folder is listed in .git/info/exclude.
|
|
45
|
+
Records: .sako/work/TASKS.md and DONE.md. They are not in Git yet; git clean -x deletes them.
|
|
46
|
+
Keep their history, or share them privately: uvx sako init --repo [url]
|
|
47
|
+
Commit them with the code: uvx sako init --shared
|
|
48
|
+
Hooks written: Claude Code (.claude/settings.local.json), chosen from CLAUDE.md. Start a session to begin. Change the client with: uvx sako init --client claude|codex|none.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Next, set your project's check command in `.sako/config.json`. For example, a
|
|
52
|
+
Python project using unittest would set
|
|
53
|
+
`"verify_command": ["python3", "-B", "-m", "unittest"]`. Use the command that checks
|
|
54
|
+
your own project; `-B` in this example prevents Python from creating cache files
|
|
55
|
+
during the check.
|
|
56
|
+
|
|
57
|
+
Start a session in your coding client and ask for a change as usual. The start
|
|
58
|
+
context gives your agent the instructions for recording and checking the work.
|
|
59
|
+
SAKO sets up hooks for Claude Code and Codex when it detects them. Without hooks,
|
|
60
|
+
the agent runs `start`, `check --gate`, and `end` itself. See
|
|
61
|
+
[client compatibility](https://github.com/Thakay/sako/blob/main/docs/compatibility.md)
|
|
62
|
+
for setup details.
|
|
63
|
+
|
|
64
|
+
[What `init` changes](https://github.com/Thakay/sako/blob/main/docs/update-and-remove.md#what-init-changes)
|
|
65
|
+
lists every file the installer writes. To uninstall while keeping your task
|
|
66
|
+
records, run `python3 .sako/sako.py remove`.
|
|
67
|
+
|
|
68
|
+
## Done means
|
|
69
|
+
|
|
70
|
+
When a session stops, its hook checks that session's changes against three rules.
|
|
71
|
+
The agent can also run the gate with `check --gate`:
|
|
72
|
+
|
|
73
|
+
- **Recorded:** every changed file belongs to a task the session claimed or closed.
|
|
74
|
+
- **Proven:** a task closed after checked content changed has a passing check for
|
|
75
|
+
that content. A missing or failed check never counts as a pass.
|
|
76
|
+
- **Committed:** finished work is committed. If you keep the task records in Git,
|
|
77
|
+
they are committed too.
|
|
78
|
+
|
|
79
|
+
Each finding explains how to fix the problem. You can pause unfinished work while
|
|
80
|
+
keeping its task claimed.
|
|
81
|
+
|
|
82
|
+
Every closed task gets a **receipt** in `.sako/work/DONE.md`, recording its
|
|
83
|
+
completion condition, evidence, closing session, date, and check result. If no
|
|
84
|
+
automated check is configured, the receipt says so.
|
|
85
|
+
|
|
86
|
+
You still review and accept the result. A passing gate confirms that SAKO's rules
|
|
87
|
+
were met; the [method](https://github.com/Thakay/sako/blob/main/SAKO.md#done-means)
|
|
88
|
+
explains what they cover.
|
|
89
|
+
|
|
90
|
+
## See a complete task
|
|
91
|
+
|
|
92
|
+
[The demo](https://github.com/Thakay/sako/blob/main/docs/demo.md) follows a task
|
|
93
|
+
from an unclaimed change through a failed check, a fix, a receipt, and a commit.
|
|
94
|
+
A fresh session then picks up the next task from the records. It is a scripted
|
|
95
|
+
run with real command output, kept in sync by a test.
|
|
96
|
+
|
|
97
|
+
## SAKO is and is not
|
|
98
|
+
|
|
99
|
+
SAKO handles task ownership and checks the evidence behind finished work. Here
|
|
100
|
+
is how it fits with the rest of your tools:
|
|
101
|
+
|
|
102
|
+
| SAKO provides | Where other tools fit |
|
|
103
|
+
|---|---|
|
|
104
|
+
| Task records in Markdown, linked to the source of the work | Your planner or spec process; SAKO includes a small default planner |
|
|
105
|
+
| A finish gate connecting changed files, check results, and commits | Your tests and CI to check whether the code works |
|
|
106
|
+
| Claims and scope checks for sessions in one repository and its worktrees | A scheduler if you want agents launched or assigned automatically |
|
|
107
|
+
| Local records you can keep private or commit | A tracker for team sync or work across clones and machines |
|
|
108
|
+
|
|
109
|
+
SAKO uses only Python's standard library and sends no telemetry. The gate prompts
|
|
110
|
+
agents to fix gaps; it is not a security boundary. It blocks a stop once, and a
|
|
111
|
+
repeated stop or a hook's own error lets the session end.
|
|
112
|
+
|
|
113
|
+
## Where your records live
|
|
114
|
+
|
|
115
|
+
Your task records live in `.sako/`. The **footprint** determines how you keep and
|
|
116
|
+
share them:
|
|
117
|
+
|
|
118
|
+
| Footprint | Command | What you get |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| Local, the default | `init` | Records stay outside Git. Useful for trying SAKO or working on one machine |
|
|
121
|
+
| Repo | `init --repo [url]` | Records have their own Git history inside `.sako/`, with an optional remote for private sharing |
|
|
122
|
+
| Shared | `init --shared` | Records live with your code, with a separate copy on each branch. The installer prints the commit command |
|
|
123
|
+
|
|
124
|
+
Switching footprints preserves the records byte for byte.
|
|
125
|
+
|
|
126
|
+
## As your project grows
|
|
127
|
+
|
|
128
|
+
Start with one agent, one task, and the default planner. You can add more when
|
|
129
|
+
your work calls for it:
|
|
130
|
+
|
|
131
|
+
- **Bring an existing plan.** Use
|
|
132
|
+
[task intake](https://github.com/Thakay/sako/blob/main/docs/intake-recipes.md)
|
|
133
|
+
to turn your plan into tasks with priorities and references to their source.
|
|
134
|
+
- **Work in parallel.** Claims and scope checks help coordinate sessions in the
|
|
135
|
+
same repository, including linked worktrees.
|
|
136
|
+
- **Work across clones or machines.**
|
|
137
|
+
[Move task authority to a tracker](https://github.com/Thakay/sako/blob/main/docs/move-to-a-tracker.md).
|
|
138
|
+
Add a scheduler if you also need agents started and assigned for you.
|
|
139
|
+
|
|
140
|
+
## Why it stays small
|
|
141
|
+
|
|
142
|
+
1. **Keep evidence visible.** The gate reads Git and check results. A passing
|
|
143
|
+
check, a commit, and your acceptance each mean something different. You decide
|
|
144
|
+
whether the checks cover what the task needs to prove.
|
|
145
|
+
2. **Give each fact one home.** Your planner holds intent, the ledger holds
|
|
146
|
+
ownership and evidence, and Git holds the changes. Source references connect
|
|
147
|
+
them without copying the plan. Plain Markdown keeps the records readable by
|
|
148
|
+
people, agents, and other tools.
|
|
149
|
+
3. **Keep everyday use simple.** Install with one command and a short read. Bring
|
|
150
|
+
your own planner, agent, and checks; the agent runs the commands while you
|
|
151
|
+
guide the work and review the result.
|
|
152
|
+
4. **Make adoption reversible.** The default install leaves tracked files alone.
|
|
153
|
+
Add history and sharing when you need them. Removal and migration instructions
|
|
154
|
+
help you keep your records when you move on.
|
|
155
|
+
|
|
156
|
+
## Learn more
|
|
157
|
+
|
|
158
|
+
- [SAKO.md](https://github.com/Thakay/sako/blob/main/SAKO.md): the method your agent follows
|
|
159
|
+
- [Compatibility](https://github.com/Thakay/sako/blob/main/docs/compatibility.md): client setup and tested behavior
|
|
160
|
+
- [Limits](https://github.com/Thakay/sako/blob/main/docs/limits.md): supported environments and boundaries
|
|
161
|
+
- [Update and removal](https://github.com/Thakay/sako/blob/main/docs/update-and-remove.md): installation details, updates, and removal
|
|
162
|
+
- [Validation](https://github.com/Thakay/sako/blob/main/docs/validation.md): guarantees and their evidence
|
|
163
|
+
- [Glossary](https://github.com/Thakay/sako/blob/main/docs/glossary.md): terms used in the docs
|
|
164
|
+
|
|
165
|
+
## Contributing, security and license
|
|
166
|
+
|
|
167
|
+
Bug reports, client test results, and improvements are welcome. See
|
|
168
|
+
[CONTRIBUTING.md](https://github.com/Thakay/sako/blob/main/CONTRIBUTING.md) to get
|
|
169
|
+
started, and [SECURITY.md](https://github.com/Thakay/sako/blob/main/SECURITY.md) to
|
|
170
|
+
report a vulnerability. SAKO is released under the
|
|
171
|
+
[MIT license](https://github.com/Thakay/sako/blob/main/LICENSE).
|