Skip to content

Releases: systeminit/swamp

swamp 20260322.201229.0-sha.e0972eb3

22 Mar 20:13
Immutable release. Only release title and notes can be modified.
e0972eb

Choose a tag to compare

What's Changed

  • feat: add smoke-test protocol for extension models (#826)

Summary

Adds a structured smoke-test protocol to the swamp-extension-model skill that guides Claude through systematically verifying extension models against live APIs before pushing. Closes #633.

  • New reference doc (references/smoke_testing.md): A 7-phase protocol (pre-flight → list → read → create → update → delete/cleanup → report) with safety rules and a common failure patterns catalog
  • Updated SKILL.md: New "Smoke Testing" section, quick reference table row, reference link, and 5 new trigger phrases in the frontmatter
  • Updated trigger evals: 5 new eval entries to verify the skill activates on smoke-test queries

Why this approach

Extension model developers were hitting real API bugs — Content-Type mismatches (415), stale bundle cache, API validation quirks (422), delete-protected defaults (403/409), and read-only resource guards (405) — that unit tests with mocked responses cannot catch. These bugs survived into pushes and were only discovered during manual smoke testing.

Rather than building new CLI infrastructure, this uses a skill-based approach: Claude reads the protocol and executes it using existing commands (swamp model method run, swamp model get, etc.). This means:

  1. Zero code changes to swamp — purely skill content, no new commands or flags to maintain
  2. Claude adapts per-model — reads the model source to understand required fields, API quirks, and resource types rather than relying on generic templates
  3. Safe by design — only creates smoke-test-* named resources, always cleans up, never touches pre-existing resources
  4. Specific bundle cache clearing — clears only .swamp/bundles/{model-filename}.js, not the entire bundles directory, so other models' cached bundles aren't disrupted

UX flow

When a user says "smoke test my honeycomb extension" or "test my model before pushing":

  1. Skill triggers via the new trigger phrases
  2. Claude loads the smoke-test protocol from the reference doc
  3. Executes phases 0-6 in order, using existing CLI commands
  4. Produces a summary table with pass/fail/expected_error/skipped classifications
  5. Flags any failures by bug category (415, 422, stale cache, etc.) with actionable fix guidance

The protocol treats 401/403 as signal, not failure — it means the endpoint works but the token is scoped. Connection errors and 500s are the real blockers.

Test plan

  • Verify skill triggers on "smoke test my extension model"
  • Verify the reference doc loads when Claude needs smoke-test details
  • Review protocol covers all 5 bug categories from issue #633 (Content-Type 415, stale bundle cache, API validation 422, delete-protected 403/409, read-only 405)
  • Confirm existing trigger phrases still work (no regressions in trigger evals)
  • Verify new trigger evals pass

🤖 Generated with Claude Code

Co-authored-by: Blake Irvin blakeirvin@me.com


Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.201229.0-sha.e0972eb3/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/v20260322.201229.0-sha.e0972eb3/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/v20260322.201229.0-sha.e0972eb3/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/v20260322.201229.0-sha.e0972eb3/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.164953.0-sha.19274d59

22 Mar 16:50
Immutable release. Only release title and notes can be modified.
19274d5

Choose a tag to compare

What's Changed

  • fix: exclude logging imports from DDD layer rule violations (#825)

Summary

  • Adds isLoggingImport helper to exclude infrastructure/logging/ imports from DDD layer violation counts — logging is a cross-cutting concern, not a real layer violation
  • Converts presentation→infrastructure test from a ratchet (≤51) to a hard zero constraint, since all 51 violations were logging imports
  • Domain ratchet unchanged at 21 (none were logging)

Fixes #820

Test Plan

  • deno run test integration/ddd_layer_rules_test.ts — both tests pass
  • deno fmt --check, deno lint — clean

🤖 Generated with Claude Code


Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.164953.0-sha.19274d59/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/v20260322.164953.0-sha.19274d59/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/v20260322.164953.0-sha.19274d59/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/v20260322.164953.0-sha.19274d59/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.161541.0-sha.32d40245

22 Mar 16:16
Immutable release. Only release title and notes can be modified.
32d4024

Choose a tag to compare

What's Changed

  • refactor: port source, issue, audit, update, and summarise to libswamp pattern (#824)

Summary

Migrates 10 CLI commands to the libswamp generator + renderer architecture as part of #739:

  • Source commands (source path, source fetch, source clean) — Simple data retrieval generators yielding completed/error events
  • Issue commands (issue bug, issue feature) — Shared issueCreate generator handling GitHub API calls; editor template logic and interactive flow remain in CLI layer
  • Audit command (audit) — Generator handles timeline data retrieval with discriminated union data (timeline/no_data/tool_not_supported); audit record hook subcommand left unchanged (intentionally not generator-based)
  • Update command — Generator with checking intermediate event; Spinner stays in CLI layer wrapping consumeStream()
  • Summarise command — Generator delegates to SummaryService; renderer accepts verbosity parameter for verbose output mode

Architecture

Each command follows the standard libswamp pattern:

  • async function* generator yielding typed { kind: string } discriminated union events
  • XxxDeps interface with createXxxDeps() factory wiring real infrastructure
  • Renderer<E> classes (Log + Json) with exhaustive EventHandlers<E> for consumeStream()
  • CLI remains pure orchestration: wire deps → create renderer → consumeStream()

Interactive logic (editor templates, spinners, repo context detection) stays in the CLI layer.

Changes

  • 7 new generator files in src/libswamp/{source,issues,audit,update,summary}/
  • 7 new renderer files in src/presentation/renderers/
  • 8 CLI commands rewritten to use consumeStream() pattern
  • 15 new unit tests across 7 test files
  • 10 old files deleted (5 output files + 5 output test files replaced by renderers)
  • mod.ts updated with exports for all new generators
  • DDD ratchet updated 49 → 51 (net +2: 7 new renderers importing getSwampLogger - 5 deleted output files)

User Impact

No user-facing behavior changes. All commands produce identical output in both log and json modes. The internal architecture is now consistent across all ported commands, making future changes and testing easier.

Test plan

  • deno check — all files type-check
  • deno lint — no lint errors
  • deno fmt --check — all files formatted
  • deno run test — all 3482 tests pass (including 15 new)
  • deno run compile — binary compiles successfully
  • DDD layer ratchet test passes with updated count

🤖 Generated with Claude Code


Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.161541.0-sha.32d40245/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/v20260322.161541.0-sha.32d40245/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/v20260322.161541.0-sha.32d40245/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/v20260322.161541.0-sha.32d40245/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.152746.0-sha.20565b85

22 Mar 15:28
Immutable release. Only release title and notes can be modified.
20565b8

Choose a tag to compare

What's Changed

  • feat: add path-filtered CLI UX review and scope reviews by change type (#822)

Summary

  • Add new claude-ux-review job that evaluates CLI user experience: help text, error messages, log/JSON output consistency, and behavioral consistency with existing commands (runs on Sonnet for speed)
  • Path-filter all three Claude review jobs so they only run when relevant files change:
    • Standard code review (code): src/**, integration/**, deno.json
    • Adversarial review (core): src/domain/**, src/infrastructure/**, src/libswamp/**
    • UX review (ux): src/cli/commands/**, src/presentation/**, src/domain/errors.ts, src/libswamp/**
  • Fix auto-merge bypassing failed reviews: each review job now writes a /tmp/review-failed sentinel file when requesting changes, and a follow-up step checks for it and fails the job. This ensures --request-changes reviews actually block auto-merge.
  • PRs that only touch docs, skills, workflows, or scripts skip all Claude reviews and auto-merge faster

Test plan

  • Open a PR that only changes README.md — verify all three Claude reviews are skipped and auto-merge proceeds
  • Open a PR that changes src/presentation/ — verify code review and UX review run, adversarial review is skipped
  • Open a PR that changes src/domain/ — verify all three reviews run
  • Verify a review that posts --request-changes creates /tmp/review-failed and the job fails, blocking auto-merge
  • Verify a review that posts --approve does not create the sentinel file and the job succeeds

Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.152746.0-sha.20565b85/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/v20260322.152746.0-sha.20565b85/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/v20260322.152746.0-sha.20565b85/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/v20260322.152746.0-sha.20565b85/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.145113.0-sha.7ad15953

22 Mar 14:52
Immutable release. Only release title and notes can be modified.
7ad1595

Choose a tag to compare

What's Changed

  • fix: restore extension vault type auto-resolve in vault create (#823)

Summary

Fixes a regression introduced in #821 (batch 3 migration) where swamp vault create @org/custom-vault my-vault fails with "Unknown vault type" instead of auto-resolving the extension type from the registry.

What broke

The old vault_create.ts CLI handler had this auto-resolve step before checking the registry:

if (!vaultTypeRegistry.has(vaultType) && vaultType.startsWith("@")) {
  await resolveVaultType(vaultType, getAutoResolver());
}

When the command was migrated to the libswamp generator pattern, this step was dropped. The generator's deps.getVaultTypeInfo() calls vaultTypeRegistry.get() directly — if the @-prefixed extension type isn't already registered, it immediately yields a validation_failed error.

Fix

Added resolveExtensionVaultType to VaultCreateDeps:

  • The dep calls resolveVaultType() from extension_auto_resolver.ts for @-prefixed types not yet in the registry
  • The generator calls it before deps.getVaultTypeInfo(), restoring the original behavior
  • Follows the same pattern as ModelCreateDeps.resolveModelType which auto-resolves extension model types

Test plan

  • Existing vault create tests pass (4/4)
  • deno check — clean
  • deno lint — clean

🤖 Generated with Claude Code


Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.145113.0-sha.7ad15953/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/v20260322.145113.0-sha.7ad15953/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/v20260322.145113.0-sha.7ad15953/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/v20260322.145113.0-sha.7ad15953/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.143913.0-sha.90818f2a

22 Mar 14:40
Immutable release. Only release title and notes can be modified.
90818f2

Choose a tag to compare

What's Changed

  • refactor: port simple mutation commands to libswamp pattern (#821)

Summary

Ports 7 simple mutation commands (8 generators total) to the libswamp event stream architecture, completing batch 3 of #739.

  • model create — validates type, checks name uniqueness, validates global args against Zod schema, creates definition
  • workflow create — checks name uniqueness, creates workflow with default job/step structure
  • vault create — validates type (with renamed-type detection), validates name format, resolves provider config, creates vault
  • data rename — validates names differ, delegates to DataRenameService for backwards-compatible forwarding
  • auth logout — loads credentials, deletes if present, yields loggedOut: true/false
  • repo init — delegates to RepoService.init(), yields init result with skills/settings/gitignore info
  • repo upgrade — delegates to RepoService.upgrade(), yields upgrade result
  • version — trivial generator, returns version string

Pattern

All commands follow the single-phase pattern: validate → mutate → save → yield completed. No confirmation prompts needed (unlike batch 5). CLI handlers are pure orchestration: create deps, create renderer, consumeStream().

Architecture decision: deps abstraction for global registries

During review, I found that the modelCreate generator was accessing modelRegistry.types() directly to build an error message, bypassing the deps interface. This was fixed by adding listAvailableTypes() to ModelCreateDeps, consistent with VaultCreateDeps which already had the same pattern.

Principle: Generators must not access global singletons directly. All infrastructure and registry access goes through the deps interface, making generators fully testable with fake deps.

Domain value object constructors (ModelType.create(), RepoPath.create()) and domain constants (RENAMED_VAULT_TYPES) are acceptable in generators since they are pure domain logic with no side effects.

User impact

None. Output is identical in both log and json modes. Same log lines, same JSON shapes. This is a purely internal refactor.

Notable details

  • vault create: Interactive vault name prompt stays in CLI layer (same pattern as batch 6 edit commands)
  • repo init: Both repoInit and repoUpgrade generators live in the same file (repo/init.ts), each with their own event/deps/input types
  • version: Uses empty VersionDeps type for consistency with the standard (ctx, deps, input) signature
  • auth logout: "Not authenticated" is a completed event with loggedOut: false, not an error — matching original behavior where logout of a non-authenticated user is informational, not a failure
  • DDD layer ratchet: Updated from 48 → 49 (new repo_init renderer imports from infrastructure/logging, net +1 after deleting old output files)

Files

Layer Files Purpose
Generators 7 files in src/libswamp/{models,workflows,vaults,data,auth,repo}/ + version.ts 8 generators with deps injection
Tests 7 *_test.ts files (17 unit tests) Cover: success, validation errors, uniqueness checks, type resolution
Renderers 7 files in src/presentation/renderers/ Log + JSON renderers matching original output
CLI 7 files in src/cli/commands/ Pure orchestration: wire deps → renderer → consumeStream
Exports src/libswamp/mod.ts All new types, generators, and deps factories
Deleted 7 old src/presentation/output/ files + tests Replaced by renderers
Updated integration/ddd_layer_rules_test.ts Ratchet 48 → 49

Test plan

  • 17 new generator unit tests
  • Full test suite: 3506 passed, 0 failed
  • deno check — clean
  • deno lint — clean
  • deno fmt — clean

Closes batch 3 of #739.

🤖 Generated with Claude Code


Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.143913.0-sha.90818f2a/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/v20260322.143913.0-sha.90818f2a/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/v20260322.143913.0-sha.90818f2a/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/v20260322.143913.0-sha.90818f2a/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.133302.0-sha.184d3e83

22 Mar 13:33
Immutable release. Only release title and notes can be modified.
184d3e8

Choose a tag to compare

What's Changed

  • refactor: port confirmation-guarded mutations to libswamp pattern (#819)

Summary

Ports 4 confirmation-guarded mutation commands to the libswamp event stream architecture, partially completing batch 5 of #739.

  • model delete — validates no workflow refs, checks data artifacts, prompts, deletes outputs + data + definition
  • workflow delete — checks extension-only guard, counts runs, prompts, deletes runs + evaluated + workflow
  • vault put — resolves key/value from CLI/stdin/TTY, checks overwrite, prompts, stores secret + publishes event
  • data gc — finds expired data, shows preview, prompts, executes garbage collection

Not included in this PR: extension pull (~1200 lines, recursive dependency installation — needs dedicated migration) and extension rm (depends on extension pull exports).

Two-phase confirmation pattern

Per the issue's architectural decision: "Confirmation prompts live in the CLI layer before calling the generator."

Each command follows a three-step flow:

1. Preview function (plain async)  →  gathers what will be affected
2. CLI prompt                      →  builds message from preview, asks user
3. Execute generator (async iter)  →  performs mutation, yields events

The preview is a plain async function (not a generator) because it returns a single result — no streaming needed. It throws SwampError on hard blocks (model not found, extension-only workflow).

The generator only runs after confirmation. If the user cancels, the CLI renders cancellation directly without invoking the generator.

Architecture trade-off: duplicated validation in generators

The generators re-validate preconditions (e.g., modelDelete re-checks workflow references and data artifacts) even though the CLI already checked them via the preview. This is intentional:

  • Generators are self-contained. A web UI adapter or API consumer might call the generator directly after their own confirmation flow, without ever calling the preview function.
  • The library contract doesn't assume the preview ran first. This makes the generators safe for any caller, not just the CLI.
  • Cost is negligible. The duplicate lookups hit the local filesystem, not remote APIs.

User impact

None. Output is identical in both log and json modes — same log lines, same JSON shapes, same confirmation prompts. This is a purely internal refactor.

Files

Layer Files Purpose
Generators src/libswamp/{models/delete,workflows/delete,vaults/put,data/gc}.ts Preview functions + execute generators with deps injection
Tests *_test.ts for each generator 19 unit tests covering: not-found, validation errors, successful deletion, force mode, preview data
Renderers src/presentation/renderers/{model_delete,workflow_delete,vault_put,data_gc}.ts Log + JSON renderers, plus renderXxxCancelled() for prompt-declined path
CLI src/cli/commands/{model_delete,workflow_delete,vault_put,data_gc}.ts Pure orchestration: preview → prompt → execute → render
Exports src/libswamp/mod.ts All new types, generators, preview functions, and deps factories
Deleted 7 old src/presentation/output/ files + tests Replaced by renderers

Test plan

  • 19 new generator unit tests (preview + execute paths for each command)
  • Full test suite: 3497 passed, 0 failed
  • deno check — clean
  • deno lint — clean
  • deno fmt — clean

Partially addresses batch 5 of #739 (4 of 6 commands).

🤖 Generated with Claude Code


Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.133302.0-sha.184d3e83/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/v20260322.133302.0-sha.184d3e83/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/v20260322.133302.0-sha.184d3e83/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/v20260322.133302.0-sha.184d3e83/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.121623.0-sha.c2cb6230

22 Mar 12:17
Immutable release. Only release title and notes can be modified.
c2cb623

Choose a tag to compare

What's Changed

  • refactor: replace /plan workflow with idempotent /triage command (#818)

Summary

  • Replaces issue-planner.yml (/plan + /plan-update) with issue-triage.yml using a single /triage command
  • Adds a triage phase that independently verifies issue claims against the codebase before planning — bugs are traced to confirm root cause, feature proposals are evaluated against the architecture
  • Makes /triage idempotent: re-running it reads the full comment thread (operator feedback, additional context) and updates the existing triage in-place. No second command needed.
  • Removes duplicated code style rules from the prompt (CLAUDE.md is the source of truth) and adds missing conventions: license headers, libswamp import rule, design docs, integration tests
  • Updates README to reference /triage instead of removed /plan commands

Test plan

  • Comment /triage on a bug report — verify it traces through the code to confirm/deny the bug rather than trusting the author's diagnosis
  • Comment /triage on a feature request with a proposed solution — verify it independently evaluates the proposal against the architecture
  • Leave operator feedback as a regular comment, then /triage again — verify it reads the comment thread and updates the existing triage with a revision history entry
  • Verify /triage on an unclear issue produces a "Needs Clarification" response with suggested questions
  • Confirm the <!-- IMPLEMENTATION-PLAN --> marker is present for triage comment detection

Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.121623.0-sha.c2cb6230/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/v20260322.121623.0-sha.c2cb6230/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/v20260322.121623.0-sha.c2cb6230/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/v20260322.121623.0-sha.c2cb6230/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.120209.0-sha.f82bed6f

22 Mar 12:03
Immutable release. Only release title and notes can be modified.
f82bed6

Choose a tag to compare

What's Changed

  • refactor: port edit commands to libswamp generator + renderer pattern (#817)

Summary

Ports the 3 edit commands (model edit, workflow edit, vault edit) to the libswamp event stream architecture, completing batch 6 of #739.

  • Generators: modelEdit, workflowEdit, vaultEdit — async generators yielding typed events (resolvingcompleted/error), with all infrastructure injected through deps interfaces
  • Renderers: LogXxxEditRenderer + JsonXxxEditRenderer per command, selected by factory function based on output mode
  • CLI handlers: reduced to pure orchestration — wire deps, create renderer, consumeStream()
  • Old output files deleted: model_edit_output.ts, workflow_edit_output.ts, vault_edit_output.ts and their tests

User impact

None. Output is identical in both log and json modes. Same log lines, same JSON shapes. This is a purely internal refactor — the commands behave exactly as before.

Architecture

Each edit command now follows the established libswamp pattern from design/libswamp.md and design/rendering.md:

Layer File Responsibility
Generator src/libswamp/{models,workflows,vaults}/edit.ts Domain orchestration: lookup entity, handle stdin update or editor open
Deps XxxEditDeps interface + createXxxEditDeps() factory Inject infrastructure (repos, editor, symlink resolution) for testability
Renderer src/presentation/renderers/{model,workflow,vault}_edit.ts Translate events to log/JSON output
CLI src/cli/commands/{model,workflow,vault}_edit.ts Wire deps, create renderer, consumeStream()

Key design decisions:

  • Editor launch injected via deps.openEditor(path) — generators are fully testable with fake deps
  • Stdin update injected via deps.updateFromStdin() — YAML parsing and persistence stay in infrastructure
  • Interactive search (no-arg mode) stays in CLI layer using existing search renderers until batch 4 migrates them
  • Symlink fallback for broken YAML files preserved in deps, tested through generator unit tests

Test plan

  • 18 new generator unit tests (6 per command) covering: not-found errors, editor open, symlink fallback, stdin update, stdin validation errors, type mismatch
  • Existing CLI command tests updated and passing
  • Full test suite: 3492 passed, 0 failed
  • deno check — clean
  • deno lint — clean
  • deno fmt — clean

Closes batch 6 of #739.

🤖 Generated with Claude Code


Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.120209.0-sha.f82bed6f/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/v20260322.120209.0-sha.f82bed6f/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/v20260322.120209.0-sha.f82bed6f/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/v20260322.120209.0-sha.f82bed6f/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/

swamp 20260322.115032.0-sha.1b795686

22 Mar 11:51
Immutable release. Only release title and notes can be modified.
1b79568

Choose a tag to compare

What's Changed

  • refactor: replace /plan workflow with /triage for issue analysis and planning (#816)

Summary

  • Replaces the issue-planner.yml workflow (/plan + /plan-update commands) with a single issue-triage.yml workflow driven by /triage
  • Adds a bug triage phase: Claude now traces through the codebase to confirm/deny bugs and identify root cause before producing an implementation plan
  • Makes /triage idempotent — re-running it reads the full comment thread for operator feedback and updates the existing triage in-place, eliminating the need for a separate /plan-update command
  • Removes duplicated code style rules from the prompt (CLAUDE.md is the source of truth) and adds missing conventions: license headers, libswamp import rule, dual output modes, design docs, integration tests

Test plan

  • Comment /triage on a bug report issue and verify it produces a triage analysis with root cause identification before the implementation plan
  • Comment /triage on a feature request issue and verify it classifies correctly and produces a plan
  • Leave feedback as a regular comment, then comment /triage again — verify it picks up the feedback and updates the existing triage comment with a revision history entry
  • Verify the triage comment starts with <!-- IMPLEMENTATION-PLAN --> marker

Installation

macOS (Apple Silicon):

curl -L https://github.com/systeminit/swamp/releases/download/v20260322.115032.0-sha.1b795686/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/v20260322.115032.0-sha.1b795686/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/v20260322.115032.0-sha.1b795686/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/v20260322.115032.0-sha.1b795686/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/