ros2docker 0.1.1__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 (32) hide show
  1. ros2docker-0.1.1/CONTRIBUTING.md +207 -0
  2. ros2docker-0.1.1/LICENSE +28 -0
  3. ros2docker-0.1.1/MANIFEST.in +10 -0
  4. ros2docker-0.1.1/PKG-INFO +152 -0
  5. ros2docker-0.1.1/README.md +119 -0
  6. ros2docker-0.1.1/docs/agent-goals/documentation-audit.md +33 -0
  7. ros2docker-0.1.1/docs/agent-goals/implementation-cleanup.md +32 -0
  8. ros2docker-0.1.1/docs/agent-goals/maintainer-review.md +19 -0
  9. ros2docker-0.1.1/docs/agent-goals/quality-workflow.md +19 -0
  10. ros2docker-0.1.1/docs/agent-goals/test-ci-audit.md +28 -0
  11. ros2docker-0.1.1/docs/ci.md +54 -0
  12. ros2docker-0.1.1/docs/configuration.md +62 -0
  13. ros2docker-0.1.1/docs/quality-audit.md +16 -0
  14. ros2docker-0.1.1/docs/release.md +48 -0
  15. ros2docker-0.1.1/pyproject.toml +115 -0
  16. ros2docker-0.1.1/setup.cfg +4 -0
  17. ros2docker-0.1.1/src/ros2docker/__init__.py +19 -0
  18. ros2docker-0.1.1/src/ros2docker/__main__.py +8 -0
  19. ros2docker-0.1.1/src/ros2docker/api.py +152 -0
  20. ros2docker-0.1.1/src/ros2docker/cli.py +115 -0
  21. ros2docker-0.1.1/src/ros2docker/commands.py +191 -0
  22. ros2docker-0.1.1/src/ros2docker/config.py +316 -0
  23. ros2docker-0.1.1/src/ros2docker/resources/build/Dockerfile +192 -0
  24. ros2docker-0.1.1/src/ros2docker/resources/build/entrypoint.sh +72 -0
  25. ros2docker-0.1.1/src/ros2docker/resources/examples/ros2docker.json +51 -0
  26. ros2docker-0.1.1/src/ros2docker/resources/schema/ros2docker.schema.json +118 -0
  27. ros2docker-0.1.1/src/ros2docker.egg-info/PKG-INFO +152 -0
  28. ros2docker-0.1.1/src/ros2docker.egg-info/SOURCES.txt +30 -0
  29. ros2docker-0.1.1/src/ros2docker.egg-info/dependency_links.txt +1 -0
  30. ros2docker-0.1.1/src/ros2docker.egg-info/entry_points.txt +2 -0
  31. ros2docker-0.1.1/src/ros2docker.egg-info/requires.txt +10 -0
  32. ros2docker-0.1.1/src/ros2docker.egg-info/top_level.txt +1 -0
@@ -0,0 +1,207 @@
1
+ # Contributing
2
+
3
+ This is the canonical development workflow for contributors.
4
+
5
+ ## Development Setup
6
+
7
+ Prerequisites:
8
+
9
+ - Python 3.10 or 3.12 when mirroring CI.
10
+ - Docker for runtime and E2E checks.
11
+ - `just` for local workflow commands.
12
+ - `pipx` for user-style installs.
13
+ - GitHub CLI `gh` for PR and auto-merge workflows.
14
+
15
+ Set up the repository from the root:
16
+
17
+ ```bash
18
+ just setup
19
+ ```
20
+
21
+ This creates `.venv`, installs `.[dev]`, and installs pre-commit hooks.
22
+
23
+ ## Local Checks
24
+
25
+ Run individual checks from the repository root:
26
+
27
+ ```bash
28
+ just lint
29
+ just typecheck
30
+ just test-unit
31
+ just test-contract
32
+ just docs
33
+ just package
34
+ ```
35
+
36
+ For small review PRs, run lightweight checks before opening the draft PR:
37
+
38
+ ```bash
39
+ just lint
40
+ just typecheck
41
+ just test-unit
42
+ ```
43
+
44
+ Before opening or updating a ready PR, run:
45
+
46
+ ```bash
47
+ just check
48
+ ```
49
+
50
+ `just check` runs linting, type checking, unit tests, contract tests, docs checks,
51
+ and package validation. It does not run Docker E2E checks.
52
+
53
+ Use Docker E2E checks when Docker/runtime behavior changed:
54
+
55
+ ```bash
56
+ just test-e2e-fast
57
+ just test-e2e-slow
58
+ ```
59
+
60
+ `just test-e2e-fast` runs the fast Docker smoke fixtures. `just test-e2e-slow`
61
+ runs the full Docker E2E suite, including slow image and ROS launch checks.
62
+
63
+ ## Branch And Merge Policy
64
+
65
+ `main` is protected. Do not push directly to `main`.
66
+
67
+ All changes must go through a pull request. Local `main` should be treated as a
68
+ clean mirror of `origin/main`.
69
+
70
+ Start each change from an up-to-date `origin/main`:
71
+
72
+ ```bash
73
+ git fetch --prune
74
+ git switch -c <type>/<short-topic> origin/main
75
+ ```
76
+
77
+ Keep the change small and coherent. Update tests for changed behavior. Update
78
+ README, docs, examples, or schema files when CLI, config, API, Docker behavior,
79
+ or public behavior changes.
80
+
81
+ After the PR has merged, clean up from a synchronized `main`:
82
+
83
+ ```bash
84
+ git switch main
85
+ git fetch --prune
86
+ git pull --ff-only
87
+ git branch -d <branch>
88
+ ```
89
+
90
+ If local `main` diverges from `origin/main`, do not continue working on `main`.
91
+ Move any useful local work to a topic branch first, then restore `main` to match
92
+ `origin/main`.
93
+
94
+ ## Pull Request Modes
95
+
96
+ This repository uses two pull request modes.
97
+
98
+ ### Review PRs
99
+
100
+ Review PRs are the default. They are intended for small changes, documentation
101
+ updates, and changes that should be inspected before merge.
102
+
103
+ Review PRs should usually be opened as draft pull requests. Draft PRs provide
104
+ lightweight CI feedback but are not expected to be mergeable yet.
105
+
106
+ Use this flow:
107
+
108
+ ```bash
109
+ gh pr create --draft --base main --title "<title>" --body "<summary>"
110
+ ```
111
+
112
+ After review approval, mark the PR ready:
113
+
114
+ ```bash
115
+ gh pr ready <number>
116
+ ```
117
+
118
+ ### Autonomous PRs
119
+
120
+ Autonomous PRs are used when the user explicitly asks for autonomous iteration,
121
+ auto-merge, or completion without further review.
122
+
123
+ Autonomous PRs are opened as ready-for-review pull requests, may have auto-merge
124
+ enabled, and must pass the full required merge gate before entering `main`.
125
+
126
+ Use this flow:
127
+
128
+ ```bash
129
+ gh pr create --base main --title "<title>" --body "<summary>"
130
+ gh pr merge <number> --auto --squash --delete-branch
131
+ gh pr checks <number> --watch --required
132
+ ```
133
+
134
+ If CI fails or auto-merge is blocked, inspect the failure, fix the same PR
135
+ branch, push the update, and repeat until the PR merges or is clearly blocked.
136
+
137
+ ## CI Policy
138
+
139
+ The required merge gate for `main` is:
140
+
141
+ ```text
142
+ ci-success
143
+ ```
144
+
145
+ Draft PRs run `pr-lightweight` for quick feedback. The lightweight workflow runs:
146
+
147
+ ```bash
148
+ just lint
149
+ just typecheck
150
+ just test-unit
151
+ ```
152
+
153
+ Ready PRs and merge queue entries run `pr-merge-gate`. The `ci-success` job in
154
+ that workflow requires:
155
+
156
+ ```bash
157
+ just check
158
+ just test-e2e-fast
159
+ ```
160
+
161
+ A PR cannot merge into `main` unless `ci-success` passes. Prefer requiring only
162
+ this stable aggregate check in branch protection so individual job names can
163
+ change without rewriting repository policy.
164
+
165
+ Full Docker E2E runs in the scheduled `nightly-e2e` workflow and may also be
166
+ triggered manually. Nightly full E2E is not a replacement for the required PR
167
+ merge gate.
168
+
169
+ Avoid path filters or branch filters for required workflows. If a required
170
+ workflow is skipped by filtering, GitHub can leave the check pending and block
171
+ merging.
172
+
173
+ See [docs/ci.md](docs/ci.md) for the contributor-facing CI workflow summary.
174
+
175
+ ## Release Workflow
176
+
177
+ Releases are built from version tags. After the release PR has merged, create
178
+ and push a tag in the form `vX.Y.Z` from the release commit:
179
+
180
+ ```bash
181
+ git switch main
182
+ git fetch --prune
183
+ git pull --ff-only
184
+ git tag vX.Y.Z
185
+ git push origin vX.Y.Z
186
+ ```
187
+
188
+ The `release` workflow validates the tag with non-Docker checks, package
189
+ artifact validation, and fast Docker E2E before publishing. Successful tag
190
+ releases publish the wheel and sdist to PyPI through Trusted Publishing, then
191
+ create a GitHub Release with the wheel, sdist, and `SHA256SUMS`.
192
+
193
+ Maintainers must configure pending Trusted Publishers on PyPI and TestPyPI for
194
+ repository `develNor/ros2docker`, workflow `.github/workflows/release.yml`, and
195
+ environments `pypi` and `testpypi`. No PyPI API token should be stored in GitHub
196
+ secrets for the normal release path.
197
+
198
+ Use the manual `release` workflow dispatch for TestPyPI rehearsals. Manual runs
199
+ publish only to TestPyPI and do not create GitHub Releases.
200
+
201
+ See [docs/release.md](docs/release.md) for the focused release workflow summary.
202
+
203
+ ## Pull Request Description
204
+
205
+ Include local command results in the PR summary. Call out whether the PR is a
206
+ review PR or an autonomous PR, which checks were run, and whether Docker/runtime
207
+ behavior changed.
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2025, develNor
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,10 @@
1
+ prune .github
2
+ prune tests
3
+
4
+ exclude .pre-commit-config.yaml
5
+ exclude .gitignore
6
+ exclude AGENTS.md
7
+ exclude DEVELOPMENT_PRINCIPLES.md
8
+ exclude justfile
9
+
10
+ global-exclude __pycache__ *.py[cod] .DS_Store
@@ -0,0 +1,152 @@
1
+ Metadata-Version: 2.4
2
+ Name: ros2docker
3
+ Version: 0.1.1
4
+ Summary: Versioned CLI and Python API for building and running ROS 2 Docker workspaces.
5
+ Author: develNor
6
+ License-Expression: BSD-3-Clause
7
+ Project-URL: Homepage, https://github.com/develNor/ros2docker
8
+ Project-URL: Repository, https://github.com/develNor/ros2docker
9
+ Project-URL: Issues, https://github.com/develNor/ros2docker/issues
10
+ Keywords: docker,ros2,cli
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Topic :: Software Development :: Build Tools
19
+ Classifier: Topic :: System :: Installation/Setup
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Provides-Extra: dev
24
+ Requires-Dist: build>=1.2; extra == "dev"
25
+ Requires-Dist: check-wheel-contents>=0.6; extra == "dev"
26
+ Requires-Dist: mypy>=1.14; extra == "dev"
27
+ Requires-Dist: pre-commit>=4.0; extra == "dev"
28
+ Requires-Dist: pytest>=8.3; extra == "dev"
29
+ Requires-Dist: pytest-cov>=6.0; extra == "dev"
30
+ Requires-Dist: ruff==0.8.6; extra == "dev"
31
+ Requires-Dist: twine>=6.0; extra == "dev"
32
+ Dynamic: license-file
33
+
34
+ # ros2docker
35
+
36
+ [![pr-lightweight](https://github.com/develNor/ros2docker/actions/workflows/pr-lightweight.yml/badge.svg)](https://github.com/develNor/ros2docker/actions/workflows/pr-lightweight.yml)
37
+ [![nightly-e2e](https://github.com/develNor/ros2docker/actions/workflows/nightly-e2e.yml/badge.svg)](https://github.com/develNor/ros2docker/actions/workflows/nightly-e2e.yml)
38
+
39
+ `ros2docker` is a versioned Python CLI and API for building and running ROS 2 Docker workspaces from JSON-with-comments config files.
40
+
41
+ ## Install
42
+
43
+ Stable release:
44
+
45
+ ```bash
46
+ pipx install ros2docker
47
+ ```
48
+
49
+ Latest development version:
50
+
51
+ ```bash
52
+ pipx install --force git+https://github.com/develNor/ros2docker.git@main
53
+ ```
54
+
55
+ Non-pipx fallback:
56
+
57
+ ```bash
58
+ python3 -m pip install --user ros2docker
59
+ ```
60
+
61
+ ## Development Install
62
+
63
+ When developing `ros2docker`, install this checkout in editable mode so the
64
+ host `ros2docker` command imports the local source:
65
+
66
+ ```bash
67
+ pipx install --force --editable /path/to/ros2docker
68
+ ```
69
+
70
+ Normal Python source changes are picked up immediately by new `ros2docker`
71
+ commands. Reinstall after changing package metadata, dependencies, or console
72
+ entry points in `pyproject.toml`.
73
+
74
+ Verify the editable command with:
75
+
76
+ ```bash
77
+ ros2docker run --no-build --dry-run -m .
78
+ ```
79
+
80
+ The dry run should print a `docker run` command that mounts the current
81
+ directory as `/ws` and starts `bash`, without requiring `-f/--config`.
82
+
83
+ ## CLI
84
+
85
+ ```bash
86
+ ros2docker run -m /host/project
87
+ ros2docker run --no-build -m /host/project
88
+ ros2docker build -f ros2docker.json
89
+ ros2docker run -f ros2docker.json
90
+ ros2docker run -f ros2docker.json --no-build -- -v /host/data:/data
91
+ ros2docker stop -f ros2docker.json
92
+ ros2docker exec -f ros2docker.json -- bash -lc 'ros2 --help'
93
+ ros2docker --version
94
+ python -m ros2docker --version
95
+ ```
96
+
97
+ Every Docker action accepts `--dry-run`, which prints the Docker argv and exits without running Docker.
98
+ The `-f`/`--config` option is optional; without it, `ros2docker` uses the default config, which starts an interactive Bash shell.
99
+
100
+ ## Config
101
+
102
+ Config files are JSON with `//` and `/* ... */` comments. Supported keys include:
103
+
104
+ ```json
105
+ {
106
+ "container_name": "example_ros2container",
107
+ "image_name": "ros2docker",
108
+ "run_type": "bash",
109
+ "mount_ws": true,
110
+ "enable_gui_forwarding": false,
111
+ "forward_ssh_agent": false,
112
+ "run_args": [],
113
+ "extra_run_args": [],
114
+ "build_args": {},
115
+ "bake_ros_packages": [],
116
+ "catmux_file": "/ws/catmux.yaml",
117
+ "catmux_params": {},
118
+ "command": "ros2 topic list"
119
+ }
120
+ ```
121
+
122
+ The machine-readable schema lives at `src/ros2docker/resources/schema/ros2docker.schema.json`.
123
+ See [docs/configuration.md](docs/configuration.md) for the full configuration contract. Unknown top-level config keys are rejected.
124
+
125
+ Supported `run_type` values are:
126
+
127
+ - `bash`: start an interactive shell.
128
+ - `command`: run the configured `command`.
129
+ - `catmux`: start a catmux session from `catmux_file`.
130
+ - `up`: start a detached keepalive container.
131
+
132
+ Host paths in `-v/--volume` and bind `--mount` args expand `~` and environment variables. Relative `./` and `../` host paths are resolved from the config file directory.
133
+
134
+ `bake_ros_packages` paths are also resolved from the config file directory and copied into a temporary Docker build context. The installed Python package directory is never mutated during builds.
135
+
136
+ `enable_gui_forwarding` forwards the X11 socket at `/tmp/.X11-unix`.
137
+ `forward_ssh_agent` forwards the host `SSH_AUTH_SOCK` path when the variable is set and points to an existing socket or file.
138
+
139
+ ## Development
140
+
141
+ For contributor setup, local checks, PR modes, merge policy, and release
142
+ workflow, see [CONTRIBUTING.md](CONTRIBUTING.md). CI behavior is summarized in
143
+ [docs/ci.md](docs/ci.md), and release publishing is summarized in
144
+ [docs/release.md](docs/release.md).
145
+
146
+ ## Python API
147
+
148
+ ```python
149
+ from ros2docker.api import build, run, build_run, stop, exec_shell
150
+ from ros2docker.config import load_config, get_config_dir
151
+ from ros2docker.commands import make_build_command, make_run_command
152
+ ```
@@ -0,0 +1,119 @@
1
+ # ros2docker
2
+
3
+ [![pr-lightweight](https://github.com/develNor/ros2docker/actions/workflows/pr-lightweight.yml/badge.svg)](https://github.com/develNor/ros2docker/actions/workflows/pr-lightweight.yml)
4
+ [![nightly-e2e](https://github.com/develNor/ros2docker/actions/workflows/nightly-e2e.yml/badge.svg)](https://github.com/develNor/ros2docker/actions/workflows/nightly-e2e.yml)
5
+
6
+ `ros2docker` is a versioned Python CLI and API for building and running ROS 2 Docker workspaces from JSON-with-comments config files.
7
+
8
+ ## Install
9
+
10
+ Stable release:
11
+
12
+ ```bash
13
+ pipx install ros2docker
14
+ ```
15
+
16
+ Latest development version:
17
+
18
+ ```bash
19
+ pipx install --force git+https://github.com/develNor/ros2docker.git@main
20
+ ```
21
+
22
+ Non-pipx fallback:
23
+
24
+ ```bash
25
+ python3 -m pip install --user ros2docker
26
+ ```
27
+
28
+ ## Development Install
29
+
30
+ When developing `ros2docker`, install this checkout in editable mode so the
31
+ host `ros2docker` command imports the local source:
32
+
33
+ ```bash
34
+ pipx install --force --editable /path/to/ros2docker
35
+ ```
36
+
37
+ Normal Python source changes are picked up immediately by new `ros2docker`
38
+ commands. Reinstall after changing package metadata, dependencies, or console
39
+ entry points in `pyproject.toml`.
40
+
41
+ Verify the editable command with:
42
+
43
+ ```bash
44
+ ros2docker run --no-build --dry-run -m .
45
+ ```
46
+
47
+ The dry run should print a `docker run` command that mounts the current
48
+ directory as `/ws` and starts `bash`, without requiring `-f/--config`.
49
+
50
+ ## CLI
51
+
52
+ ```bash
53
+ ros2docker run -m /host/project
54
+ ros2docker run --no-build -m /host/project
55
+ ros2docker build -f ros2docker.json
56
+ ros2docker run -f ros2docker.json
57
+ ros2docker run -f ros2docker.json --no-build -- -v /host/data:/data
58
+ ros2docker stop -f ros2docker.json
59
+ ros2docker exec -f ros2docker.json -- bash -lc 'ros2 --help'
60
+ ros2docker --version
61
+ python -m ros2docker --version
62
+ ```
63
+
64
+ Every Docker action accepts `--dry-run`, which prints the Docker argv and exits without running Docker.
65
+ The `-f`/`--config` option is optional; without it, `ros2docker` uses the default config, which starts an interactive Bash shell.
66
+
67
+ ## Config
68
+
69
+ Config files are JSON with `//` and `/* ... */` comments. Supported keys include:
70
+
71
+ ```json
72
+ {
73
+ "container_name": "example_ros2container",
74
+ "image_name": "ros2docker",
75
+ "run_type": "bash",
76
+ "mount_ws": true,
77
+ "enable_gui_forwarding": false,
78
+ "forward_ssh_agent": false,
79
+ "run_args": [],
80
+ "extra_run_args": [],
81
+ "build_args": {},
82
+ "bake_ros_packages": [],
83
+ "catmux_file": "/ws/catmux.yaml",
84
+ "catmux_params": {},
85
+ "command": "ros2 topic list"
86
+ }
87
+ ```
88
+
89
+ The machine-readable schema lives at `src/ros2docker/resources/schema/ros2docker.schema.json`.
90
+ See [docs/configuration.md](docs/configuration.md) for the full configuration contract. Unknown top-level config keys are rejected.
91
+
92
+ Supported `run_type` values are:
93
+
94
+ - `bash`: start an interactive shell.
95
+ - `command`: run the configured `command`.
96
+ - `catmux`: start a catmux session from `catmux_file`.
97
+ - `up`: start a detached keepalive container.
98
+
99
+ Host paths in `-v/--volume` and bind `--mount` args expand `~` and environment variables. Relative `./` and `../` host paths are resolved from the config file directory.
100
+
101
+ `bake_ros_packages` paths are also resolved from the config file directory and copied into a temporary Docker build context. The installed Python package directory is never mutated during builds.
102
+
103
+ `enable_gui_forwarding` forwards the X11 socket at `/tmp/.X11-unix`.
104
+ `forward_ssh_agent` forwards the host `SSH_AUTH_SOCK` path when the variable is set and points to an existing socket or file.
105
+
106
+ ## Development
107
+
108
+ For contributor setup, local checks, PR modes, merge policy, and release
109
+ workflow, see [CONTRIBUTING.md](CONTRIBUTING.md). CI behavior is summarized in
110
+ [docs/ci.md](docs/ci.md), and release publishing is summarized in
111
+ [docs/release.md](docs/release.md).
112
+
113
+ ## Python API
114
+
115
+ ```python
116
+ from ros2docker.api import build, run, build_run, stop, exec_shell
117
+ from ros2docker.config import load_config, get_config_dir
118
+ from ros2docker.commands import make_build_command, make_run_command
119
+ ```
@@ -0,0 +1,33 @@
1
+ Goal: Make public-facing documentation consistent, non-redundant, and aligned with the repository.
2
+
3
+ Scope:
4
+
5
+ * README
6
+ * CONTRIBUTING
7
+ * DEVELOPMENT / development principles
8
+ * AGENTS.md
9
+ * docs/
10
+ * package metadata if it contains public-facing descriptions
11
+
12
+ Document ownership:
13
+
14
+ * README: user-facing purpose, installation, quick start, common usage
15
+ * CONTRIBUTING: human contribution workflow, PR expectations, local checks
16
+ * DEVELOPMENT: technical setup, architecture, testing, release process
17
+ * AGENTS.md: agent-specific operating rules only; link to human docs instead of duplicating them
18
+
19
+ Tasks:
20
+
21
+ * Find duplicated, stale, contradictory, or misplaced information.
22
+ * Prefer one canonical location plus links instead of repeated prose.
23
+ * Ensure documented workflows match actual repo configuration.
24
+ * Ensure agent instructions do not diverge from human development instructions.
25
+ * Keep AGENTS.md short and focused on agent behavior.
26
+ * Do not change source code unless needed to correct a documented command.
27
+
28
+ Report:
29
+
30
+ * final responsibility of each public-facing document
31
+ * moved or removed duplicated content
32
+ * remaining intentional duplication
33
+ * any documented behavior that still lacks implementation or tests
@@ -0,0 +1,32 @@
1
+ Goal: Improve implementation quality while preserving the current public contract.
2
+
3
+ Scope:
4
+ - source code
5
+ - tests only where needed to preserve or clarify behavior
6
+ - no documentation changes except small corrections caused by code cleanup
7
+
8
+ Rules:
9
+ - Do not change documented CLI/API behavior unless tests and docs prove the old behavior was stale or broken.
10
+ - Do not remove tests.
11
+ - Do not weaken assertions.
12
+ - Do not add compatibility layers unless strictly required.
13
+ - Prefer clean removal of obsolete/dead code.
14
+ - Prefer the simplest implementation that satisfies the tests.
15
+ - Avoid broad rewrites.
16
+
17
+ Check for:
18
+ - dead code
19
+ - unused imports/functions/classes/constants
20
+ - redundant branches
21
+ - duplicated logic
22
+ - over-abstracted helpers
23
+ - unclear names
24
+ - unnecessary compatibility paths
25
+ - unnecessarily complicated control flow
26
+ - tests that no longer test meaningful behavior
27
+
28
+ After changes:
29
+ - run formatter/linter
30
+ - run unit tests
31
+ - run fast e2e tests if configured
32
+ - summarize simplifications and test coverage
@@ -0,0 +1,19 @@
1
+ Review this PR as a strict maintainer.
2
+
3
+ Focus:
4
+ - scope creep
5
+ - missing or weak tests
6
+ - documentation drift
7
+ - accidental public API or CLI changes
8
+ - dead code left behind
9
+ - unnecessary abstraction
10
+ - CI/pre-commit mismatch
11
+ - release or packaging risks
12
+
13
+ Return:
14
+ - blocking issues
15
+ - non-blocking suggestions
16
+ - files/lines for each issue
17
+ - final recommendation: merge or request changes
18
+
19
+ Do not modify files unless explicitly asked.
@@ -0,0 +1,19 @@
1
+ You are executing a multi-goal repository quality workflow.
2
+
3
+ Repository rules:
4
+ - Follow AGENTS.md.
5
+ - Use the goal templates in docs/agent-goals/.
6
+ - Create one focused autonomous PR per goal.
7
+ - Do not combine unrelated goals into one PR.
8
+ - Start every goal from latest main.
9
+ - Do not start a dependent goal until prerequisite PRs are merged.
10
+ - If CI fails, fix the current PR instead of starting a new goal.
11
+ - If a PR cannot be merged automatically, stop and report the blocker.
12
+ - Do not weaken tests, remove checks, or hide failures with broad skips/xfails.
13
+ - Keep each PR small and reviewable.
14
+
15
+ Execution plan:
16
+ 1. Run docs/agent-goals/test-ci-audit.md and create a PR.
17
+ 2. Run docs/agent-goals/documentation-audit.md and create a PR.
18
+ 3. After both are merged into main, run docs/agent-goals/implementation-cleanup.md and create a PR.
19
+ 4. After the cleanup PR is created, run docs/agent-goals/maintainer-review.md as a review-only task.
@@ -0,0 +1,28 @@
1
+ Goal: Audit and improve test coverage and test execution wiring.
2
+
3
+ Scope:
4
+
5
+ * tests/
6
+ * pyproject.toml or equivalent test config
7
+ * .pre-commit-config.yaml
8
+ * .github/workflows/*
9
+ * README/CONTRIBUTING/DEVELOPMENT sections that describe testing
10
+ * minimal source changes only if required to make behavior testable
11
+
12
+ Tasks:
13
+
14
+ * Map every public README-documented command, feature, and CLI behavior to existing tests where feasible.
15
+ * Add missing tests for feasible documented behavior.
16
+ * Identify behavior that cannot sensibly be tested automatically and document a manual verification check.
17
+ * Verify that tests are collected and actually executed.
18
+ * Check that tests are not accidentally skipped, deselected, ignored, or excluded by config.
19
+ * Ensure skipped/xfail tests have explicit reasons.
20
+ * Verify that local test instructions, pre-commit, CI, and release validation are consistent.
21
+ * Do not refactor implementation except where needed to make tests possible.
22
+
23
+ Run the relevant checks and report:
24
+
25
+ * changed files
26
+ * added or fixed tests
27
+ * remaining untested behavior and why
28
+ * commands run and results