Skip to main content
← Back to list
01Issue
BugShippedSwamp CLIPublic
Assigneesskunk-ape

Relationships

↔ sibling #3031

#3018 extension push: sub-directory extensions cannot be found from outside their directory (manifest path, directory argument, --extensions-dir for workflows and skills)

Opened by skunk-ape · 10/5/2026· Shipped 10/6/2026

Problem

swamp extension push cannot find the files an author points at when the extension lives in a sub-directory, which is how every extension in swamp-extensions is laid out. Getting one to dry-run from outside its own directory took four attempts in the assessment, and each failure named the wrong fix or none. Four of 21 hand-written extensions (kubernetes, cve/researcher, both bootstraps) cannot be dry-run from a sibling repo at all.

What the author types What happens Why
swamp extension push manifest.yaml from the extension dir, with SWAMP_REPO_DIR set Manifest file not found: $SWAMP_REPO_DIR/manifest.yaml Relative manifest paths resolve against the repo dir, not cwd (extension_push.ts:298, resolve_extension_files.ts:116)
swamp extension push <dir> IsADirectory ... readfile (EISDIR) The directory is read as if it were the manifest (#2747)
--extensions-dir <ext>/extensions Model file not found ... expected at <ext>/extensions/extensions/models/... The flag is a base to which extensions/models is appended; the message does not say so
--extensions-dir <ext> with a workflows: or skills: entry Workflow file not found (looked in <repo>/workflows, <repo>/extensions/workflows) / Skill directory not found Workflows and skills ignore --extensions-dir; only paths.base: manifest moves them

paths.base: manifest fixes all four, and none of the 704 manifests in swamp-extensions sets it. #459 and #540 made paths.base: manifest work for skills and workflows; this issue covers what they left.

Expected

  • A relative manifest path resolves against the current directory.
  • A directory argument means <dir>/manifest.yaml; a directory without one fails with No manifest.yaml found in <dir>. Never readTextFile on a directory. (Merges #2747, including the misleading "Manifest file not found" for a non-existent path.)
  • paths.base: manifest is the default when the manifest is not at the repo root, or push prints a loud hint naming it.
  • --extensions-dir applies to workflows and skills as it does to models.
  • Every not-found error names the flag or manifest setting that fixes it, and prints the paths it looked in.

Acceptance

  • The four rows above, run against a copy of swamp-extensions laid out as CI publishes it, each either succeed or print an error naming the fix.
  • swamp extension push extensions/models/x and swamp extension push extensions/models/x/manifest.yaml are equivalent.
  • The four extensions that cannot be dry-run today (kubernetes, cve/researcher, the two bootstraps) dry-run from a sibling repo.

Out of scope

#2613 (workflows under a shared prefix collapse into one file) is in the same file and goes first in this lane.

Source: the extension push assessment (2026-10-02, swamp 20261002.194016) and the Extension Push UX Plan, which groups this with its lane and order.

02Bog Flow
✓OPEN✓TRIAGED✓IN PROGRESS✓SHIPPED+ 1 MOREASSIGNED+ 9 MOREREVIEW+ 13 MOREPR_MERGED+ 2 MORESESSION_SUMMARIZED

Shipped

10/6/2026, 8:25:52 PM

Click a lifecycle step above to view its details.

03Sludge Pulse
skunk-ape assigned skunk-ape10/6/2026, 6:58:29 PM
skunk-ape linked sibling of #303110/6/2026, 7:15:13 PM
Editable. Press Enter to edit.

skunk-ape commented 10/5/2026, 2:34:54 PM

Guardrail: changing the paths.base default or --extensions-dir scope must not change what any existing manifest packages. Acceptance should include an archive-content comparison across the hand-written extensions in swamp-extensions before and after: identical archives, or a loud error, never a silently different one.

Sign in to post a ripple.