Commit graph

392 commits

Author SHA1 Message Date
3078d50f05 Merge pull request 'feat(iso): wire Colibri OOTB defaults + opt-in Mother MCP link' (#96) from colibri-ootb-mcp-defaults into main 2026-06-21 19:22:42 +02:00
02507476b8 Merge pull request 'feat(join-hive): capture vault creds and pull provider keys on first boot' (#95) from joinhive-cred-capture into main 2026-06-21 19:22:22 +02:00
34259e3312 feat(join-hive): confirm the auto-spawned Pi after daemon restart
Per Hermes' review of the cred-capture flow: after the daemon restart that
loads the pulled keys, poll colibri status (up to 10s) for a live agent so the
operator sees confirmation that the Pi auto-spawn actually came up — instead of
just "daemon restarted". Prints "Pi agent is live." or a check hint.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 18:59:15 +02:00
a788d99967 feat(iso): wire Colibri OOTB defaults + opt-in Mother MCP link
Workstream C of the next ISO rebuild.

C1 — Auto-spawn lit up out of the box:
  provider.env now ships COLIBRI_AUTOSPAWN_PI="YES", so colibri#137 fires on
  the booted image once a DeepSeek key is present (pulled by Join Hive, A).

C2 — External MCP registry staged:
  /usr/local/etc/colibri/external-mcp.json shipped as {"servers":{}} at the
  path colibri-mcp reads by default. Empty = mother off by default.

C3 — Opt-in "Enable Mother Link" (clawdie-enable-mother + desktop entry):
  Direction is "our Pi calls mother's tools" — colibri-mcp dials OUT to mother
  over SSH-stdio and proxies mother's tools to the Pi via its external-call
  path. The toggle:
   - provisions an SSH identity for the colibri service account
     (/var/db/colibri/.ssh — the daemon and its Pi run as `colibri`),
   - writes the mother entry into external-mcp.json (ssh -i <key> ... mother),
   - upserts COLIBRI_MCP_EXTERNAL_CALL=1 into provider.env,
   - restarts the daemon and prints colibri's pubkey to authorize on mother.

provider.env.sample documents the new toggles. sh -n clean on all scripts;
the empty default and the emitted mother entry validate as JSON and match the
ExternalMcpRegistry {servers:{command,args,env}} shape.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 18:53:41 +02:00
f9e47ab516 feat(join-hive): capture vault creds and pull provider keys on first boot
Workstream A of the next ISO rebuild. The booted XFCE image's "Join Hive"
flow now collects the 3 Vaultwarden bootstrap values and pulls the provider
keys, instead of only warning when they are missing.

Step [2/4] now:
- If provider.env lacks BW_*, prompts for BW_CLIENTID/BW_CLIENTSECRET/
  BW_PASSWORD (secret + password read with echo off) and upserts them into
  provider.env (root-owned 0600). Entering nothing skips — manual floor intact.
- Then runs clawdie-vault-fetch against provider.env (as bootstrap and as
  --write-env target) to pull DEEPSEEK_API_KEY (and other agent-secrets), and
  restarts colibri_daemon so it loads the new keys — which triggers the Pi
  auto-spawn (colibri#137).

Secrets never appear in process arguments: values stay in shell variables and a
0600 temp under ~/.cache/clawdie; provider.env is read/written via mdo. The
upsert preserves the endpoint line and other keys (verified: special characters
in the secret/password survive, no duplicate BW_* lines).

provider.env stays the single secret store — the daemon's vault provisioning and
the existing provider_env_has_bw_creds check already assume that.

sh -n clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 18:22:45 +02:00
3b96c5215d docs: document ISO versioning & release schema in AGENTS.md
The product-version scheme was only captured in scattered build.cfg/build.sh
comments and agent memory. Promote it to contributor-visible guidance:
- ISO_VERSION is an explicit product version in build.cfg (0.11.0, unified
  with Colibri); no-version builds fail fast; image name = codename + version.
- Component versions are provenance in build-manifest.json (version_scheme
  "product"), not the image identity.
- BUILD_CHANNEL dev|release; release gate (build.sh:check_release_gate)
  requires clean staged trees so the manifest fully describes the artifact.

Matches shipped code; no behavior change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 16:47:23 +02:00
0deaae2586 Merge pull request 'fix(build): resolve shared npm snippet via COLIBRI_REPO + preflight it' (#93) from harden-shared-npm-snippet into main
Reviewed-on: #93
2026-06-21 16:41:01 +02:00
eec69caa5f fix(build): resolve shared npm snippet via COLIBRI_REPO + preflight it
PR #92 wired the ISO to the shared clawdie-npm-profile.sh but hardcoded
${SCRIPT_DIR}/../colibri and had no existence guard. Every other colibri
consumer in build.sh resolves through resolve_colibri_paths (default
/home/clawdie/ai/colibri, honoring COLIBRI_REPO), so the hardcoded path
diverged from the real build-host layout and ignored the override; a
missing file let cat fail silently into a half-written snippet.

Now: resolve via resolve_colibri_paths and preflight the file with a
clear error pointing at COLIBRI_REPO, matching preflight_colibri_artifacts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 16:39:25 +02:00
4a43e6d0d6 Merge pull request 'fix(build): source shared npm-global snippet instead of inline heredoc' (#92) from fix/unify-npm-profile-snippet into main
Reviewed-on: #92
2026-06-21 16:25:34 +02:00
ac8be1f7d3 Merge pull request 'merge/usb-to-disk-strategies' (#91) from merge/usb-to-disk-strategies into main
Reviewed-on: #91
2026-06-21 16:25:03 +02:00
ef3b4889b2 Merge branch 'main' into merge/usb-to-disk-strategies 2026-06-21 16:24:49 +02:00
e4ff0a9bd3 Merge pull request 'docs(plan): replace Track C with 3 USB→disk deploy strategies' (#90) from docs/usb-to-disk-deploy-strategies into main
Reviewed-on: #90
2026-06-21 16:24:05 +02:00
15d298f975 fix(build): source shared npm-global snippet instead of inline heredoc
Completes colibri#122. The ISO now installs the canonical
clawdie-npm-profile.sh from colibri (same file agent-jail-bootstrap
uses). The ISO-specific clawdie.sh sources it rather than
duplicating the npm PATH + npm config lines.
2026-06-21 16:21:13 +02:00
c029841ce9 Merge: 3 USB→disk deploy strategies (C1/C2/C3) 2026-06-21 15:24:25 +02:00
278ea10c63 docs(plan): replace Track C with 3 USB→disk deploy strategies
Track C rewritten: old TS tarball-deploy plumbing replaced with
the clawdie Rust binary strategies (C1: CLI, C2: wizard, C3: declarative).

References the existing clawdie crate in Colibri (discover → plan → apply).
C1 is zero new code — needs only 1 destructive validation test.
2026-06-21 14:26:52 +02:00
53d1212ad9 Merge pull request 'docs: define clawdie-iso as USB dev surface + Clawdie service installer' (#89) from docs/clawdie-bare-metal-identity into main
Reviewed-on: #89
2026-06-21 14:20:37 +02:00
b2f9f03e9e docs: define clawdie-iso as USB dev surface + Clawdie service installer
Project Identity added: the ISO builds the operator USB which is both
the Colibri development surface AND the Clawdie bare-metal service
installer. Clawdie service target: ZFS RAID1, PostgreSQL + pgvector,
bhyve VMs, Bastille jails.
2026-06-21 14:16:33 +02:00
99755fa8b7 Merge pull request 'docs: rewrite negative patterns to positive actionable instructions' (#88) from docs/positive-language-rewrite into main
Reviewed-on: #88
2026-06-21 14:01:59 +02:00
f10216db12 docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.

Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
  private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
  SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
  tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
  bhyve gating, dashboard dependencies, seed checkout exclusions

Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
d1d420fb91 Merge pull request 'docs(build): OSA disk policy + corrected cleanup one-liner' (#87) from docs/build-host-disk-policy into main 2026-06-21 12:25:17 +02:00
Sam & Claude
86b218ac6c fix(build): correct the disk-cleanup paths to real build artifacts
The one-liner's `output/FreeBSD-*.img` matched nothing — OUTPUT_DIR is
tmp/output, the built image is clawdie-*.img, and the cached memstick lives in
tmp/cache (FreeBSD-*-memstick.img). Replace with `tmp/packages tmp/cache
tmp/output` — clears bundled packages, all caches (incl. work.img + the cached
memstick), and built outputs; all regenerable, all under repo-local tmp/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 12:24:51 +02:00
2d2a757646 docs(build): add cleanup one-liner, /tmp note, mother-build PLANNED marker 2026-06-21 12:17:57 +02:00
1c427bb93b docs(build): record OSA disk policy and mother-build rationale (Sam & Codex) 2026-06-21 12:12:29 +02:00
aa364c3b01 Merge pull request 'feat(pkg): FreeBSD hermes runtime baseline — ffmpeg, py311-pillow, python311' (#86) from feat/freebsd-hermes-runtime-pkgs into main 2026-06-21 10:28:54 +02:00
Sam & Claude
47757da758 feat(pkg): FreeBSD hermes runtime baseline — ffmpeg, py311-pillow, python311
Tier 1 of the hermes out-of-the-box dependency sweep. hermes is a Python/uv app
(requires-python >=3.11,<3.14) whose venvs use --system-site-packages, so system
py311-* pkgs satisfy compiled deps without building.

- ffmpeg: hermes runtime baseline (installer) + voice-transcription/media skills.
- py311-pillow: Pillow is a hermes CORE dependency; the --system-site-packages
  venv picks up the prebuilt system pkg (no source build).
- python311 explicit (python3 = 3.11 after the default flip); python312 stays.
- Fix the stale "python312 owns python3" comment.

Covers hermes core + telegram gateway + voice. Tier 2 (discord-voice libsodium/
opus, astro vips, ollama/llama-cpp) pending confirmation of default integrations.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:26:30 +02:00
6d6a3c4ca1 Merge pull request 'feat(operator): python3=3.11 default on FreeBSD + image-render/screenshot skill' (#85) from feat/freebsd-image-render-skill into main 2026-06-21 10:14:37 +02:00
Sam & Claude
7ee7c55bed feat(operator): python3=3.11 default on FreeBSD + image-render/screenshot skill
Stop fighting FreeBSD's PYTHON_DEFAULT=3.11: make python3 resolve to 3.11
(python312 stays installed and available as python3.12 for anything needing
newer). This also makes Pillow trivial — py311-pillow imports on plain python3,
so the image-render/screenshot skill needs no version gymnastics.

- build.sh: python3/python symlink → 3.11 (prefer python3.11, else lowest).
- pkg-list-live-operator.txt: add py311-pillow.
- clawdie-join-hive.sh: advertise image-render when `python3 -c import PIL`
  works, and screenshot when $DISPLAY is set.
- BUILD.md: short note (python3=3.11; python3.12 available; image-render via
  py311-pillow).

Validated: sh -n build.sh + join-hive clean; markdown gate clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:08:07 +02:00
fdb6b912ac Merge pull request 'docs: document Python 3.11/3.12 coexistence with FreeBSD defaults' (#84) from docs/python-311-coexistence into main
Reviewed-on: #84
2026-06-21 09:37:56 +02:00
940404d612 docs: document Python 3.11/3.12 coexistence with FreeBSD defaults
FreeBSD pkg repos build against PYTHON_DEFAULT=3.11, so system packages
(git, libinput, npm-node24) pull python311 as transitive deps. We keep
python312 as the application Python — it wins the python3 symlink via
sort -V. Document this in BUILD.md, build.sh, package lists, and
bootstrap.html so the dual-version reality is explicit and intentional.
2026-06-21 09:36:28 +02:00
b892a9c64e Merge pull request 'fix/colibri-test-agent-stage-mode' (#83) from fix/colibri-test-agent-stage-mode into main
Reviewed-on: #83
2026-06-21 08:13:14 +02:00
5cd0d6d3f0 docs(colibri): describe test-agent staging as explicit build mode (Sam & Codex) 2026-06-21 08:11:39 +02:00
14248b6a20 feat(colibri): gate test-agent staging by build mode (Sam & Pi)
Add COLIBRI_STAGE_TEST_AGENT with dev/release defaults so validation builds can include colibri-test-agent while production/release operator USB images omit it by default. Keep poudriere guidance test-friendly and document binary roles in BUILD.md.\n\nValidation: sh -n build.sh scripts/stage-colibri-iso.sh live/operator-session/colibri-live-rebuild; ./scripts/check-format.sh; ./scripts/test-release-gate.sh; build.cfg default/override checks.
2026-06-21 07:55:24 +02:00
a1f8efd7bf Merge pull request 'docs: release 0.11.0 ISO builder handoff' (#82) from docs/release-0.11.0-handoff into main
Reviewed-on: #82
2026-06-21 07:08:39 +02:00
Sam & Claude
d02f8b1423 docs: release 0.11.0 ISO builder handoff for the FreeBSD build host
Concise, release-specific handoff for codex/osa: repo state at unified 0.11.0
(commits + tags), the release-channel build command, the release-gate clean-tree
requirement (iso/colibri/clawdie-ai/zot), and the two caveats for this build —
colibri ships as raw FreeBSD binaries (poudriere/Phase 4 deferred until
mother-build) and CI is dormant (validate via local gates, not forge checks).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 07:07:55 +02:00
7f55770746 Merge pull request 'fix(packages): align agent jail package list with bootstrap (Sam & Pi)' (#81) from fix/issue-70-agent-jail-packages into main
Reviewed-on: #81
2026-06-20 22:32:31 +02:00
5625bf9786 fix(packages): align agent jail package list with bootstrap (Sam & Pi)
Add an agent-jail section to pkg-list-jails.txt mirroring Colibri agent-jail-bootstrap.sh, include python312, and use npm-node24 instead of generic npm. This satisfies issue #70 acceptance and resolves the npm package-name drift in favor of the node24-tied package.\n\nValidation: ./scripts/check-format.sh; sh -n build.sh; git diff --check
2026-06-20 22:31:32 +02:00
ec2a73d267 Merge pull request 'release/iso-0.11.0' (#80) from release/iso-0.11.0 into main
Reviewed-on: #80
2026-06-20 22:26:22 +02:00
Sam & Claude
c5fdb57b78 docs(poudriere): colibri port license is MIT (was AGPLv3 reference)
Match the colibri relicense (AGPL-3.0 -> MIT, same as layered-soul) in the
build-server doc's port key-facts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 22:06:18 +02:00
Sam & Claude
d8927de671 release: bump Clawdie version to 0.11.0 (unify clawdie-iso + colibri)
- build.cfg: ISO_VERSION 0.10.0 -> 0.11.0; reword the version note — clawdie-iso
  and colibri now share one unified Clawdie release version (zot/clawdie-ai stay
  provenance in build-manifest.json).
- CHANGELOG: [0.11.0] entry (date in EU format DD.mon.YYYY per AGENTS rule)
  covering the versioning unify, operator-session hardening, poudriere
  build-server scripts, and the duplicate-port retirement.

colibri Cargo.toml + port DISTVERSION bump to 0.11.0 lands in the colibri repo
(separate branch). Tags held until both bumps merge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 21:52:52 +02:00
8fa6e1f3ca Merge pull request 'cleanup: retire duplicate Colibri port; colibri repo owns it' (#79) from cleanup/colibri-owns-the-port into main
Reviewed-on: #79
2026-06-20 21:39:20 +02:00
Sam & Claude
d9a469a418 cleanup: retire duplicate Colibri port; colibri repo owns it
The canonical Colibri FreeBSD port lives in the colibri repo
(packaging/freebsd/port/sysutils/colibri), kept with the code it builds and
guarded by a CARGO_CRATES drift check in colibri CI. The copy here was a
divergent duplicate (wrong LICENSE=MIT vs AGPLv3, CARGO_BUILD=no skeleton that
could not build, different binary set) that the drift check could not protect.

- delete ports/sysutils/colibri/ (no longer maintained here)
- build.sh release gate: fail if ports/sysutils/colibri/ reappears, pointing at
  the canonical location — keeps the cleanup structural, not just one-time
- docs/POUDRIERE-BUILD-SERVER.md + scripts/poudriere/README.md: state colibri
  owns the port, copy it into the ports tree, this repo keeps no duplicate

Validation: build.sh sh -n clean; release-gate self-test passes; guard fires on
a reintroduced dir; markdown gate clean. Nothing references the deleted path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 21:37:47 +02:00
2eb2ae06b4 Merge pull request 'cleanup(tmp): remove Clawdie-owned host tmp paths (Sam & Pi)' (#78) from cleanup/prebuild-tmp-and-stale-prs into main
Reviewed-on: #78
2026-06-20 21:15:37 +02:00
65015b0c70 cleanup(tmp): remove Clawdie-owned host tmp paths (Sam & Pi)
Broaden prebuild cleanup by documenting project-local tmp policy, syncing the hardened wallpaper/join-hive helpers, moving vault/no-blank scratch under runtime/cache dirs, and keeping release-gate scratch under repo tmp.\n\nValidation: ./scripts/check-format.sh; sh -n build.sh live/operator-session/clawdie-join-hive.sh live/operator-session/clawdie-wallpaper-gen.sh live/operator-session/clawdie-vault-fetch live/operator-session/clawdie-noblank-guard.sh scripts/test-release-gate.sh; ./scripts/test-release-gate.sh; clawdie-wallpaper-gen output test under repo tmp.
2026-06-20 21:07:05 +02:00
42930b2b52 Merge pull request 'fix(ports): use MASTER_SITES for Forgejo, not GH_ACCOUNT' (#77) from fix/colibri-port-forgejo into main 2026-06-20 17:36:09 +02:00
dd0fbb1fed fix(ports): use MASTER_SITES for Forgejo, not GH_ACCOUNT
- Replace GH_ACCOUNT+GH_PROJECT with MASTER_SITES pointing at
  code.smilepowered.org/clawdie/colibri/archive/
- Fix distinfo to match Forgejo archive naming (v0.0.1.tar.gz)
2026-06-20 17:35:53 +02:00
02897574e2 Merge pull request 'feat(ports): add sysutils/colibri FreeBSD port skeleton (v0.0.1)' (#76) from feat/colibri-freebsd-port into main 2026-06-20 17:35:19 +02:00
92b3ebacdd feat(ports): add sysutils/colibri FreeBSD port skeleton (v0.0.1)
- Makefile: USES=cargo, installs daemon + client + MCP + probe + inventory
- distinfo: SHA256 of v0.0.1 tarball from Forgejo
- files/: colibri_daemon.in + colibri_bridge.in rc.d scripts
- Port needs: colibri repo tagged v0.0.1 (done), CARGO_CRATES generation
  on FreeBSD (make cargo-crates), and a FreeBSD pkg build test
2026-06-20 17:34:47 +02:00
352a1d6da9 Merge pull request 'combined/iso-poudriere-livepower' (#75) from combined/iso-poudriere-livepower into main
Reviewed-on: #75
2026-06-20 17:24:36 +02:00
Sam & Claude
5c5ed57abe docs(live-power): document C3 wake-safety invariant; tidy rcorder block
clawdie_live_power is a one-shot boot script that applies the power_profile
C-state policy once (FreeBSD's power_profile is nostart and otherwise only
runs on a devd AC-line transition). Comment-only clarification — no behavior
change:

- Move the PROVIDE/REQUIRE/BEFORE/KEYWORD rcorder block to the top (convention;
  rcorder scans the whole file, so behavior is identical).
- Document scope explicitly: this selects a CPU C-state/freq profile ONLY —
  never suspend/sleep/blank/DPMS (screen-blank is the separate no-blank stack).
- Record the wake-safety invariant: both AC (0x01) and battery (0x00) branches
  are safe because rc.conf pins performance_cx_lowest AND economy_cx_lowest to
  C3, so neither can select a deeper C-state that breaks USB resume. Guard-rail
  for future editors: do not deepen on the live USB.

sh -n clean; rcorder tags intact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 17:22:28 +02:00
Sam & Claude
95c0cf879f docs(poudriere): point port section at canonical colibri port; fix MIT→AGPLv3
The inline Makefile example claimed LICENSE=MIT (wrong — colibri is
AGPL-3.0-only) and duplicated what now lives canonically in
colibri/packaging/freebsd/port/. Replace the snippet with a pointer + the
corrected key facts (license, binaries shipped, generated files).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 17:22:28 +02:00