Skip to content

fix(sync): shared-base quiet mode + manifest-derived bootstrap symlinks - #14

Merged
ronsilver merged 6 commits into
mainfrom
fix/shared-flag-deployment-2026-08-26
Aug 26, 2026
Merged

ronsilver merged 6 commits into
mainfrom
fix/shared-flag-deployment-2026-08-26

Conversation

@ronsilver

Copy link
Copy Markdown
Owner

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 in make sync output.

Why

make sync output 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_SYNC env var suppresses per-file logs during the shared content phase; --debug preserves full detail
  • scripts/sync.sh + scripts/lib/sync.sh: new get_shared_base(), get_shared_write_path(), has_skill_directories() helpers; sync_shared_directory_content() writes shared:true targets once with summary logging
  • scripts/bootstrap-symlinks.sh: complete rewrite — manifest-derived (no hardcoded link map), backup-first, idempotent, --dry-run, UNLINK verb for shared:false migration
  • Makefile: sync split into sync-content + bootstrap-symlinks (serial via .NOTPARALLEL); bootstrap gets visual section banner; validate-shared-targets gate added
  • scripts/validate-shared-targets.sh: enforces invariant feat(gitnexus): migrate graphify to gitnexus skills (ADR-0037) #11 (directory targets keep agent real dirs in path/scripts_path)
  • content/hooks/claude-code/settings.fragment.json: hook commands use ${DETECTED_BASE}/hooks/... placeholders

Verification

  • All 259 tests pass (make test)
  • make check green (lint → lint-md → lint-yaml-json → fmt-check → validate → test)
  • 5 conventional commits: feat, refactor, build, test, docs
  • Sync order unchanged: sync-content → cleanup → bootstrap-symlinks

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.
@ronsilver ronsilver self-assigned this Aug 26, 2026
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).
@ronsilver
ronsilver merged commit 6692ee5 into main Aug 26, 2026
11 of 12 checks passed
@ronsilver
ronsilver deleted the fix/shared-flag-deployment-2026-08-26 branch August 26, 2026 21:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant