Repository navigation
fix(sync): shared-base quiet mode + manifest-derived bootstrap symlinks - #14
Merged
Merged
Conversation
Replace per-file [INFO] → logging with summary mode for shared targets.
QUIET_SYNC env var suppresses per-file logs during the shared content
phase; debug output preserved with --debug. Add get_shared_base(),
get_shared_write_path(), and has_skill_directories() helpers. Shared
directory impls branch on shared:true (write once to shared base) vs
shared:false (write per workspace). Fragment merge expands
${DETECTED_BASE} placeholders per detected workspace.
Replace hardcoded agent dir list with manifest-driven symlink bootstrap.
Derives per-agent paths from agents.*.targets.{skills,subagents,hooks}
path/scripts_path fields via resolve_agent_dirs(). Supports
${DETECTED_BASE} expansion for detect_as_base agents. Backup-first
(idempotent, never deletes), --dry-run, UNLINK verb for shared:false
migration. Removes recursive "Run make sync" hint.
… gate Add sync-content and bootstrap-symlinks targets; sync = sync-content + bootstrap-symlinks (serial via .NOTPARALLEL). sync-force reuses bootstrap-symlinks via $(MAKE). Bootstrap section gets visual banner. Add validate-shared-targets gate enforcing invariant #11 (directory targets keep agent real dirs in path/scripts_path).
…uites Add test_bootstrap_symlinks.bats (6 tests: get_shared_write_path default+override, write-once dedup, manifest-derived bootstrap, shared:false unlink). Add test_validate_shared_targets.bats (8 tests: canonical shared_base, missing shared_base, directory path at shared base, file-level skip, shared_dir rejection, legacy key rejection, shared:false path-required, shared:false+transform). Update test_sync.bats: HOME-isolated shared_base fixtures (never touches live ~/.claude*); 252 → 259 total.
CHANGELOG: add entries for quiet mode, bootstrap rewrite, Makefile split, validation gate, test suites, manifest.shared_base. AGENTS.md: add invariant #11 (Shared-Dir Sync), Sync Targets validation rules, content registration note. CONTRIBUTING.md: directory-format target note. README.md: update make target descriptions, add validate-shared-targets. .gitignore: add verification-results. manifest.example.yaml: add shared_base top-level key and directory target shared flag.
manifest.yaml is gitignored and absent in CI. The test was passing /manifest.yaml which does not exist on ubuntu-latest, causing exit 1. Switch to manifest.example.yaml (committed).
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.
What
Shared-base sync output now shows one summary line per target instead of 73+ individual
[INFO] →lines. Bootstrap symlinks get their own visible section inmake syncoutput.Why
make syncoutput was unreadable with 73+[INFO] →lines for skills. Bootstrap output was incorrectly nested under the Cleanup section, making it hard to track sync progress.How
QUIET_SYNCenv var suppresses per-file logs during the shared content phase;--debugpreserves full detailscripts/sync.sh+scripts/lib/sync.sh: newget_shared_base(),get_shared_write_path(),has_skill_directories()helpers;sync_shared_directory_content()writes shared:true targets once with summary loggingscripts/bootstrap-symlinks.sh: complete rewrite — manifest-derived (no hardcoded link map), backup-first, idempotent,--dry-run,UNLINKverb for shared:false migrationMakefile:syncsplit intosync-content+bootstrap-symlinks(serial via.NOTPARALLEL); bootstrap gets visual section banner;validate-shared-targetsgate addedscripts/validate-shared-targets.sh: enforces invariant feat(gitnexus): migrate graphify to gitnexus skills (ADR-0037) #11 (directory targets keep agent real dirs inpath/scripts_path)content/hooks/claude-code/settings.fragment.json: hook commands use${DETECTED_BASE}/hooks/...placeholdersVerification
make test)make checkgreen (lint → lint-md → lint-yaml-json → fmt-check → validate → test)