aisland 0.1.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.
- aisland-0.1.0/CHANGELOG.md +44 -0
- aisland-0.1.0/LICENSE +21 -0
- aisland-0.1.0/MANIFEST.in +10 -0
- aisland-0.1.0/PKG-INFO +306 -0
- aisland-0.1.0/README.md +249 -0
- aisland-0.1.0/aisland/__init__.py +12 -0
- aisland-0.1.0/aisland/atomic.py +80 -0
- aisland-0.1.0/aisland/backups.py +687 -0
- aisland-0.1.0/aisland/ci/__init__.py +5 -0
- aisland-0.1.0/aisland/ci/ci_scaffold.py +585 -0
- aisland-0.1.0/aisland/ci/ci_templates.py +375 -0
- aisland-0.1.0/aisland/ci/jenkins_job_config.py +257 -0
- aisland-0.1.0/aisland/ci/quality.py +124 -0
- aisland-0.1.0/aisland/ci/stats_report.py +529 -0
- aisland-0.1.0/aisland/clean.py +283 -0
- aisland-0.1.0/aisland/cli/__init__.py +33 -0
- aisland-0.1.0/aisland/cli/__main__.py +5 -0
- aisland-0.1.0/aisland/cli/_base.py +294 -0
- aisland-0.1.0/aisland/cli/configure.py +184 -0
- aisland-0.1.0/aisland/cli/editor.py +141 -0
- aisland-0.1.0/aisland/cli/services.py +355 -0
- aisland-0.1.0/aisland/cli/toplevel.py +349 -0
- aisland-0.1.0/aisland/cli/tunnel.py +348 -0
- aisland-0.1.0/aisland/cli/wheels.py +297 -0
- aisland-0.1.0/aisland/cli/workspace.py +476 -0
- aisland-0.1.0/aisland/code-workspace.json +96 -0
- aisland-0.1.0/aisland/console.py +103 -0
- aisland-0.1.0/aisland/css_colors.py +160 -0
- aisland-0.1.0/aisland/doctor.py +791 -0
- aisland-0.1.0/aisland/downloads.py +35 -0
- aisland-0.1.0/aisland/editor.py +354 -0
- aisland-0.1.0/aisland/envfile.py +144 -0
- aisland-0.1.0/aisland/errors.py +41 -0
- aisland-0.1.0/aisland/failures.py +42 -0
- aisland-0.1.0/aisland/git/git_folder_all.sh +160 -0
- aisland-0.1.0/aisland/git/git_pull_all.sh +549 -0
- aisland-0.1.0/aisland/git/git_push_all.sh +77 -0
- aisland-0.1.0/aisland/git/setup_git.sh +225 -0
- aisland-0.1.0/aisland/git_exclude.py +42 -0
- aisland-0.1.0/aisland/gitcmd.py +98 -0
- aisland-0.1.0/aisland/harness/AGENTS.md +374 -0
- aisland-0.1.0/aisland/harness/commands/commit-all.md +41 -0
- aisland-0.1.0/aisland/harness/commands/commit-session.md +35 -0
- aisland-0.1.0/aisland/harness/commands/list-actions.md +28 -0
- aisland-0.1.0/aisland/harness/commands/pull-all.md +39 -0
- aisland-0.1.0/aisland/harness/commands/push-all.md +26 -0
- aisland-0.1.0/aisland/harness/commands/ship.md +155 -0
- aisland-0.1.0/aisland/harness/harness.toml +10 -0
- aisland-0.1.0/aisland/harness/scripts/stage_hunks.py +127 -0
- aisland-0.1.0/aisland/locations.py +318 -0
- aisland-0.1.0/aisland/machine_config.py +60 -0
- aisland-0.1.0/aisland/notebook_utils.py +170 -0
- aisland-0.1.0/aisland/paths.py +35 -0
- aisland-0.1.0/aisland/plugins.py +112 -0
- aisland-0.1.0/aisland/probe.py +49 -0
- aisland-0.1.0/aisland/py.typed +0 -0
- aisland-0.1.0/aisland/pypi.py +121 -0
- aisland-0.1.0/aisland/pyproject.py +70 -0
- aisland-0.1.0/aisland/pytest_stats.py +343 -0
- aisland-0.1.0/aisland/server.py +458 -0
- aisland-0.1.0/aisland/services/__init__.py +0 -0
- aisland-0.1.0/aisland/services/base.py +310 -0
- aisland-0.1.0/aisland/services/declared.py +45 -0
- aisland-0.1.0/aisland/services/docker.py +402 -0
- aisland-0.1.0/aisland/services/jenkins.py +431 -0
- aisland-0.1.0/aisland/services/jenkins_java.py +293 -0
- aisland-0.1.0/aisland/services/jenkins_jobs.py +268 -0
- aisland-0.1.0/aisland/services/jenkins_settings.py +222 -0
- aisland-0.1.0/aisland/services/nightly.py +393 -0
- aisland-0.1.0/aisland/services/plugin.py +161 -0
- aisland-0.1.0/aisland/services/registry.py +286 -0
- aisland-0.1.0/aisland/services/supervisor.py +627 -0
- aisland-0.1.0/aisland/services/swiftbar.py +277 -0
- aisland-0.1.0/aisland/setup/__init__.py +5 -0
- aisland-0.1.0/aisland/setup/bashrc.py +63 -0
- aisland-0.1.0/aisland/setup/completion.py +316 -0
- aisland-0.1.0/aisland/setup/configure.py +202 -0
- aisland-0.1.0/aisland/setup/editor_files.py +293 -0
- aisland-0.1.0/aisland/setup/env_example.py +305 -0
- aisland-0.1.0/aisland/setup/git_settings.py +42 -0
- aisland-0.1.0/aisland/setup/harness.py +669 -0
- aisland-0.1.0/aisland/setup/init.py +424 -0
- aisland-0.1.0/aisland/setup/installers.py +296 -0
- aisland-0.1.0/aisland/setup/manager.py +172 -0
- aisland-0.1.0/aisland/setup/mcp_config.py +195 -0
- aisland-0.1.0/aisland/setup/playwright_browser.py +56 -0
- aisland-0.1.0/aisland/setup/provision.py +202 -0
- aisland-0.1.0/aisland/setup/source_commands.py +268 -0
- aisland-0.1.0/aisland/setup/uv_config.py +165 -0
- aisland-0.1.0/aisland/templates/ci/Jenkinsfile.jinja +285 -0
- aisland-0.1.0/aisland/templates/ci/Jenkinsfile.local.jinja +292 -0
- aisland-0.1.0/aisland/templates/ci/_gh_node_job.yml.jinja +28 -0
- aisland-0.1.0/aisland/templates/ci/_gh_preinstall.yml.jinja +4 -0
- aisland-0.1.0/aisland/templates/ci/_gh_slow_job.yml.jinja +30 -0
- aisland-0.1.0/aisland/templates/ci/_gh_token.yml.jinja +9 -0
- aisland-0.1.0/aisland/templates/ci/_jenkins_preinstall.groovy.jinja +5 -0
- aisland-0.1.0/aisland/templates/ci/_limited.groovy.jinja +19 -0
- aisland-0.1.0/aisland/templates/ci/_local_node_stage.groovy.jinja +16 -0
- aisland-0.1.0/aisland/templates/ci/_local_slow_param.groovy.jinja +6 -0
- aisland-0.1.0/aisland/templates/ci/_local_slow_stage.groovy.jinja +27 -0
- aisland-0.1.0/aisland/templates/ci/_node_stage.groovy.jinja +13 -0
- aisland-0.1.0/aisland/templates/ci/_slow_stage.groovy.jinja +22 -0
- aisland-0.1.0/aisland/templates/ci/_venv_check.groovy.jinja +12 -0
- aisland-0.1.0/aisland/templates/ci/ci.yml.jinja +144 -0
- aisland-0.1.0/aisland/templates/ci/template.toml +20 -0
- aisland-0.1.0/aisland/templates/jenkins/local_job.xml.jinja +28 -0
- aisland-0.1.0/aisland/templates/jenkins/multibranch.xml.jinja +49 -0
- aisland-0.1.0/aisland/templates/jenkins/nightly_check.xml.jinja +24 -0
- aisland-0.1.0/aisland/templates/jenkins/orchestrator.xml.jinja +34 -0
- aisland-0.1.0/aisland/templates/swiftbar/gh_status.sh +74 -0
- aisland-0.1.0/aisland/templates/swiftbar/jenkins_status.sh +126 -0
- aisland-0.1.0/aisland/templates/test_env_example.py.template +125 -0
- aisland-0.1.0/aisland/templates/vscode-init-bash.sh +29 -0
- aisland-0.1.0/aisland/toml_places.py +67 -0
- aisland-0.1.0/aisland/tunnel/__init__.py +8 -0
- aisland-0.1.0/aisland/tunnel/binary.py +168 -0
- aisland-0.1.0/aisland/tunnel/connect.py +540 -0
- aisland-0.1.0/aisland/tunnel/host.py +441 -0
- aisland-0.1.0/aisland/tunnel/shell.py +171 -0
- aisland-0.1.0/aisland/tunnel/state.py +42 -0
- aisland-0.1.0/aisland/tunnel/store.py +287 -0
- aisland-0.1.0/aisland/userspace_tools.py +70 -0
- aisland-0.1.0/aisland/venv.py +74 -0
- aisland-0.1.0/aisland/wheels/__init__.py +9 -0
- aisland-0.1.0/aisland/wheels/build.py +856 -0
- aisland-0.1.0/aisland/wheels/bundle.py +445 -0
- aisland-0.1.0/aisland/wheels/check.py +359 -0
- aisland-0.1.0/aisland/wheels/export.py +53 -0
- aisland-0.1.0/aisland/wheels/extra.py +341 -0
- aisland-0.1.0/aisland/wheels/files.py +353 -0
- aisland-0.1.0/aisland/wheels/filter_repo.py +43 -0
- aisland-0.1.0/aisland/wheels/install.py +217 -0
- aisland-0.1.0/aisland/wheels/projects.py +151 -0
- aisland-0.1.0/aisland/wheels/prune.py +845 -0
- aisland-0.1.0/aisland/wheels/published.py +78 -0
- aisland-0.1.0/aisland/wheels/report.py +457 -0
- aisland-0.1.0/aisland/wheels/scrub.py +108 -0
- aisland-0.1.0/aisland/wheels/unzip.py +147 -0
- aisland-0.1.0/aisland/workspace/__init__.py +8 -0
- aisland-0.1.0/aisland/workspace/activation.py +253 -0
- aisland-0.1.0/aisland/workspace/check.py +109 -0
- aisland-0.1.0/aisland/workspace/clones.py +101 -0
- aisland-0.1.0/aisland/workspace/discovery.py +549 -0
- aisland-0.1.0/aisland/workspace/file.py +600 -0
- aisland-0.1.0/aisland/workspace/github.py +65 -0
- aisland-0.1.0/aisland/workspace/gitmodules.py +72 -0
- aisland-0.1.0/aisland/workspace/local.py +87 -0
- aisland-0.1.0/aisland/workspace/mirrors.py +713 -0
- aisland-0.1.0/aisland/workspace/model.py +135 -0
- aisland-0.1.0/aisland/workspace/projects.py +233 -0
- aisland-0.1.0/aisland/workspace/prune_record.py +57 -0
- aisland-0.1.0/aisland/workspace/recording.py +121 -0
- aisland-0.1.0/aisland/workspace/selection.py +476 -0
- aisland-0.1.0/aisland/workspace/source_apply.py +176 -0
- aisland-0.1.0/aisland/workspace/sources.py +378 -0
- aisland-0.1.0/aisland/workspace/tracking.py +394 -0
- aisland-0.1.0/aisland.egg-info/PKG-INFO +306 -0
- aisland-0.1.0/aisland.egg-info/SOURCES.txt +164 -0
- aisland-0.1.0/aisland.egg-info/dependency_links.txt +1 -0
- aisland-0.1.0/aisland.egg-info/entry_points.txt +6 -0
- aisland-0.1.0/aisland.egg-info/requires.txt +35 -0
- aisland-0.1.0/aisland.egg-info/top_level.txt +1 -0
- aisland-0.1.0/project.bashrc +120 -0
- aisland-0.1.0/pyproject.toml +227 -0
- aisland-0.1.0/setup.cfg +4 -0
- aisland-0.1.0/setup.py +30 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to aisland are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The newest entry is the
|
|
7
|
+
next release: it reads `- Unreleased` until the release dates it.
|
|
8
|
+
|
|
9
|
+
## [0.1.0] - 2026-11-13
|
|
10
|
+
|
|
11
|
+
The first release on PyPI: `pip install aisland`.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- **A workspace in two commands.** `aisland workspace init <folder>` makes one git repository whose projects are
|
|
15
|
+
submodules, listed in `workspace.toml`. `aisland setup` installs every project editable into one `.venv`,
|
|
16
|
+
dependencies first, along with the system tools the projects declare, the git aliases (`git pull-all`,
|
|
17
|
+
`git push-all`), the editor's workspace file and `project.bashrc` ([workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md)).
|
|
18
|
+
- **Per-project and per-machine choices.** `aisland workspace configure` picks where each project comes from (a
|
|
19
|
+
checkout, GitHub or PyPI), whether this machine has it, where it is mirrored, and which extras the projects
|
|
20
|
+
install ([sources](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/sources.md), [selections](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/selections.md)).
|
|
21
|
+
- **Local services.** `aisland services` runs Jenkins, the container engine, SwiftBar and the services projects
|
|
22
|
+
declare, under one process-compose supervisor. Jenkins is a pinned LTS release with checked downloads, and it
|
|
23
|
+
listens on this machine only ([services](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/services.md), [jenkins](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/jenkins.md)).
|
|
24
|
+
- **Generated CI and the quality gates.** `aisland jenkins scaffold` writes a project's `Jenkinsfile`,
|
|
25
|
+
`Jenkinsfile.local` and GitHub `ci.yml` from a template set, aisland's own or yours. `aisland check` runs isort,
|
|
26
|
+
black, flake8, mypy, pytest and `act` the way CI does ([ci](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/ci.md)).
|
|
27
|
+
- **Wheels for a machine without the workspace.** `aisland wheels build|zip|install` carries a project and its
|
|
28
|
+
unreleased dependencies elsewhere. `aisland wheels prune|reset` drops old committed wheels from a project's
|
|
29
|
+
history, with a backup bundle (the `prune` extra; [wheels](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/wheels.md)).
|
|
30
|
+
- **The machine's environment.** `aisland doctor` checks it and prints the fix for each problem it finds.
|
|
31
|
+
`aisland workspace env-example` collects every variable the projects read into `env.complete` and `env.example`
|
|
32
|
+
([doctor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/doctor.md)).
|
|
33
|
+
- **Test-run statistics.** A pytest plugin records each run of a workspace project, and `aisland tests report`
|
|
34
|
+
proposes which tests to move between the fast and slow runs ([tests](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tests.md)).
|
|
35
|
+
- **AI coding agents.** `aisland setup` installs the agent rules and commands from the harness sets
|
|
36
|
+
`workspace.toml` lists. `aisland mcp claude|gemini` writes the client files, and `aisland-mcp` (the `mcp` extra)
|
|
37
|
+
offers a chosen set of aisland's commands to an AI client ([harness](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/harness.md), [mcp](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/mcp.md)).
|
|
38
|
+
- **Remote machines.** `aisland tunnel` opens a VS Code Remote Tunnel, and `aisland tunnel connect` (the `connect`
|
|
39
|
+
extra) a terminal over it ([tunnel](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tunnel.md)).
|
|
40
|
+
- **Predictable failures and versioned files.** Every error is one `Error:` line with exit code 1, and
|
|
41
|
+
`aisland --debug` adds the traceback. `workspace.toml`, template sets and harness sets carry a `format`, so a file
|
|
42
|
+
written for a newer aisland is refused with the upgrade to make ([stability](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/stability.md)).
|
|
43
|
+
|
|
44
|
+
[0.1.0]: https://github.com/Gearlux/aisland/releases/tag/v0.1.0
|
aisland-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Gert Behiels
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# The source package carries project.bashrc: setup.py copies it into the wheel, and `python -m build` builds
|
|
2
|
+
# the wheel FROM the source package. Pinned by tests/test_packaging.py::test_a_release_build_puts_the_shell_init_into_the_wheel.
|
|
3
|
+
include project.bashrc
|
|
4
|
+
# Nothing references CHANGELOG.md (LICENSE comes with `license-files`), so without this line the source
|
|
5
|
+
# package would ship none. Pinned by tests/test_packaging.py::test_the_source_package_carries_the_licence_and_the_changelog.
|
|
6
|
+
include CHANGELOG.md
|
|
7
|
+
# The source package builds the wheel and nothing else. setuptools adds tests/test_*.py by default, but the suite also
|
|
8
|
+
# needs its helpers, docs/, examples/ and .github/, so a partial copy cannot run: the tests stay in the repository.
|
|
9
|
+
# Pinned by tests/test_packaging.py::test_the_source_package_carries_no_part_of_the_test_suite.
|
|
10
|
+
prune tests
|
aisland-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aisland
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: One workspace of many Python projects: a shared venv, local services, generated CI and git aliases.
|
|
5
|
+
Author: Gert Behiels
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Gearlux/aisland
|
|
8
|
+
Project-URL: Repository, https://github.com/Gearlux/aisland.git
|
|
9
|
+
Project-URL: Issues, https://github.com/Gearlux/aisland/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/Gearlux/aisland/blob/v0.1.0/CHANGELOG.md
|
|
11
|
+
Keywords: workspace,monorepo,git submodules,virtualenv,continuous integration,jenkins,developer tools
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: MacOS
|
|
16
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
21
|
+
Classifier: Typing :: Typed
|
|
22
|
+
Requires-Python: >=3.12
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: click>=8.2.1
|
|
26
|
+
Requires-Dist: jinja2>=3.1.6
|
|
27
|
+
Requires-Dist: markupsafe>=2.0
|
|
28
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
29
|
+
Requires-Dist: packaging>=23.0
|
|
30
|
+
Requires-Dist: tomlkit>=0.12.0
|
|
31
|
+
Provides-Extra: connect
|
|
32
|
+
Requires-Dist: msgpack>=1.2; extra == "connect"
|
|
33
|
+
Provides-Extra: mcp
|
|
34
|
+
Requires-Dist: mcp<3,>=2.0; extra == "mcp"
|
|
35
|
+
Provides-Extra: prune
|
|
36
|
+
Requires-Dist: git-filter-repo>=2.47; extra == "prune"
|
|
37
|
+
Provides-Extra: dev
|
|
38
|
+
Requires-Dist: msgpack>=1.2; extra == "dev"
|
|
39
|
+
Requires-Dist: mcp<3,>=2.0; extra == "dev"
|
|
40
|
+
Requires-Dist: git-filter-repo>=2.47; extra == "dev"
|
|
41
|
+
Requires-Dist: liquifai>=0.3.1; extra == "dev"
|
|
42
|
+
Requires-Dist: pytest<9.0,>=8.0; extra == "dev"
|
|
43
|
+
Requires-Dist: pytest-cov>=6.0; extra == "dev"
|
|
44
|
+
Requires-Dist: pytest-xdist<4.0,>=3.8; extra == "dev"
|
|
45
|
+
Requires-Dist: black<25.0,>=24.0; extra == "dev"
|
|
46
|
+
Requires-Dist: isort<6.0,>=5.13; extra == "dev"
|
|
47
|
+
Requires-Dist: flake8>=7.0; extra == "dev"
|
|
48
|
+
Requires-Dist: import-linter>=2.12; extra == "dev"
|
|
49
|
+
Requires-Dist: mypy<2.0,>=1.20; extra == "dev"
|
|
50
|
+
Requires-Dist: types-PyYAML>=6.0; extra == "dev"
|
|
51
|
+
Requires-Dist: build>=1.5; extra == "dev"
|
|
52
|
+
Requires-Dist: twine>=7.0; extra == "dev"
|
|
53
|
+
Requires-Dist: setuptools>=77.0; extra == "dev"
|
|
54
|
+
Requires-Dist: wheel>=0.34; extra == "dev"
|
|
55
|
+
Requires-Dist: uv>=0.12; extra == "dev"
|
|
56
|
+
Dynamic: license-file
|
|
57
|
+
|
|
58
|
+
# aisland
|
|
59
|
+
|
|
60
|
+
**One workspace of many Python projects, set up the same way on every machine.** aisland keeps a git repository
|
|
61
|
+
whose projects are submodules, installs every project editable into the workspace's one virtual environment, and
|
|
62
|
+
gives the workspace what its projects share: git aliases that pull and push them all, local services (Jenkins,
|
|
63
|
+
and the ones the projects bring, such as MLflow) under one supervisor, generated CI files, an environment check,
|
|
64
|
+
and the agent rules every AI coding session in the workspace reads.
|
|
65
|
+
|
|
66
|
+
## Install
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
uv tool install aisland # or: pipx install aisland
|
|
70
|
+
aisland --version # which aisland runs: aisland, version <its version>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Install aisland once, as a tool: that copy only creates workspaces. Each workspace then gets its own aisland in
|
|
74
|
+
its `.venv`, which `aisland setup`, the git aliases and CI use, so every workspace keeps the version it was set up
|
|
75
|
+
with. A project is any git repository with a `pyproject.toml`. `uv tool install` and `pipx install` give the tool an
|
|
76
|
+
environment of its own; a plain `pip install aisland` works only inside a virtual environment, since the system
|
|
77
|
+
Python of Homebrew or Debian refuses it (`externally-managed-environment`).
|
|
78
|
+
|
|
79
|
+
`aisland setup` also installs rule files for AI coding agents: an `AGENTS.md` in the root (`CLAUDE.md` and
|
|
80
|
+
`GEMINI.md` link to it), the rules and commands in `.agents/`, and a `.claude/commands` link in the root and in every
|
|
81
|
+
project. To have none of them, write `[harness] sets = []` into `workspace.toml`
|
|
82
|
+
([harness](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/harness.md)).
|
|
83
|
+
|
|
84
|
+
aisland runs on macOS and Linux with Python 3.12 or newer, git, [uv](https://docs.astral.sh/uv/) and bash (the git
|
|
85
|
+
aliases and the shell start-up file `project.bashrc` are bash), and on macOS [Homebrew](https://brew.sh), through which
|
|
86
|
+
it installs tools. `aisland setup` installs the system tools your projects declare. aisland's own are installed the
|
|
87
|
+
first time a command needs one, after asking you — on macOS through Homebrew: process-compose for the services, Colima
|
|
88
|
+
and Docker, SwiftBar, act, and the Java Jenkins accepts; on Linux only process-compose, into aisland's own `bin/`
|
|
89
|
+
folder, while Docker and Java are yours to install. Without a terminal the command stops and prints the install line
|
|
90
|
+
instead. Three extras add optional parts:
|
|
91
|
+
|
|
92
|
+
| Extra | Adds |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `aisland[mcp]` | `aisland-mcp`, an MCP server that offers a chosen set of aisland's commands to an AI client |
|
|
95
|
+
| `aisland[connect]` | `aisland tunnel connect`, a terminal on a remote machine over its VS Code tunnel |
|
|
96
|
+
| `aisland[prune]` | `aisland wheels prune` and `aisland wheels reset`, which rewrite a project's history with git-filter-repo |
|
|
97
|
+
|
|
98
|
+
Installing aisland also registers a pytest plugin, `aisland_test_stats`. It records every test run of a project
|
|
99
|
+
in an aisland workspace (how long it took, and each test's outcome) in the workspace's `.aisland/data/test-stats/`;
|
|
100
|
+
a project outside a workspace records nothing. `aisland tests report` reads the record. To turn it off
|
|
101
|
+
([tests](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tests.md#the-pytest-plugin) says what it writes):
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
aisland workspace test-stats off [PROJECT…] [--machine-only] # for good
|
|
105
|
+
pytest -p no:aisland_test_stats # for one run
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## A first workspace
|
|
109
|
+
|
|
110
|
+
The `aisland` tool creates the workspace; the workspace's own aisland, installed into its `.venv`, sets it up:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
aisland workspace init ~/work/acme --add git@github.com:acme/models.git
|
|
114
|
+
cd ~/work/acme
|
|
115
|
+
uv venv --seed .venv && .venv/bin/pip install aisland # the workspace's own aisland
|
|
116
|
+
.venv/bin/aisland setup
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`init` creates the repository and its starting files and adds each `--add` project as a submodule:
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
==> Created workspace acme in /Users/you/work/acme
|
|
123
|
+
.git/ git init
|
|
124
|
+
models/ submodule git@github.com:acme/models.git
|
|
125
|
+
.gitignore written
|
|
126
|
+
.env written
|
|
127
|
+
mypy.ini written
|
|
128
|
+
vscode-init-bash.sh written
|
|
129
|
+
workspace.toml the projects, how to start another machine from them
|
|
130
|
+
git aliases pull-all, push-all, … in the local git config
|
|
131
|
+
.agents/ harness: aisland (6 commands, 1 script, rules) (`.claude/commands` links to its commands)
|
|
132
|
+
AGENTS.md written (imports the rules; CLAUDE.md and GEMINI.md link to it)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`aisland setup` then installs the system tools the projects declare, installs every project editable into `.venv`, and writes the
|
|
136
|
+
editor's workspace file and `project.bashrc`, the shell start-up file:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
source project.bashrc # activates .venv and exports .env
|
|
140
|
+
aisland completion install # shell completion for every tool in .venv; project.bashrc loads it from now on
|
|
141
|
+
git pull-all # every project and the workspace, merged
|
|
142
|
+
aisland doctor # the environment checks, each with the command that fixes it
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`init` never writes over a file that exists, and `setup` can be run again at any time: it brings the workspace in
|
|
146
|
+
line with `workspace.toml` and the projects' own declarations.
|
|
147
|
+
|
|
148
|
+
## The same workspace on another machine
|
|
149
|
+
|
|
150
|
+
`workspace.toml` is committed: it lists every project (its folder, its repository, its branch) and starts with the
|
|
151
|
+
commands that create the workspace on a machine that has no aisland yet:
|
|
152
|
+
|
|
153
|
+
```toml
|
|
154
|
+
[workspace]
|
|
155
|
+
format = 1
|
|
156
|
+
name = "acme"
|
|
157
|
+
|
|
158
|
+
[project."models"]
|
|
159
|
+
url = "git@github.com:acme/models.git"
|
|
160
|
+
branch = "main"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
In an empty folder holding only that file:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
uv venv --seed .venv && .venv/bin/pip install aisland
|
|
167
|
+
.venv/bin/aisland workspace init . --from workspace.toml # clones every project on its branch
|
|
168
|
+
.venv/bin/aisland setup
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Configure
|
|
172
|
+
|
|
173
|
+
Where a project comes from, whether this machine has it and which extras the projects install are settings of
|
|
174
|
+
`aisland workspace configure`. A setting is committed in `workspace.toml`, or kept for this machine only with
|
|
175
|
+
`--machine-only`:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
aisland workspace configure source set models pypi # install models from PyPI instead of its checkout
|
|
179
|
+
aisland workspace configure source set models local --machine-only
|
|
180
|
+
aisland workspace configure extras set dev # the extras every project installs
|
|
181
|
+
aisland workspace show # what the projects declare to aisland
|
|
182
|
+
aisland workspace projects # the project folders, dependencies first
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
A project tells aisland what it brings — a selection to choose from, a service to run, the system tools it
|
|
186
|
+
needs — in its own `pyproject.toml`, under `[tool.aisland]`. It never imports aisland.
|
|
187
|
+
|
|
188
|
+
## What aisland assumes
|
|
189
|
+
|
|
190
|
+
aisland comes with the habits of the workspace it grew in. Each one can be left alone, or turned off:
|
|
191
|
+
|
|
192
|
+
- **Two branches per project**: work on `dev/main`, release from `main`. The git aliases and
|
|
193
|
+
`aisland workspace mirror sync` know both by name. Other branches work too, but they get no special handling.
|
|
194
|
+
- **Two test runs**: a fast `pytest` that stays under five minutes, and a slow `pytest -m slow`.
|
|
195
|
+
`aisland tests report` proposes which tests to move between them, measured against that budget.
|
|
196
|
+
- **Python with machine-learning dependencies**: the generated root `uv.toml` installs `opencv-python-headless` in place
|
|
197
|
+
of `opencv-python` everywhere. `aisland doctor` also checks for known problems with OpenCV, `huggingface_hub` and
|
|
198
|
+
torch's extension builds; a check passes with a note where its package is not installed.
|
|
199
|
+
|
|
200
|
+
## Common tasks
|
|
201
|
+
|
|
202
|
+
| To … | Run | Page |
|
|
203
|
+
|---|---|---|
|
|
204
|
+
| create a workspace, or set up an existing repository | `aisland workspace init <folder>` | [workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md) |
|
|
205
|
+
| bring the workspace in line after a change | `aisland setup` | [workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md) |
|
|
206
|
+
| see which of the projects' variables this machine's `.env` lacks | `aisland workspace env-example --missing` | [workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md#the-machines-environment-envcomplete-envexample-and-env) |
|
|
207
|
+
| choose where a project comes from | `aisland workspace configure source set <project> local\|github\|pypi` | [sources](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/sources.md) |
|
|
208
|
+
| choose the extras the projects install | `aisland workspace configure extras set <names…>` | [selections](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/selections.md) |
|
|
209
|
+
| choose whether the root records a project's commits, and see what is set | `aisland workspace track set\|unset [<project>]`, `aisland workspace track status` | [workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md) |
|
|
210
|
+
| pull, push or tag every project | `git pull-all`, `git push-all`, `git tag-all <tag>` | [git](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/git.md) |
|
|
211
|
+
| run the local services | `aisland services start [NAME…]` | [services](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/services.md) |
|
|
212
|
+
| check the environment | `aisland doctor` | [doctor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/doctor.md) |
|
|
213
|
+
| see where a command failed | `aisland --debug <command>` (every error is one `Error:` line, exit 1; this adds its traceback and aisland's debug log) | [doctor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/doctor.md) |
|
|
214
|
+
| check every project, or one, before a push | `aisland check [<project>]` (isort, black, flake8, mypy, pytest, `act`; `--write` lets isort and black rewrite) | [ci](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/ci.md#check-quality-gates) |
|
|
215
|
+
| write a project's CI files | `aisland jenkins scaffold <project>` | [ci](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/ci.md) |
|
|
216
|
+
| see a project's test runs and slowest tests | `aisland tests report <project>` | [tests](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tests.md) |
|
|
217
|
+
| carry a project to a machine without the workspace | `aisland wheels build <project>` | [wheels](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/wheels.md) |
|
|
218
|
+
| drop old committed wheels from a project's history | `aisland wheels prune <project> --apply` | [wheels](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/wheels.md#old-committed-wheels-aisland-wheels-prune-and-aisland-wheels-reset) |
|
|
219
|
+
| reclaim a project's disk, and undo it | `aisland clean <project>`, `aisland backups restore` | [clean](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/clean.md) |
|
|
220
|
+
| refresh shell completion | `aisland completion install` | [completion](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/completion.md) |
|
|
221
|
+
| give the editor window its own theme | `aisland workspace theme set <name>` | [editor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/editor.md) |
|
|
222
|
+
| list the workspace's MCP servers for an AI client | `aisland mcp claude` | [mcp](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/mcp.md) |
|
|
223
|
+
| keep notebooks in git without their outputs | nothing: `aisland setup` registers the git filter `aisland notebooks clean` and adds `*.ipynb filter=ipynb-cleaner` to the root's `.gitattributes` (a project adds the line to its own) | [notebooks](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/notebooks.md) |
|
|
224
|
+
| reach a remote machine from your editor or a terminal, with no sshd | `aisland tunnel start` there, then `aisland tunnel open <workspace>` or `aisland tunnel connect <workspace>` here | [tunnel](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tunnel.md) |
|
|
225
|
+
|
|
226
|
+
Every command has `--help`; [commands](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/commands.md) lists them all, with every option.
|
|
227
|
+
|
|
228
|
+
## Environment variables
|
|
229
|
+
|
|
230
|
+
None is needed; each changes one default. `env.complete` lists them with every variable the projects read.
|
|
231
|
+
|
|
232
|
+
| Variable | What it changes |
|
|
233
|
+
|---|---|
|
|
234
|
+
| `AISLAND_WORKSPACE` | aisland installed from a wheel: the workspace it works on (default: the one the current folder belongs to) |
|
|
235
|
+
| `AISLAND_TUNNEL_HOME` | where `aisland tunnel` keeps its state (default: `~/.aisland/tunnel`) |
|
|
236
|
+
| `WORKSPACE` | the name `aisland tunnel start` gives the tunnel when none is given (default: the machine's hostname) |
|
|
237
|
+
| `DATA_ROOT`, `MODEL_ROOT`, `RUN_DIR` | the folders the `cdd`, `cdm` and `cdr` helpers of `project.bashrc` jump to (`cdd models` goes to `$DATA_ROOT/models`); set them in the workspace's `.env` |
|
|
238
|
+
| `TORCH_EXTENSIONS_DIR` | the folder `aisland doctor` checks for a stale torch build lock (default: torch's own cache) |
|
|
239
|
+
|
|
240
|
+
## Uninstall
|
|
241
|
+
|
|
242
|
+
aisland keeps what it writes in the workspace, apart from the tunnel's state and the programs it installed with
|
|
243
|
+
your consent. To remove it from a workspace:
|
|
244
|
+
|
|
245
|
+
1. Stop what it runs: `aisland services stop`, and `aisland tunnel stop` on a machine that serves a tunnel.
|
|
246
|
+
2. Uninstall the package: `.venv/bin/pip uninstall aisland`, or delete `.venv`.
|
|
247
|
+
3. Delete what it generated in the root: `env.complete`, `env.example`, `project.bashrc`, `.project.bashrc.completion`,
|
|
248
|
+
`pyrightconfig.json`, `uv.toml`, `.mcp.json`, `.gemini/settings.json`, `<name>.code-workspace`, the agent files
|
|
249
|
+
(`.agents/`, the `.claude/commands` link, and `AGENTS.md` with its `CLAUDE.md` and `GEMINI.md` links unless you
|
|
250
|
+
wrote your own), and from a wheel `.aisland/`, which holds the services' data and the tools aisland downloaded (from
|
|
251
|
+
a checkout they are in the checkout's `bin/`, `data/` and `tools/`).
|
|
252
|
+
4. Decide about the starting files `workspace init` wrote, which are yours from then on: `.gitignore` (setup appends
|
|
253
|
+
the agent files' paths to it), `.env`, `mypy.ini` (setup appends the projects to its `mypy_path`),
|
|
254
|
+
`vscode-init-bash.sh` and `workspace.toml`. setup adds `*.ipynb filter=ipynb-cleaner` to the root's
|
|
255
|
+
`.gitattributes`.
|
|
256
|
+
5. In each project: delete `pyrightconfig.json` and the `.claude/commands` link, and drop the lines `/pyrightconfig.json`,
|
|
257
|
+
`/**/*.egg-info/` and `/.claude/commands` from its `.git/info/exclude`.
|
|
258
|
+
6. Remove the git settings from the local `.git/config` of the root and of each project: the workspace aliases
|
|
259
|
+
(`git config --local --get-regexp '^alias\.'` lists them), `filter.ipynb-cleaner.*`, `submodule.recurse`,
|
|
260
|
+
`pull.rebase` and the `aisland.*` keys. aisland adds nothing to the global git config; it removes a global alias
|
|
261
|
+
named like one of the workspace's.
|
|
262
|
+
7. Outside the workspace: `~/.aisland/tunnel` (or `$AISLAND_TUNNEL_HOME`), SwiftBar's plugins folder setting on macOS,
|
|
263
|
+
and the Homebrew formulas aisland installed after asking (`process-compose`, `docker`, `colima`, `act`, `swiftbar`,
|
|
264
|
+
and the `openjdk@<N>` Jenkins runs on), which `brew uninstall` removes.
|
|
265
|
+
|
|
266
|
+
## Documentation
|
|
267
|
+
|
|
268
|
+
- [A workspace and its setup](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md) — `init`, `setup`,
|
|
269
|
+
`workspace.toml`, optional and untracked projects, system tools, a workspace of plain folders
|
|
270
|
+
- [Where each project comes from](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/sources.md) — `local`, `github`,
|
|
271
|
+
`pypi`, and mirrors
|
|
272
|
+
- [Selections](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/selections.md) — the extras a project offers and the
|
|
273
|
+
workspace chooses
|
|
274
|
+
- [Git across the workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/git.md) — `pull-all`, `push-all` and
|
|
275
|
+
the other aliases
|
|
276
|
+
- [Services](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/services.md) — the supervisor, Jenkins, Docker
|
|
277
|
+
and the others, and a service a project declares
|
|
278
|
+
- [Jenkins](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/jenkins.md) — starting it, its GitHub credential and
|
|
279
|
+
the pipelines `aisland jenkins init` seeds
|
|
280
|
+
- [CI](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/ci.md) — the generated `Jenkinsfile`, `Jenkinsfile.local`
|
|
281
|
+
and `ci.yml`, and the quality gates
|
|
282
|
+
- [The environment doctor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/doctor.md)
|
|
283
|
+
- [Test-run statistics](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tests.md)
|
|
284
|
+
- [Wheels for another machine](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/wheels.md)
|
|
285
|
+
- [Reclaiming disk space](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/clean.md) — `clean` and `backups`
|
|
286
|
+
- [Shell completion](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/completion.md)
|
|
287
|
+
- [The editor's files](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/editor.md) — the VS Code workspace file,
|
|
288
|
+
Pyright's files, the window's theme and colours
|
|
289
|
+
- [MCP](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/mcp.md) — the client files and `aisland-mcp`
|
|
290
|
+
- [Agent commands and rules](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/harness.md)
|
|
291
|
+
- [Notebooks](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/notebooks.md)
|
|
292
|
+
- [Remote machines](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tunnel.md)
|
|
293
|
+
- [Stability](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/stability.md) — what a release keeps, and what may
|
|
294
|
+
change in any release
|
|
295
|
+
- [Architecture](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/architecture.md) — for contributors: what aisland
|
|
296
|
+
is built of, and the decision records behind each mechanism
|
|
297
|
+
- [Contributing](https://github.com/Gearlux/aisland/blob/v0.1.0/CONTRIBUTING.md) — a checkout that runs the tests, the
|
|
298
|
+
layers, where a change goes, the release
|
|
299
|
+
|
|
300
|
+
The examples in [`examples/`](https://github.com/Gearlux/aisland/tree/v0.1.0/examples) run as written and check what
|
|
301
|
+
the pages show.
|
|
302
|
+
|
|
303
|
+
## Licence
|
|
304
|
+
|
|
305
|
+
MIT — see [LICENSE](https://github.com/Gearlux/aisland/blob/v0.1.0/LICENSE). Changes are listed in the
|
|
306
|
+
[CHANGELOG](https://github.com/Gearlux/aisland/blob/v0.1.0/CHANGELOG.md).
|
aisland-0.1.0/README.md
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# aisland
|
|
2
|
+
|
|
3
|
+
**One workspace of many Python projects, set up the same way on every machine.** aisland keeps a git repository
|
|
4
|
+
whose projects are submodules, installs every project editable into the workspace's one virtual environment, and
|
|
5
|
+
gives the workspace what its projects share: git aliases that pull and push them all, local services (Jenkins,
|
|
6
|
+
and the ones the projects bring, such as MLflow) under one supervisor, generated CI files, an environment check,
|
|
7
|
+
and the agent rules every AI coding session in the workspace reads.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uv tool install aisland # or: pipx install aisland
|
|
13
|
+
aisland --version # which aisland runs: aisland, version <its version>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Install aisland once, as a tool: that copy only creates workspaces. Each workspace then gets its own aisland in
|
|
17
|
+
its `.venv`, which `aisland setup`, the git aliases and CI use, so every workspace keeps the version it was set up
|
|
18
|
+
with. A project is any git repository with a `pyproject.toml`. `uv tool install` and `pipx install` give the tool an
|
|
19
|
+
environment of its own; a plain `pip install aisland` works only inside a virtual environment, since the system
|
|
20
|
+
Python of Homebrew or Debian refuses it (`externally-managed-environment`).
|
|
21
|
+
|
|
22
|
+
`aisland setup` also installs rule files for AI coding agents: an `AGENTS.md` in the root (`CLAUDE.md` and
|
|
23
|
+
`GEMINI.md` link to it), the rules and commands in `.agents/`, and a `.claude/commands` link in the root and in every
|
|
24
|
+
project. To have none of them, write `[harness] sets = []` into `workspace.toml`
|
|
25
|
+
([harness](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/harness.md)).
|
|
26
|
+
|
|
27
|
+
aisland runs on macOS and Linux with Python 3.12 or newer, git, [uv](https://docs.astral.sh/uv/) and bash (the git
|
|
28
|
+
aliases and the shell start-up file `project.bashrc` are bash), and on macOS [Homebrew](https://brew.sh), through which
|
|
29
|
+
it installs tools. `aisland setup` installs the system tools your projects declare. aisland's own are installed the
|
|
30
|
+
first time a command needs one, after asking you — on macOS through Homebrew: process-compose for the services, Colima
|
|
31
|
+
and Docker, SwiftBar, act, and the Java Jenkins accepts; on Linux only process-compose, into aisland's own `bin/`
|
|
32
|
+
folder, while Docker and Java are yours to install. Without a terminal the command stops and prints the install line
|
|
33
|
+
instead. Three extras add optional parts:
|
|
34
|
+
|
|
35
|
+
| Extra | Adds |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `aisland[mcp]` | `aisland-mcp`, an MCP server that offers a chosen set of aisland's commands to an AI client |
|
|
38
|
+
| `aisland[connect]` | `aisland tunnel connect`, a terminal on a remote machine over its VS Code tunnel |
|
|
39
|
+
| `aisland[prune]` | `aisland wheels prune` and `aisland wheels reset`, which rewrite a project's history with git-filter-repo |
|
|
40
|
+
|
|
41
|
+
Installing aisland also registers a pytest plugin, `aisland_test_stats`. It records every test run of a project
|
|
42
|
+
in an aisland workspace (how long it took, and each test's outcome) in the workspace's `.aisland/data/test-stats/`;
|
|
43
|
+
a project outside a workspace records nothing. `aisland tests report` reads the record. To turn it off
|
|
44
|
+
([tests](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tests.md#the-pytest-plugin) says what it writes):
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
aisland workspace test-stats off [PROJECT…] [--machine-only] # for good
|
|
48
|
+
pytest -p no:aisland_test_stats # for one run
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## A first workspace
|
|
52
|
+
|
|
53
|
+
The `aisland` tool creates the workspace; the workspace's own aisland, installed into its `.venv`, sets it up:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
aisland workspace init ~/work/acme --add git@github.com:acme/models.git
|
|
57
|
+
cd ~/work/acme
|
|
58
|
+
uv venv --seed .venv && .venv/bin/pip install aisland # the workspace's own aisland
|
|
59
|
+
.venv/bin/aisland setup
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`init` creates the repository and its starting files and adds each `--add` project as a submodule:
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
==> Created workspace acme in /Users/you/work/acme
|
|
66
|
+
.git/ git init
|
|
67
|
+
models/ submodule git@github.com:acme/models.git
|
|
68
|
+
.gitignore written
|
|
69
|
+
.env written
|
|
70
|
+
mypy.ini written
|
|
71
|
+
vscode-init-bash.sh written
|
|
72
|
+
workspace.toml the projects, how to start another machine from them
|
|
73
|
+
git aliases pull-all, push-all, … in the local git config
|
|
74
|
+
.agents/ harness: aisland (6 commands, 1 script, rules) (`.claude/commands` links to its commands)
|
|
75
|
+
AGENTS.md written (imports the rules; CLAUDE.md and GEMINI.md link to it)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`aisland setup` then installs the system tools the projects declare, installs every project editable into `.venv`, and writes the
|
|
79
|
+
editor's workspace file and `project.bashrc`, the shell start-up file:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
source project.bashrc # activates .venv and exports .env
|
|
83
|
+
aisland completion install # shell completion for every tool in .venv; project.bashrc loads it from now on
|
|
84
|
+
git pull-all # every project and the workspace, merged
|
|
85
|
+
aisland doctor # the environment checks, each with the command that fixes it
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`init` never writes over a file that exists, and `setup` can be run again at any time: it brings the workspace in
|
|
89
|
+
line with `workspace.toml` and the projects' own declarations.
|
|
90
|
+
|
|
91
|
+
## The same workspace on another machine
|
|
92
|
+
|
|
93
|
+
`workspace.toml` is committed: it lists every project (its folder, its repository, its branch) and starts with the
|
|
94
|
+
commands that create the workspace on a machine that has no aisland yet:
|
|
95
|
+
|
|
96
|
+
```toml
|
|
97
|
+
[workspace]
|
|
98
|
+
format = 1
|
|
99
|
+
name = "acme"
|
|
100
|
+
|
|
101
|
+
[project."models"]
|
|
102
|
+
url = "git@github.com:acme/models.git"
|
|
103
|
+
branch = "main"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
In an empty folder holding only that file:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
uv venv --seed .venv && .venv/bin/pip install aisland
|
|
110
|
+
.venv/bin/aisland workspace init . --from workspace.toml # clones every project on its branch
|
|
111
|
+
.venv/bin/aisland setup
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Configure
|
|
115
|
+
|
|
116
|
+
Where a project comes from, whether this machine has it and which extras the projects install are settings of
|
|
117
|
+
`aisland workspace configure`. A setting is committed in `workspace.toml`, or kept for this machine only with
|
|
118
|
+
`--machine-only`:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
aisland workspace configure source set models pypi # install models from PyPI instead of its checkout
|
|
122
|
+
aisland workspace configure source set models local --machine-only
|
|
123
|
+
aisland workspace configure extras set dev # the extras every project installs
|
|
124
|
+
aisland workspace show # what the projects declare to aisland
|
|
125
|
+
aisland workspace projects # the project folders, dependencies first
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
A project tells aisland what it brings — a selection to choose from, a service to run, the system tools it
|
|
129
|
+
needs — in its own `pyproject.toml`, under `[tool.aisland]`. It never imports aisland.
|
|
130
|
+
|
|
131
|
+
## What aisland assumes
|
|
132
|
+
|
|
133
|
+
aisland comes with the habits of the workspace it grew in. Each one can be left alone, or turned off:
|
|
134
|
+
|
|
135
|
+
- **Two branches per project**: work on `dev/main`, release from `main`. The git aliases and
|
|
136
|
+
`aisland workspace mirror sync` know both by name. Other branches work too, but they get no special handling.
|
|
137
|
+
- **Two test runs**: a fast `pytest` that stays under five minutes, and a slow `pytest -m slow`.
|
|
138
|
+
`aisland tests report` proposes which tests to move between them, measured against that budget.
|
|
139
|
+
- **Python with machine-learning dependencies**: the generated root `uv.toml` installs `opencv-python-headless` in place
|
|
140
|
+
of `opencv-python` everywhere. `aisland doctor` also checks for known problems with OpenCV, `huggingface_hub` and
|
|
141
|
+
torch's extension builds; a check passes with a note where its package is not installed.
|
|
142
|
+
|
|
143
|
+
## Common tasks
|
|
144
|
+
|
|
145
|
+
| To … | Run | Page |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| create a workspace, or set up an existing repository | `aisland workspace init <folder>` | [workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md) |
|
|
148
|
+
| bring the workspace in line after a change | `aisland setup` | [workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md) |
|
|
149
|
+
| see which of the projects' variables this machine's `.env` lacks | `aisland workspace env-example --missing` | [workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md#the-machines-environment-envcomplete-envexample-and-env) |
|
|
150
|
+
| choose where a project comes from | `aisland workspace configure source set <project> local\|github\|pypi` | [sources](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/sources.md) |
|
|
151
|
+
| choose the extras the projects install | `aisland workspace configure extras set <names…>` | [selections](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/selections.md) |
|
|
152
|
+
| choose whether the root records a project's commits, and see what is set | `aisland workspace track set\|unset [<project>]`, `aisland workspace track status` | [workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md) |
|
|
153
|
+
| pull, push or tag every project | `git pull-all`, `git push-all`, `git tag-all <tag>` | [git](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/git.md) |
|
|
154
|
+
| run the local services | `aisland services start [NAME…]` | [services](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/services.md) |
|
|
155
|
+
| check the environment | `aisland doctor` | [doctor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/doctor.md) |
|
|
156
|
+
| see where a command failed | `aisland --debug <command>` (every error is one `Error:` line, exit 1; this adds its traceback and aisland's debug log) | [doctor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/doctor.md) |
|
|
157
|
+
| check every project, or one, before a push | `aisland check [<project>]` (isort, black, flake8, mypy, pytest, `act`; `--write` lets isort and black rewrite) | [ci](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/ci.md#check-quality-gates) |
|
|
158
|
+
| write a project's CI files | `aisland jenkins scaffold <project>` | [ci](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/ci.md) |
|
|
159
|
+
| see a project's test runs and slowest tests | `aisland tests report <project>` | [tests](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tests.md) |
|
|
160
|
+
| carry a project to a machine without the workspace | `aisland wheels build <project>` | [wheels](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/wheels.md) |
|
|
161
|
+
| drop old committed wheels from a project's history | `aisland wheels prune <project> --apply` | [wheels](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/wheels.md#old-committed-wheels-aisland-wheels-prune-and-aisland-wheels-reset) |
|
|
162
|
+
| reclaim a project's disk, and undo it | `aisland clean <project>`, `aisland backups restore` | [clean](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/clean.md) |
|
|
163
|
+
| refresh shell completion | `aisland completion install` | [completion](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/completion.md) |
|
|
164
|
+
| give the editor window its own theme | `aisland workspace theme set <name>` | [editor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/editor.md) |
|
|
165
|
+
| list the workspace's MCP servers for an AI client | `aisland mcp claude` | [mcp](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/mcp.md) |
|
|
166
|
+
| keep notebooks in git without their outputs | nothing: `aisland setup` registers the git filter `aisland notebooks clean` and adds `*.ipynb filter=ipynb-cleaner` to the root's `.gitattributes` (a project adds the line to its own) | [notebooks](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/notebooks.md) |
|
|
167
|
+
| reach a remote machine from your editor or a terminal, with no sshd | `aisland tunnel start` there, then `aisland tunnel open <workspace>` or `aisland tunnel connect <workspace>` here | [tunnel](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tunnel.md) |
|
|
168
|
+
|
|
169
|
+
Every command has `--help`; [commands](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/commands.md) lists them all, with every option.
|
|
170
|
+
|
|
171
|
+
## Environment variables
|
|
172
|
+
|
|
173
|
+
None is needed; each changes one default. `env.complete` lists them with every variable the projects read.
|
|
174
|
+
|
|
175
|
+
| Variable | What it changes |
|
|
176
|
+
|---|---|
|
|
177
|
+
| `AISLAND_WORKSPACE` | aisland installed from a wheel: the workspace it works on (default: the one the current folder belongs to) |
|
|
178
|
+
| `AISLAND_TUNNEL_HOME` | where `aisland tunnel` keeps its state (default: `~/.aisland/tunnel`) |
|
|
179
|
+
| `WORKSPACE` | the name `aisland tunnel start` gives the tunnel when none is given (default: the machine's hostname) |
|
|
180
|
+
| `DATA_ROOT`, `MODEL_ROOT`, `RUN_DIR` | the folders the `cdd`, `cdm` and `cdr` helpers of `project.bashrc` jump to (`cdd models` goes to `$DATA_ROOT/models`); set them in the workspace's `.env` |
|
|
181
|
+
| `TORCH_EXTENSIONS_DIR` | the folder `aisland doctor` checks for a stale torch build lock (default: torch's own cache) |
|
|
182
|
+
|
|
183
|
+
## Uninstall
|
|
184
|
+
|
|
185
|
+
aisland keeps what it writes in the workspace, apart from the tunnel's state and the programs it installed with
|
|
186
|
+
your consent. To remove it from a workspace:
|
|
187
|
+
|
|
188
|
+
1. Stop what it runs: `aisland services stop`, and `aisland tunnel stop` on a machine that serves a tunnel.
|
|
189
|
+
2. Uninstall the package: `.venv/bin/pip uninstall aisland`, or delete `.venv`.
|
|
190
|
+
3. Delete what it generated in the root: `env.complete`, `env.example`, `project.bashrc`, `.project.bashrc.completion`,
|
|
191
|
+
`pyrightconfig.json`, `uv.toml`, `.mcp.json`, `.gemini/settings.json`, `<name>.code-workspace`, the agent files
|
|
192
|
+
(`.agents/`, the `.claude/commands` link, and `AGENTS.md` with its `CLAUDE.md` and `GEMINI.md` links unless you
|
|
193
|
+
wrote your own), and from a wheel `.aisland/`, which holds the services' data and the tools aisland downloaded (from
|
|
194
|
+
a checkout they are in the checkout's `bin/`, `data/` and `tools/`).
|
|
195
|
+
4. Decide about the starting files `workspace init` wrote, which are yours from then on: `.gitignore` (setup appends
|
|
196
|
+
the agent files' paths to it), `.env`, `mypy.ini` (setup appends the projects to its `mypy_path`),
|
|
197
|
+
`vscode-init-bash.sh` and `workspace.toml`. setup adds `*.ipynb filter=ipynb-cleaner` to the root's
|
|
198
|
+
`.gitattributes`.
|
|
199
|
+
5. In each project: delete `pyrightconfig.json` and the `.claude/commands` link, and drop the lines `/pyrightconfig.json`,
|
|
200
|
+
`/**/*.egg-info/` and `/.claude/commands` from its `.git/info/exclude`.
|
|
201
|
+
6. Remove the git settings from the local `.git/config` of the root and of each project: the workspace aliases
|
|
202
|
+
(`git config --local --get-regexp '^alias\.'` lists them), `filter.ipynb-cleaner.*`, `submodule.recurse`,
|
|
203
|
+
`pull.rebase` and the `aisland.*` keys. aisland adds nothing to the global git config; it removes a global alias
|
|
204
|
+
named like one of the workspace's.
|
|
205
|
+
7. Outside the workspace: `~/.aisland/tunnel` (or `$AISLAND_TUNNEL_HOME`), SwiftBar's plugins folder setting on macOS,
|
|
206
|
+
and the Homebrew formulas aisland installed after asking (`process-compose`, `docker`, `colima`, `act`, `swiftbar`,
|
|
207
|
+
and the `openjdk@<N>` Jenkins runs on), which `brew uninstall` removes.
|
|
208
|
+
|
|
209
|
+
## Documentation
|
|
210
|
+
|
|
211
|
+
- [A workspace and its setup](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/workspace.md) — `init`, `setup`,
|
|
212
|
+
`workspace.toml`, optional and untracked projects, system tools, a workspace of plain folders
|
|
213
|
+
- [Where each project comes from](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/sources.md) — `local`, `github`,
|
|
214
|
+
`pypi`, and mirrors
|
|
215
|
+
- [Selections](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/selections.md) — the extras a project offers and the
|
|
216
|
+
workspace chooses
|
|
217
|
+
- [Git across the workspace](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/git.md) — `pull-all`, `push-all` and
|
|
218
|
+
the other aliases
|
|
219
|
+
- [Services](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/services.md) — the supervisor, Jenkins, Docker
|
|
220
|
+
and the others, and a service a project declares
|
|
221
|
+
- [Jenkins](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/jenkins.md) — starting it, its GitHub credential and
|
|
222
|
+
the pipelines `aisland jenkins init` seeds
|
|
223
|
+
- [CI](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/ci.md) — the generated `Jenkinsfile`, `Jenkinsfile.local`
|
|
224
|
+
and `ci.yml`, and the quality gates
|
|
225
|
+
- [The environment doctor](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/doctor.md)
|
|
226
|
+
- [Test-run statistics](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tests.md)
|
|
227
|
+
- [Wheels for another machine](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/wheels.md)
|
|
228
|
+
- [Reclaiming disk space](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/clean.md) — `clean` and `backups`
|
|
229
|
+
- [Shell completion](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/completion.md)
|
|
230
|
+
- [The editor's files](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/editor.md) — the VS Code workspace file,
|
|
231
|
+
Pyright's files, the window's theme and colours
|
|
232
|
+
- [MCP](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/mcp.md) — the client files and `aisland-mcp`
|
|
233
|
+
- [Agent commands and rules](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/harness.md)
|
|
234
|
+
- [Notebooks](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/notebooks.md)
|
|
235
|
+
- [Remote machines](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/tunnel.md)
|
|
236
|
+
- [Stability](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/stability.md) — what a release keeps, and what may
|
|
237
|
+
change in any release
|
|
238
|
+
- [Architecture](https://github.com/Gearlux/aisland/blob/v0.1.0/docs/architecture.md) — for contributors: what aisland
|
|
239
|
+
is built of, and the decision records behind each mechanism
|
|
240
|
+
- [Contributing](https://github.com/Gearlux/aisland/blob/v0.1.0/CONTRIBUTING.md) — a checkout that runs the tests, the
|
|
241
|
+
layers, where a change goes, the release
|
|
242
|
+
|
|
243
|
+
The examples in [`examples/`](https://github.com/Gearlux/aisland/tree/v0.1.0/examples) run as written and check what
|
|
244
|
+
the pages show.
|
|
245
|
+
|
|
246
|
+
## Licence
|
|
247
|
+
|
|
248
|
+
MIT — see [LICENSE](https://github.com/Gearlux/aisland/blob/v0.1.0/LICENSE). Changes are listed in the
|
|
249
|
+
[CHANGELOG](https://github.com/Gearlux/aisland/blob/v0.1.0/CHANGELOG.md).
|