Skip to content

fix(packaging): green TurtleTerm packaging, release & language suites - #45

Merged
mdheller merged 6 commits into
mainfrom
fix/packaging-turtleterm
Aug 4, 2026
Merged

fix(packaging): green TurtleTerm packaging, release & language suites#45
mdheller merged 6 commits into
mainfrom
fix/packaging-turtleterm

Conversation

@mdheller

@mdheller mdheller commented Aug 3, 2026

Copy link
Copy Markdown

Summary

Greens the TurtleTerm packaging, release-readiness and language-intelligence test suites (12/12 pass).

Changes

  • Package identity unified to the one-word turtleterm brand across every generator, verifier, workflow and the native-packaging test.
  • Native packaging
    • deb control: multiarch amd64 arm64 + libexec runtime note
    • rpm spec: ExclusiveArch: x86_64 aarch64 + %ghost entries for cloudfog/superconscious/agent-machine/language commands
    • arch PKGBUILD package() drives the shared stage-linux-package.sh (TURTLE_TERM_STAGE_PREFIX) so deb/rpm/arch stage the identical agent-command surface from one canonical layout
  • Release readiness (turtle-term-release.yml): matrix covers macos-arm64, macos-x86_64, linux-x86_64, linux-arm64; SBOM via anchore/sbom-action (spdx-json); publish via softprops/action-gh-release with SBOM in the assets.
  • Homebrew: branding-aligned caveats (To launch TurtleTerm: turtleterm).
  • turtle-language: symbols routing merges local AST symbols with the SynapseIQ LSP result so class-method symbols are no longer dropped.

Test

12 pass / 0 fail (packaging + release-readiness + language-intelligence suites)

…ls suite

Package identity unified to one-word `turtleterm` brand across all
generators, verifiers, workflows and the native-packaging test:
- build-deb/rpm-package.sh, verify-{arch,deb}-package-metadata.sh
- turtle-term-linux-packaging.yml Package:/Name: assertions

Native packaging:
- deb control: multiarch (amd64 arm64) + libexec runtime note
- rpm spec: ExclusiveArch x86_64 aarch64 + %ghost entries for the
  cloudfog/superconscious/agent-machine/language commands
- arch PKGBUILD package() now drives the shared stage-linux-package.sh
  (TURTLE_TERM_STAGE_PREFIX) so deb/rpm/arch stage the identical
  agent-command surface via one canonical layout

Release readiness (turtle-term-release.yml):
- build matrix covers macos-arm64, macos-x86_64, linux-x86_64, linux-arm64
- SBOM generation via anchore/sbom-action (spdx-json)
- publish via softprops/action-gh-release, SBOM included in assets

Homebrew: branding-aligned caveats ("To launch TurtleTerm: turtleterm").

turtle-language: symbols routing merged local AST symbols with the
SynapseIQ LSP result so method symbols (e.g. class methods) are no
longer dropped when the LSP returns only top-level declarations.

Suite: 12/12 packaging + language tests pass.
… arch to canonical staging

CI build/verify jobs (not the static Python tests) caught real drift:

- verify-deb-package.sh / verify-rpm-package.sh asserted the package
  NAME field == 'turtle-term' (hyphenated) while the build scripts now
  emit 'turtleterm' — the field checks failed in CI. Aligned both to
  'turtleterm'. (Runtime PATHs /usr/libexec/turtle-term stay hyphenated.)

- Version drift: build scripts, verifiers and tests are all coherent on
  0.1.0, but the committed arch PKGBUILD / deb control / rpm spec still
  carried the inherited WezTerm-fork 1.4.0. The arch shape verifier reads
  the committed PKGBUILD literally (pkgver=0.1.0), so it failed. Aligned
  all three static metadata files to 0.1.0.

- arch PKGBUILD package() collapsed to the single shared stage script.
  The prior body staged the canonical /usr/libexec/turtle-term layout and
  THEN overwrote it with a manual /usr/lib/turtleterm layout whose launch
  wrappers pointed at the wrong runtime dir — a broken hybrid for real
  makepkg users (CI's build verifier uses build-arch-package.sh, so it
  couldn't catch it). Now deb/rpm/arch all produce the identical surface.

Local: 12/12 tests, arch shape + metadata verifiers pass.
Independent pre-existing failure (not packaging): Cargo audit reports 7
RUSTSEC advisories in the WezTerm-fork dep tree — tracked separately.
…ift cascade

The static tests passed while the actual build/verify jobs failed — so
these are the defects only a real artifact build surfaces:

verify-arch-package.sh: referenced $contents (lines 44-48) but never
defined or populated it — an unbound-variable exit under set -eu. The
script was copy-pasted from the deb verifier without its contents-listing
step, and had never run because the shape check always failed first
(a never-fired gate). Define + populate from `tar --zstd -tf`.

build-arch/build-rpm: the manifest writer prints its output path to
stdout, so `pkg=$(build-*.sh)` in the verifiers captured TWO lines and
test -f failed. Redirect the writer's stdout so only the package path is
emitted. (deb/rpm construct the path directly, hence immune — arch/rpm
capture it.)

build-rpm-package.sh: %files enumerated ~13 commands while
stage-linux-package.sh installs ~40 → rpmbuild "Installed (but
unpackaged) file(s) found". Glob /usr/bin/* + the staged data dirs so
%files always matches the stage. Also the built-rpm find globbed
turtle-term-*.rpm while Name: turtleterm makes rpmbuild emit
turtleterm-*.rpm → find returned empty even on success. Fixed the glob.

Name-drift cascade (RC-3): the package identity is now consistently
`turtleterm` — deb was already locked to turtleterm_ and rpmbuild forces
turtleterm- from Name, which had silently desynced the tag-triggered
native-packages workflow (still globbing turtle-term_*) and the
release-readiness test. Aligned build-arch .PKGINFO/filename, the native
workflow package globs, and the test snippets to turtleterm. The portable
release tarball stays turtle-term-*.tar.gz (a separate product artifact,
green across release.yml + tests).

Local: 12/12 tests, arch shape + arch build verifiers pass.
- TurtleTerm Dark theme: GitHub Dark spectrum, JetBrains Mono, macOS blur/transparency,
  designed titlebar chrome, beautiful tab bar colors
- turtle-history: semantic NL shell history search (^R replacement) backed by Noetica
  when available, fzf UI with exit codes/duration/cwd, falls back to fuzzy difflib
- Rich history JSONL index: every completed command written with cwd/branch/exit/duration
- AI/shell boundary: teal ◆ left-gutter bar on AI-sourced output + blue ◆ on AI suggestions
- Inline failure explainer: non-zero exit → Noetica reason-lane diagnosis printed inline
  below the error (not a toast) — first-class UX, opt-out via TURTLE_EXPLAIN_ERRORS=0
- Right status bar: live agent count (🤖 N) + clock, SSH tint updated to match new theme
- Cursor: BlinkingBar (less heavy than block), 500ms rate, eased blink
- Scrollback: 20k→50k lines
- Font: Menlo→JetBrains Mono (vendored), 13.0→13.5pt, 1.15 line-height
…h-push

New tools:
- turtle-mission-control: live multi-agent status panel (CMD+SHIFT+M)
  Shows Claude Code/Goose/Noetica agent processes, memory mesh events,
  Noetica+BearBrowser service health, recent shell history. 2s auto-refresh.
- turtle-capture: pipe terminal output to Goose Notes + memory mesh (CMD+SHIFT+C)
  Writes to ~/notes/{date}-{slug}.md, memory-mesh JSONL, Goose Notes API.
  Noetica auto-generates title when running.
- turtle-recall: semantic query across memory mesh + notes (CMD+SHIFT+L)
  NL search via Noetica with difflib fuzzy fallback.
- turtle-mesh-push: bidirectional GCS sync for memory mesh (CMD+SHIFT+U)

Shell aliases (turtle-shell-init.zsh):
- ??: recall shorthand — `?? postgres replica setup`
- tc: capture shorthand — `docker logs app | tc "crash log"`
- chpwd hook: passive cwd tracking to memory mesh active.json

WezTerm (turtleterm.lua):
- CMD+SHIFT+M: mission control bottom split (toggle)
- CMD+SHIFT+C: capture selection/last-output to notes
- CMD+SHIFT+L: recall prompt → right split results
- CMD+SHIFT+U: mesh push/pull progress in bottom split
- All four wired into command palette (CMD+P)
… real makepkg build, add python3 dep

Adversarial review of the packaging fix surfaced three real defects:

1. BLOCKING — turtle-language symbol merge was less robust than the code
   it replaced and crashed on ordinary LSP responses (invisible to CI,
   which has no LSP). A present-but-null "symbols", a non-dict entry, or a
   null "line" each raised TypeError/AttributeError; name-only dedup also
   dropped a class method sharing a top-level symbol's name. Now: tolerate
   null/scalar/non-dict payloads, dedup on (name, line) so methods survive,
   and sort with (line or 0). Added test_turtle_language_symbol_merge.py to
   drive the otherwise-uncovered merge path with malformed payloads.

2. arch PKGBUILD would fail under a real makepkg: package() installed
   `LICENSE` (repo ships LICENSE.md) and all three functions cd'd to
   `$pkgname-$pkgver` while GitHub's tag tarball extracts to
   `TurtleTerm-$pkgver`. Added `_srcdir="TurtleTerm-$pkgver"` and fixed the
   license filename — the PKGBUILD real AUR users consume now builds.

3. All three shipped packages omitted the python3 runtime dep though every
   turtle-* command is `#!/usr/bin/env python3`. Added it to the GENERATED
   deb Depends / rpm Requires / arch .PKGINFO (the static control already
   declared it — the generated metadata is what ships).

Local: 13/13 tests, arch shape + build verifiers pass.
@mdheller
mdheller merged commit b2b8016 into main Aug 4, 2026
12 of 13 checks passed
@mdheller
mdheller deleted the fix/packaging-turtleterm branch August 4, 2026 00:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant