Releases: systeminit/swamp
swamp 20260319.214938.0-sha.16f2cc42
What's Changed
- The Machine: Fixup issues with the machine (#783)
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260319.214938.0-sha.16f2cc42/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/v20260319.214938.0-sha.16f2cc42/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/v20260319.214938.0-sha.16f2cc42/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/v20260319.214938.0-sha.16f2cc42/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260319.210746.0-sha.16d16c05
What's Changed
- The Machine: Improving the machine that builds the machine (#782)
Cleaning up claude.md and adding hooks and updating CI
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260319.210746.0-sha.16d16c05/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/v20260319.210746.0-sha.16d16c05/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/v20260319.210746.0-sha.16d16c05/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/v20260319.210746.0-sha.16d16c05/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260319.193638.0-sha.bb9503f2
What's Changed
- docs: add CLAUDE.md rule to prefer fan-out methods over shell loops (#781)
Summary
Closes #729
Adds rule 6 to the generated CLAUDE.md instructions: Prefer fan-out methods
over loops.
Why a CLAUDE.md rule instead of tooling/metadata changes?
Investigation of #729 found that the core problem is already largely addressed
by existing swamp features, and the remaining gap is best solved at the
guidance level rather than with new tooling:
What's already in place:
- Per-model locks — Locking is now per-model instead of global, eliminating
cross-model contention. The original issue hit global lock contention where
45/50 parallel CLI calls timed out. - Factory model pattern — The
swamp-extension-modelskill already documents
the factory pattern (one method call, N targets, N outputs), which is the
correct way to build fleet-aware models. AWS and other models already use this. - "Search before you build" — Existing CLAUDE.md rules guide agents to find
existing model types before building from scratch.
Why the issue's proposed solutions weren't needed:
- Model type metadata (
fleetAware,fanOutMethods) — This puts the burden
on extension authors to understand and flag fleet patterns. The factory model
pattern already solves this architecturally — extension authors who follow the
documented pattern naturally produce fan-out capable models. - CLI hints — The factory pattern and per-model locks make the "wrong path"
(shell-looping) less catastrophic but the real fix is guiding agents to the
right path upfront.
The remaining gap: When an agent runs swamp model type describe and sees
multiple methods, nothing tells it to prefer a fan-out method over looping
single-target calls. A single CLAUDE.md rule fills this gap by explaining both
the what (use fan-out methods) and the why (per-model lock contention).
Verified effective: Tested by prompting an agent with "run execute on
server-1, server-2, and server-3" — the agent cited rule 6, mentioned lock
contention, and checked for fan-out methods before proceeding.
Test plan
-
deno checkpasses -
deno run test src/domain/repo/repo_service_test.ts— all 77 tests pass - Run
swamp repo initin a scratch directory and verify rule 6 appears in
the generated CLAUDE.md - In a fresh Claude Code session with the updated CLAUDE.md, prompt:
"I need to run the execute method on server-1, server-2, and server-3" —
agent should check for fan-out methods instead of shell-looping
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260319.193638.0-sha.bb9503f2/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/v20260319.193638.0-sha.bb9503f2/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/v20260319.193638.0-sha.bb9503f2/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/v20260319.193638.0-sha.bb9503f2/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260319.184717.0-sha.0e4c970c
What's Changed
- docs: document --input key=value syntax in skills (#780)
Summary
- Update swamp-model and swamp-workflow skills to document the
--input key=valuesyntax as the preferred form for simple scalar inputs - Keep JSON blob syntax (
--input '{}') as a documented alternative for complex structures (arrays, nested objects) - Fix options tables that described
--inputas--input <json>to--input <value>
Context
A user filed #760 requesting --arg key=value support, not knowing that --input key=value already works. Every example in our skills only showed the JSON blob form, making the key-value syntax invisible. This PR fixes that documentation gap.
Files changed
.claude/skills/swamp-model/SKILL.md— Quick reference, examples, options table.claude/skills/swamp-model/references/examples.md— Runtime inputs section.claude/skills/swamp-model/references/scenarios.md— Runtime inputs scenario.claude/skills/swamp-workflow/SKILL.md— Quick reference, examples, options table.claude/skills/swamp-workflow/references/scenarios.md— Nested workflow example
Test plan
- Verify
swamp model method run <name> <method> --input key=value --jsonworks as documented - Verify
swamp workflow run <name> --input key=value --jsonworks as documented - Verify JSON form still works:
--input '{"key": "value"}' - Verify dot notation works:
--input config.timeout=30
Closes #760
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260319.184717.0-sha.0e4c970c/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/v20260319.184717.0-sha.0e4c970c/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/v20260319.184717.0-sha.0e4c970c/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/v20260319.184717.0-sha.0e4c970c/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260319.180241.0-sha.12ca0b71
What's Changed
- feat: support environment variable expansion in datastore paths (#779)
Summary
Fixes #775
The filesystem datastore path in .swamp.yaml was stored as an absolute path (e.g. /Users/blake.irvin/.swamp/hello-swamp), which breaks portability when the repo is cloned on a different machine or user account.
This PR adds environment variable expansion to datastore paths, so .swamp.yaml can store portable paths like $HOME/.swamp/hello-swamp that resolve correctly at runtime on any machine.
What changed
- New
expandEnvVars(path)— expands~,$VAR, and${VAR}references from the environment at runtime. Throws a clearUserErrorif a referenced variable is not set. - New
collapseEnvVars(path)— whenswamp datastore setup filesystemwrites to.swamp.yaml, it collapses the$HOMEprefix back to$HOME/...so the stored path is portable by default. - Applied at both read points — env var / CLI
--datastorearg and.swamp.yamlfilesystem path both expand env vars before use.
Why general env var expansion (not just $HOME)
We considered special-casing only $HOME/~, but teams may use other env vars too — $XDG_DATA_HOME for XDG compliance, $SWAMP_DATA_ROOT for shared NFS mounts, or $PROJECT_DATA_DIR in CI. General $VAR/${VAR} expansion covers all these cases with the same small amount of code.
Manual verification
Compiled the binary, then:
$ mkdir /tmp/swamp-env-test && cd /tmp/swamp-env-test
$ swamp repo init
$ swamp datastore setup filesystem --path ~/.swamp/env-test-store
Confirmed .swamp.yaml stores the portable path:
datastore:
type: filesystem
path: $HOME/.swamp/env-test-storeConfirmed swamp datastore status resolves it correctly:
Datastore Status
Type: filesystem
Path: /Users/stack72/.swamp/env-test-store
Health: ● healthy (1ms)
Test plan
- 14 new unit tests for
expandEnvVarsandcollapseEnvVars(tilde,$VAR,${VAR}, undefined vars throw, passthrough, roundtrip) - All 3393 existing tests pass
-
deno check,deno lint,deno fmtall clean - Manual end-to-end test with compiled binary
🤖 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/v20260319.180241.0-sha.12ca0b71/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/v20260319.180241.0-sha.12ca0b71/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/v20260319.180241.0-sha.12ca0b71/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/v20260319.180241.0-sha.12ca0b71/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260319.173738.0-sha.1a4711da
What's Changed
- fix: silence spurious warnings for type-only .ts files in extension models (#778)
Summary
Fixes #776.
- When extension models use a modular file structure with type-only
.tsfiles (e.g.,my_model/types.ts),bundleExtension()threw on the empty output because TypeScript erases interfaces and type aliases at compile time. This surfaced as noisy warnings during model loading even though the models worked fine. - Replace the throw with a minimal
export {};module so the existing loader skip logic (which already silently skips files withoutmodel/extensionexports) handles these files naturally. - The fix is in the shared
bundleExtension()function, so it applies to all 4 loaders (models, vaults, drivers, datastores) with no loader changes needed.
User impact
Users with modular extension models that include helper type files (interfaces, type aliases) will no longer see confusing "deno bundle produced empty output" warnings. No behavior change for valid models.
Test plan
- New unit test:
bundleExtension returns minimal module for type-only files— verifies empty bundle producesexport {};instead of throwing - New integration test:
UserModelLoader silently skips type-only .ts files in subdirectories— verifies type-only files in a model subdirectory don't appear inresult.failed - All existing tests pass (
deno run test,deno check,deno lint,deno fmt)
🤖 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/v20260319.173738.0-sha.1a4711da/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/v20260319.173738.0-sha.1a4711da/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/v20260319.173738.0-sha.1a4711da/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/v20260319.173738.0-sha.1a4711da/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260319.155838.0-sha.5364c61c
What's Changed
- feat: search community extensions before creating custom models (#777)
feat: search community extensions before creating custom models
Summary
- Rewrites Rule #1 in the CLAUDE.md template from "Extension models for service integrations" to "Search before you build", with explicit steps: search local types → search community extensions (
swamp extension pull) → install if found → only then create custom - Adds a community search step to the
swamp-modelskill workflow - Adds Scenario 5 ("Community Extension Found") to the
swamp-extension-modelskill showing the happy path where a community extension exists
User Impact
Previously, agents only saw guidance to "create an extension model" in the CLAUDE.md Rules section. The swamp-extension-model skill documented the search-first flow, but agents only loaded that skill after deciding to create a model — too late. Now agents see the search-first guidance immediately in Rule #1, prompting them to run swamp extension search before building anything custom.
Test Plan
- New unit test:
RepoService.init generates CLAUDE.md with extension search guidance— asserts generated CLAUDE.md containsextension search,Search before you build, andswamp model type search - All 78 repo service tests pass
- Full test suite passes
-
deno check,deno lint,deno fmtall pass -
deno run compile— binary recompiled - Manual verification: Asked an agent to "create me a model that I can use to create an aws ec2 instance" — the agent correctly ran
swamp model type search "ec2"followed byswamp extension search "ec2 instance"before attempting to create anything, then found a community extension and usedswamp extension pullto install it
Closes #757
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260319.155838.0-sha.5364c61c/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/v20260319.155838.0-sha.5364c61c/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/v20260319.155838.0-sha.5364c61c/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/v20260319.155838.0-sha.5364c61c/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260319.021849.0-sha.a5b52081
What's Changed
- feat: add swamp-extension-vault skill for custom vault providers (#773)
Summary
- Add the missing
swamp-extension-vaultskill to complete the full set of extension content type skills - Previously only 3 of 4 extension types had creation skills:
swamp-extension-model,swamp-extension-driver,swamp-extension-datastore— vaults were the gap - Add
swamp-extension-vaultto the skills list in bothCLAUDE.mdand the generated template inrepo_service.ts
What's included
The new skill at .claude/skills/swamp-extension-vault/ contains:
| File | Purpose |
|---|---|
SKILL.md |
Main skill doc — quick start template, export contract (type, name, description, configSchema, createProvider), VaultProvider interface (get, put, list, getName), configuration via .swamp.yaml, development workflow, discovery/loading rules, key rules, cross-references |
references/api.md |
Full VaultProvider and VaultConfiguration interface documentation sourced from vault_provider.ts |
references/examples.md |
Three complete working examples: in-memory vault, HTTP API vault, encrypted file vault with AES-GCM |
references/troubleshooting.md |
Common issues: type not found, config validation, stale bundles, auth failures, network errors |
Why this is correct
- Follows the exact same structure as
swamp-extension-datastore(closest analogue — both are TypeScript files exporting a named const withtype,name,description,configSchema,createProvider) - Export contract matches the
UserVaultSchemainsrc/domain/vaults/user_vault_loader.tsexactly VaultProviderinterface matchessrc/domain/vaults/vault_provider.tsexactly- Key difference from datastores correctly documented:
createProvidertakes two args(name, config)vs datastores' single(config)arg - Scores 100% on
npx tessl skill review - All 77 repo_service tests pass with the template update
Impact
- AI coding assistants (Claude, Cursor, etc.) can now guide users through creating custom vault providers without needing to reverse-engineer the interface from source code
- Completes the extension skill matrix — all 4 extension content types now have dedicated creation skills
Test Plan
-
npx tessl skill review .claude/skills/swamp-extension-vault— 100% (description 100%, content 100%) -
deno run test src/domain/repo/repo_service_test.ts— 77/77 pass - No conflicts with upstream changes (resolved cleanly after
but pull)
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260319.021849.0-sha.a5b52081/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/v20260319.021849.0-sha.a5b52081/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/v20260319.021849.0-sha.a5b52081/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/v20260319.021849.0-sha.a5b52081/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/swamp 20260319.020120.0-sha.17c0bda6
What's Changed
- feat: add package.json support and fix ambient package.json interference (#772)
Summary
- Extensions can now live inside existing Node/TypeScript projects with
package.jsondependency management - Fixes a critical bug where an unrelated
package.jsonin the directory tree breaks allnpm:prefixed extension imports (#617) - Resolves
no-import-prefixlint conflicts by enabling bare specifiers viapackage.json(#758) - Supersedes the documentation workaround in #693
Problem
Two related issues were affecting users:
-
Issue #617: A user added
package.jsonto their repo root for@anthropic-ai/claude-code. This caused Deno to switch tonode_modules/resolution mode, breaking all extension bundling with:error: Could not find a matching package for 'npm:@octokit/rest@22.0.1' in the node_modules directory. -
Issue #758: Extensions using
npm:andjsr:inline specifiers conflict with Deno'sno-import-prefixlint rule, forcing every file to include// deno-lint-ignore no-import-prefixsuppress comments. Users wanted to use bare specifiers viapackage.jsoninstead.
What changed
src/domain/models/bundle.ts
- Added
packageJsonDir?: stringtoBundleOptions— mutually exclusive withdenoConfigPath - When
packageJsonDiris set: uses--node-modules-dir=auto(works with bothnpm installanddeno install), setscwdon the subprocess so Deno auto-detectspackage.json - When NO project config is used: now passes
--node-modules-dir=noneto prevent any ambientpackage.jsonin the directory tree from interfering withnpm:prefixed imports - Added
isZod4InPackageJson()— readsdependencies/devDependenciesfor zod 4.x, externalizes bare"zod"specifier when found - Added
joinimport from@std/path
src/cli/commands/extension_push.ts
- Added
findPackageJson()— same walk-up pattern asfindDenoConfig, returns the directory containingpackage.json - Added
requireNodeModules()— validatesnode_modules/exists, throwsUserErrorwith clear instructions if missing - Added bare specifier gate: only uses a detected
package.jsonwhen at least one extension entry point contains bare specifiers (viasourceHasBareSpecifiers). This prevents an unrelatedpackage.json(e.g., for tooling) from being mistakenly treated as the extension's project config findDenoConfigis completely untouched — zero regression risk for the deno.json path- Updated
bundleOptionsderivation to includepackageJsonDir
Detection logic
Detection is sequential, not interleaved, to guarantee deno.json always wins:
- Walk up from manifest to repo root looking for
deno.json(full walk) - Only if no
deno.jsonfound: walk up looking forpackage.json - Only if
package.jsonfound AND extension has bare specifiers: use it - Otherwise: no project config (default behavior with
--node-modules-dir=none)
This design prevents the scenario where a package.json at a closer directory level would shadow a deno.json higher up.
Bundling permutations
| Scenario | deno bundle flags |
Quality check flags |
|---|---|---|
deno.json found |
--config <path> |
--config <path> |
package.json found, bare specifiers |
--node-modules-dir=auto, cwd set |
--no-config |
package.json found, npm: imports |
--no-lock --node-modules-dir=none |
--no-config |
| No config found | --no-lock --node-modules-dir=none |
--no-config |
Design docs and skills
design/extension.md— Complete rewrite of project-aware bundling section with decision matrix table, bare specifier gate explanation,--node-modules-dir=nonerationale, and updated zod externalization/runtime caching sectionsswamp-extension-model/SKILL.md— Updated import and version pinning rules to includepackage.jsonswamp-extension-model/references/examples.md— Addedpackage.jsonimport style example withnode_modules/requirement noteswamp-extension-model/references/publishing.md— Updated "Detect project config" step to cover both config typesswamp-extension-driver/SKILL.md— Updated pin versions ruleswamp-extension-datastore/SKILL.md— Updated pin versions rule
User impact
Extensions in Node/TypeScript projects (new capability)
Users with package.json and bare specifiers can now swamp extension push without creating a deno.json wrapper. Requires node_modules/ from npm install or deno install.
Unrelated package.json no longer breaks extensions (bug fix)
Users who add a package.json to their repo for unrelated tooling (e.g., @anthropic-ai/claude-code, husky, prettier) will no longer see their extension bundling break. The --node-modules-dir=none flag prevents Deno from switching to node_modules/ resolution mode.
Lint conflict resolution (improvement)
Users can now use bare specifiers via package.json (or deno.json) to avoid the no-import-prefix lint rule conflict, eliminating the need for suppress comments on every import line.
Existing extensions (no change)
Extensions with deno.json — unchanged (detection code untouched). Extensions with inline npm: deps and no config — unchanged (same flags plus --node-modules-dir=none safety net). Pulled extensions — unchanged (cached bundle preference already handles bare specifiers).
Testing performed
Automated (3376 tests, 0 failed)
deno check— zero type errorsdeno lint— all files cleandeno fmt --check— all files cleandeno run test— 3376 tests passed, 0 failed- Integration test: pull + load
@stack72/letsencrypt-certificate@2026.03.04.1
Manual end-to-end (6 scenarios)
1. package.json + bare specifiers + npm install
- Created fresh swamp repo with
package.jsoncontainingzod@4.3.6and@aws-sdk/client-secrets-manager@3.1010.0 - Extension source uses bare specifiers (
from "zod",from "@aws-sdk/client-secrets-manager") - Ran
npm install(NOTdeno install) swamp extension fmt manifest.yaml— passedswamp extension push manifest.yaml --dry-run— produced 203.5KB archive- Debug log confirmed:
Found package.json project at /private/tmp/swamp-ext-test swamp vault type list— vault loaded successfully at runtime
2. package.json + bare specifiers + deno install
- Same setup but used
deno installinstead ofnpm install - Push dry-run produced identical 203.5KB archive
- Vault loaded at runtime
3. package.json without node_modules/ (error case)
- Created repo with
package.jsonand bare specifier extension, nonpm install swamp extension push manifest.yaml --dry-runfailed with clear error:
No node_modules/ found at /private/tmp/swamp-ext-test. Run 'npm install' or 'deno install' to install dependencies before pushing.
4. Unrelated package.json + npm: imports (issue #617 scenario)
- Created repo with
package.jsoncontaining only@anthropic-ai/claude-code - Extension uses
npm:zod@4.3.6(NOT bare specifiers) - Ran
npm install - Debug log confirmed:
Ignoring package.json at /private/tmp/swamp-ext-test (extension uses npm: prefixed imports) - Push dry-run produced 203.4KB archive — bundling succeeded with
--node-modules-dir=none
5. deno.json regression check
- Created repo with
deno.jsonimport map + bare specifiers (nopackage.json) - Push dry-run produced 203.4KB archive
- Debug log confirmed:
Found deno.json at /private/tmp/swamp-ext-test/deno.json - Behaviour identical to previous PR
6. deno.json takes precedence over package.json
- Created repo with BOTH
deno.jsonandpackage.json - Debug log confirmed only
deno.jsonwas detected —package.jsonwas not even checked
7. Inline deps, no config files
- Extension with
npm:zod@4.3.6imports, nodeno.json, nopackage.json - Push dry-run produced 203.4KB archive
- Zod externalized via source scanning
8. Pull + load existing extension
swamp extension pull @stack72/letsencrypt-certificate@2026.03.04.1— succeededswamp model type search letsencrypt— found@stack72/letsencrypt-certificate
9. --node-modules-dir=auto compatibility
- Verified
deno bundle --node-modules-dir=autoauto-initializesnode_modules/.deno/metadata when onlynpm installwas run - This is what makes
npm installwork (without it,deno bundlefails with "Did you forget to rundeno install?")
10. Regex safety (from previous PR, still passing)
rewriteZodImportsdoes NOT matchzod-utils,zodiac,npm:zod@3, orzod@3- Only matches zod 4.x or unversioned bare
"zod"
Test plan
- CI passes (type check, lint, fmt, tests)
- Verify
swamp extension push --dry-runworks for extension withpackage.json+ bare specifiers - Verify unrelated
package.jsondoes not break extensions withnpm:imports - Verify
deno.jsonpath is unchanged (regression check) - Verify
swamp extension pull+ runtime load works for existing published extensions
Closes #617
Closes #758
Supersedes #693
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260319.020120.0-sha.17c0bda6/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/v20260319.020120.0-sha.17c0bda6/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/v20260319.020120.0-sha.17c0bda6/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/v20260319.020120.0-sha.17c0bda6/swamp-linux-aarch64 -o swamp
chmod +x ...swamp 20260319.011305.0-sha.1d5b7af1
What's Changed
- docs: improve extension datastore skill workflow clarity (#771)
Summary
- Replace flat "Verify" section in the
swamp-extension-datastoreskill with a numbered Development Workflow section - Adds explicit validation checkpoints and "if X fails, do Y" error recovery feedback loops
- Addresses
tessl skill reviewsuggestions for workflow clarity, bringing the skill score from 94% to 100%
Context
PR #770 updated several extension skills but the datastore skill's workflow clarity scored 2/3 on the tessl review. This PR addresses the two specific suggestions:
- Add an explicit numbered workflow section that sequences the full create-configure-verify cycle
- Integrate verification commands and error recovery into the workflow with feedback loops
Test plan
-
npx tessl skill review .claude/skills/swamp-extension-datastore— 100% score (was 94%)
🤖 Generated with Claude Code
Installation
macOS (Apple Silicon):
curl -L https://github.com/systeminit/swamp/releases/download/v20260319.011305.0-sha.1d5b7af1/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/v20260319.011305.0-sha.1d5b7af1/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/v20260319.011305.0-sha.1d5b7af1/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/v20260319.011305.0-sha.1d5b7af1/swamp-linux-aarch64 -o swamp
chmod +x swamp && sudo mv swamp /usr/local/bin/