Releases: systeminit/swamp
swamp 20260322.201229.0-sha.e0972eb3
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:
- Zero code changes to swamp — purely skill content, no new commands or flags to maintain
- Claude adapts per-model — reads the model source to understand required fields, API quirks, and resource types rather than relying on generic templates
- Safe by design — only creates
smoke-test-*named resources, always cleans up, never touches pre-existing resources - 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":
- Skill triggers via the new trigger phrases
- Claude loads the smoke-test protocol from the reference doc
- Executes phases 0-6 in order, using existing CLI commands
- Produces a summary table with pass/fail/expected_error/skipped classifications
- 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
What's Changed
- fix: exclude logging imports from DDD layer rule violations (#825)
Summary
- Adds
isLoggingImporthelper to excludeinfrastructure/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 passdeno 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
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 yieldingcompleted/errorevents - Issue commands (
issue bug,issue feature) — SharedissueCreategenerator 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 recordhook subcommand left unchanged (intentionally not generator-based) - Update command — Generator with
checkingintermediate event; Spinner stays in CLI layer wrappingconsumeStream() - Summarise command — Generator delegates to
SummaryService; renderer acceptsverbosityparameter for verbose output mode
Architecture
Each command follows the standard libswamp pattern:
async function*generator yielding typed{ kind: string }discriminated union eventsXxxDepsinterface withcreateXxxDeps()factory wiring real infrastructureRenderer<E>classes (Log + Json) with exhaustiveEventHandlers<E>forconsumeStream()- 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.tsupdated 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
What's Changed
- feat: add path-filtered CLI UX review and scope reviews by change type (#822)
Summary
- Add new
claude-ux-reviewjob 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/**
- Standard code review (
- Fix auto-merge bypassing failed reviews: each review job now writes a
/tmp/review-failedsentinel file when requesting changes, and a follow-up step checks for it and fails the job. This ensures--request-changesreviews 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-changescreates/tmp/review-failedand the job fails, blocking auto-merge - Verify a review that posts
--approvedoes 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
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()fromextension_auto_resolver.tsfor@-prefixed types not yet in the registry - The generator calls it before
deps.getVaultTypeInfo(), restoring the original behavior - Follows the same pattern as
ModelCreateDeps.resolveModelTypewhich 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
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 definitionworkflow create— checks name uniqueness, creates workflow with default job/step structurevault create— validates type (with renamed-type detection), validates name format, resolves provider config, creates vaultdata rename— validates names differ, delegates to DataRenameService for backwards-compatible forwardingauth logout— loads credentials, deletes if present, yieldsloggedOut: true/falserepo init— delegates to RepoService.init(), yields init result with skills/settings/gitignore inforepo upgrade— delegates to RepoService.upgrade(), yields upgrade resultversion— 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: BothrepoInitandrepoUpgradegenerators live in the same file (repo/init.ts), each with their own event/deps/input typesversion: Uses emptyVersionDepstype for consistency with the standard(ctx, deps, input)signatureauth logout: "Not authenticated" is acompletedevent withloggedOut: 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_initrenderer 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
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 + definitionworkflow delete— checks extension-only guard, counts runs, prompts, deletes runs + evaluated + workflowvault put— resolves key/value from CLI/stdin/TTY, checks overwrite, prompts, stores secret + publishes eventdata 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
What's Changed
- refactor: replace /plan workflow with idempotent /triage command (#818)
Summary
- Replaces
issue-planner.yml(/plan+/plan-update) withissue-triage.ymlusing a single/triagecommand - 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
/triageidempotent: 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
/triageinstead of removed/plancommands
Test plan
- Comment
/triageon a bug report — verify it traces through the code to confirm/deny the bug rather than trusting the author's diagnosis - Comment
/triageon a feature request with a proposed solution — verify it independently evaluates the proposal against the architecture - Leave operator feedback as a regular comment, then
/triageagain — verify it reads the comment thread and updates the existing triage with a revision history entry - Verify
/triageon 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
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 (resolving→completed/error), with all infrastructure injected through deps interfaces - Renderers:
LogXxxEditRenderer+JsonXxxEditRendererper 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.tsand 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
What's Changed
- refactor: replace /plan workflow with /triage for issue analysis and planning (#816)
Summary
- Replaces the
issue-planner.ymlworkflow (/plan+/plan-updatecommands) with a singleissue-triage.ymlworkflow 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
/triageidempotent — 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-updatecommand - 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
/triageon a bug report issue and verify it produces a triage analysis with root cause identification before the implementation plan - Comment
/triageon a feature request issue and verify it classifies correctly and produces a plan - Leave feedback as a regular comment, then comment
/triageagain — 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/