Standalone binary distribution, forgejo-mcp pin fix, allow-list/deny-list terminology (v0.3.0) #1

Merged
goern merged 5 commits from goern/castra:main into main 2026-07-31 09:23:33 +00:00
Owner

Brings agentic-forges/castra up to date with the work on goern/castra, and cuts the surface needed for a v0.3.0 release.

Contents

  • fix: pin forgejo-mcp to the v2.30 minor series (compare major.minor) so patch releases pass while a minor bump still fails loud; an empty --cli stdout now reports the tool's real error instead of blaming the version pin; selftest picks its default target per forge host
  • fix: resolve persona skills from CASTRA_HOME rather than the clone, so a lane can triage an issue whose code lives in another checkout
  • chore: house terminology settled on allow-list / deny-list, enforced by a list-terminology pre-commit hook and recorded in AGENTS.md
  • feat: ship castra as a standalone binary — install.sh (curl-pipe, checksum-verified), scripts/release-build.sh (cross-compiles linux-x64, linux-arm64, darwin-arm64), install:local / release:build scripts; version 0.3.0

Note on history

Upstream main carries 719b622; this branch replaces it with db07c53 — the same tree and message, re-signed with the correct key. The merge will therefore show that change twice. Content is identical, so no conflict is expected.

204 tests pass; biome, typecheck and the terminology hook are green.

Brings `agentic-forges/castra` up to date with the work on `goern/castra`, and cuts the surface needed for a `v0.3.0` release. ### Contents - **fix:** pin `forgejo-mcp` to the `v2.30` minor series (compare major.minor) so patch releases pass while a minor bump still fails loud; an empty `--cli` stdout now reports the tool's real error instead of blaming the version pin; `selftest` picks its default target per forge host - **fix:** resolve persona skills from `CASTRA_HOME` rather than the clone, so a lane can triage an issue whose code lives in another checkout - **chore:** house terminology settled on allow-list / deny-list, enforced by a `list-terminology` pre-commit hook and recorded in `AGENTS.md` - **feat:** ship castra as a standalone binary — `install.sh` (curl-pipe, checksum-verified), `scripts/release-build.sh` (cross-compiles linux-x64, linux-arm64, darwin-arm64), `install:local` / `release:build` scripts; version 0.3.0 ### Note on history Upstream `main` carries `719b622`; this branch replaces it with `db07c53` — the same tree and message, re-signed with the correct key. The merge will therefore show that change twice. Content is identical, so no conflict is expected. 204 tests pass; biome, typecheck and the terminology hook are green.
- forgejo-mcp: compare only major.minor against the pin, so v2.30.2 and
  later patch releases pass while a minor bump still fails loud
- forgejo-mcp: an empty --cli stdout is the tool erroring (bad target, bad
  token), not envelope drift — report its real error instead of blaming
  the version pin
- selftest: pick the default target per forge host; machdenstaat/lage#41
  does not exist on git.b4mad.industries. CASTRA_SELFTEST_URL still wins,
  unknown hosts keep the bash norm's target

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
House wording is positive-list / negative-list — never whitelist/blacklist,
and not the allow/deny pair either.

- hack/check-list-terminology.sh + a pre-commit hook that rejects the banned
  variants (hyphen/space/case included) in staged files; `terminology-ok` on
  the line is the escape hatch for an unavoidable verbatim quote
- intake skill: a hard rule, so verdicts land in public issue comments with
  the right wording
- fix the two live occurrences in .castra/personas/

attic/ is excluded — archived reference, left as its authors wrote it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Persona prompts said `Read .agents/skills/<name>/SKILL.md`, resolved against
the cloned target repo. A repo shipping no skills of its own therefore gave
the agent no method and no output contract — it would improvise an off-schema
verdict or trip the gate. code/fix papered over this by seeding skills into
the checkout with `cp -rn`; intake had no seeding at all and simply broke.

- castraSkills() mirrors castraHome(): CASTRA_SKILLS > <cwd>/.agents/skills >
  CASTRA_SKILLS_FALLBACK > /opt/castra/.agents/skills — the target repo's own
  skills still win, the image copy is the fallback
- renderPrompt() binds {{SKILLS}} to that absolute path; unbound still shows
  up in the existing unresolved-placeholder warning
- persona-run resolves against the persona's workingDir, not castra's cwd —
  the agent runs in the clone, not here
- retire the duplicated `cp -rn` seeding from castra-code/castra-fix

Verified across all three branches: skill-less dir → image fallback, castra
itself → its own tree, CASTRA_SKILLS → the override.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Supersedes e4f07e8, which banned the allow/deny pair as well. The house
wording is allow-list / deny-list; only the white/black pair is rejected.

- guard now matches white/black variants only, so allow-list/deny-list pass
- AGENTS.md records the convention, the hook, and the `terminology-ok`
  escape hatch for verbatim upstream quotes
- intake skill rule and the two .castra/personas/ comments follow suit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
No bun, node or npm needed at runtime.

- install.sh: curl-pipe installer, fetches a released .gz asset into
  ~/.local/bin and verifies it against SHA256SUMS; pins the protocol so a
  redirect cannot downgrade https
- scripts/release-build.sh: cross-compiles every released target
  (linux-x64, linux-arm64, darwin-arm64) into dist/release/
- package.json: `install:local` builds and installs for this machine;
  `release:build` cuts the assets; bin points at the compiled ./dist/index
- README: install, local-build and cut-a-release sections
- version 0.2.0 → 0.3.0 across package.json, bunli.config.ts and
  src/version.ts (test/version.test.ts asserts they agree)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
goern merged commit 1c0c7e2199 into main 2026-07-31 09:23:33 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
agentic-forges/castra!1
No description provided.