Skip to content

Installing Plugins

Ptah plugins are enabled per workspace. A plugin that’s active in your Angular app won’t clutter a Python service next door — each workspace carries its own selection.

  1. Open Marketplace → Plugins and click Configure.
  2. Tick the checkbox on the plugins you want. Clicking anywhere on the row toggles it.
  3. Click Save Configuration.

Ptah then:

  1. Persists the selection for the current workspace.
  2. Resolves each enabled plugin ID to its directory under ~/.ptah/plugins/ — unknown IDs and missing directories are dropped, not guessed at.
  3. Invalidates the slash-command cache so the plugin’s commands appear in / autocomplete.
  4. Creates skill junctions under <workspace>/.claude/skills/ and copies command files into <workspace>/.claude/commands/, so third-party AI clients discover them too.

Reopen the same modal, untick the plugin, and save. The junctions for its skills are removed and the orchestrator stops offering its commands. The downloaded files stay in ~/.ptah/plugins/ — see Managing plugins.

Your enabled-plugin selection is not a file in your repository. It is stored in the host’s per-workspace state store — VS Code’s workspaceState Memento, and the equivalent store in the desktop app — under the key:

ptah.plugins.config

The persisted record holds three lists plus a timestamp:

FieldMeaning
enabledPluginIdsBundled plugins you explicitly turned on (opt-in)
disabledPluginIdsHarness plugins you explicitly turned off (opt-out)
disabledSkillIdsIndividual skills you switched off — see Skill toggles
lastUpdatedISO timestamp of the last save

Because this lives in host state and not in your working tree, there is nothing to commit and nothing to gitignore. Teammates who clone the repository start with an empty selection and pick their own plugins. If you want a shared baseline for a project, put it in the project’s onboarding notes — Ptah has no mechanism today for sharing a plugin selection through version control.

The downloaded plugin files themselves are global, not per workspace:

~/.ptah/plugins/

Skill directory names form a single flat namespace under .claude/skills/. If two enabled plugins both ship a skills/orchestration/, Ptah resolves it like this:

  1. The first plugin path that supplies the name wins. Enabled bundled plugins are walked first, in the order held in your saved selection, then your harness-authored plugins.
  2. Later plugins offering the same name are skipped, and the collision is written to the Ptah logs as a warning.
  3. If .claude/skills/<name> is already a real directory — something you or another tool created — Ptah leaves it alone and does not overwrite it. Your own file wins over any plugin.

There is no conflict UI. Nothing is surfaced in the app when a collision happens, so the logs are the only place it shows up. Give your own skills distinctive directory names and this stays theoretical.