Remove Paperclip name from descriptive comments in setup/agent-cli-check.ts
and setup/onboarding.ts. Fix stale SQLite reference in
doc/CONTROLPLANE-AIDER-PI.md. Answer open questions and check off
completed tasks in the Aider+Pi handoff doc.
---
Build: pass | Tests: not run (Linux)
Mirrors Paperclip's per-adapter ensureCommandResolvable pattern as a single
fail-fast gate at the top of `setup onboard`. Probes {claude, codex, gemini,
pi} via commandExists; throws NoAgentCliError if none resolve. Also surfaces
all four in `setup verify` alongside the existing CODEX check.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: FAIL — Tests 1 failed | 846 passed (847)
Onboarding was writing WARDEN_GIT_IP=.4 and WARDEN_OLLAMA_IP=.6 —
reversed from the canonical Ansible/live scheme (.6=git, .5=ollama).
Also fix git.ts feature gate to skip on either FEATURE_GIT=false OR
CODE_HOSTING_MODE=external (was requiring both).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 605 passed (605)
applyHostLocale() was writing whatever charset was detected on the host
(including ISO8859-2) verbatim into ~/.login_conf, silently breaking
Slovenian character rendering on next login.
- Always strip the charset suffix from the detected locale tag and
rewrite it as <base>.UTF-8 — sl_SI.ISO8859-2 → sl_SI.UTF-8
- charset field is always written as UTF-8
- Replace both 'tmux kill-server && tmux' suggestions with instruction
to open a new tmux window or fresh SSH login
- Add UTF-8 compliance section to AGENTS.md documenting the rule,
normalisation table, and the cap_mkdb requirement
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 431 passed (431)
Dropped inferGender() heuristic. The installer now shows the current
.env value (or 'n') as default and requires explicit user selection.
No guessing from name endings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 431 passed (431)
src/agent-identity.ts (new): AgentIdentity resolves name, gender, locale
into pronoun/possessive/title/selfIntro. FORMS map supports sl (full
gendered grammar: asistentka/asistent, ona/on) and en (neutral fallback).
resolveAgentIdentity() exported for onboarding preview before .env write.
src/config.ts: AgentGender type ('m'|'f'|'n'), AGENT_GENDER export.
Accepts 'ž' as alias for 'f' (Slovenian natural input).
src/agent-runner.ts: AGENT_IDENTITY.selfIntro prepended to every pi
system prompt — agent always knows who it is grammatically.
setup/onboarding.ts: gender question after assistant name in both
bsddialog (menu with live preview per gender) and TTY (prompt + preview
line) paths. inferGender() suggests female for names ending in 'a'.
Confirmation screen shows full identity preview. AGENT_GENDER written
to .env.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 431 passed (431)
- Create freebsd-timezones.ts with IANA timezone list (Europe/Ljubljana first as Slovenian prototype default)
- Add TimezoneOption interface and helper functions (getTimezoneOptions, prioritizeTimezones, findTimezoneOption, isValidTimezone, formatTimezoneLabel)
- Add showTimezoneMenu function for bsddialog timezone menu selection
- Update onboarding to show timezone as interactive dropdown menu (like locale)
- Support locale + timezone selection in same step, both with defaults and menu options
- Slovenian language (sl-SI) is first in locale list, Europe/Ljubljana is first in timezone list
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
---
Build: pass | Tests: FAIL — Tests 2 failed | 487 passed | 10 skipped (499)
Update onboarding wizard to prioritize sl-SI (Slovenian) locale
and Europe/Ljubljana timezone by default:
- Add 'sl-SI' as first priority in locale enumeration
- Default timezone to Europe/Ljubljana if not detected
- Makes installation flow more suitable for development/testing
This allows developers to run setup steps without specifying
locale flags while keeping FreeBSD-detected values as fallback.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
---
Build: pass | Tests: FAIL — Tests 2 failed | 487 passed | 10 skipped (499)
bsddialog writes the selected item to stderr by default (not stdout).
The previous code used --stdout which, when stdout is piped (non-TTY),
causes bsddialog to dump all terminal escape codes + the tag to stdout,
making .trim() return escape-sequence garbage instead of the bare tag.
Switch to spawnSync with stdio: ['inherit', 'inherit', 'pipe'] so that
the TUI renders on the inherited TTY (stdin/stdout) while the selection
tag is captured cleanly from result.stderr.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---
Build: pass | Tests: pass — Tests 414 passed | 10 skipped (424)
- Add bsddialog --menu profile selector to onboarding.ts interactive flow
(shows all 10 PI profiles after assistant name, before Stripe config)
- Add --pi-profile CLI arg for non-interactive use
- Write PI_TUI_PROFILE to .env and include in confirmation summary + status
- Add missing 'hosts' step to available step entrypoints list in README
- Add 'cnc' profile to PI Profiles section in README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
After the bsddialog wizard confirms a locale selection, write it to
~/.login_conf and run cap_mkdb so it survives reboots and new logins.
Show a respawn reminder since setup runs inside tmux and the server
inherits env at startup.
Document the full pattern in freebsd-admin/references/locale-setup.md,
extend freebsd-admin and tmux-screenshot skills with scope and workflow
pointers, and add Locale & Identity as step 0 in the setup skill.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>