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.
Files changed (166) hide show
  1. aisland-0.1.0/CHANGELOG.md +44 -0
  2. aisland-0.1.0/LICENSE +21 -0
  3. aisland-0.1.0/MANIFEST.in +10 -0
  4. aisland-0.1.0/PKG-INFO +306 -0
  5. aisland-0.1.0/README.md +249 -0
  6. aisland-0.1.0/aisland/__init__.py +12 -0
  7. aisland-0.1.0/aisland/atomic.py +80 -0
  8. aisland-0.1.0/aisland/backups.py +687 -0
  9. aisland-0.1.0/aisland/ci/__init__.py +5 -0
  10. aisland-0.1.0/aisland/ci/ci_scaffold.py +585 -0
  11. aisland-0.1.0/aisland/ci/ci_templates.py +375 -0
  12. aisland-0.1.0/aisland/ci/jenkins_job_config.py +257 -0
  13. aisland-0.1.0/aisland/ci/quality.py +124 -0
  14. aisland-0.1.0/aisland/ci/stats_report.py +529 -0
  15. aisland-0.1.0/aisland/clean.py +283 -0
  16. aisland-0.1.0/aisland/cli/__init__.py +33 -0
  17. aisland-0.1.0/aisland/cli/__main__.py +5 -0
  18. aisland-0.1.0/aisland/cli/_base.py +294 -0
  19. aisland-0.1.0/aisland/cli/configure.py +184 -0
  20. aisland-0.1.0/aisland/cli/editor.py +141 -0
  21. aisland-0.1.0/aisland/cli/services.py +355 -0
  22. aisland-0.1.0/aisland/cli/toplevel.py +349 -0
  23. aisland-0.1.0/aisland/cli/tunnel.py +348 -0
  24. aisland-0.1.0/aisland/cli/wheels.py +297 -0
  25. aisland-0.1.0/aisland/cli/workspace.py +476 -0
  26. aisland-0.1.0/aisland/code-workspace.json +96 -0
  27. aisland-0.1.0/aisland/console.py +103 -0
  28. aisland-0.1.0/aisland/css_colors.py +160 -0
  29. aisland-0.1.0/aisland/doctor.py +791 -0
  30. aisland-0.1.0/aisland/downloads.py +35 -0
  31. aisland-0.1.0/aisland/editor.py +354 -0
  32. aisland-0.1.0/aisland/envfile.py +144 -0
  33. aisland-0.1.0/aisland/errors.py +41 -0
  34. aisland-0.1.0/aisland/failures.py +42 -0
  35. aisland-0.1.0/aisland/git/git_folder_all.sh +160 -0
  36. aisland-0.1.0/aisland/git/git_pull_all.sh +549 -0
  37. aisland-0.1.0/aisland/git/git_push_all.sh +77 -0
  38. aisland-0.1.0/aisland/git/setup_git.sh +225 -0
  39. aisland-0.1.0/aisland/git_exclude.py +42 -0
  40. aisland-0.1.0/aisland/gitcmd.py +98 -0
  41. aisland-0.1.0/aisland/harness/AGENTS.md +374 -0
  42. aisland-0.1.0/aisland/harness/commands/commit-all.md +41 -0
  43. aisland-0.1.0/aisland/harness/commands/commit-session.md +35 -0
  44. aisland-0.1.0/aisland/harness/commands/list-actions.md +28 -0
  45. aisland-0.1.0/aisland/harness/commands/pull-all.md +39 -0
  46. aisland-0.1.0/aisland/harness/commands/push-all.md +26 -0
  47. aisland-0.1.0/aisland/harness/commands/ship.md +155 -0
  48. aisland-0.1.0/aisland/harness/harness.toml +10 -0
  49. aisland-0.1.0/aisland/harness/scripts/stage_hunks.py +127 -0
  50. aisland-0.1.0/aisland/locations.py +318 -0
  51. aisland-0.1.0/aisland/machine_config.py +60 -0
  52. aisland-0.1.0/aisland/notebook_utils.py +170 -0
  53. aisland-0.1.0/aisland/paths.py +35 -0
  54. aisland-0.1.0/aisland/plugins.py +112 -0
  55. aisland-0.1.0/aisland/probe.py +49 -0
  56. aisland-0.1.0/aisland/py.typed +0 -0
  57. aisland-0.1.0/aisland/pypi.py +121 -0
  58. aisland-0.1.0/aisland/pyproject.py +70 -0
  59. aisland-0.1.0/aisland/pytest_stats.py +343 -0
  60. aisland-0.1.0/aisland/server.py +458 -0
  61. aisland-0.1.0/aisland/services/__init__.py +0 -0
  62. aisland-0.1.0/aisland/services/base.py +310 -0
  63. aisland-0.1.0/aisland/services/declared.py +45 -0
  64. aisland-0.1.0/aisland/services/docker.py +402 -0
  65. aisland-0.1.0/aisland/services/jenkins.py +431 -0
  66. aisland-0.1.0/aisland/services/jenkins_java.py +293 -0
  67. aisland-0.1.0/aisland/services/jenkins_jobs.py +268 -0
  68. aisland-0.1.0/aisland/services/jenkins_settings.py +222 -0
  69. aisland-0.1.0/aisland/services/nightly.py +393 -0
  70. aisland-0.1.0/aisland/services/plugin.py +161 -0
  71. aisland-0.1.0/aisland/services/registry.py +286 -0
  72. aisland-0.1.0/aisland/services/supervisor.py +627 -0
  73. aisland-0.1.0/aisland/services/swiftbar.py +277 -0
  74. aisland-0.1.0/aisland/setup/__init__.py +5 -0
  75. aisland-0.1.0/aisland/setup/bashrc.py +63 -0
  76. aisland-0.1.0/aisland/setup/completion.py +316 -0
  77. aisland-0.1.0/aisland/setup/configure.py +202 -0
  78. aisland-0.1.0/aisland/setup/editor_files.py +293 -0
  79. aisland-0.1.0/aisland/setup/env_example.py +305 -0
  80. aisland-0.1.0/aisland/setup/git_settings.py +42 -0
  81. aisland-0.1.0/aisland/setup/harness.py +669 -0
  82. aisland-0.1.0/aisland/setup/init.py +424 -0
  83. aisland-0.1.0/aisland/setup/installers.py +296 -0
  84. aisland-0.1.0/aisland/setup/manager.py +172 -0
  85. aisland-0.1.0/aisland/setup/mcp_config.py +195 -0
  86. aisland-0.1.0/aisland/setup/playwright_browser.py +56 -0
  87. aisland-0.1.0/aisland/setup/provision.py +202 -0
  88. aisland-0.1.0/aisland/setup/source_commands.py +268 -0
  89. aisland-0.1.0/aisland/setup/uv_config.py +165 -0
  90. aisland-0.1.0/aisland/templates/ci/Jenkinsfile.jinja +285 -0
  91. aisland-0.1.0/aisland/templates/ci/Jenkinsfile.local.jinja +292 -0
  92. aisland-0.1.0/aisland/templates/ci/_gh_node_job.yml.jinja +28 -0
  93. aisland-0.1.0/aisland/templates/ci/_gh_preinstall.yml.jinja +4 -0
  94. aisland-0.1.0/aisland/templates/ci/_gh_slow_job.yml.jinja +30 -0
  95. aisland-0.1.0/aisland/templates/ci/_gh_token.yml.jinja +9 -0
  96. aisland-0.1.0/aisland/templates/ci/_jenkins_preinstall.groovy.jinja +5 -0
  97. aisland-0.1.0/aisland/templates/ci/_limited.groovy.jinja +19 -0
  98. aisland-0.1.0/aisland/templates/ci/_local_node_stage.groovy.jinja +16 -0
  99. aisland-0.1.0/aisland/templates/ci/_local_slow_param.groovy.jinja +6 -0
  100. aisland-0.1.0/aisland/templates/ci/_local_slow_stage.groovy.jinja +27 -0
  101. aisland-0.1.0/aisland/templates/ci/_node_stage.groovy.jinja +13 -0
  102. aisland-0.1.0/aisland/templates/ci/_slow_stage.groovy.jinja +22 -0
  103. aisland-0.1.0/aisland/templates/ci/_venv_check.groovy.jinja +12 -0
  104. aisland-0.1.0/aisland/templates/ci/ci.yml.jinja +144 -0
  105. aisland-0.1.0/aisland/templates/ci/template.toml +20 -0
  106. aisland-0.1.0/aisland/templates/jenkins/local_job.xml.jinja +28 -0
  107. aisland-0.1.0/aisland/templates/jenkins/multibranch.xml.jinja +49 -0
  108. aisland-0.1.0/aisland/templates/jenkins/nightly_check.xml.jinja +24 -0
  109. aisland-0.1.0/aisland/templates/jenkins/orchestrator.xml.jinja +34 -0
  110. aisland-0.1.0/aisland/templates/swiftbar/gh_status.sh +74 -0
  111. aisland-0.1.0/aisland/templates/swiftbar/jenkins_status.sh +126 -0
  112. aisland-0.1.0/aisland/templates/test_env_example.py.template +125 -0
  113. aisland-0.1.0/aisland/templates/vscode-init-bash.sh +29 -0
  114. aisland-0.1.0/aisland/toml_places.py +67 -0
  115. aisland-0.1.0/aisland/tunnel/__init__.py +8 -0
  116. aisland-0.1.0/aisland/tunnel/binary.py +168 -0
  117. aisland-0.1.0/aisland/tunnel/connect.py +540 -0
  118. aisland-0.1.0/aisland/tunnel/host.py +441 -0
  119. aisland-0.1.0/aisland/tunnel/shell.py +171 -0
  120. aisland-0.1.0/aisland/tunnel/state.py +42 -0
  121. aisland-0.1.0/aisland/tunnel/store.py +287 -0
  122. aisland-0.1.0/aisland/userspace_tools.py +70 -0
  123. aisland-0.1.0/aisland/venv.py +74 -0
  124. aisland-0.1.0/aisland/wheels/__init__.py +9 -0
  125. aisland-0.1.0/aisland/wheels/build.py +856 -0
  126. aisland-0.1.0/aisland/wheels/bundle.py +445 -0
  127. aisland-0.1.0/aisland/wheels/check.py +359 -0
  128. aisland-0.1.0/aisland/wheels/export.py +53 -0
  129. aisland-0.1.0/aisland/wheels/extra.py +341 -0
  130. aisland-0.1.0/aisland/wheels/files.py +353 -0
  131. aisland-0.1.0/aisland/wheels/filter_repo.py +43 -0
  132. aisland-0.1.0/aisland/wheels/install.py +217 -0
  133. aisland-0.1.0/aisland/wheels/projects.py +151 -0
  134. aisland-0.1.0/aisland/wheels/prune.py +845 -0
  135. aisland-0.1.0/aisland/wheels/published.py +78 -0
  136. aisland-0.1.0/aisland/wheels/report.py +457 -0
  137. aisland-0.1.0/aisland/wheels/scrub.py +108 -0
  138. aisland-0.1.0/aisland/wheels/unzip.py +147 -0
  139. aisland-0.1.0/aisland/workspace/__init__.py +8 -0
  140. aisland-0.1.0/aisland/workspace/activation.py +253 -0
  141. aisland-0.1.0/aisland/workspace/check.py +109 -0
  142. aisland-0.1.0/aisland/workspace/clones.py +101 -0
  143. aisland-0.1.0/aisland/workspace/discovery.py +549 -0
  144. aisland-0.1.0/aisland/workspace/file.py +600 -0
  145. aisland-0.1.0/aisland/workspace/github.py +65 -0
  146. aisland-0.1.0/aisland/workspace/gitmodules.py +72 -0
  147. aisland-0.1.0/aisland/workspace/local.py +87 -0
  148. aisland-0.1.0/aisland/workspace/mirrors.py +713 -0
  149. aisland-0.1.0/aisland/workspace/model.py +135 -0
  150. aisland-0.1.0/aisland/workspace/projects.py +233 -0
  151. aisland-0.1.0/aisland/workspace/prune_record.py +57 -0
  152. aisland-0.1.0/aisland/workspace/recording.py +121 -0
  153. aisland-0.1.0/aisland/workspace/selection.py +476 -0
  154. aisland-0.1.0/aisland/workspace/source_apply.py +176 -0
  155. aisland-0.1.0/aisland/workspace/sources.py +378 -0
  156. aisland-0.1.0/aisland/workspace/tracking.py +394 -0
  157. aisland-0.1.0/aisland.egg-info/PKG-INFO +306 -0
  158. aisland-0.1.0/aisland.egg-info/SOURCES.txt +164 -0
  159. aisland-0.1.0/aisland.egg-info/dependency_links.txt +1 -0
  160. aisland-0.1.0/aisland.egg-info/entry_points.txt +6 -0
  161. aisland-0.1.0/aisland.egg-info/requires.txt +35 -0
  162. aisland-0.1.0/aisland.egg-info/top_level.txt +1 -0
  163. aisland-0.1.0/project.bashrc +120 -0
  164. aisland-0.1.0/pyproject.toml +227 -0
  165. aisland-0.1.0/setup.cfg +4 -0
  166. 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).
@@ -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).