dotagents-cli 0.7.5__tar.gz → 0.8.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.
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/CHANGELOG.md +89 -1
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/PKG-INFO +20 -9
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/README.md +8 -2
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/guide/commands.md +38 -15
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/guide/install.md +6 -3
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/guide/overlays.md +48 -9
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/guide/private-sync.md +12 -1
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/install.py +2 -2
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/pyproject.toml +13 -6
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/AGENTS.md +111 -29
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/__init__.py +1 -1
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_context.py +16 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_env.py +42 -5
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_overlay/dotagents/templates/AGENTS.md +7 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_overlays.py +10 -4
- dotagents_cli-0.8.0/src/dotagents/_pipwheel.py +319 -0
- dotagents_cli-0.8.0/src/dotagents/_pyvenv.py +329 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_resources.py +18 -5
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_skills.py +1 -1
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_sources.py +19 -18
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/__init__.py +3 -92
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/about.py +2 -2
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/build_pyz.py +62 -21
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/init.py +16 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/overlays.py +135 -24
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/conftest.py +21 -1
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_about.py +3 -3
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_build_pyz.py +18 -3
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_cli_main.py +1 -1
- dotagents_cli-0.8.0/tests/test_cloud_setup.py +97 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_cli.py +0 -28
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_init.py +2 -2
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_skills_adapters.py +16 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_init_base.py +15 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_overlays_cli.py +61 -0
- dotagents_cli-0.8.0/tests/test_pipwheel.py +102 -0
- dotagents_cli-0.8.0/tests/test_pyvenv_core.py +216 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_sources_uri.py +2 -2
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tools/cloud-setup.sh +18 -4
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tools/pyz_smoke.sh +8 -8
- dotagents_cli-0.7.5/tests/test_cloud_setup.py +0 -55
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/.gitignore +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/LICENSE +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/agents.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/cli.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/commands.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/context.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/env.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/fs.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/hooks.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/merge.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/overlays.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/reference.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/resources.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/scope.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/skills.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/sources.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/api/wrappers.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/changelog.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/guide/authoring.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/docs/index.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/mkdocs.yml +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/__main__.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_agents.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_fs.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_hooks.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_ignore.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_merge.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_overlay/dotagents/cmds/findings.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_overlay/dotagents/cmds/launch.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_overlay/dotagents/hooks/preinvocation_antigravity_context.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_overlay/dotagents/hooks/pretooluse_codex_env.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_overlay/dotagents/hooks/sessionstart_codex_context.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_overlay/dotagents/templates/PROJECT.md +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_scope.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/_wrappers.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/_common.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/context.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/env.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/cli/path.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/src/dotagents/py.typed +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/_helpers.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/_shell.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_agents.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_api_header.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_audit_leak.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_cmds_discovery.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_context.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_env.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_env_cli_scope.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_env_format.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_env_into.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_env_regressions.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_env_safety.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_findings_cmd.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_adapters.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_env.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_hooks.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_overlays.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_packaging.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_fix_scope_context.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_git_ssl_revoke.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_hooks.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_ignore.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_last_mile.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_launch_cmd.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_local_additions.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_mcp.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_no_internal_labels.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_overlay_libs.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_overlays_command.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_path_timeout_frontmatter.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_powershell_env_hook.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_quoting_injection_safety.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_scope.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_sources.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_wire_hooks.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tests/test_wrappers.py +0 -0
- {dotagents_cli-0.7.5 → dotagents_cli-0.8.0}/tools/audit.py +0 -0
|
@@ -7,6 +7,92 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.0] - 2026-10-16
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `overlays add` takes globs: `overlays add '*' -g` installs every overlay the repos
|
|
15
|
+
offer, which for a store with a registry (`<store>/dotagents.toml`) is everything
|
|
16
|
+
it names. A glob matching nothing is an error.
|
|
17
|
+
- `tools/cloud-setup.sh` installs every overlay the store's registry names
|
|
18
|
+
(`overlays add '*'`) before falling back to installing `private-sync` alone.
|
|
19
|
+
|
|
20
|
+
- Each store has a Python venv, `<store>/.pyvenv/<X.Y.Z>-<os>-<arch>/`, made from
|
|
21
|
+
the Python that runs dotagents, where skills run. `init` and `overlays add` /
|
|
22
|
+
`sync` / `remove` keep it current: the user venv always has duho, and every
|
|
23
|
+
overlay's `requirements.txt` is installed (in one pip run, only when a file
|
|
24
|
+
changed, before the overlay's `setup.py`). A project gets its own venv when one of
|
|
25
|
+
its overlays ships requirements or a `lib/`. `--no-venv` skips it for a run;
|
|
26
|
+
`AGENTS_NO_PYVENV=1` turns it off. `.pyvenv/` holds the agents' venvs only: a
|
|
27
|
+
venv there that no sync completed is never used, and a project's own code keeps
|
|
28
|
+
its venvs in the project tree.
|
|
29
|
+
- The venvs layer project > user > system through a `.pth` file in each: the store's
|
|
30
|
+
own overlay libs, then each lower store's venv packages and libs, then dotagents
|
|
31
|
+
itself. A project venv imports the project's packages first, then the user's.
|
|
32
|
+
- `env` points `AGENTS_PYTHON` at the active venv and names it in `AGENTS_PYVENV`;
|
|
33
|
+
overlay `setup.py` scripts run under it. `context` prints it ("Python for
|
|
34
|
+
skills"), and its JSON form carries it as `python`. The managed block tells
|
|
35
|
+
agents to run skill scripts with `$AGENTS_PYTHON`.
|
|
36
|
+
- pip without ensurepip: a venv where the interpreter has no ensurepip is created
|
|
37
|
+
without pip, and pip runs from its wheel (25.3, the last for Python 3.9, checked
|
|
38
|
+
against a pinned sha256). The wheel is found in the store's cache, in a `.pyz`
|
|
39
|
+
built with the new `build-pyz --with-pip`, in `AGENTS_PIP_SOURCE` (a directory of
|
|
40
|
+
wheels, or any URI pathapi-uri reads) or pip's `find-links`, or on your index
|
|
41
|
+
(`PIP_INDEX_URL`, or the mirror in `pip.ini` / `pip.conf`). `AGENTS_PIP_SOURCE`
|
|
42
|
+
is also passed to pip as `--find-links` for the requirements.
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- `overlays add` no longer stops at the first overlay that fails. Each failure is
|
|
47
|
+
logged, the overlays that require the failed one are skipped, every other overlay
|
|
48
|
+
is installed, and the command exits 1 naming each failure. A failed overlay this
|
|
49
|
+
run was installing for the first time is removed again, as before; the ones that
|
|
50
|
+
installed stay.
|
|
51
|
+
- With a scope venv, `env` no longer puts the overlay libs it layers on
|
|
52
|
+
`PYTHONPATH`: the venv's interpreter imports them, and no other Python in the
|
|
53
|
+
session should. Without a venv, `PYTHONPATH` carries them as before.
|
|
54
|
+
`AGENTS_PYTHONPATH` still lists every lib.
|
|
55
|
+
- The base block's "Startup: annotate that you read `…`" line names a store under
|
|
56
|
+
the home directory from there (`~/.agents/AGENTS.md`), and any other store by its
|
|
57
|
+
absolute path as before. A store kept in git and used on machines whose home
|
|
58
|
+
directories differ no longer shows `AGENTS.md` modified on all but one of them.
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
|
|
62
|
+
- `env --cache` on Windows with Python before 3.13 could miss a cache it had just
|
|
63
|
+
written: `time.time()` there lags the file's own timestamp by up to one clock
|
|
64
|
+
tick, and a cache file dated after "now" was treated as stale. A cache file
|
|
65
|
+
dated up to 2 s in the future now counts as fresh.
|
|
66
|
+
|
|
67
|
+
## [0.7.6] - 2026-10-15
|
|
68
|
+
|
|
69
|
+
### Added
|
|
70
|
+
|
|
71
|
+
- A `repo` extra (`repopath[uri]`) for overlay sources at `github:`, `gitlab:` and
|
|
72
|
+
`repo:` URIs, which the `uri` extra no longer brings.
|
|
73
|
+
|
|
74
|
+
### Changed
|
|
75
|
+
|
|
76
|
+
- dotagents depends on `pathapi` (`>=0.1.0,<0.2`), the new name of `pathlib_next`,
|
|
77
|
+
instead of `pathlib_next`. The `.pyz` vendors it; `build-pyz --pathapi-version`
|
|
78
|
+
names its pin, and `--pathlib-next-version` still works. On Python 3.9 nothing
|
|
79
|
+
else has to be installed for it.
|
|
80
|
+
- The extras install pathapi's own distributions: `uri` and `http` install
|
|
81
|
+
`pathapi-uri` (the URI layer, imported as `uripath`, with `file:`, `http(s):`,
|
|
82
|
+
`dav:`, `ftp:`, `zip:` and `tar:` on the standard library); `sftp` adds
|
|
83
|
+
`sftppath[paramiko]` and `s3` adds `objpath[s3]`. Overlay sources are read as
|
|
84
|
+
before. A `git:` URI is not a scheme any more; a repository tree is a `repo:` URI.
|
|
85
|
+
- `build-pyz --extras` vendors what the named extras install, each distribution at
|
|
86
|
+
its floor, and refuses an extra it does not know.
|
|
87
|
+
- `about` lists `pathapi`, `pathapi-uri`, `netimps` and the plugin distributions in
|
|
88
|
+
place of `pathlib_next`, `uritools` and `requests`.
|
|
89
|
+
|
|
90
|
+
### Removed
|
|
91
|
+
|
|
92
|
+
- The `.pyz` no longer extracts the built-in command modules' sources to temporary
|
|
93
|
+
files at startup: duho reads a command's flags and help through the zip importer
|
|
94
|
+
when the module has no file on disk.
|
|
95
|
+
|
|
10
96
|
## [0.7.5] - 2026-10-14
|
|
11
97
|
|
|
12
98
|
### Changed
|
|
@@ -1441,7 +1527,9 @@ Patch release: the PATH/POSIX-conversion fix above (the only change since 0.3.0)
|
|
|
1441
1527
|
affected module sources (`dotagents.cli`, `duho.presets`) to extracted temp files
|
|
1442
1528
|
before dispatch; a no-op for a plain install.
|
|
1443
1529
|
|
|
1444
|
-
[Unreleased]: https://github.com/jose-pr/dotagents/compare/v0.
|
|
1530
|
+
[Unreleased]: https://github.com/jose-pr/dotagents/compare/v0.8.0...HEAD
|
|
1531
|
+
[0.8.0]: https://github.com/jose-pr/dotagents/compare/v0.7.6...v0.8.0
|
|
1532
|
+
[0.7.6]: https://github.com/jose-pr/dotagents/compare/v0.7.5...v0.7.6
|
|
1445
1533
|
[0.7.5]: https://github.com/jose-pr/dotagents/compare/v0.7.4...v0.7.5
|
|
1446
1534
|
[0.7.4]: https://github.com/jose-pr/dotagents/compare/v0.7.3...v0.7.4
|
|
1447
1535
|
[0.7.3]: https://github.com/jose-pr/dotagents/compare/v0.7.2...v0.7.3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: dotagents-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: The dotagents CLI: install and manage a portable ~/.agents config for AI coding agents
|
|
5
5
|
Project-URL: Homepage, https://github.com/jose-pr/dotagents/
|
|
6
6
|
Project-URL: Repository, https://github.com/jose-pr/dotagents
|
|
@@ -24,12 +24,12 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
24
24
|
Classifier: Typing :: Typed
|
|
25
25
|
Requires-Python: >=3.9
|
|
26
26
|
Requires-Dist: duho<0.8,>=0.7.5
|
|
27
|
-
Requires-Dist:
|
|
27
|
+
Requires-Dist: pathapi<0.2,>=0.1.0
|
|
28
28
|
Requires-Dist: tomli>=1.1.0; python_version < '3.11'
|
|
29
29
|
Provides-Extra: dev
|
|
30
30
|
Requires-Dist: build; extra == 'dev'
|
|
31
31
|
Requires-Dist: hatchling>=1.27; extra == 'dev'
|
|
32
|
-
Requires-Dist:
|
|
32
|
+
Requires-Dist: pathapi-uri<0.2,>=0.1.0; extra == 'dev'
|
|
33
33
|
Requires-Dist: pytest; extra == 'dev'
|
|
34
34
|
Requires-Dist: pyyaml; extra == 'dev'
|
|
35
35
|
Provides-Extra: docs
|
|
@@ -37,13 +37,18 @@ Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
|
|
|
37
37
|
Requires-Dist: mkdocs>=1.5; extra == 'docs'
|
|
38
38
|
Requires-Dist: mkdocstrings[python]>=0.24; extra == 'docs'
|
|
39
39
|
Provides-Extra: http
|
|
40
|
-
Requires-Dist:
|
|
40
|
+
Requires-Dist: pathapi-uri<0.2,>=0.1.0; extra == 'http'
|
|
41
|
+
Provides-Extra: repo
|
|
42
|
+
Requires-Dist: pathapi-uri<0.2,>=0.1.0; extra == 'repo'
|
|
43
|
+
Requires-Dist: repopath[uri]<0.2,>=0.1.0; extra == 'repo'
|
|
41
44
|
Provides-Extra: s3
|
|
42
|
-
Requires-Dist:
|
|
45
|
+
Requires-Dist: objpath[s3]<0.2,>=0.1.0; extra == 's3'
|
|
46
|
+
Requires-Dist: pathapi-uri<0.2,>=0.1.0; extra == 's3'
|
|
43
47
|
Provides-Extra: sftp
|
|
44
|
-
Requires-Dist:
|
|
48
|
+
Requires-Dist: pathapi-uri<0.2,>=0.1.0; extra == 'sftp'
|
|
49
|
+
Requires-Dist: sftppath[paramiko]<0.2,>=0.1.0; extra == 'sftp'
|
|
45
50
|
Provides-Extra: uri
|
|
46
|
-
Requires-Dist:
|
|
51
|
+
Requires-Dist: pathapi-uri<0.2,>=0.1.0; extra == 'uri'
|
|
47
52
|
Provides-Extra: yaml
|
|
48
53
|
Requires-Dist: pyyaml; extra == 'yaml'
|
|
49
54
|
Description-Content-Type: text/markdown
|
|
@@ -156,7 +161,8 @@ dotagents init --force # replace AGENTS.md's content wholesale
|
|
|
156
161
|
|
|
157
162
|
`--from <source>` selects another *base*: a base overlay directory, a dotagents
|
|
158
163
|
checkout (its `src/dotagents/_overlay`), a `file:`, `http(s):`, `zip:`, `sftp:` or `s3:`
|
|
159
|
-
URI (`pip install "dotagents-cli[uri]"` for all but `file
|
|
164
|
+
URI (`pip install "dotagents-cli[uri]"` for all but `file:`, plus `[sftp]` or `[s3]`
|
|
165
|
+
for those schemes), or a git repository
|
|
160
166
|
(`repo[@ref][#path]`). A remote one is fetched into `<user store>/.cache/overlays/`.
|
|
161
167
|
The bundled base ships inside the package, so `--from` is only for a base of your own.
|
|
162
168
|
`init` records it (without any credentials in the URL), and later `init` and
|
|
@@ -209,6 +215,11 @@ store's shared `skills/` so every agent sees the same skills.
|
|
|
209
215
|
`.ignore` at the overlay's root match (setup output, local state) and tool caches are left
|
|
210
216
|
alone; `--prune` clears them too. A fresh `add` whose setup script fails is rolled
|
|
211
217
|
back.
|
|
218
|
+
- Each store has a Python venv, `<store>/.pyvenv/<version>-<os>-<arch>/`, where skills
|
|
219
|
+
run (`$AGENTS_PYTHON`): duho, every overlay's `requirements.txt` and every overlay
|
|
220
|
+
`lib/` import there, layered project > user > system. pip comes from the
|
|
221
|
+
interpreter, else its pinned wheel (cache, `AGENTS_PIP_SOURCE`, your index mirror,
|
|
222
|
+
or a `.pyz` built `--with-pip`).
|
|
212
223
|
- `sync` refreshes each overlay from the repo it was installed from (`--repo` replaces
|
|
213
224
|
that source), installs a `requires` added upstream, and re-merges the managed block.
|
|
214
225
|
- `remove` deletes the overlay's directory, unpublishes only the skills **it**
|
|
@@ -239,7 +250,7 @@ authors:
|
|
|
239
250
|
|
|
240
251
|
### Downloadable `dotagents.pyz`
|
|
241
252
|
|
|
242
|
-
A self-contained zipapp with `duho`, `
|
|
253
|
+
A self-contained zipapp with `duho`, `pathapi` and `tomli` bundled in (pure
|
|
243
254
|
Python, so one file runs on any OS and on Python 3.9+), so it needs no
|
|
244
255
|
`pip install`. Each release attaches one:
|
|
245
256
|
<https://github.com/jose-pr/dotagents/releases/latest/download/dotagents.pyz>.
|
|
@@ -106,7 +106,8 @@ dotagents init --force # replace AGENTS.md's content wholesale
|
|
|
106
106
|
|
|
107
107
|
`--from <source>` selects another *base*: a base overlay directory, a dotagents
|
|
108
108
|
checkout (its `src/dotagents/_overlay`), a `file:`, `http(s):`, `zip:`, `sftp:` or `s3:`
|
|
109
|
-
URI (`pip install "dotagents-cli[uri]"` for all but `file
|
|
109
|
+
URI (`pip install "dotagents-cli[uri]"` for all but `file:`, plus `[sftp]` or `[s3]`
|
|
110
|
+
for those schemes), or a git repository
|
|
110
111
|
(`repo[@ref][#path]`). A remote one is fetched into `<user store>/.cache/overlays/`.
|
|
111
112
|
The bundled base ships inside the package, so `--from` is only for a base of your own.
|
|
112
113
|
`init` records it (without any credentials in the URL), and later `init` and
|
|
@@ -159,6 +160,11 @@ store's shared `skills/` so every agent sees the same skills.
|
|
|
159
160
|
`.ignore` at the overlay's root match (setup output, local state) and tool caches are left
|
|
160
161
|
alone; `--prune` clears them too. A fresh `add` whose setup script fails is rolled
|
|
161
162
|
back.
|
|
163
|
+
- Each store has a Python venv, `<store>/.pyvenv/<version>-<os>-<arch>/`, where skills
|
|
164
|
+
run (`$AGENTS_PYTHON`): duho, every overlay's `requirements.txt` and every overlay
|
|
165
|
+
`lib/` import there, layered project > user > system. pip comes from the
|
|
166
|
+
interpreter, else its pinned wheel (cache, `AGENTS_PIP_SOURCE`, your index mirror,
|
|
167
|
+
or a `.pyz` built `--with-pip`).
|
|
162
168
|
- `sync` refreshes each overlay from the repo it was installed from (`--repo` replaces
|
|
163
169
|
that source), installs a `requires` added upstream, and re-merges the managed block.
|
|
164
170
|
- `remove` deletes the overlay's directory, unpublishes only the skills **it**
|
|
@@ -189,7 +195,7 @@ authors:
|
|
|
189
195
|
|
|
190
196
|
### Downloadable `dotagents.pyz`
|
|
191
197
|
|
|
192
|
-
A self-contained zipapp with `duho`, `
|
|
198
|
+
A self-contained zipapp with `duho`, `pathapi` and `tomli` bundled in (pure
|
|
193
199
|
Python, so one file runs on any OS and on Python 3.9+), so it needs no
|
|
194
200
|
`pip install`. Each release attaches one:
|
|
195
201
|
<https://github.com/jose-pr/dotagents/releases/latest/download/dotagents.pyz>.
|
|
@@ -100,10 +100,15 @@ dotagents init # base config into ./.agents (project sc
|
|
|
100
100
|
dotagents init -g # ...into ~/.agents (user scope)
|
|
101
101
|
dotagents init --bin-dir ~/.local/bin # also write a `dotagents` command on PATH
|
|
102
102
|
dotagents init --no-hooks # skip agent hook wiring + the skills links
|
|
103
|
+
dotagents init --no-venv # skip the store's Python venv (duho for skills)
|
|
103
104
|
dotagents init --agents claude,codex # exactly these agents (default: detected + claude)
|
|
104
105
|
dotagents init --dry-run
|
|
105
106
|
```
|
|
106
107
|
|
|
108
|
+
`init` also creates or updates the store's Python venv, where skills run (see
|
|
109
|
+
[the scope venv](overlays.md#python-dependencies-and-the-scope-venv)). Offline, or
|
|
110
|
+
with no pip to be had, that is a warning; `overlays sync` retries.
|
|
111
|
+
|
|
107
112
|
### Hook wiring
|
|
108
113
|
|
|
109
114
|
For each active agent, `init` adds what that harness needs to load the config, and
|
|
@@ -198,6 +203,7 @@ Manages opt-in overlays **by name**. See [Overlays](overlays.md) for the full mo
|
|
|
198
203
|
|
|
199
204
|
```bash
|
|
200
205
|
dotagents overlays add python engineering # install into the scope, publish skills, merge rules/routing
|
|
206
|
+
dotagents overlays add '*' -g # everything the repos offer (a store registry: all it names)
|
|
201
207
|
dotagents overlays list # installed (discovered) + available from the repos
|
|
202
208
|
dotagents overlays sync 'py*' # refresh installed overlays matching a glob
|
|
203
209
|
dotagents overlays sync --prune # also clear what .gitignore/.ignore protect: exactly upstream
|
|
@@ -205,7 +211,14 @@ dotagents overlays remove python # delete the overlay dir, unpublish i
|
|
|
205
211
|
dotagents overlays show python # describe one: manifest, requires, setup, skills, source (--json)
|
|
206
212
|
```
|
|
207
213
|
|
|
208
|
-
- **`add`**
|
|
214
|
+
- **`add`** takes names or globs: `'*'` is every overlay the repos offer, so with
|
|
215
|
+
a store registry it installs everything the registry names, and `'py*'` the ones
|
|
216
|
+
starting with `py`; a glob that matches nothing is an error. One overlay failing
|
|
217
|
+
(its copy, requirements or setup) does not stop the rest: it is logged, what
|
|
218
|
+
requires it is skipped, everything else installs, and the command exits 1 naming
|
|
219
|
+
each failure. A failed overlay this run was installing for the first time is
|
|
220
|
+
removed again; one that was already installed is left in place, not set up.
|
|
221
|
+
`add` installs what each manifest's `requires` names first, each requirement
|
|
209
222
|
installed and set up before the overlay that needs it (`--no-requires` to skip); a
|
|
210
223
|
requirement the scope already has, in its own store or the user store for a project,
|
|
211
224
|
is satisfied and left alone, while a name you ask for explicitly is always
|
|
@@ -213,8 +226,11 @@ dotagents overlays show python # describe one: manifest, requires, s
|
|
|
213
226
|
before touching anything — the first repo that offers a name wins — records where
|
|
214
227
|
each overlay came from, and publishes skills from the installed copy, never
|
|
215
228
|
replacing a skill already in the shared `skills/` dir (and links them into
|
|
216
|
-
Claude's skills dir when `init` wired Claude for the store).
|
|
217
|
-
|
|
229
|
+
Claude's skills dir when `init` wired Claude for the store). Each overlay's
|
|
230
|
+
`requirements.txt` is installed into the scope venv before its setup script runs
|
|
231
|
+
(`--no-venv` skips it; see
|
|
232
|
+
[the scope venv](overlays.md#python-dependencies-and-the-scope-venv)). A fresh install
|
|
233
|
+
whose requirements or setup script fail is rolled back. A source inside the store's own `overlays/` directory
|
|
218
234
|
is refused (by `sync` too): `remove` would delete the only copy.
|
|
219
235
|
- `add`, `remove` and `show` without an overlay name are usage errors (exit 2), and
|
|
220
236
|
a `--dry-run` says what it would write (`would recompose ...`) instead of reporting
|
|
@@ -359,7 +375,7 @@ form and drop names that are not shell identifiers.
|
|
|
359
375
|
`<NAME_OVERLAY_ROOT>` placeholder, so an env file and a context file refer to an
|
|
360
376
|
overlay's install dir by one name. When `dotagents` runs from a `.pyz`,
|
|
361
377
|
`AGENTS_PYLIB` names that archive: the libraries it bundles (duho,
|
|
362
|
-
|
|
378
|
+
pathapi) import from it, so an overlay built on them appends it to
|
|
363
379
|
`sys.path` when its own import fails. An installed `dotagents` sets nothing,
|
|
364
380
|
since those libraries are already in `AGENTS_PYTHON`'s site-packages. It is
|
|
365
381
|
never put on `PYTHONPATH`, where it would shadow a project's own copy.
|
|
@@ -572,39 +588,46 @@ See [Private sync](private-sync.md) for the full walkthrough.
|
|
|
572
588
|
## about
|
|
573
589
|
|
|
574
590
|
```bash
|
|
575
|
-
dotagents about # dotagents-cli <version>, then duho,
|
|
591
|
+
dotagents about # dotagents-cli <version>, then duho, pathapi, ...
|
|
576
592
|
dotagents about --json # the same, plus where it runs from and the Python
|
|
577
593
|
```
|
|
578
594
|
|
|
579
595
|
One `<distribution> <version>` per line, the CLI first. From a built `.pyz` the
|
|
580
596
|
list is exactly what `build-pyz` vendored (it records the names and versions in
|
|
581
597
|
`dotagents/_bundle.json` before stripping the `dist-info` dirs the zipapp would
|
|
582
|
-
otherwise carry, so `--extras uri
|
|
583
|
-
|
|
584
|
-
`
|
|
585
|
-
set, such as a client the `sftp` or `s3` extra pulls in
|
|
598
|
+
otherwise carry, so `--extras uri` shows up here as `pathapi-uri` and `netimps`).
|
|
599
|
+
From a plain install it is whichever of a fixed set is installed: `duho`, `pathapi`,
|
|
600
|
+
`pathapi-uri`, `netimps`, `sftppath`, `objpath` and `repopath`. A package outside
|
|
601
|
+
that set, such as a client the `sftp` or `s3` extra pulls in (`paramiko`, `boto3`),
|
|
602
|
+
is not listed.
|
|
586
603
|
|
|
587
604
|
## build-pyz
|
|
588
605
|
|
|
589
606
|
```bash
|
|
590
607
|
python -m dotagents build-pyz --out dist/dotagents.pyz
|
|
591
|
-
python -m dotagents build-pyz --extras uri,
|
|
608
|
+
python -m dotagents build-pyz --extras uri,repo # also vendor what those extras install
|
|
609
|
+
python -m dotagents build-pyz --with-pip # also carry pip, for machines without it
|
|
592
610
|
```
|
|
593
611
|
|
|
594
|
-
Builds a self-contained zipapp from a source checkout, with `duho` and `
|
|
595
|
-
vendored (plus the
|
|
612
|
+
Builds a self-contained zipapp from a source checkout, with `duho` and `pathapi`
|
|
613
|
+
vendored (plus what the dotagents-cli extras named by `--extras` install), so it runs with no
|
|
596
614
|
`pip install`. The repo's `tools/` never ships in it. Flags:
|
|
597
615
|
|
|
598
616
|
- `--out <path>` — where to write it (default `dist/dotagents.pyz`).
|
|
599
617
|
- `--python <shebang>` — the interpreter line embedded in it (default
|
|
600
618
|
`/usr/bin/env python3`).
|
|
601
|
-
- `--duho-version`, `--
|
|
602
|
-
floors the package declares).
|
|
603
|
-
|
|
619
|
+
- `--duho-version`, `--pathapi-version` — the versions vendored (defaults: the
|
|
620
|
+
floors the package declares). `--pathlib-next-version` is the old name of the
|
|
621
|
+
second.
|
|
622
|
+
- `--extras <a,b>` — dotagents-cli extras to vendor too (`uri`, `http`, `s3`, `repo`),
|
|
623
|
+
each distribution they install at its floor,
|
|
604
624
|
so the `.pyz` can read those overlay sources; none by default. Everything is
|
|
605
625
|
vendored as pure-Python wheels resolved for Python 3.9, so the file does not
|
|
606
626
|
depend on the machine that built it; `sftp` needs native modules and fails the
|
|
607
627
|
build with a message saying so. The archive is compressed.
|
|
628
|
+
- `--with-pip` — also vendor the pinned pip wheel (about 1.8 MB), so the `.pyz` can
|
|
629
|
+
set up the scope venv where Python has no ensurepip and no index is reachable
|
|
630
|
+
(see [the scope venv](overlays.md#python-dependencies-and-the-scope-venv)).
|
|
608
631
|
|
|
609
632
|
Each release attaches a built one:
|
|
610
633
|
<https://github.com/jose-pr/dotagents/releases/latest/download/dotagents.pyz>.
|
|
@@ -5,7 +5,9 @@ pip install dotagents-cli # the `dotagents` command and `import dot
|
|
|
5
5
|
pip install "dotagents-cli[uri]" # + remote overlay sources beyond git and http(s) registries
|
|
6
6
|
```
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
`uri` installs `pathapi-uri`: `file:`, `http(s):`, `dav:`, `ftp:`, `zip:` and `tar:` on
|
|
9
|
+
the standard library. `sftp`, `s3` and `repo` add `sftp:`, `s3:` and `github:` /
|
|
10
|
+
`gitlab:` / `repo:` to it; `http` installs the same as `uri`. With no
|
|
9
11
|
`pip` at all, use the [downloadable `dotagents.pyz`](#downloadable-dotagentspyz).
|
|
10
12
|
|
|
11
13
|
`dotagents init` then lays down the neutral **base config**. Opinionated content is
|
|
@@ -49,7 +51,8 @@ dotagents init --force # replace AGENTS.md's content wholesale
|
|
|
49
51
|
|
|
50
52
|
`--from <source>` selects another *base*: a base overlay directory, a dotagents
|
|
51
53
|
checkout (its `src/dotagents/_overlay`), a `file:`, `http(s):`, `zip:`, `sftp:` or `s3:`
|
|
52
|
-
URI (`pip install "dotagents-cli[uri]"` for all but `file
|
|
54
|
+
URI (`pip install "dotagents-cli[uri]"` for all but `file:`, plus `[sftp]` or `[s3]`
|
|
55
|
+
for those schemes), or a git repository
|
|
53
56
|
(`repo[@ref][#path]`). A remote one is fetched into `<user store>/.cache/overlays/`.
|
|
54
57
|
The bundled base ships inside the package, so `--from` is only for a base of your own.
|
|
55
58
|
`init` records it in
|
|
@@ -58,7 +61,7 @@ The bundled base ships inside the package, so `--from` is only for a base of you
|
|
|
58
61
|
|
|
59
62
|
## Downloadable `dotagents.pyz`
|
|
60
63
|
|
|
61
|
-
A self-contained zipapp with `duho`, `
|
|
64
|
+
A self-contained zipapp with `duho`, `pathapi` and `tomli` bundled in as
|
|
62
65
|
pure-Python wheels (plus whatever `build-pyz --extras` added), so it needs no
|
|
63
66
|
`pip install` and runs on any OS with Python 3.9+. Each release attaches one:
|
|
64
67
|
<https://github.com/jose-pr/dotagents/releases/latest/download/dotagents.pyz>.
|
|
@@ -124,9 +124,10 @@ in what the path names:
|
|
|
124
124
|
`…/dotagents.git@repo#overlays/net` is the `net` overlay itself. Given as `--repo`,
|
|
125
125
|
that form would list `net`'s own subdirectories as overlays.
|
|
126
126
|
|
|
127
|
-
A `scheme://` location that is not git is a **
|
|
128
|
-
extra (`pip install 'dotagents-cli[uri]'`;
|
|
129
|
-
|
|
127
|
+
A `scheme://` location that is not git is a **uripath path** (pathapi's URI layer, the
|
|
128
|
+
`pathapi-uri` distribution). With the `uri` extra (`pip install 'dotagents-cli[uri]'`;
|
|
129
|
+
`[sftp]`, `[s3]` and `[repo]` add `sftp:`, `s3:` and `github:` / `gitlab:` / `repo:`)
|
|
130
|
+
any scheme uripath speaks works like a local path: an `http(s)://`
|
|
130
131
|
directory listing, an `sftp`, `s3`, `dav` or `github` tree is a directory of overlays
|
|
131
132
|
as a repo or one overlay as a source, a file is a registry; an archive is a tree too —
|
|
132
133
|
`zip:<archive-uri>!/<inner path>` (`tar:`, or `archive:` to auto-detect), the archive
|
|
@@ -135,7 +136,7 @@ materialized into `<user store>/.cache/overlays/uri/`, synced once per run, and
|
|
|
135
136
|
from there; `file://` is a local path, no copy. Without the extra, an `http(s)://`
|
|
136
137
|
location can still be a registry file (fetched with the standard library), and
|
|
137
138
|
anything else says which extra it needs. The `.pyz` vendors none of this unless built
|
|
138
|
-
with `build-pyz --extras uri
|
|
139
|
+
with `build-pyz --extras uri`.
|
|
139
140
|
|
|
140
141
|
A source written as a **relative path** (`./python`, `../shared/net`, `overlays/rust`)
|
|
141
142
|
is relative to the registry it is in: the registry file's directory for a local file,
|
|
@@ -225,12 +226,49 @@ copies, where symlinks are unavailable) into the scope's shared skills dir, so e
|
|
|
225
226
|
agent that reads that dir picks up the same skills. Removing the overlay unpublishes
|
|
226
227
|
only the skills it published, then sweeps any now-broken symlinks.
|
|
227
228
|
|
|
229
|
+
## Python dependencies and the scope venv
|
|
230
|
+
|
|
231
|
+
Every store has a Python venv, `<store>/.pyvenv/<X.Y.Z>-<os>-<arch>/` (for example
|
|
232
|
+
`~/.agents/.pyvenv/3.14.7-nt-arm64`), made from the Python that runs dotagents.
|
|
233
|
+
A store's `.pyvenv/` holds these **agents' venvs only**: skills, overlay helpers and
|
|
234
|
+
setup scripts run there. A project's own code gets its venvs beside the store, in
|
|
235
|
+
the project root's `.pyvenv/` (`<project>/.pyvenv/<version>-<os>-<arch>/`, which the
|
|
236
|
+
python overlay's `dotagents pyvenv` creates); only a venv dotagents itself synced is
|
|
237
|
+
ever used as an agents' venv. `init` and every
|
|
238
|
+
`overlays add` / `sync` / `remove` keep it current:
|
|
239
|
+
|
|
240
|
+
- The user store's venv always has **duho**, so any skill can build a command line
|
|
241
|
+
on it, plus the packages each overlay installed there lists in a
|
|
242
|
+
**`requirements.txt`** at its root (pip's format). They are installed in one pip
|
|
243
|
+
run, so pip sees every constraint at once, and only when a file changed.
|
|
244
|
+
- A project gets its own venv only when one of its overlays ships a
|
|
245
|
+
`requirements.txt` or a `lib/`; otherwise a project session uses the user venv.
|
|
246
|
+
- The venvs **layer like everything else**. A `.pth` file in each venv lists, highest
|
|
247
|
+
precedence first: the store's own overlay libs, then the user venv's packages and
|
|
248
|
+
libs, then the system store's. dotagents itself comes last. So in a project venv,
|
|
249
|
+
the project's packages and libs win, then the user's, then the system's.
|
|
250
|
+
- `dotagents env` points **`AGENTS_PYTHON`** at the active venv (and names it in
|
|
251
|
+
`AGENTS_PYVENV`). Overlay `setup.py` and `env.py` run under it, and the managed
|
|
252
|
+
block tells agents to run skill scripts with it. Libs the venv layers stay off
|
|
253
|
+
`PYTHONPATH`, so no other Python in the session, such as a project's own venv,
|
|
254
|
+
imports them by accident.
|
|
255
|
+
|
|
256
|
+
**No ensurepip, no network?** pip runs from its wheel, pinned by version (25.3, the
|
|
257
|
+
last for Python 3.9) and hash, found in this order: the store's cache, a copy
|
|
258
|
+
vendored into the `.pyz` (`build-pyz --with-pip`), `AGENTS_PIP_SOURCE` (a directory
|
|
259
|
+
of wheels, or any URI pathapi-uri reads: `file:`, `s3:`, `sftp:`, ...), pip's own
|
|
260
|
+
`find-links`, then your index (`PIP_INDEX_URL` or the mirror in `pip.ini` /
|
|
261
|
+
`pip.conf`). `AGENTS_PIP_SOURCE` is also handed to pip as `--find-links` for the
|
|
262
|
+
requirements themselves.
|
|
263
|
+
|
|
264
|
+
Opt out per run with `--no-venv`, or for good with `AGENTS_NO_PYVENV=1`.
|
|
265
|
+
|
|
228
266
|
## Setup scripts
|
|
229
267
|
|
|
230
268
|
An overlay may ship an **idempotent** `setup.py` at its root — the recommended,
|
|
231
|
-
OS-agnostic form: it runs under the
|
|
232
|
-
|
|
233
|
-
in, dotagents runs the script automatically. Reserve it for real install-time work:
|
|
269
|
+
OS-agnostic form: it runs under `AGENTS_PYTHON` (the scope venv above, with the
|
|
270
|
+
overlay's requirements installed first), so it works on every platform. After
|
|
271
|
+
`add` / `sync` copies the overlay in, dotagents runs the script automatically. Reserve it for real install-time work:
|
|
234
272
|
`PATH`, `PYTHONPATH` and `$<NAME>_OVERLAY_ROOT` are `dotagents env`'s job
|
|
235
273
|
(above), and an overlay's own env vars belong in its `env.py`, not in a script that
|
|
236
274
|
writes one into the store — none of the example overlays ship a setup script any more.
|
|
@@ -241,8 +279,9 @@ Presence of a script is the opt-in; skip it with `--no-setup`. The author contra
|
|
|
241
279
|
- **Environment** carries `AGENTS_HOME` (the user store), `AGENTS_SCOPE_ROOT` (the
|
|
242
280
|
store the overlay is installed into), `AGENTS_SCOPE` (`user` or `project`) and
|
|
243
281
|
`AGENTS_OVERLAY_DIR` (the overlay's own installed dir) — never hardcode a home path.
|
|
244
|
-
- **Environment** is also the scope's assembled `dotagents env`: every overlay's `
|
|
245
|
-
on `
|
|
282
|
+
- **Environment** is also the scope's assembled `dotagents env`: every overlay's `bin/`
|
|
283
|
+
on `PATH`, and every overlay's `lib/` importable (through the venv's layering, or
|
|
284
|
+
`PYTHONPATH` without a venv).
|
|
246
285
|
- **Time limit**: 300 seconds, or the manifest's `setup_timeout`, or the command's
|
|
247
286
|
`--setup-timeout` (which wins); `0` means no limit. A script still running then is
|
|
248
287
|
stopped, and that counts as a failure (exit 124).
|
|
@@ -19,6 +19,16 @@ never lands in the public repo). `<name>` defaults to the project's basename, so
|
|
|
19
19
|
local checkout and a cloud checkout of the same project resolve to the same store
|
|
20
20
|
entry.
|
|
21
21
|
|
|
22
|
+
The store's installed overlays can travel two ways:
|
|
23
|
+
|
|
24
|
+
- **Tracked copies**: `overlays/` is committed. Every machine and cloud session has
|
|
25
|
+
them with the clone, offline; every `overlays sync` is a diff in the private repo.
|
|
26
|
+
- **A registry**: `<store>/dotagents.toml` names one source per overlay and
|
|
27
|
+
`overlays/` is left out of the repo. `dotagents overlays add '*' -g` installs
|
|
28
|
+
everything it names, keeping going past one that fails; the bootstrap below runs
|
|
29
|
+
it in a cloud session. The repo stays small; each new machine fetches the
|
|
30
|
+
overlays once.
|
|
31
|
+
|
|
22
32
|
## Commands
|
|
23
33
|
|
|
24
34
|
The overlay goes into the user store, since the store is what it syncs:
|
|
@@ -82,7 +92,8 @@ curl -fsSL https://raw.githubusercontent.com/<you>/dotagents/main/tools/cloud-se
|
|
|
82
92
|
success. `&&` propagates the curl failure instead.
|
|
83
93
|
|
|
84
94
|
The bootstrap authenticates (bypassing a hosted-runner `github.com` → proxy git
|
|
85
|
-
rewrite), clones/pulls the store, installs the CLI,
|
|
95
|
+
rewrite), clones/pulls the store, installs the CLI, installs every overlay the store's
|
|
96
|
+
registry names (`overlays add '*'`, when it has one), links the project, and wires the
|
|
86
97
|
hooks into `~/.claude/settings.json` — driven by `AGENTS_REMOTE` /
|
|
87
98
|
`DOTAGENTS_AGENTS_TOKEN` / `DOTAGENTS_CLI_INSTALL` environment variables (the token is
|
|
88
99
|
never committed). `AGENTS_OVERLAYS_REMOTE` / `AGENTS_OVERLAYS_REF` choose where it
|
|
@@ -5,7 +5,7 @@ Thin front over ``dotagents.cli.main()``, kept at this filename so existing
|
|
|
5
5
|
muscle-memory/docs pointing at ``python install.py`` still work.
|
|
6
6
|
|
|
7
7
|
Self-bootstrapping, inside a virtual environment: the CLI needs the
|
|
8
|
-
``dotagents`` package and its ``duho``/``
|
|
8
|
+
``dotagents`` package and its ``duho``/``pathapi`` dependencies
|
|
9
9
|
importable. If they aren't -- e.g. a fresh venv with nothing installed yet --
|
|
10
10
|
this shim installs this checkout **into the interpreter that is running it**
|
|
11
11
|
(``sys.executable -m pip install -e .``) and retries, exactly once. When
|
|
@@ -49,7 +49,7 @@ def _import_main():
|
|
|
49
49
|
"""Return ``dotagents.cli.main`` if importable, else None.
|
|
50
50
|
|
|
51
51
|
The ``src/`` fallback lets an un-pip-installed checkout resolve its
|
|
52
|
-
``src/`` layout directly, provided ``duho``/``
|
|
52
|
+
``src/`` layout directly, provided ``duho``/``pathapi`` are importable
|
|
53
53
|
some other way. A plain editable install makes all three importable without
|
|
54
54
|
the fallback.
|
|
55
55
|
"""
|
|
@@ -36,19 +36,26 @@ classifiers = [
|
|
|
36
36
|
# raise a floor and move its pin there in the same change.
|
|
37
37
|
dependencies = [
|
|
38
38
|
"duho>=0.7.5,<0.8",
|
|
39
|
-
"
|
|
39
|
+
"pathapi>=0.1.0,<0.2",
|
|
40
40
|
# overlay.toml manifests and TOML registries; tomllib is stdlib from 3.11.
|
|
41
41
|
'tomli>=1.1.0; python_version < "3.11"',
|
|
42
42
|
]
|
|
43
43
|
|
|
44
|
+
# Overlay sources at a URI. `pathapi-uri` (import name `uripath`) gives the
|
|
45
|
+
# file:, http(s):, dav:, ftp:, zip: and tar: schemes on the standard library;
|
|
46
|
+
# the other distributions add their schemes to it. `build-pyz --extras` vendors
|
|
47
|
+
# the floor of each (EXTRA_REQUIREMENTS in src/dotagents/cli/build_pyz.py).
|
|
44
48
|
[project.optional-dependencies]
|
|
45
|
-
uri = ["
|
|
46
|
-
http
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
uri = ["pathapi-uri>=0.1.0,<0.2"]
|
|
50
|
+
# http(s) is part of `uri` now; kept so `dotagents-cli[http]` still installs.
|
|
51
|
+
http = ["pathapi-uri>=0.1.0,<0.2"]
|
|
52
|
+
sftp = ["pathapi-uri>=0.1.0,<0.2", "sftppath[paramiko]>=0.1.0,<0.2"]
|
|
53
|
+
s3 = ["pathapi-uri>=0.1.0,<0.2", "objpath[s3]>=0.1.0,<0.2"]
|
|
54
|
+
# github:, gitlab: and repo: (a repository's tree at a ref).
|
|
55
|
+
repo = ["pathapi-uri>=0.1.0,<0.2", "repopath[uri]>=0.1.0,<0.2"]
|
|
49
56
|
# YAML overlay-repo registries (dotagents.yaml / *.yml).
|
|
50
57
|
yaml = ["pyyaml"]
|
|
51
|
-
dev = ["build", "hatchling>=1.27", "pytest", "pyyaml", "
|
|
58
|
+
dev = ["build", "hatchling>=1.27", "pytest", "pyyaml", "pathapi-uri>=0.1.0,<0.2"]
|
|
52
59
|
docs = [
|
|
53
60
|
"mkdocs>=1.5",
|
|
54
61
|
"mkdocs-material>=9.5",
|