Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
026280c
openRepoShape: `--install` records the ref it runs at in `openRepoSha…
Oct 14, 2026
d0cdbf4
install.sh: one line, `curl -fsSL https://github.com/opensoft/openRep…
Oct 14, 2026
319b005
openRepoShape and install.sh, the fix round on #577: `--install` reco…
Oct 15, 2026
322a305
README.md, docs/handbook.html, AGENTS.md and the v1.0.1 release notes…
Oct 15, 2026
868c9bf
docs/release-notes/v1.0.1.md: the "Before tagging" steps are safe to …
Oct 15, 2026
892a041
Merge remote-tracking branch 'origin/l3-564-one-line-install' into l3…
Oct 15, 2026
b2f0be3
tests/readme-cap.d/564.txt: README.md's cap is 1449, raised by 22 for…
Oct 15, 2026
68b999f
docs/handbook.html: the consent rules say every action the tool OFFER…
Oct 15, 2026
53416db
Merge remote-tracking branch 'origin/main' into l3-564-carry-to-main
Oct 15, 2026
a155945
Merge remote-tracking branch 'origin/main' into l3-564-carry-to-main
Oct 15, 2026
c1e6b82
README.md: the NOTE says the preflight installs nothing without the t…
Oct 15, 2026
5191f0e
docs/handbook.html: the consent rules say install.sh asks nothing bef…
Oct 15, 2026
ba83231
openRepoShape: --install refuses a target that is a symbolic link, su…
Oct 15, 2026
8cae45c
install.sh: the one-line installer refuses a target that is a symboli…
Oct 15, 2026
604fbda
pyproject.toml, src/openreposhape/: the openreposhape package gives o…
Oct 15, 2026
4759eea
.github/workflows/tests.yml: a package job builds the openreposhape w…
Oct 15, 2026
ab8bfe3
tests/test_openreposhape_command.py: the symlink-target test asserts …
Oct 15, 2026
bfd927a
install.sh, tests/test_install_sh.py: the symlink-target check uses `…
Oct 15, 2026
cb910c4
src/openreposhape/, tests/test_openreposhape_package.py: the argument…
Oct 15, 2026
9b0a29e
.github/workflows/tests.yml: the package job runs pipx 1.11.1 on the …
Oct 15, 2026
d53080a
.github/workflows/tests.yml: the package job installs pipx from wheel…
Oct 15, 2026
25b2aee
Merge branch 'main' into l3-564-carry-to-main
brettheap Oct 15, 2026
a20c469
Merge remote-tracking branch 'origin/l3-564-carry-to-main' into l3-56…
Oct 15, 2026
22ade8e
openRepoShape: the comment over `--install`'s record says the target …
Oct 15, 2026
66bb2c7
src/openreposhape/, pyproject.toml, tests/test_openreposhape_package.…
Oct 15, 2026
6179bd7
tests/test_repo_hygiene.py: every module of src/openreposhape/ is pur…
Oct 15, 2026
d090f0c
src/openreposhape/standard.py, tests/test_openreposhape_package.py: a…
Oct 15, 2026
c7ef427
.github/release-build-requirements.txt, .github/release-pipx-requirem…
Oct 15, 2026
3c91176
.github/workflows/release.yml: a dispatch on the annotated tag v<vers…
Oct 15, 2026
e98f5ee
pyproject.toml: the comment over the build backend's pin says the rel…
Oct 15, 2026
67468a9
tests/test_release_workflow.py: release.yml is read and held to its s…
Oct 15, 2026
e11c3f1
.github/workflows/release.yml: the three-OS gate counts only the jobs…
Oct 15, 2026
a412012
.github/workflows/tests.yml: actionlint reads the release workflow on…
Oct 15, 2026
fa31fdc
pyproject.toml: the comment says the release shows the wheel path-ind…
Oct 15, 2026
9a632c4
tests/test_release_workflow.py: every RV599 mutation fails a test, th…
Oct 15, 2026
b23b245
Merge remote-tracking branch 'origin/main' into l3-564-carry-to-main
Oct 15, 2026
19fe64a
.github/workflows/release.yml: the gate requires the tests job alone,…
Oct 15, 2026
d2fdc6b
tests/test_release_workflow.py: the gate is `("tests",)`, and its own…
Oct 15, 2026
e814c39
.github/workflows/release.yml: the header's step 1 and each refusal o…
Oct 15, 2026
b0182e2
tests/test_release_workflow.py: a cancelled tests run refuses and a l…
Oct 15, 2026
d5011b1
Merge branch 'main' into l3-564-carry-to-main
brettheap Oct 15, 2026
f9b07c9
Merge remote-tracking branch 'origin/main' into l3-564-carry-to-main
Oct 15, 2026
3d8fa05
Merge branch 'main' into l3-564-carry-to-main
brettheap Oct 15, 2026
06dad85
Merge #587's final head (3d8fa05e) into l3-563-pypi-package
Oct 15, 2026
3c208e9
Merge origin/main (22eaceed, #587's squash) into l3-563-pypi-package
Oct 15, 2026
1c8a708
.github/workflows/tests.yml, tests/test_openreposhape_package.py: the…
Oct 15, 2026
f87c098
Merge origin/main (396c0ff4) into l3-563-docs
Oct 15, 2026
adb4313
adopt-project.py: `filter-repo-missing` names git-filter-repo's insta…
Oct 15, 2026
99f5074
README.md and the handbook: `pipx install openreposhape` is the secon…
Oct 15, 2026
7692b55
AGENTS.md: `pipx install openreposhape` is the human's to run, as the…
Oct 15, 2026
3df2192
docs/cli.md: the checkout group says `pipx install openreposhape` pla…
Oct 15, 2026
63c1e4b
docs/release-notes/v1.1.0.md: a first draft of the v1.1.0 notes: open…
Oct 15, 2026
995e138
Merge branch 'main' into l3-563-pypi-package
brettheap Oct 15, 2026
6d8893c
Merge origin/main (8f453d0e) into l3-563-docs
Oct 15, 2026
82f9403
docs/release-notes/v1.1.0.md: #625 (#613), which landed on main while…
Oct 15, 2026
cfbe59d
Merge origin/main (4cf5fb07, with #596's tests-git-bash job) into l3-…
Oct 16, 2026
2a7865e
Merge origin/main (4cf5fb07) into l3-563-docs
Oct 16, 2026
4410da0
tests/test_install_sh.py, tests/test_openreposhape_command.py: the tw…
Oct 16, 2026
70955e4
.github/workflows/tests.yml: the header says what is the `package` jo…
Oct 16, 2026
b347943
adopt-project.py: `filter-repo-missing` names git-filter-repo's insta…
Oct 16, 2026
c3e9a3d
README.md and the handbook: #563's raise is +12, not +28, with RV630'…
Oct 16, 2026
0470497
AGENTS.md: section 2's installed-command paragraph says native Window…
Oct 16, 2026
b006f16
docs/release-notes/v1.1.0.md: refreshed at main 4cf5fb0 (49 pull requ…
Oct 16, 2026
750366b
Merge remote-tracking branch 'origin/l3-563-pypi-package' into l3-563…
Oct 16, 2026
ca5c49f
Merge origin/l3-563-release-workflow (750366bc, #599 with #590's 7095…
Oct 16, 2026
493c6ad
Merge origin/main (d4a7fab9) into l3-563-docs
Oct 16, 2026
61b3907
docs/handbook.html and docs/release-notes/v1.1.0.md: step 3's Windows…
Oct 16, 2026
9e504c0
Merge origin/main (879d8047) into l3-563-docs
Oct 16, 2026
ddd3c5f
docs/handbook.html and docs/release-notes/v1.1.0.md: step 3's Git Bas…
Oct 16, 2026
5b140bd
README.md and the handbook: `validate-pins.py`'s paragraph says again…
Oct 16, 2026
7b7e657
Merge origin/main (de926142) into l3-563-docs
Oct 16, 2026
6fd33a9
README.md, the handbook and the v1.1.0 notes: the adopted repository …
Oct 16, 2026
a86a422
Merge origin/main (bf1f099b) into l3-563-docs
Oct 17, 2026
d2d3d76
README.md, the handbook and the v1.1.0 notes: the doctor's exit 3 nam…
Oct 17, 2026
d6a8556
Merge origin/main (20004887) into l3-563-docs
Oct 17, 2026
b2a62ec
README.md, the handbook and the v1.1.0 notes: lane 2's review of roun…
Oct 17, 2026
441dcb4
Merge origin/main (40e678e6) into l3-563-docs
Oct 17, 2026
6a6817c
README.md, the handbook and the v1.1.0 notes: RV630's four nits, and …
Oct 17, 2026
8049456
Merge origin/main (64ec47c3) into l3-563-docs
Oct 17, 2026
cd56ed7
docs/release-notes/v1.1.0.md: RV630's pre-review of the B2 stage, #74…
Oct 17, 2026
42d4df8
Merge origin/main (bad05d21) into l3-563-docs
Oct 17, 2026
1aeed03
docs/release-notes/v1.1.0.md: entries for #748, #731, #810, #809, #81…
Oct 17, 2026
4d14e4a
Merge origin/main (fc867207) into l3-563-docs
Oct 17, 2026
d697b36
docs/release-notes/v1.1.0.md: #746's entry, v1.0.0's staged-paths lim…
Oct 17, 2026
016599b
Merge origin/main (6f64eea2) into l3-563-docs
Oct 17, 2026
aef568f
docs/release-notes/v1.1.0.md: #795's entry, the list complete to main…
Oct 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ hand-edited; `tests/test_cli_reference.py` fails when the two disagree.
types `yes` at its prompt; you never answer it for them. No terminal: section 2.

**Never answer an install prompt.** The preflight asks `Type yes to continue:`
for each thing it offers to run — an install, `gh auth login`, `gh auth
setup-git`. The human types it; you never install software or log in for them.
The one-line install (`install.sh`) is theirs to run: relay it, never run it.
for each offer — an install, `gh auth login`, `gh auth setup-git` — and the
human types it; you never install software or log in for them. The one-line
`install.sh` and `pipx install openreposhape` are theirs: relay, never run.

**Never pass `--allow-upstream-org` on your own initiative.** It guards only
`--org opensoft`, the namespace of openRepoShape's upstream owner. If setup.sh
Expand Down Expand Up @@ -60,11 +60,13 @@ curl -fsSL https://raw.githubusercontent.com/opensoft/openRepoShape/main/setup.s
--visibility <private|public|internal> --elected-by '<Name>'
```

`openRepoShape <Project> --org <org> --visibility <…> --elected-by '<Name>'`
is the same run through the installed command, still without `--yes`. With no
arguments it prints its usage and exits 1, and `--install` ends with a
read-only `machine:` block naming anything missing; neither installs anything.
Relay the block; the human runs `--preflight` if they want the offers.
`openRepoShape <Project> --org <org> --visibility <…> --elected-by '<Name>'` is
the same run through the installed command, still without `--yes`, whether
`install.sh` or `pipx install openreposhape` (native Windows too) placed it;
pipx adds `scaffold-project`, `adopt-project`, `update-shape` and
`shape-doctor`, the tools below by name. Bare, it prints its usage and exits 1;
the bash one's `--install` ends with a read-only `machine:` block naming
anything missing, and installs nothing: relay it; the human runs `--preflight`.

On Windows without WSL2, `Invoke-WebRequest https://raw.githubusercontent.com/opensoft/openRepoShape/main/setup-project.py -OutFile setup-project.py`
then `py setup-project.py <Project> --org <org> --visibility <…> --elected-by '<Name>'`
Expand Down Expand Up @@ -217,7 +219,7 @@ no `--dry-run` to do first. The one exception to "writes nothing" is
The checks are a REGISTRY with an empty `fix` slot in each of them, which is
where a repair mode will hang; nothing in it writes today. Installed,
`openRepoShape --doctor` takes `--json` and `--placement-plan <file>` as well,
and KEEPS its temporary clone of the standard for the NEXT lines that name it:
and KEEPS its clone of the standard for the NEXT lines that name it:
its last line names that directory, the human's to delete once those have run.

1. **Read the verdict, then read the rows.** `COMPLIANT`, `COMPLIANT, SHAPE
Expand Down
87 changes: 51 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,10 @@ its own `contracts/shape-pin.yaml`, so a CRLF checkout reports drift in files
nobody edited. The clone `setup-project.py` makes is configured correctly
whatever the machine says; the global setting is for every clone after it.

Then two commands, run in the directory the new project should land in:
Then `pipx install openreposhape` (where `pipx` is missing: `python -m pip
install --user pipx`, then `python -m pipx ensurepath` and a new terminal):
step 3 says what it places, and step 4 runs it. Or, installing nothing, two
commands, run in the directory the new project should land in:

```powershell
Invoke-WebRequest https://raw.githubusercontent.com/opensoft/openRepoShape/main/setup-project.py -OutFile setup-project.py
Expand All @@ -149,13 +152,13 @@ and refuses. Downloading the file first leaves stdin on your terminal.
`setup-project.py` is the flow itself, and `setup.sh` a shim over it: the same
preflight, the same naming check, the same plan, the same one `yes`, the same
self-bootstrap outside a checkout. It never needs `make` and never looks for a
`python3` — it runs the interpreter that started it. That two-liner IS the
Windows way in from PowerShell, which has no twin of step 3's `openRepoShape`
command. Git Bash runs that command and step 3's one line, tested in CI but for
a typed `yes`, which its preflight cannot take there. Printed commands are
quoted for a POSIX shell, so paste them into Git Bash. Only `shape-doctor.py`'s
lines, `setup-project.py`'s family lines and `family.py`'s `NEXT`, `switch -c`,
`add` and `git rm -r --cached` lines are quoted for PowerShell, on Windows.
`python3` — it runs the interpreter that started it. That two-liner is the
Windows way in that installs nothing; pipx's `openRepoShape` runs the same flow.
Git Bash runs step 3's bash command and its one line, tested in CI but for a
typed `yes`, which its preflight cannot take there. Printed commands are quoted
for a POSIX shell, so paste them into Git Bash. Only `shape-doctor.py`'s lines,
`setup-project.py`'s family lines and `family.py`'s `NEXT`, `switch -c`, `add`
and `git rm -r --cached` lines are quoted for PowerShell, on Windows.

</details>

Expand All @@ -180,8 +183,8 @@ run the four steps below INSIDE the WSL shell.
> `brew` the preflight names <https://brew.sh> and stops there. To check a
> machine and stop, creating nothing, run `openRepoShape --preflight` —
> `py setup-project.py --preflight` on Windows — which exits 0 when everything
> is present and 1 when it is not (`openRepoShape --preflight` exits 2 when
> `git` or a Python 3.9 or newer is missing).
> is present and 1 when it is not (the bash `openRepoShape --preflight` exits
> 2 when `git` or a Python 3.9 or newer is missing).

**1. Install the GitHub CLI**, `gh`. The official instructions are at
<https://cli.github.com/> (and <https://github.com/cli/cli#installation>):
Expand Down Expand Up @@ -275,6 +278,14 @@ things it does, one line each: install it, check the machine
scaffold a project. Type any scaffold argument and you get the run you asked
for, refusals and all.

**The second way, from PyPI:** `pipx install openreposhape`, wherever `pipx`
is (`sudo apt-get install -y pipx` on Debian and Ubuntu, `brew install pipx` on
macOS, then `pipx ensurepath`). It places the same `openRepoShape` (its
`--install` refuses) and `scaffold-project`, `adopt-project`, `update-shape`
and `shape-doctor`, with `git-filter-repo` 2.47.0; each runs a cached clone at
the release's commit, digest-checked every run. `pipx upgrade openreposhape`
upgrades. Use one installer, not both: each places `~/.local/bin/openRepoShape`.

**4. Run it:**

```sh
Expand Down Expand Up @@ -730,10 +741,12 @@ one is found — `--pin-source [PRODUCT=]<path>`, `SHAPE_PIN_SOURCE_<PRODUCT>` i
the environment, or a checkout beside the assembly root named for the pinned
repository — else by `gh api`, with the operator's `gh` credentials, when `gh`
can read it. Finding neither is a named SKIP, exit 0: no checkout and no network
does not make a descent a lie. A checkout that cannot answer is the finding
`neutral-pin-source-unreadable`. `make bootstrap`, `bump-leg.py` and
`update-shape.py apply` run this validator in the operator's environment, so
each makes that call too; none takes `--pin-source`.
does not make a descent a lie. A digest that recomputes differently is the
finding `neutral-pin-digest-mismatch` (exit 1), and a checkout that cannot
answer is the finding `neutral-pin-source-unreadable`; a declared pin file that
is not there is the refusal `neutral-pin-missing` (exit 2). `make bootstrap`,
`bump-leg.py` and `update-shape.py apply` run this validator in the operator's
environment, so each makes that call too; none takes `--pin-source`.

### A neutral product may elect the shape and be its own assembly root

Expand All @@ -755,8 +768,8 @@ it satisfies no leg form to be admitted into, and is still refused as any leg.
## Adopting an existing repository

A repository that already exists is converted **in place**, by `adopt-project.py`,
and this is a ruling (**Brett Heap, 2026-09-02**): it KEEPS ITS NAME, which
`--project` must be, ITS IDENTITY AND ITS FULL HISTORY and becomes the assembly
and this is a ruling (**Brett Heap, 2026-09-02**): it KEEPS ITS NAME (which
`--project` must be), ITS IDENTITY AND ITS FULL HISTORY, and becomes the assembly
root, while `<Project>-spec` and `<Project>-code` are NEW repositories extracted
with history-preserving filters. The source is never deleted, never renamed and
never force-pushed; the only change to its history is ONE split commit, arriving
Expand All @@ -770,10 +783,10 @@ only, and a tool needing a bypass cannot be used where it is needed.
./adopt-project.py execute --plan adoption-plan.yaml --yes
```

`git filter-repo` is a **hard dependency** — `pip install git-filter-repo`, or
the same name from apt or brew. It is deliberately not vendored: history
extraction has one correct implementation, and a copy is a second one that
drifts.
`git filter-repo` is a **hard dependency**: step 3's one line installs it or
prints the command for this machine, and `pipx install openreposhape` brings it
for its `adopt-project`. It is deliberately not vendored: history extraction
has one correct implementation, and a copy is a second one that drifts.

### The worked example: MedxEHR — 167 files, 25 commits, three arguments

Expand Down Expand Up @@ -1148,8 +1161,8 @@ openRepoShape --doctor # the repository you are standing in
It **writes nothing into the repository but a `--placement-plan` file you name,
and fetches nothing from it**, and it reimplements nothing: each row is a check
this file documents. It compares against the checkout it is RUN FROM, so the
verdict is offline. Installed, it KEEPS its temporary clone of the standard for
the NEXT lines naming it: its last line names it, safe to delete after they run.
verdict is offline. Installed, it KEEPS its clone of the standard for the NEXT
lines naming it: its last line names it, safe to delete after they run.

For an assembly root the rows are **naming** (this standard's own
`contracts/repository-naming.yaml`), **manifest** and **pins** (the project's
Expand Down Expand Up @@ -1194,16 +1207,17 @@ one verdict, and its exit code:

Exit 3 is usage or environment (a flag argparse rejects is exit 2) — nothing about
it is a statement about the tree you pointed at: no such path, a refused
`--placement-plan`, a `shape-doctor.py` not sitting in a
checkout of the standard, or a pin naming a commit **this** checkout does not
carry (`CANNOT ANSWER`). **Drift outranks a red validator** on the verdict
line, deliberately — an edited shape copy is exactly what makes
`validate-pins.py` red, so `INVALID (pins)` would send the reader at the
symptom while the fix is `update-shape.py`; the pins row still prints its own
next command. `MISPLACED` sits between the two: a path in the wrong leg is a
fact about the shape no validator, pin or manifest here can see. **An
unfinished merge outranks all three**, as `INVALID (merge)`: the conflict is
what turns the other rows red, and no fix commits until it is finished.
`--placement-plan`, a `shape-doctor.py` outside a checkout of the standard, or
**this** checkout unable to answer (`CANNOT ANSWER`): a pin's commit it lacks, a
partial clone missing what is compared, a read that fails, a validator of its
own that crashed or could not be run, or its own naming policy not loading.
**Drift outranks a red validator** on the verdict line, deliberately — an edited
shape copy is what makes `validate-pins.py` red, so `INVALID (pins)` would send
the reader at the symptom while the fix is `update-shape.py`; the pins row still
prints its own next command. `MISPLACED` sits between the two: a path in the
wrong leg is a fact no validator, pin or manifest here can see.
**An unfinished merge outranks all three**, as `INVALID (merge)`: the conflict
is what turns the other rows red, and no fix commits until it is finished.
`--json` is the same report as one object on stdout, each row carrying its `id`.

**`placement` is the row that reads what is *inside* the legs.** Brett Heap,
Expand Down Expand Up @@ -1426,8 +1440,9 @@ scripts/shape_materialize.py the ONE materializer, used by both tools
scripts/validate-repository-naming.py
openRepoShape installs itself as a command; runs setup.sh
install.sh the one-line install: a release, pinned
src/openreposhape/ the pipx package (pyproject.toml); stdlib only
setup.sh the shim: find an interpreter, hand over
setup-project.py THE FLOW, and the Windows way in (no bash there)
setup-project.py THE FLOW, and a Windows way in from PowerShell
scaffold-project.py creates the three repositories and the pins
adopt-project.py converts an EXISTING repository in place
update-shape.py re-syncs a root's copies and re-pins
Expand All @@ -1450,9 +1465,9 @@ scripts/render-cli-reference.py renders docs/cli.md; never hand-edit that file
tests/ pytest; scaffolds into bare repos in /tmp
```

**Python 3 standard library only.** No `pip`, no packaging, no
engineering-domain dependency — the shape must run where nothing can be
installed. `tests/test_repo_hygiene.py` enforces it.
**Python 3 standard library only.** No tool needs `pip` or any dependency, so
the shape runs where nothing can be installed; the `openreposhape` package is a
second way in, never a requirement. `tests/test_repo_hygiene.py` enforces it.

## Licence

Expand Down
20 changes: 15 additions & 5 deletions adopt-project.py
Original file line number Diff line number Diff line change
Expand Up @@ -891,12 +891,22 @@ def _pin_digest_findings(plan: "Plan") -> tuple[list[str], list[str]]:
SEED_TEMPLATE = {"spec": "templates/spec-root", "code": "templates/code-root"}
EXTRACTED_LEGS = ("spec", "code")

#: In install.sh's order (#595): with the pipx or uv already there, else
#: brew's, else pipx from apt or dnf, else Arch's own package. No `pip
#: install --user`: Debian 12, Ubuntu 23.04 and Arch mark their own Python
#: externally managed (PEP 668) and refuse it. The openreposhape package
#: depends on git-filter-repo and puts it on PATH for the `adopt-project` it
#: places, but not for this file run by its path (#563).
FILTER_REPO_HINT = (
"Remediation: install it — `pip install git-filter-repo`, or "
"`apt install git-filter-repo`, or `brew install git-filter-repo`; it is "
"one file on PATH named `git-filter-repo`. It is NOT vendored here on "
"purpose: history extraction has one correct implementation and a copy of "
"it is a second one that drifts."
"Remediation: install it — `pipx install git-filter-repo==2.47.0`, or "
"`uv tool install git-filter-repo==2.47.0` where there is no pipx; with "
"neither, `brew install git-filter-repo`, or `sudo apt-get install -y "
"pipx && pipx install git-filter-repo==2.47.0 && pipx ensurepath` (`dnf` "
"for `apt-get` on Fedora), or `sudo pacman -S --needed git-filter-repo` "
"on Arch; it is one file on PATH named `git-filter-repo`. `pipx install "
"openreposhape` brings it for the `adopt-project` command it places. It "
"is NOT vendored here on purpose: history extraction has one correct "
"implementation and a copy of it is a second one that drifts."
)


Expand Down
2 changes: 1 addition & 1 deletion docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ one today, and the generator refuses to write this file if one ever appears.

## Run from a checkout of the standard

Every command below is typed at the root of a clone of this repository. `openRepoShape` is also the one file `--install` places on `PATH`, and is the only entry point that needs no checkout at all.
Every command below is typed at the root of a clone of this repository. `openRepoShape` is also the one file `--install` places on `PATH`, and needs no checkout at all. `pipx install openreposhape` (#563) places a Python `openRepoShape` with the same modes, whose own `--help` says what differs (its `--install` refuses and names `pipx upgrade openreposhape`), and four commands that need no checkout either: `scaffold-project`, `adopt-project`, `update-shape` and `shape-doctor` each run the tool of that name below, with every argument unchanged, from a clone of the standard at the package's own release commit, so their flags are the ones below.

### `setup.sh`

Expand Down
Loading
Loading