From 88f3b6c03eac43c903d1a54c199aaec335f0108c Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 23 Jul 2026 12:50:14 +0100 Subject: [PATCH] refactor: rename autobuild package and CLI to autohands The Hands repo was renamed PyAutoBuild -> PyAutoHands but its payload package and CLI kept the old name. Renames autobuild/ -> autohands/ and bin/autobuild -> bin/autohands (via git mv, so history follows) and updates every live reference across the organism. Preserved deliberately: PyAutoBuild#NNN issue citations, the rhayes777/PyAutoBuild url_fixups patterns, the pyautobuild -> pyautohands policy alias, pyautobuild_boundary_audit.md, and PyAutoMind historical records. 'autobuild' is also kept as a back-compat router keyword in policy.yaml / _intake.py / _bug.py, since those are typed keywords rather than paths. Refs PyAutoLabs/PyAutoHands#177 Co-Authored-By: Claude Opus 4.8 --- AGENTS.md | 2 +- ORGANISM.md | 2 +- agents/_common.sh | 8 ++++---- agents/conductors/bug/_bug.py | 3 ++- agents/conductors/build/AGENTS.md | 2 +- agents/conductors/build/BUILD_CAPABILITIES.md | 14 +++++++------- agents/conductors/build/build.sh | 8 ++++---- agents/conductors/clone/DESIGN.md | 2 +- agents/conductors/clone/_clone.py | 2 +- agents/conductors/intake/_intake.py | 3 ++- agents/conductors/release/AGENTS.md | 2 +- agents/conductors/release/release.sh | 2 +- agents/faculties/vitals/HEART_CAPABILITIES.md | 2 +- bin/pyauto-brain | 2 +- config/policy.yaml | 4 ++-- docs/adoption/config_surfaces.md | 2 +- docs/organs/build.md | 4 ++-- skills/ship_library/reference.md | 2 +- tests/test_policy_seams.py | 2 +- 19 files changed, 35 insertions(+), 33 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 1748cd0..b3802b4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -157,7 +157,7 @@ the `/` slash commands. Like the other PyAuto repos, PyAutoBrain runs from its checkout (no pip install); -it resolves the sibling `pyauto-heart` and `autobuild` binaries from PATH or the +it resolves the sibling `pyauto-heart` and `autohands` binaries from PATH or the `~/Code/PyAutoLabs/` checkouts. ## The command surface (Brain implicit) diff --git a/ORGANISM.md b/ORGANISM.md index 9424f47..98b3e98 100644 --- a/ORGANISM.md +++ b/ORGANISM.md @@ -23,7 +23,7 @@ organs plan, build, test and release it, and you make every judgment call. *Hands* and *Build* name the **same organ** (PyAutoHands) throughout this document: the organ is the **Hands**, and *Build* is the call-chain step it performs. (The Hands repo was renamed PyAutoBuild → PyAutoHands; the *Build* -call-chain shorthand and the `autobuild` package/CLI keep their names. +call-chain shorthand and the `autohands` package/CLI keep their names. `PyAutoConf` likewise remains the Nerves repo's name, aligned with its `autoconf` package.) diff --git a/agents/_common.sh b/agents/_common.sh index f99d145..42aad53 100755 --- a/agents/_common.sh +++ b/agents/_common.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash # agents/_common.sh — shared helpers for PyAutoBrain's specialist agents. # -# Resolves the sibling PyAuto organ CLIs (pyauto-heart, autobuild) the same way -# the autobuild shim resolves them: prefer PATH, fall back to the sibling +# Resolves the sibling PyAuto organ CLIs (pyauto-heart, autohands) the same way +# the autohands shim resolves them: prefer PATH, fall back to the sibling # checkout under ~/Code/PyAutoLabs/. Nothing here is pip-installed. PYAUTO_ROOT="${PYAUTO_ROOT:-$HOME/Code/PyAutoLabs}" @@ -31,8 +31,8 @@ resolve_heart() { _resolve_bin pyauto-heart "$PYAUTO_ROOT/PyAutoHeart/bin/pyauto-heart" } -resolve_autobuild() { - _resolve_bin autobuild "$PYAUTO_ROOT/PyAutoHands/bin/autobuild" +resolve_autohands() { + _resolve_bin autohands "$PYAUTO_ROOT/PyAutoHands/bin/autohands" } # _resolve_dir — echo the path to a sibling PyAuto diff --git a/agents/conductors/bug/_bug.py b/agents/conductors/bug/_bug.py index fab2c7b..cfd18f0 100755 --- a/agents/conductors/bug/_bug.py +++ b/agents/conductors/bug/_bug.py @@ -35,7 +35,8 @@ # (the organs themselves), not library-source or workspace work. INFRA_TARGETS = { "pyautobrain": "PyAutoBrain", "pyautoheart": "PyAutoHeart", - "pyautobuild": "PyAutoHands", "autobuild": "PyAutoHands", + "pyautobuild": "PyAutoHands", "autohands": "PyAutoHands", + "autobuild": "PyAutoHands", # back-compat: the package was renamed autobuild -> autohands "pyautomind": "PyAutoMind", "pyautomemory": "PyAutoMemory", } diff --git a/agents/conductors/build/AGENTS.md b/agents/conductors/build/AGENTS.md index 895ae50..0f0b8ab 100644 --- a/agents/conductors/build/AGENTS.md +++ b/agents/conductors/build/AGENTS.md @@ -86,7 +86,7 @@ mode/action. "requested_action": "", "health_status": "green|yellow|red|unknown", "decision": "proceed|proceed-with-caution|abort", - "execution_plan": ["autobuild "], + "execution_plan": ["autohands "], "execution_summary": "", "warnings": ["..."], "blockers": ["..."], diff --git a/agents/conductors/build/BUILD_CAPABILITIES.md b/agents/conductors/build/BUILD_CAPABILITIES.md index 62389c5..238d921 100644 --- a/agents/conductors/build/BUILD_CAPABILITIES.md +++ b/agents/conductors/build/BUILD_CAPABILITIES.md @@ -2,12 +2,12 @@ This audit records the execution surface the PyAutoBrain Build Agent reasons over and **calls**. The agent must treat every item here as a PyAutoHands capability, -not as logic to reimplement inside Brain. Source of truth: the `autobuild` -dispatcher (`PyAutoHands/bin/autobuild`) and `PyAutoHands/CLAUDE.md`. +not as logic to reimplement inside Brain. Source of truth: the `autohands` +dispatcher (`PyAutoHands/bin/autohands`) and `PyAutoHands/CLAUDE.md`. ## Execution capabilities (the Build Agent calls these) -From `autobuild help`. **Mode** is the Build Agent allowlist that *may* route +From `autohands help`. **Mode** is the Build Agent allowlist that *may* route the capability (`build.sh`); **Consumer today** is who actually drives it now. The two diverge for the workspace-run surface — see the note below. @@ -24,11 +24,11 @@ The two diverge for the workspace-run surface — see the note below. | `script_matrix` | Output a JSON `{name, directory}` matrix for GitHub Actions. | build | **Heart** `workspace-validation.yml` (CI) | | `aggregate_results` | Aggregate per-job JSON into a release-readiness report. | build, release | **Heart** `workspace-validation.yml` (CI) | | `slow_skip_check` | Surface SLOW / NEEDS_FIX entries in workspace `no_run.yaml`. | build | `run_all.py` + Heart `test_run` check | -| `repro_command` | Emit the shell command autobuild uses to run one script. | build | triage (manual handoff) | +| `repro_command` | Emit the shell command autohands uses to run one script. | build | triage (manual handoff) | | `bump_colab_urls` | Rewrite Colab URLs in cwd from an old to a new date-tag. | build, deploy | `release.yml` (CI) + deploy | **Reading the Consumer column — the run\* seam is latent, not active.** The -capabilities still *exist* and match the `autobuild` dispatcher and the +capabilities still *exist* and match the `autohands` dispatcher and the `build.sh` allowlists exactly; the *Mode* column remains accurate as the allowlist of record. What changed is the driver. The workspace full-run → report → issue flow moved **out of `release.yml` into PyAutoHeart's @@ -36,14 +36,14 @@ report → issue flow moved **out of `release.yml` into PyAutoHeart's `release.yml` comment recording the removed `run_scripts` / `run_notebooks` / `analyze_results` jobs). Heart checks these primitives out from Build and reuses them directly — calling `run.py` / `run_python.py` / `script_matrix.py` / -`aggregate_results.py`, **not** `autobuild run_*` and **not** `pyauto-brain build +`aggregate_results.py`, **not** `autohands run_*` and **not** `pyauto-brain build run_*`. Nothing invokes `run` / `run_python` / `run_all` through the Build Agent today, so their build-mode allowlist entries are a **latent seam** — kept so the Build Agent could re-own execution without churn, but **Heart is the live consumer**. This is the execution/health boundary the audit below argues for, now made visible in the table itself. -Underlying implementation assets the agent never re-owns: `autobuild/run_python.py`, +Underlying implementation assets the agent never re-owns: `autohands/run_python.py`, `run.py`, `generate.py`, `script_matrix.py`, `aggregate_results.py`, `tag_and_merge.sh`, `build_util.py`, the `release.yml` GitHub workflow, and the per-workspace `config/build/{no_run,env_vars,visualise_notebooks}.yaml`. diff --git a/agents/conductors/build/build.sh b/agents/conductors/build/build.sh index 1af0069..9106c08 100755 --- a/agents/conductors/build/build.sh +++ b/agents/conductors/build/build.sh @@ -27,7 +27,7 @@ # # Usage: # build.sh [--mode build|deploy|release] [--force] [--accept-red=]... -# [--dry-run] [--json] [] [-- ] +# [--dry-run] [--json] [] [-- ] # # --force proceed on a YELLOW verdict (deploy/release). # --accept-red= authorize proceeding despite the RED reason . Repeatable. @@ -193,7 +193,7 @@ case "$eff" in esac # ----- execution plan ----- -plan_cmd="autobuild $action" +plan_cmd="autohands $action" [[ ${#forward[@]} -gt 0 ]] && plan_cmd+=" ${forward[*]}" plan=("$plan_cmd") @@ -250,6 +250,6 @@ if [[ "$dry_run" -eq 1 ]]; then exit 0 fi -autobuild="$(resolve_autobuild)" || exit $? +autohands="$(resolve_autohands)" || exit $? [[ "$json_only" -eq 1 ]] || echo "== exec: $plan_cmd ==" -exec "$autobuild" "$action" "${forward[@]}" +exec "$autohands" "$action" "${forward[@]}" diff --git a/agents/conductors/clone/DESIGN.md b/agents/conductors/clone/DESIGN.md index b800675..d9f7303 100644 --- a/agents/conductors/clone/DESIGN.md +++ b/agents/conductors/clone/DESIGN.md @@ -121,7 +121,7 @@ bad usage). partition, generation plan, CloneDecision. No writer at all. Proves the reasoning on `PyAutoFit → autofit_assistant` as the dry-run case study. 2. **v1 — seed births. SHIPPED.** `--apply` for **lightweight-seed** via a - PyAutoHands primitive (`autobuild/clone_seed.py`: repo creation + generic-set + PyAutoHands primitive (`autohands/clone_seed.py`: repo creation + generic-set copy + scaffolds + the `PENDING.md` growth queue). Heart gained the newborn-validation checklist (`PyAutoHeart/docs/newborn_validation.md`). 3. **v2 — differentiated siblings.** Skill/wiki regeneration from the domain diff --git a/agents/conductors/clone/_clone.py b/agents/conductors/clone/_clone.py index 56f0dd1..eebef3e 100644 --- a/agents/conductors/clone/_clone.py +++ b/agents/conductors/clone/_clone.py @@ -425,7 +425,7 @@ def apply_seed(args, decision): plan_path = Path(tempfile.mkstemp(prefix="clone_plan_", suffix=".json")[1]) plan_path.write_text(json.dumps(plan, indent=2)) - seed_script = PYAUTO_ROOT / "PyAutoHands" / "autobuild" / "clone_seed.py" + seed_script = PYAUTO_ROOT / "PyAutoHands" / "autohands" / "clone_seed.py" if not seed_script.exists(): fail(4, f"Build primitive not found: {seed_script}") cmd = [sys.executable, str(seed_script), str(plan_path)] diff --git a/agents/conductors/intake/_intake.py b/agents/conductors/intake/_intake.py index cbb3924..87dfe89 100755 --- a/agents/conductors/intake/_intake.py +++ b/agents/conductors/intake/_intake.py @@ -86,7 +86,8 @@ "autogalaxy": "PyAutoGalaxy", "autolens": "PyAutoLens", "pyautomind": "PyAutoMind", "pyautobrain": "PyAutoBrain", "pyautoheart": "PyAutoHeart", "pyautobuild": "PyAutoHands", - "pyautomemory": "PyAutoMemory", "autobuild": "PyAutoHands", + "pyautomemory": "PyAutoMemory", "autohands": "PyAutoHands", + "autobuild": "PyAutoHands", # back-compat: the package was renamed autobuild -> autohands "workspaces": "workspaces", } PRIORITY_HIGH = ["urgent", "asap", "blocker", "blocking", "critical", "important", diff --git a/agents/conductors/release/AGENTS.md b/agents/conductors/release/AGENTS.md index b66a8e0..942f73a 100644 --- a/agents/conductors/release/AGENTS.md +++ b/agents/conductors/release/AGENTS.md @@ -19,7 +19,7 @@ Brain → Heart (gate) → Build (execute) 2. **The release door**: plain `release [--force]` delegates the readiness gate *and* execution to the Build Agent's release mode (`build.sh --mode release`), the **single** gate implementation — GREEN - proceeds, YELLOW needs `--force`, RED blocks; on a pass `autobuild + proceeds, YELLOW needs `--force`, RED blocks; on a pass `autohands pre_build` dispatches `release.yml`. This conductor holds no second copy of that gate. diff --git a/agents/conductors/release/release.sh b/agents/conductors/release/release.sh index 865eeb9..e509ff7 100755 --- a/agents/conductors/release/release.sh +++ b/agents/conductors/release/release.sh @@ -70,7 +70,7 @@ echo "== release conductor: delegating gate + execution to the Build Agent (rele # One gate implementation, not two: the Build Agent's release mode refreshes # health via the vitals faculty, applies GREEN / YELLOW(--force) / RED, and on -# a pass runs `autobuild pre_build` (which dispatches release.yml). +# a pass runs `autohands pre_build` (which dispatches release.yml). args=(--mode release) [[ "$force" -eq 1 ]] && args+=(--force) for _a in ${accept_red[@]+"${accept_red[@]}"}; do args+=("--accept-red=$_a"); done diff --git a/agents/faculties/vitals/HEART_CAPABILITIES.md b/agents/faculties/vitals/HEART_CAPABILITIES.md index 05c027b..7851144 100644 --- a/agents/faculties/vitals/HEART_CAPABILITIES.md +++ b/agents/faculties/vitals/HEART_CAPABILITIES.md @@ -92,7 +92,7 @@ reimplement inside Brain. PyAutoHands has been fully renamed onto the Heart/Brain names (no PyAutoPulse or PyAutoAgent references remain) and exposes health-shim commands such as -`autobuild verify_install`, `autobuild url_check`, and `autobuild watch|status|tick|fix`. +`autohands verify_install`, `autohands url_check`, and `autohands watch|status|tick|fix`. These delegate to the health authority rather than owning readiness logic. Decision: GREEN — the docs are renamed and the shims delegate only. Do not diff --git a/bin/pyauto-brain b/bin/pyauto-brain index 5ed5e12..a25abbc 100755 --- a/bin/pyauto-brain +++ b/bin/pyauto-brain @@ -3,7 +3,7 @@ # # PyAutoBrain is the reasoning layer of the PyAuto organism: it figures out HOW # work should be done and coordinates the organs that do it. The subcommand -# pattern mirrors PyAutoHands/bin/autobuild and PyAutoHeart/bin/pyauto-heart so +# pattern mirrors PyAutoHands/bin/autohands and PyAutoHeart/bin/pyauto-heart so # the CLIs feel the same. Agents live in two tiers under agents/: # # agents/conductors// — front-door agents a human DRIVES (they decide diff --git a/config/policy.yaml b/config/policy.yaml index 96ef666..3fe5ca3 100644 --- a/config/policy.yaml +++ b/config/policy.yaml @@ -24,7 +24,7 @@ sizing_categories: workspace: [workspace, workspace_test, workspace_developer, howto, assistant, pipeline, project] organism: [organ] extra_workspace_targets: [workspaces] -extra_organism_targets: [autobuild] +extra_organism_targets: [autohands] # Keyword -> PyAutoMemory sub-wiki (also the science vocabulary difficulty # scoring keys off). Source of truth for the wiki list: PyAutoMemory/index.md. @@ -58,7 +58,7 @@ target_signals: pyautomind: [pyautomind, the mind, prompt registry, active.md, planned.md, ideas.md, dashboard] pyautoheart: [heart, readiness, health check, vitals, green verdict] - pyautobuild: [autobuild, release.yml, notebook generation, the hands] + pyautobuild: [autohands, autobuild, release.yml, notebook generation, the hands] # Feature conductor: target -> the sub-wiki consulted by default. target_default_wiki: diff --git a/docs/adoption/config_surfaces.md b/docs/adoption/config_surfaces.md index 854fff4..ff2e5f6 100644 --- a/docs/adoption/config_surfaces.md +++ b/docs/adoption/config_surfaces.md @@ -15,7 +15,7 @@ framework organs is domain-free logic you pull from upstream. | `agents/conductors/release/` — the library tuple + `nightly.sh` | Brain | Which libraries the release path drives. | | `agents/faculties/memory/` — the wiki keyword map | Brain | Topic keywords → your Memory's sub-wikis. | | `heart/readiness.py` — `DEFAULT_LIBRARIES`; `heart/checks/version_skew.py` — the workspace→(library, package) map | Heart | The release-gate repo sets. | -| `autobuild/run_all.py`, `autobuild/slow_skip_check.py`, navigator maps | Hands | Which workspaces the validation pipeline runs and skips. | +| `autohands/run_all.py`, `autohands/slow_skip_check.py`, navigator maps | Hands | Which workspaces the validation pipeline runs and skips. | The honest state: some of these are clean policy files (Heart's `config/repos.yaml`), others are constant tables inside code files. A diff --git a/docs/organs/build.md b/docs/organs/build.md index 82ad1da..a951414 100644 --- a/docs/organs/build.md +++ b/docs/organs/build.md @@ -18,7 +18,7 @@ work. ## The pieces -- **`bin/autobuild`** — the single dispatcher; every operation is a +- **`bin/autohands`** — the single dispatcher; every operation is a subcommand with `--help` (`pre_build`, `generate`, `run_all`, `tag_and_merge`, …). - **`pre_build.sh`** — the declarative heart of the pipeline: one @@ -30,6 +30,6 @@ work. ## For an adopter Fork it. The pipeline mechanics are the framework; the `run_workspace` -table in `pre_build.sh` and the small maps in `autobuild/*.py` (which +table in `pre_build.sh` and the small maps in `autohands/*.py` (which workspaces to run, what to skip) are the declared config surfaces you rewrite for your own repos — see {doc}`../adoption/config_surfaces`. diff --git a/skills/ship_library/reference.md b/skills/ship_library/reference.md index 209ab01..4c265a0 100644 --- a/skills/ship_library/reference.md +++ b/skills/ship_library/reference.md @@ -112,7 +112,7 @@ grep -rn "" \ euclid_strong_lens_modeling_pipeline/scripts/ HowToLens/scripts/ ``` -Also check `PyAutoHands/autobuild/config/no_run.yaml` — a changed symbol used by +Also check `PyAutoHands/autohands/config/no_run.yaml` — a changed symbol used by a script listed there is a **hidden risk** (its release-pipeline integration test is disabled). Present a data-driven recommendation: diff --git a/tests/test_policy_seams.py b/tests/test_policy_seams.py index 99bcf3b..17f3b7c 100644 --- a/tests/test_policy_seams.py +++ b/tests/test_policy_seams.py @@ -35,7 +35,7 @@ def test_workspace_and_organism_sets(): assert "howtolens" in _sizing.WORKSPACE_REPOS assert "workspaces" in _sizing.WORKSPACE_REPOS # policy extra assert "pyautobrain" in _sizing.ORGANISM_REPOS - assert "autobuild" in _sizing.ORGANISM_REPOS # policy extra + assert "autohands" in _sizing.ORGANISM_REPOS # policy extra # the three sets stay disjoint — a repo must classify one way assert not (_sizing.LIBRARY_REPOS & _sizing.WORKSPACE_REPOS) assert not (_sizing.LIBRARY_REPOS & _sizing.ORGANISM_REPOS)