Skip to content

feat(install): the installers take --base, --team and --personal and never ask; install.ps1 never exits the user's session; CI runs both on every platform - #984

Merged
David-Noble-at-work merged 2 commits into
developfrom
feature/950-installers-take-base-team-and
Sep 30, 2026
Merged

David-Noble-at-work merged 2 commits into
developfrom
feature/950-installers-take-base-team-and

Conversation

@David-Noble-at-work

@David-Noble-at-work David-Noble-at-work commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Lanes 15, 16 and 17 of #949, PR B of four (ruled 2026-09-29: "We'll four PRs: A, B, #959, and then C.").

Also: wiki/Releasing.md says the release copies both installers; the README's Noble Factor link points at https://github.com/NobleFactor; PR A's plan (#962) takes its last tick and is complete. Found and filed: #982, #983.

  • Plan — docs/plans/feature/950-installers-take-base-team-and.md. It stays active: its last boxes are this PR's installers jobs and, after the merge, the site's copies of both installers.

Resolves #950
Resolves #965
Resolves #946

Test plan

  • bash, in scratch accounts: flags through the pipe, twice (unchanged); a URL layer; DEVLORE_BASE alone and flag over variable; no flags with and without a terminal, identical; refusals; 36 of 37 checks, the 37th a dead noblefactor.com link, since repointed
  • pwsh 7: the script-block form, irm | iex, -Help, a forced failure under both forms leaving the session open, -File exit codes; develop's install.ps1 ends the session on the same failure
  • scripts/Test-InstallScript.sh, 14 of 14, and scripts/Test-InstallScript.ps1 under pwsh 7, 12 of 12, on Linux arm64; the host's devlore files and the checkout untouched
  • An eight-agent review of the CI tests for macOS, Windows PowerShell 5.1, GitHub Actions and writ on Windows: two defects confirmed and fixed (5.1's redirected native stderr, 5.1's Remove-Item on directory links)
  • Gates: star lint shell, the PowerShell gate, ASCII only, 0 exit nodes in install.ps1, guide frontmatter; every address the documents add answers 200
  • This PR's installers jobs, all six runners, both PowerShell editions
  • After the merge: the site's install.sh and install.ps1 equal develop's

Time

Marker UTC Elapsed
opened (first commit) 2026-09-29T23:16:08Z —
submitted (PR opened) 2026-09-30T00:50:55Z 1.6 h after opened
merged 2026-09-30T01:01:42Z 0.2 h after submitted; 1.8 h in all

Computed by the algorithm of noblefactor-ops#188 at merge.

…ags, their exits, and their documentation

The installers take --base, --team and --personal and never ask;
install.ps1 stops calling exit, which closes the user's PowerShell window
under both one-liners; the guide and the README show the one command.
Every open question was ruled on 2026-09-30, one at a time.

Claude-Session: https://claude.ai/code/session_01DuNfZFyfxBoD9pdaiDEMrY
…never ask; install.ps1 never exits the user's session; CI runs both on every platform

#950: each installer registers the layers it is given, base first, with
the writ it just installed: writ repo set <layer> <loc> --unattended.
--base/--team/--personal in install.sh, -Base/-Team/-Personal in
install.ps1, DEVLORE_BASE/_TEAM/_PERSONAL for both; a flag wins over its
variable. Nothing reads the terminal; a layer not given is skipped and
named, with its command, in the last lines. writ's output is left as it
prints it, and the summary comes after it. install.sh refuses an unknown
argument. Long options throughout, the standard script headers,
Apache-2.0 on both, GH_TOKEN sent when set and its false warnings gone,
armv7 gone, and the PATH advice names the directory installed into.

#965: install.ps1 calls no exit. -Help returns, and Write-Fatal throws,
so a failure under irm | iex or the script-block form leaves the user's
session and the message on screen; run as a file it still exits 1. tar
and chmod gain their $LASTEXITCODE checks. The native calls run under
'Continue', so a caller who redirects the streams (*>&1 | Tee-Object)
on Windows PowerShell 5.1 no longer loses the install at writ's first
stderr line.

#946: the README and the getting-started guide lead with the one command
for bash and PowerShell (the script-block form preferred), a table of
the flags, and the steps by hand. No releases/latest, no per-program
assets, no go install. The guide's repository and deploy sections stay
as develop has them: the first-use scenario goes to #894's replan. The
README's Noble Factor link points at the GitHub organization.

CI: .github/workflows/installers.yaml runs scripts/Test-InstallScript.sh
on macOS (both architectures, with macOS's own tools) and Linux (both),
and scripts/Test-InstallScript.ps1 on Windows (both architectures)
under Windows PowerShell 5.1 and PowerShell 7.

wiki/Releasing.md says the release copies both installers. PR A's plan
(#962) takes its last tick and is complete. Found and filed: #982, #983.

Resolves #950
Resolves #965
Resolves #946

Claude-Session: https://claude.ai/code/session_01DuNfZFyfxBoD9pdaiDEMrY
@David-Noble-at-work
David-Noble-at-work merged commit e3b501d into develop Sep 30, 2026
19 checks passed
@David-Noble-at-work
David-Noble-at-work deleted the feature/950-installers-take-base-team-and branch September 30, 2026 01:01
David-Noble-at-work added a commit that referenced this pull request Sep 30, 2026
…tc/os-release before it closes it (#986)

* fix(writ): plan for #959, writ detects the Linux distribution

detectDistro closes /etc/os-release before reading it, so DISTRO has been
empty on every Linux host since 57a9fd2. The plan: readDistro(path)
opens, defers the close, and scans; tests that go through the file and
fail first; the adopt test that pinned the bug refuses a word no host
detects; PR B's owed ticks. Lane 18 of #949; #944 follows as lane 19.

Claude-Session: https://claude.ai/code/session_01DuNfZFyfxBoD9pdaiDEMrY

* fix(writ): writ detects the Linux distribution; detectDistro reads /etc/os-release before it closes it

detectDistro closed /etc/os-release between the open and the scan, so
every read failed and the DISTRO segment has been empty on every Linux
host since 57a9fd2 (#288): no directory with a distribution suffix
matched anywhere. It now calls readDistro(path), which defers the close
straight after the open.

The path is the seam the tests use: readDistro runs against os-release
fixtures (Ubuntu with its ID_LIKE, Debian, a quoted ID, an unknown ID,
no ID, no file), and TestDetectSegments checks DISTRO on a Linux host
whose os-release carries an ID. Both failed against the old close and
pass now. The adopt test that pinned the bug refused "Ubuntu", which is
matched on Ubuntu now; it refuses NoSuchPlatform instead.

DISTRO stays the ID field, capitalized: `debian` matches `.Debian`. The
lineage, so that Ubuntu also matches `.Debian`, is #944, the next PR.

PR B's plan takes its two owed ticks, the installers jobs on #984 and
the site's sync, and is complete.

Resolves #959

Claude-Session: https://claude.ai/code/session_01DuNfZFyfxBoD9pdaiDEMrY
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment