Summary
Post–Epic A hardening pass: path-traversal fixes at install, symlink safety, integrity verification, continueWith iteration cap, missing tests, SSRF-redirect fix.
Plan: .agents/plans/2026-06-26-epic-a-architecture-epic-b-harden.md
Depends on: #42 (Epic A)
P0 — Release-blocking
P1
P2
Trust model
Community plugin add installs attacker-controlled manifests. All path-traversal/injection = arbitrary delete/write/RCE. P0 items are release-blocking.
Summary
Post–Epic A hardening pass: path-traversal fixes at install, symlink safety, integrity verification, continueWith iteration cap, missing tests, SSRF-redirect fix.
Plan:
.agents/plans/2026-06-26-epic-a-architecture-epic-b-harden.mdDepends on: #42 (Epic A)
P0 — Release-blocking
sanitizeName()at install — reject non-kebab/..//(store.ts:471,475,537)sanitizeJoin()fornativeCopies.from/to(cli/build.ts:120-124)0.4.0+ write## v0.4.0CHANGELOG entryP1
lstatSyncguard — onlyunlinkSyncsymlinks, neverrmSync(recursive)on real dirssanitizeName()on SKILL.mdname:frontmatter before symlinkingcapabilities:['subprocess']gate (currently inert) — feed real handler source in build/addunlinkAll()for idempotentinstallPlugincontinueWithstop block; fixcontinueWithSafetyRulelint pathP2
safe-fetchvs allow-list + private-IPverifyIntegrity()on install when manifest declaresintegrityadd/import --writecloneRepointerpolationsidecarexperimental in schema/docsTrust model
Community plugin
addinstalls attacker-controlled manifests. All path-traversal/injection = arbitrary delete/write/RCE. P0 items are release-blocking.