Conversation
…rectory - Prepend pack identifier as subdirectory to copyPackFile destinations in ExternalPackAdapter, preventing cross-pack file collisions - Update existing adapter test assertions to expect namespaced paths - Add integration test verifying two packs with same hook filename coexist and removal is independent
- Memoize ExternalPackAdapter.components as a stored property computed once at init - Add projectHookCommand/globalHookCommand helpers to LifecycleTestBed - Replace 9 hand-assembled hook command string literals with helper calls
- Skip pack-id subdirectory prefix for .skill file type to avoid double nesting that breaks Claude Code skill discovery - Skills use directory-based identity (.claude/skills/<name>/SKILL.md) — an extra nesting level makes them invisible
- Add inline comment explaining why skills are excluded from destination namespacing - Remove unused globalHookCommand helper from LifecycleTestBed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Prevents cross-pack file collisions by namespacing
copyPackFiledestinations with the pack identifier as a subdirectory prefix. When two packs define the same destination filename, they now install to distinct paths (e.g.,.claude/hooks/pack-a/lint.shvs.claude/hooks/pack-b/lint.sh).Changes
<pack-identifier>/tocopyPackFiledestinations inExternalPackAdapter.convertInstallAction, covering all fiveCopyFileTypecases (hooks, skills, commands, agents, generic)ExternalPackAdapter.componentsas a stored property computed once at initprojectHookCommand/globalHookCommandhelpers toLifecycleTestBed, replacing 9 hand-assembled hook command string literalsCrossPackCollisionTestsintegration test verifying two packs with same hook filename coexist and removal is independentTest plan
swift testpasses locally (866 tests)swiftformat --lint .andswiftlintpass without violationsmcs sync,mcs doctor)Checklist for engine changes
LifecycleIntegrationTestsorDoctorRunnerIntegrationTests)PathContainment.safePath()and handle thenil(escape) caseCloses #278