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 withNo manifest.yaml found in <dir>. NeverreadTextFileon a directory. (Merges #2747, including the misleading "Manifest file not found" for a non-existent path.) paths.base: manifestis the default when the manifest is not at the repo root, or push prints a loud hint naming it.--extensions-dirapplies 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/xandswamp extension push extensions/models/x/manifest.yamlare 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.
Shipped
Click a lifecycle step above to view its details.
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.