name: eforge-profile description: List, inspect, and switch agent runtime profiles disable-model-invocation: true
Note: In Pi, the native
/eforge:profilecommand provides a richer interactive experience with TUI selector/panel profile browsing and switching. This skill serves as a fallback for non-interactive contexts and as model-readable documentation.
/eforge:profile
List, inspect, and switch named agent runtime profiles stored in .eforge/profiles/ (project-local scope), eforge/profiles/ (project scope), or ~/.config/eforge/profiles/ (user scope). The active profile is tracked by a marker file at any level; resolution follows a 6-step precedence chain (see below).
Workflow
Step 1: Branch on arguments
Inspect $ARGUMENTS:
- If
$ARGUMENTSis empty or whitespace, go to Step 2 (inspect mode). - Otherwise treat the argument as a profile name and go to Step 3 (switch mode).
Step 2: Inspect mode
Call the eforge_profile tool with { action: "show" }.
Parse the response (shape: { active, source, resolved: { harness, profile, metadata } }) and report:
- Active profile:
{active}(or "(none - using team default)" whenactiveis null) - Source:
{source}(localwhen the active profile is picked via the.eforge/.active-profilemarker,projectwhen picked via theeforge/.active-profilemarker,missingwhen the marker points at a profile file that does not exist (stale marker),nonewhen no profile is configured at all) - Resolved harness:
{resolved.harness}(e.g.claude-sdkorpi) - Metadata (when present in
resolved.metadata):- Description:
{resolved.metadata.description} - Use when:
{resolved.metadata.whenToUse}(as a bullet list) - Tags:
{resolved.metadata.tags}(comma-separated)
- Description:
- Tier toolbelts (when
tierToolbeltsis present in the response): render a per-tier summary under aTier toolbelts:sub-header:- For each tier in
tierToolbelts, show<tier>: <toolbelt>followed by the sorted MCP server names in parentheses when non-empty, e.g.implementation: browser-ui (playwright)orplanning: noneorreview: all (default).
- For each tier in
Then call eforge_profile with { action: "list" } to show the user what other profiles are available, rendering a table with the following columns:
| Name | Scope | Harness | Description | Active |
|---|---|---|---|---|
pi-anthropic |
local |
pi |
Fast multi-provider | ● |
pi-glm |
project (shadowed) |
pi |
||
claude-fast |
user |
claude-sdk |
- Scope:
localfor profiles in.eforge/profiles/(gitignored, project-local),projectfor profiles ineforge/profiles/,userfor profiles in~/.config/eforge/profiles/. - Local entries shadow project and user entries of the same name. Project entries shadow user entries of the same name. Shadowed entries show
project (shadowed)oruser (shadowed)in the Scope column. - Mark the active profile with
●. - Description: show
resolved.metadata.descriptionwhen present (truncated to ~60 chars). Leave blank when absent.
If no profiles exist, suggest /eforge:profile-new to create one.
Step 3: Switch mode
Call eforge_profile with { action: "use", name: "<arg>" }. To set the active profile at user scope instead of project scope, pass scope: "user": { action: "use", name: "<arg>", scope: "user" }.
On success, the daemon writes the active-profile marker at the chosen scope (.eforge/.active-profile for local, eforge/.active-profile for project, ~/.config/eforge/.active-profile for user). Then call { action: "show" } again and report the new active profile plus the resolved harness:
Switched to
{name}. Resolved harness:{resolved.harness}. The next eforge build will use this profile.
On error (e.g. the profile does not exist), surface the error message and suggest running /eforge:profile with no args to list available profiles, or /eforge:profile-new to create a new one.
Scope Parameter
The scope parameter is available on list, use, create, and delete actions:
list:scopeaccepts"local","project","user", or"all"(default"all") - shows profiles from all scopes when omitted.use/create/delete:scopeaccepts"local","project", or"user"(default"project") - operates on.eforge/profiles/and.eforge/.active-profilefor local scope,eforge/profiles/andeforge/.active-profilefor project scope,~/.config/eforge/profiles/and~/.config/eforge/.active-profilefor user scope.
Active Profile Precedence
The active agent runtime profile is resolved using a 4-step precedence chain (highest to lowest):
- Project-local marker -
.eforge/.active-profilefile in the repo root (gitignored) - Project marker -
eforge/.active-profilefile in the project - User marker -
~/.config/eforge/.active-profilefile - None - no profile configured
When a profile name is resolved, the profile file is looked up local-first, then project, then user-fallback - so a local profile shadows project and user profiles with the same name.
Error Handling
| Condition | Action |
|---|---|
| Profile name does not exist | Show the daemon error and list available profiles |
No eforge/profiles/ directory |
Suggest /eforge:profile-new to create the first profile |
| Tool connection failure | The daemon is not running. Tell the user to start it with eforge_daemon { action: "start" }, /eforge:restart, or eforge daemon start. |
| No config found | Tell the user: "No eforge config found. Run /eforge:init to initialize eforge in this project." |
Related Skills
| Skill | When to suggest |
|---|---|
/eforge:profile-new |
User wants to create a new named profile |
/eforge:config |
User wants to view or edit eforge/config.yaml (the team default fallback) |
eforge_extension_contribution |
User wants to discover or invoke workflows provided by loaded extensions |
/eforge:status |
User wants to check current build status |