Layers
cmd/mcpup: process entrypoint and exit code handling
internal/cli: command parsing + orchestration
internal/store: canonical config schema, validation, persistence, CRUD
internal/planner: desired/current state normalization, diffing, dry-run summaries
internal/adapters: per-client detect/read/apply/write/validate
internal/core: reconciler and exit semantics
internal/backup: snapshot, rollback, retention
internal/profile: profile create/list/apply/delete orchestration
internal/validate: doctor diagnostics
internal/output: human/json rendering contract
Canonical Flow (enable/disable)
- Load canonical config
- Mutate desired canonical state
- Build desired client state
- Diff current vs desired via adapter
- Dry-run: print summary and exit
- Snapshot client config
- Write desired client config
- Validate client config
- Save canonical config
Failure Recovery
- Client write/validate failures trigger restore from backup
- Reconcile returns stable error code for partial recovery scenarios
- Profile apply rolls back previously changed clients on partial failure