From GSD Core
Manages the runtime skill surface — enable, disable, or switch profiles for skill clusters without reinstalling. Also supports listing status and resetting.
How this command is triggered — by the user, by Claude, or both
Slash command
/gsd-core:surface [list|status|profile <name>|disable <cluster>|enable <cluster>|reset]gsd/This command is limited to the following tools:
The summary Claude sees in its command listing — used to decide when to auto-load this command
<objective> Manage the runtime skill surface without reinstall. Reads/writes `~/.claude/.gsd-surface.json` (sibling to `~/.claude/.gsd-profile`) and re-stages the active skills directory in place. Skill dirs live at `~/.claude/skills/gsd-*/`. Sub-commands: list · status · profile · disable · enable · reset </objective> ## Sub-command routing Parse the first token of $ARGUMENTS: | Token | Action | |---|---| | `list` | Show enabled + disabled clusters and skills | | `status` | Alias for `list` plus token cost summary | | `profile <name>` | Write `baseProfile` and re-stage | | `profile <n1...
Sub-commands: list · status · profile · disable · enable · reset
Parse the first token of $ARGUMENTS:
| Token | Action |
|---|---|
list | Show enabled + disabled clusters and skills |
status | Alias for list plus token cost summary |
profile <name> | Write baseProfile and re-stage |
profile <n1>,<n2> | Composed profiles (comma-separated, no spaces) |
disable <cluster> | Add cluster to disabledClusters, re-stage |
enable <cluster> | Remove cluster from disabledClusters, re-stage |
reset | Delete .gsd-surface.json, return to install-time profile |
| (none) | Treat as list |
Load the capability registry and call listSurface(runtimeConfigDir, manifest, CLUSTERS, registry) from
gsd-core/bin/lib/surface.cjs. The registry is loaded via:
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
Display:
Enabled (N skills, ~T tokens):
core_loop: new-project discuss-phase plan-phase execute-phase help update
audit_review: …
…
Disabled:
utility: health stats settings …
Token cost: ~T (budget cap ~500 tokens for 200k context @ 1%)
For status also append:
Base profile: standard (from .gsd-surface.json)
Install profile: standard (from .gsd-profile)
readSurface(runtimeConfigDir) → if null, seed from readActiveProfile(runtimeConfigDir).surfaceState.baseProfile = name.writeSurface(runtimeConfigDir, surfaceState).const registry = require('gsd-core/bin/lib/capability-registry.cjs');
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
<name>. N skills enabled."Valid cluster names: core_loop, audit_review, milestone, research_ideate,
workspace_state, docs, ui, ai_eval, ns_meta, utility.
Object.keys(CLUSTERS).surfaceState.disabledClusters (deduplicate).writeSurface → resolve layout → applySurface:
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
<cluster>. N skills removed from surface."surfaceState.disabledClusters.writeSurface → resolve layout → applySurface:
const registry = require('gsd-core/bin/lib/capability-registry.cjs');
const layout = resolveRuntimeArtifactLayout(runtime, runtimeConfigDir, scope);
applySurface(runtimeConfigDir, layout, manifest, CLUSTERS, registry);
<cluster>. N skills added back to surface.".gsd-surface.json exists.readActiveProfile(runtimeConfigDir) (install-time profile).<name>."The runtimeConfigDir for applySurface is the base Claude config directory
(~/.claude), NOT the skills sub-directory (~/.claude/skills).
This matches installRuntimeArtifacts and uninstallRuntimeArtifacts, which also
receive ~/.claude as configDir. The skill dirs themselves live at
~/.claude/skills/gsd-*/ because the claude global layout has destSubpath = 'skills' — they are derived from configDir, not the root for it.
# Claude Code — global install
RUNTIME_CONFIG_DIR="${CLAUDE_CONFIG_DIR:-$HOME/.claude}"
SCOPE="global"
# Artifact destinations are derived from runtime layout
# via resolveRuntimeArtifactLayout(runtime, RUNTIME_CONFIG_DIR, SCOPE)
# then applySurface(RUNTIME_CONFIG_DIR, layout, manifest, CLUSTERS)
Surface state is stored at ${RUNTIME_CONFIG_DIR}/.gsd-surface.json
(i.e. ~/.claude/.gsd-surface.json).
All paths can be overridden by reading the CLAUDE_CONFIG_DIR env var if set.
core, standard, full), exit.surface.cjs → prompt: "Run npm i -g gsd-core to reinstall GSD."<execution_context>
Surface state file: ~/.claude/.gsd-surface.json
Install profile marker: ~/.claude/.gsd-profile
Skill dirs: ~/.claude/skills/gsd-*/
Engine module: ~/.claude/gsd-core/bin/lib/surface.cjs
Cluster definitions: ~/.claude/gsd-core/bin/lib/clusters.cjs
</execution_context>
npx claudepluginhub open-gsd/gsd-core/skillsManages Conductor skills: lists available with status, shows details, enables or disables for current project via Python CLI or file ops.
/setupInventories locally installed skills from Claude Code and OpenClaw directories, surfaces high-signal issues, and manages setup state in manual or auto-trigger modes.
/skillsDiscovers, reads, enables, and disables crtr skills. Also supports authoring workflows including scaffolding and guides.
/fire-skillManages skills across their lifecycle — create, import, test, list, stats, export, browse, and upgrade. Supports both quick and interactive creation modes.
/load-skillLoads an auto-generated skill into the current Claude Code session for immediate use. Also supports listing available skills and searching community skills.
/f5-skillManages F5 knowledge skills: list, load, create, or run by name for tech stacks like NestJS and React, core skills like TDD and security, and domains.