Global tooling setups

Dev Profiles

Named bundles of global kits and artifacts. Switch profiles to tear down one set of HubBound-owned installs and apply another — without touching enforced or non-HubBound files.

What they are

A profile is a named set of pins (artifacts and kits) that HubBound materializes into your global tool homes — Claude Code, Cursor, Codex, Copilot, Antigravity, and so on.

Profiles are global only. They do not replace a project's HubBound file (hubbound.json), and they do not apply with --scope local.

What they are for

Use profiles when you want different global tooling setups — for example work vs personal — and need a safe way to swap them.

Switching removes only optional installs owned by the previous profile, then applies the target profile's pins.

  • Never uninstalls enforced / RuleMandatory installs.
  • Never removes files without HubBound ownership markers.
  • Pins with version latest are checked for updates during switch.

Where they are stored

Profiles live under the HubBound user config directory (os.UserConfigDir()/hubbound-lab). On macOS that is typically ~/Library/Application Support/hubbound-lab; on Linux ~/.config/hubbound-lab.

hubbound-lab/

profiles/

active # e.g. work

work/hubbound.json

personal/hubbound.json

state/

artifact_installs.json

kit_installs.json

profiles/<name>/hubbound.json Pins for that profile (same shape as a project manifest).
profiles/active Plain-text name of the active profile.
state/artifact_installs.json Install ledger; profile-owned rows carry profile_id.
state/kit_installs.json Kit ledger; same optional profile_id field.

What they modify

Applying a profile installs or upgrades the pinned kits/artifacts into global tool config directories and stamps profile_id on the ledger rows.

Switching away uninstalls optional installs whose profile_id matches the previous active profile and that are not required by the target.

  • Provider files HubBound owns (skills, hooks, rules, etc.) for profile-owned optional installs.
  • profiles/active and the profile's hubbound.json pins.
  • Ledger entries — ownership lives in profile_id, not in provider marker formats.

Commands that use them

Profiles are driven by the profile subcommands and by install --profile.

$ hubbound profile create work

$ hubbound install artifact author/my-hook --profile work

$ hubbound profile switch personal

$ hubbound profile list

hubbound profile create Create profiles/<name>/hubbound.json. First profile becomes active; may absorb existing unprofiled global installs.
hubbound profile switch Teardown previous profile-owned optionals → check latest pins → apply target → write profiles/active.
hubbound profile list Scan profiles/*/hubbound.json; show counts and which one is active.
hubbound install … --profile Always pin into that profile. Active → install now. Inactive → offer TUI switch (or print a hint with --no-tui).