Releases: systeminit/swamp
swamp 20260303.011043.0-sha.990678e2
What's Changed
- fix: use absolute path for swamp binary in kiro hooks (#574)
Summary
- Kiro-cli does not perform PATH resolution when executing hook commands, causing
No such file or directory (os error 2)errors when theswamp audit recordhook fires - Resolve the absolute path to the
swampbinary at init/upgrade time usingwhichand embed it in the kiro hook configuration - Falls back to bare
swampif resolution fails - Only affects kiro hooks — Claude, Cursor, and OpenCode handle PATH correctly
Test plan
- All 63 repo_service tests pass
-
deno checkpasses -
deno lintpasses -
deno fmtpasses - Manual:
swamp repo init --tool kirothen verify.kiro/hooks/swamp-audit.jsoncontains absolute path - Manual: start kiro-cli and confirm audit hook no longer errors
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260303.011043.0-sha.990678e2/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260303.011043.0-sha.990678e2/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260303.011043.0-sha.990678e2/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260303.011043.0-sha.990678e2/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260303.005604.0-sha.bab2b48f
What's Changed
- feat: add
swamp extension yankcommand (#575)
Summary
- Add
swamp extension yank <extension> [version] --reason <reason>command for yanking extensions from the registry - Extension owners can yank their own extensions, admins can yank any extension (authorization enforced server-side)
- Add
yankExtension()method toExtensionApiClientcallingPOST /api/v1/extensions/{name}/yankandPOST /api/v1/extensions/{name}@{version}/yank
Server-side implementation: https://github.com/systeminit/swamp-club/pull/158
Closes #571
Test plan
-
deno fmt --check— formatting clean -
deno lint— linting clean -
deno check— type checking clean -
deno run test— 2512 tests pass, 0 failures -
deno run compile— binary recompiled - API client tests: POST to correct endpoints (version/extension), auth header, request body, 410 already-yanked error, connection failure
- Output rendering tests: JSON mode with/without version, cancellation output
- Manual test against live registry after swamp-club#158 merges
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260303.005604.0-sha.bab2b48f/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260303.005604.0-sha.bab2b48f/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260303.005604.0-sha.bab2b48f/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260303.005604.0-sha.bab2b48f/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260302.235049.0-sha.05292a33
What's Changed
- fix:
swamp repo upgradeoverwrites managed instructions file (#573)
Summary
swamp repo upgradenow overwrites the instructions file (CLAUDE.md,.cursor/rules/swamp.mdc, etc.) when content has changed, keeping it in sync with swamp's template- Adds
updateInstructionsFilemethod using the existingoverwriteIfChangedhelper - Adds
instructionsUpdatedfield toRepoUpgradeResultand output types - Refactors init/upgrade tool dispatch from if/else chains to exhaustive
switchstatements withassertNever - Extracts shared
createFileIfNotExistsandoverwriteIfChangedhelpers, eliminating duplicated file-creation logic across tool-specific methods
Test plan
- Updated test asserting upgrade now overwrites stale instructions content
- Added test asserting
instructionsUpdated: falsewhen content is already current - All 63 repo_service tests pass
-
deno checkpasses -
deno lintpasses -
deno fmtpasses
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.235049.0-sha.05292a33/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.235049.0-sha.05292a33/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.235049.0-sha.05292a33/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.235049.0-sha.05292a33/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260302.232225.0-sha.16e1ce94
What's Changed
- feat: add
swamp auditcommand for tracking AI agent actions (#572)
Summary
Introduces swamp audit — a new command that captures every bash tool invocation from AI coding agents via PostToolUse hooks, providing visibility into which commands were run through swamp's managed workflow versus executed directly by the agent.
- Multi-tool support: Works with Claude Code, Cursor, Kiro, and OpenCode. Each tool has its own hook mechanism; a normalization layer (
hook_input.ts) handles payload differences. Codex is unsupported (no per-command hooks) and shows a warning. - Hook-based capture:
swamp repo init --tool <tool>generates tool-specific hook configs (.claude/settings.local.json,.cursor/hooks.json,.kiro/hooks/swamp-audit.json,.opencode/plugins/swamp-audit.ts). Hooks pipe JSON toswamp audit record --from-hook --tool <tool>. - Timeline view:
swamp auditreads JSONL logs and categorizes commands as "swamp" (managed) or "direct" (unmanaged), with noise filtering, session filtering, and 7-day retention. - Hidden for now: The
auditcommand is hidden from--helpwhile the feature is being tested in real repositories.
Closes #427
Test plan
-
deno check— type checking passes -
deno lint— linting passes -
deno fmt— formatting passes -
deno run test— all 2576 tests pass -
deno run compile— binary compiles - Manual testing: verified audit capture works with OpenCode in a real repository
🤖 Generated with Claude Code
Co-authored-by: Walter Heck walterheck@helixiora.com
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.232225.0-sha.16e1ce94/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.232225.0-sha.16e1ce94/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.232225.0-sha.16e1ce94/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.232225.0-sha.16e1ce94/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260302.220424.0-sha.cc1fb239
What's Changed
- docs: remove CLI command sections from design documents (#570)
Summary
- Remove
## CLI Commandssections from all 7 design documents: agent, extension, inputs, models, repo, vaults, and workflow - Fix minor markdown formatting (table alignment, trailing whitespace, italic syntax)
Why
The design documents in design/ describe domain concepts and architecture — entities, aggregates, data flows, and invariants. The ## CLI Commands sections were originally written as implementation specs when building the CLI, but they serve no ongoing purpose:
- They drift. The CLI evolves faster than these docs get updated, so the sections become misleading rather than helpful.
- They're redundant. Every command already has authoritative
--helpoutput and theswamp-*skills provide structured guidance for agents. - They blur the purpose. Design docs should describe what the domain is, not how to invoke it from a terminal. Mixing the two makes the docs harder to use as architectural references.
Files changed
| File | What was removed |
|---|---|
design/agent.md |
swamp-model and swamp-workflow skill CLI recipes |
design/extension.md |
extension push/pull/rm/list command docs |
design/inputs.md |
CLI input syntax section (key=value, JSON, YAML) |
design/models.md |
model type describe/search, model create/search/get/validate/edit, model method describe/run |
design/repo.md |
repo init/upgrade/index command docs |
design/vaults.md |
vault type search/create/search/get/edit/put/list-keys |
design/workflow.md |
workflow create/validate/search/get/run/edit/history/schema |
Test plan
- No code changes — design docs only
- Verified no broken cross-references within the remaining content
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.220424.0-sha.cc1fb239/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.220424.0-sha.cc1fb239/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.220424.0-sha.cc1fb239/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.220424.0-sha.cc1fb239/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260302.215131.0-sha.4d0c44f0
What's Changed
- feat: add Kiro IDE support to
swamp repo init(#569)
Summary
Closes #565
Adds Kiro IDE as a supported AI coding tool for swamp repo init --tool kiro, requested by @danmcclain.
- Skills: copied to
.kiro/skills/(Kiro's standard skills directory) - Steering:
.kiro/steering/swamp-rules.mdwithinclusion: alwaysYAML frontmatter, ensuring rules are loaded in every Kiro session - Settings:
.vscode/settings.local.jsonwithkiroAgent.trustedCommands: ["swamp *"]— uses Kiro's prefix matching to trust all swamp subcommands with a single entry - Gitignore:
.kiro/skills/added to managed section and legacy migration patterns - Upgrade: full
updateKiroSettings()with merge logic, matching the existing Claude upgrade path
Design differences from the contributor's reference commit
@danmcclain provided a helpful reference commit. This PR takes a different approach in several areas:
| Aspect | Reference commit | This PR |
|---|---|---|
| Settings key | kiro.allowedCommands |
kiroAgent.trustedCommands — matches the documented Kiro setting |
| Trusted commands | 26 per-command entries (e.g. swamp model type search *) |
Single "swamp *" prefix — Kiro uses prefix matching, so one entry trusts all subcommands |
| Code structure | Refactored getClaudeAllowedCommands() into shared getSwampCommands() base |
Kept getClaudeAllowedCommands() unchanged; Kiro doesn't need per-command entries so a shared base doesn't apply |
| Steering frontmatter | Not added | inclusion: always YAML frontmatter per Kiro steering conventions |
| Upgrade support | Not implemented | Full updateKiroSettings() with merge logic for swamp repo upgrade --tool kiro |
| Legacy gitignore | Not updated | Added .kiro/skills/ and # Kiro skills to migration patterns |
| Tests | 1 test | 4 tests covering init, upgrade tool-switch, settings isolation, and gitignore |
Test plan
-
deno check— type checking passes -
deno lint— linting passes -
deno fmt— formatting passes -
deno run test src/domain/repo/repo_service_test.ts— all 54 tests pass (4 new) -
deno run test— full suite (2505 tests) passes -
deno run compile— binary compiles - Manual verification:
swamp repo init /tmp/test --tool kiro --include-gitignorecreates correct files
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.215131.0-sha.4d0c44f0/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.215131.0-sha.4d0c44f0/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.215131.0-sha.4d0c44f0/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.215131.0-sha.4d0c44f0/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260302.211941.0-sha.9cb888e5
What's Changed
- feat: send repository URL to registry during extension push (#566)
Summary
- Add optional
repositoryfield toPushMetadatainterface in the extension API client - Wire
manifest.repositorythrough to the push metadata in theextension pushcommand
Why this is correct
The swamp-club registry backend already accepts an optional repository field in both push API endpoints, but the CLI was never sending it — even though the manifest parser already reads the field. This change closes that gap with two minimal additions:
-
PushMetadatainterface (extension_api_client.ts): Addingrepository?: stringmakes the type reflect what the API accepts. The field is optional, so all existing callers remain valid without changes. -
Push metadata construction (
extension_push.ts):manifest.repository || undefineduses logical-OR coercion so that empty strings ("") becomeundefined, whichJSON.stringifyomits entirely. The registry receives either a real URL or no field at all — never a blank string.
User impact
Extension authors who set repository in their extension.yaml manifest will now have that URL visible on the registry after pushing. Authors who don't set it (or leave it empty) see no change — the field is simply absent from the API payload.
Test plan
-
deno check— type-checks pass -
deno lint— no lint issues -
deno fmt— formatting clean -
deno run test— all 2488 tests pass
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.211941.0-sha.9cb888e5/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.211941.0-sha.9cb888e5/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.211941.0-sha.9cb888e5/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.211941.0-sha.9cb888e5/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260302.205621.0-sha.ea0fde08
What's Changed
- fix: add spinner progress feedback to
swamp update(#564)
Summary
- Add spinner to
swamp updateso it no longer appears to hang during download/install - Shows "Checking for updates..." for
--checkand "Updating swamp..." for full update - Follows the same
Spinnerpattern already used inauth login, with try/finally for cleanup - Spinner is skipped in
--jsonmode
Test plan
-
deno checkpasses -
deno lintpasses -
deno fmtpasses - New tests in
update_test.tspass (5 tests covering start/stop, error cleanup, and JSON-mode skip)
Fixes #561
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.205621.0-sha.ea0fde08/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.205621.0-sha.ea0fde08/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.205621.0-sha.ea0fde08/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.205621.0-sha.ea0fde08/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260302.205225.0-sha.018ec6d8
What's Changed
- fix: extract core install logic from pullExtension for clean extension updates (#563)
Summary
Extracts the core install pipeline (download → verify → extract → copy → track)
from pullExtension() into a new installExtension() function that returns
structured data instead of rendering output as a side effect. This fixes several
problems with extension update:
- Broken JSON output —
pullExtensionemitted its own JSON objects mid-flow,
so update output was multiple JSON fragments instead of one valid document - Double API calls — update called
getExtension()to check versions, then
pullExtensioncalled it again internally to resolve the version - Noisy output — pull-specific messages (resolved, integrity, file list) were
interleaved with update messages - Wrong error types — pull failures were recorded as
not_foundregardless of
actual cause (could be safety error, integrity failure, etc.)
Design
installExtension as the shared boundary. Every caller (pull, update,
search) needs the same download→verify→extract→copy→track sequence. They differ
only in what they show the user. The I/O is the shared concern; rendering is
per-caller. installExtension returns an InstallResult with all the data
callers need to render their own way.
Throws on conflicts instead of prompting. The interactive prompt is a UX
decision that belongs to the command layer. Update always forces (overwriting is
the point of an update). Pull wants to ask. By throwing a ConflictError, each
caller handles conflicts its way.
New failed status distinct from not_found. not_found means "extension
doesn't exist in registry" (permanent, from the check phase). failed means
"install blew up" (could be transient network error, safety rejection, integrity
failure). Users and JSON consumers need to distinguish these cases.
Changes
src/cli/commands/extension_pull.ts
- New
InstallResulttype — structured return with name, version, files,
integrity status, safety warnings, conflicts, dependency results - New
InstallContexttype — likePullContextwithoutoutputMode - New
ConflictError— thrown when conflicts exist and!force - New
installExtension()— pure I/O, no rendering, returnsInstallResult - Rewrote
pullExtension()as thin wrapper: callsinstallExtension, renders
result, handlesConflictErrorwith interactive prompt + retry
src/domain/extensions/extension_update_service.ts
- Added
FailedStatusinterface (status: "failed") - Added to
ExtensionUpdateStatusunion buildUpdateResultcounts"failed"in the failed bucket
src/cli/commands/extension_update.ts
- Uses
installExtensiondirectly instead ofpullExtension - Passes explicit
version: s.latestVersion— no redundant API call - Always
force: true— updates should overwrite - Errors recorded as
"failed"(not"not_found") with actual error message
src/presentation/output/extension_update_output.ts
- Added
"failed"case to bothrenderExtensionUpdateCheckand
renderExtensionUpdateResult
Test files
- 11 new tests across service, CLI, and output layers for the
failedvariant
User Impact
swamp extension updatenow produces clean, non-interleaved outputswamp extension update --jsonreturns a single valid JSON document- Update errors show the actual failure reason (e.g., "safety error",
"integrity check failed") instead of misleadingly saying "not found" swamp extension pullbehavior is unchanged — same interactive prompts,
same rendering
Test Plan
-
deno check— all types pass -
deno lint— clean -
deno fmt— formatted -
deno run test— 2488 tests pass, 0 failures -
deno run compile— binary compiles - Manual: installed
@stack72/system-extensions@2026.02.26.2, ran
extension update→ upgraded to2026.02.28.1, ran again → "up to date" - Manual:
extension update --jsonproduces single valid JSON document
🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.205225.0-sha.018ec6d8/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.205225.0-sha.018ec6d8/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.205225.0-sha.018ec6d8/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.205225.0-sha.018ec6d8/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260302.203912.0-sha.b250bb5e
What's Changed
- feat: check community extensions before building custom models (#562)
Summary
Closes #546
When AI agents are asked to create models for services (e.g., "I need a model
for Tailscale"), they immediately build custom extension models from scratch.
The swamp extension search command already exists (PR #555) but isn't wired
into the model creation workflow — agents and users have no guidance to check
community extensions first.
This PR closes the gap at two levels:
1. Agent guidance updates
CLAUDE.md: Adds step 3 to the "Building Automation with Swamp" workflow
—swamp extension search <query>— between local type search and building
from scratch.swamp-extension-modelskill (SKILL.md): Updates the "When to Create a
Custom Model" decision flow to check community extensions before creating a
model. Adds a "Search community" row to the Quick Reference table.swamp-extension-modelscenarios (references/scenarios.md): Updates all
4 scenario decision trees to start with checking local types and community
extensions.
2. User-facing hint in model type search
When model type search returns zero results and the user typed a query, a tip
is shown suggesting swamp extension search <query>:
- Interactive UI: Displays the hint below "No matching types found" (only
when a query is present, not when the list is simply empty). - JSON output: Adds an optional
hintfield toTypeSearchDatawhen no
results match.
Why this is the correct fix
The agent workflow previously was:
local type search → not found → build from scratch
Now it's:
local type search → community extension search → install or build
The guidance changes fix the agent workflow (the primary consumer of skills
and CLAUDE.md). The hint fixes the human workflow — a user who runs
swamp model type search tailscale, gets zero results, and doesn't know what
to do next. Both close the same gap: the missing link between "no local type
found" and "check the community registry."
User impact
- Agents will now check community extensions before building custom models,
avoiding duplicate work when a community extension already exists. - Users running
model type searchwith no results will see a helpful tip
pointing them toextension search. - No breaking changes — the
hintfield is optional inTypeSearchData,
and the interactive hint only appears conditionally.
Test Plan
- 5 new tests covering hint behavior in both interactive and JSON modes
- All 2454 existing tests pass
deno check,deno lint,deno fmtall pass- Binary recompiled successfully
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.203912.0-sha.b250bb5e/swamp-darwin-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/macOS (Intel):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.203912.0-sha.b250bb5e/swamp-darwin-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (x86_64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.203912.0-sha.b250bb5e/swamp-linux-x86_64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/Linux (aarch64):
curl -L https://github.com/systeminit/swamp/releases/download/v20260302.203912.0-sha.b250bb5e/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/