11 Commits
Author SHA1 Message Date
m3ta-chiron cbe284dfae chore(beads): log issue tracker state transitions 2026-08-23 17:48:42 +02:00
m3ta-chiron 1b2fcb6fbb feat: recursive skill discovery + tree-url type-root folding
- skills are found at any depth under the skills dir, so category-nested
  layouts (skills/<category>/<id>/SKILL.md) vendor correctly; the folder
  basename is the upstream id and the outermost SKILL.md wins over anything
  nested inside a skill folder
- web-tree urls pointing directly at a type directory (.../tree/main/skills)
  now map that directory as the type root instead of nesting it under the
  default layout
- verified against the real github.com/mattpocock/skills repository
  (36 skills across categories; include-selection by basename)
2026-08-23 14:50:56 +02:00
m3ta-chiron 67cd4e4737 feat: e2e acceptance script, README and fleet handoff docs
- scripts/e2e-acceptance.sh: offline spec walk (fixture upstream -> vendor
  add/determinism/collisions/renames -> validate/list/inspect -> update
  cycle -> employee sync -> idempotence -> protected sync -> deletions ->
  status drift -> unreachable repo), 61 assertions on tree, lockfile,
  manifest and exit codes
- README: installation, curator guide (selection rules, renames), client
  guide (three-state semantics, notifications), security model,
  troubleshooting, scope
- docs/fleet-handoff.md: rollout (pinned release, admin-protected config,
  user-context scheduled task), token rotation, ADR draft superseding the
  exact-mirror doctrine, fleet verification checklist
2026-08-23 10:43:41 +02:00
m3ta-chiron 949a431c4c feat: status command + windows toast notifications
- status: read-only report of deployed/repository revision, pending changes,
  skipped items (with reasons), unrecognized local items, binary version;
  --json machine-readable; exit 1 when local modifications block repository
  updates (headless drift checks)
- sync/status share a read-only prepare() front half
- notify package: windows toast via PowerShell script (go-toast mechanism,
  zero deps, build-tag gated), noop on linux/macos; cross-compile verified
- toast fires exactly once per sync with warnings, never for routine syncs;
  notification failures are logged and never fail the sync (fail-open)
2026-08-23 10:40:25 +02:00
m3ta-chiron 63619b90a4 feat: three-state sync planner with warning semantics
- Plan is a pure function (inventory, manifest, disk facts, injected path
  mapping) emitting exactly six actions: deploy, update, skip+warn,
  leave+warn, remove, keep — deterministic order, no filesystem access
- full 3x3 matrix (disk unmodified/user-modified/never-managed x upstream
  added/changed/removed) table-tested plus missing-disk restore cases,
  a mixed fixture and a purity/determinism guarantee test
- executor applies plans item by item (atomic deploy/remove per item),
  rewrites the manifest once, appends timestamped SKIP/LEAVE lines with
  item name and reason to the sync log
- sync now plans before mutating: unmanaged occupants block new deploys,
  upstream deletions remove only unmodified copies, local modifications
  always win and are warned about
2026-08-23 10:36:44 +02:00
m3ta-chiron 49dbcf469e feat: client sync core — config, pull, inventory, manifest, OpenCode target
- admin-protected client config (flag > AGENT_LIB_CONFIG > platform default),
  token used for basic auth only, redacted from all errors and files
- work-repo pull via go-git (bare cache clone + fetch, remote re-pointed on
  config change), clean failure keeps previous state
- inventory: own items + external areas from lockfile; MCP inventoried but
  never deployed
- manifest v1 records name/type/origin/revision/content-hash per item,
  deterministic bytes; folder hashes over sorted relpath+filehash lines so
  tree and disk hashes agree
- shared deploy package (atomic temp+rename, exec-bit preserving) now backs
  both curator materialization and client deployment
- sync validates and hashes everything before the first mutation; second run
  is a byte-level no-op
2026-08-23 10:31:00 +02:00
m3ta-chiron b4bd57a22f test: fix vendor list fixture for collision-guarded namespace 2026-08-22 21:56:50 +02:00
m3ta-chiron 36ce7dd747 feat: collision hard errors + rename resolution
- flat per-type deployed namespace enforced across own items and all sources
- own-vs-vendored and vendored-vs-vendored collisions abort with both parties named
- --rename upstream=deployed resolves collisions; on-disk folder always equals
  deployed name; rename targets are validated against new collisions
- checks run before any tree mutation; validate re-checks the namespace offline
2026-08-22 21:56:21 +02:00
m3ta-chiron 484a15797c feat: validate + vendor list/inspect with --json
- validate: offline hard rules (all+include, exclude-without-all, orphaned
  include entries vs pinned inventory) and lockfile/external-area divergence
- vendor list: name/url/ref/rev/mode/item counts, human + json
- vendor inspect: per-type inventory with frontmatter metadata and recorded
  warnings read from the external area, human + json
- exit code 1 on invalid state for headless drift checks
2026-08-22 21:54:32 +02:00
m3ta-chiron 2c7200380b feat: vendor add end-to-end with deterministic lockfile v2
- go-git in-process clone, default-branch/tag resolution, optional token auth
- web-tree URL normalization (github/gitlab) with implied discovery root
- discovery of skills/commands/agents/mcp, lenient frontmatter with warnings
- selection: all by default, --include with missing-entry hard errors
- external/<source>/<type>/ materialization preserving exec bits
- lockfile v2: deterministic JSON, pinned url/ref/rev, inventory, warnings
- offline black-box e2e suite against local fixture git repositories
2026-08-22 21:52:30 +02:00
m3ta-chiron 8d34426864 chore: preserve beads tracker and adopt Go gitignore after python-era reset 2026-08-22 21:41:05 +02:00