scripts/setup is the initial install, nothing else

Two of the eight did not belong. cleanup-desktop.sh is the teardown — the inverse of an install, not part
of one. provision-user-dirs.ts runs per account at invite time, on a machine that is already set up.
Both are back at the top level, with their `../` derivations and usage strings put back.

What is left is what a fresh machine runs once: the two installers (setup.sh, setup_mac_light.sh), the
two things setup.sh calls (setup-dockers.sh, setup-desktop.sh), and the two files they deploy —
starship.toml, copied to ~/.config, and officer-set-display.sh, which setup-desktop.sh installs to
~/.local/bin as a login-time mode setter. The last one is not a setup script and does not read like one;
it is here because it is install payload, same as the toml, and setup-desktop.sh loads it by
`$(dirname $0)`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 04:05:06 +00:00
co-authored by Claude Opus 5
parent 9c353f5f0d
commit f5f509a99d
4 changed files with 10 additions and 10 deletions
+1 -1
View File
@@ -52,7 +52,7 @@ the owner's OS user and can never be granted. Indirection there really is accide
`'Unverified'` and `signin.ts` refuses anything else with a bare UNAUTHORIZED, which is the trap `'Unverified'` and `signin.ts` refuses anything else with a bare UNAUTHORIZED, which is the trap
the hand-INSERT route fell into. The owner sets the password and reads it out; `passwordChangedAt` the hand-INSERT route fell into. The owner sets the password and reads it out; `passwordChangedAt`
stays null. Directories come from the shared `provisionUserDirs`/`USER_DIRS` in `data-path.ts`, stays null. Directories come from the shared `provisionUserDirs`/`USER_DIRS` in `data-path.ts`,
which `scripts/setup/provision-user-dirs.ts` now imports rather than restating. which `scripts/provision-user-dirs.ts` now imports rather than restating.
- [ ] **Still no invite flow, and no password reset for a member.** The owner types the password and - [ ] **Still no invite flow, and no password reset for a member.** The owner types the password and
tells the person, which means the owner knows it and the member cannot change it back if they tells the person, which means the owner knows it and the member cannot change it back if they
@@ -26,7 +26,7 @@ set -euo pipefail
# their profile in it. Opt in rather than surprise someone. # their profile in it. Opt in rather than surprise someone.
# #
# Usage: # Usage:
# bash scripts/setup/cleanup-desktop.sh [--purge-brave] # bash scripts/cleanup-desktop.sh [--purge-brave]
# #
# Reboot afterwards: the GDM and GRUB changes are both boot-time. # Reboot afterwards: the GDM and GRUB changes are both boot-time.
@@ -131,9 +131,9 @@ fi
# --- Step 7: .env --- # --- Step 7: .env ---
echo "[7/7] Cleaning .env..." echo "[7/7] Cleaning .env..."
# ../.. — this lives in scripts/setup/. A wrong level here is quiet in the other direction: the sed # A wrong level here is quiet: the sed below simply finds no file, reports "No .env" and leaves the real
# below simply finds no file, reports "No .env" and leaves the real VNC_PASSWORD in place. # VNC_PASSWORD in place. Keep this in step with wherever this script lives.
ENV_FILE="$(cd "$(dirname "$0")/../.." && pwd)/.env" ENV_FILE="$(cd "$(dirname "$0")/.." && pwd)/.env"
if [ -f "$ENV_FILE" ]; then if [ -f "$ENV_FILE" ]; then
sed -i '/^VNC_PASSWORD=/d; /^VNC_PORT=/d' "$ENV_FILE" sed -i '/^VNC_PASSWORD=/d; /^VNC_PORT=/d' "$ENV_FILE"
echo " Removed VNC entries." echo " Removed VNC entries."
@@ -1,7 +1,7 @@
// Create the per-user root under DATA_PATH for the given accounts. // Create the per-user root under DATA_PATH for the given accounts.
// //
// bun scripts/setup/provision-user-dirs.ts a@b.com c@d.com // bun scripts/provision-user-dirs.ts a@b.com c@d.com
// DRY_RUN=1 bun scripts/setup/provision-user-dirs.ts a@b.com // DRY_RUN=1 bun scripts/provision-user-dirs.ts a@b.com
// //
// Takes emails as arguments rather than reading the user table: the directory layout does not depend // Takes emails as arguments rather than reading the user table: the directory layout does not depend
// on the database, and keeping the DB out means this runs with nothing else up. At invite time the // on the database, and keeping the DB out means this runs with nothing else up. At invite time the
@@ -19,13 +19,13 @@ import { join } from 'node:path';
// The list and DATA_PATH itself come from the platform rather than being restated here. The owner's // The list and DATA_PATH itself come from the platform rather than being restated here. The owner's
// create-account handler provisions the same skeleton, and a script that drifted from it would produce // create-account handler provisions the same skeleton, and a script that drifted from it would produce
// accounts that differ by how they were made. Importing data-path.ts pulls in no database and no server. // accounts that differ by how they were made. Importing data-path.ts pulls in no database and no server.
import { DATA_PATH, USER_DIRS } from '../../src/servers/data-path'; import { DATA_PATH, USER_DIRS } from '../src/servers/data-path';
const DRY_RUN = process.env.DRY_RUN === '1'; const DRY_RUN = process.env.DRY_RUN === '1';
const emails = process.argv.slice(2).filter(Boolean); const emails = process.argv.slice(2).filter(Boolean);
if (!emails.length) { if (!emails.length) {
console.error('Usage: bun scripts/setup/provision-user-dirs.ts <email> [email...]'); console.error('Usage: bun scripts/provision-user-dirs.ts <email> [email...]');
process.exit(2); process.exit(2);
} }
+1 -1
View File
@@ -50,7 +50,7 @@ export const getOwnerHomeDir = (email: string): string => process.env.HOME_DIR ?
// non-owner's sessions would run. // non-owner's sessions would run.
// //
// Single-sourced here rather than in the script that used to own the list, because there are now two // Single-sourced here rather than in the script that used to own the list, because there are now two
// callers — `scripts/setup/provision-user-dirs.ts` and the owner's create-account handler — and a skeleton // callers — `scripts/provision-user-dirs.ts` and the owner's create-account handler — and a skeleton
// that differs depending on how the account was made is a bug nobody would think to look for. // that differs depending on how the account was made is a bug nobody would think to look for.
export const USER_DIRS = ['home', 'attachments', 'cache', 'dashboards', 'email_accounts', 'logs', 'sidecar'] as const; export const USER_DIRS = ['home', 'attachments', 'cache', 'dashboards', 'email_accounts', 'logs', 'sidecar'] as const;