[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DZAV6K145TV5MJ3DYK7ZPY":3,"skill-same:01M6DZAV6K145TV5MJ3DYK7ZPY":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":38,"repositoryHtmlUrl":39,"repositoryHomepageUrl":40,"ownerHtmlUrl":41,"ownerBlogUrl":42,"ownerDescription":6,"updatedAt":43,"install":44,"resources":56},"01M6DZAV6K145TV5MJ3DYK7ZPY","eforge-profile",null,"List, inspect, and switch agent runtime profiles","eforge-build\u002Feforge","eforge-build","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F268386632?v=4","01M6DZ9WAH8M3XRV4J88WG5SB5","01M6DZ9WEVEC6BJ62ZX3RAVA02",71,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-profile\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28],"profile","eforge profile","agent runtime","list","switch","runtime","2026-11-10 10:12:30",false,"---\nname: eforge-profile\ndescription: List, inspect, and switch agent runtime profiles\ndisable-model-invocation: true\n---\n\n> **Note:** In Pi, the native `\u002Feforge:profile` command provides a richer interactive experience with TUI selector\u002Fpanel profile browsing and switching. This skill serves as a fallback for non-interactive contexts and as model-readable documentation.\n\n# \u002Feforge:profile\n\nList, inspect, and switch named agent runtime profiles stored in `.eforge\u002Fprofiles\u002F` (project-local scope), `eforge\u002Fprofiles\u002F` (project scope), or `~\u002F.config\u002Feforge\u002Fprofiles\u002F` (user scope). The active profile is tracked by a marker file at any level; resolution follows a 6-step precedence chain (see below).\n\n## Workflow\n\n### Step 1: Branch on arguments\n\nInspect `$ARGUMENTS`:\n\n- If `$ARGUMENTS` is empty or whitespace, go to Step 2 (**inspect mode**).\n- Otherwise treat the argument as a profile name and go to Step 3 (**switch mode**).\n\n### Step 2: Inspect mode\n\nCall the `eforge_profile` tool with `{ action: \"show\" }`.\n\nParse the response (shape: `{ active, source, resolved: { harness, profile, metadata } }`) and report:\n\n- **Active profile**: `{active}` (or \"(none - using team default)\" when `active` is null)\n- **Source**: `{source}` (`local` when the active profile is picked via the `.eforge\u002F.active-profile` marker, `project` when picked via the `eforge\u002F.active-profile` marker, `missing` when the marker points at a profile file that does not exist (stale marker), `none` when no profile is configured at all)\n- **Resolved harness**: `{resolved.harness}` (e.g. `claude-sdk` or `pi`)\n- **Metadata** (when present in `resolved.metadata`):\n  - **Description**: `{resolved.metadata.description}`\n  - **Use when**: `{resolved.metadata.whenToUse}` (as a bullet list)\n  - **Tags**: `{resolved.metadata.tags}` (comma-separated)\n- **Tier toolbelts** (when `tierToolbelts` is present in the response): render a per-tier summary under a `Tier toolbelts:` sub-header:\n  - For each tier in `tierToolbelts`, show `  \u003Ctier>: \u003Ctoolbelt>` followed by the sorted MCP server names in parentheses when non-empty, e.g. `  implementation: browser-ui (playwright)` or `  planning: none` or `  review: all (default)`.\n\nThen call `eforge_profile` with `{ action: \"list\" }` to show the user what other profiles are available, rendering a table with the following columns:\n\n| Name | Scope | Harness | Description | Active |\n|------|-------|---------|-------------|--------|\n| `pi-anthropic` | `local` | `pi` | Fast multi-provider | `●` |\n| `pi-glm` | `project (shadowed)` | `pi` | | |\n| `claude-fast` | `user` | `claude-sdk` | | |\n\n- **Scope**: `local` for profiles in `.eforge\u002Fprofiles\u002F` (gitignored, project-local), `project` for profiles in `eforge\u002Fprofiles\u002F`, `user` for profiles in `~\u002F.config\u002Feforge\u002Fprofiles\u002F`.\n- 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)` or `user (shadowed)` in the Scope column.\n- Mark the active profile with `●`.\n- **Description**: show `resolved.metadata.description` when present (truncated to ~60 chars). Leave blank when absent.\n\nIf no profiles exist, suggest `\u002Feforge:profile-new` to create one.\n\n### Step 3: Switch mode\n\nCall `eforge_profile` with `{ action: \"use\", name: \"\u003Carg>\" }`. To set the active profile at user scope instead of project scope, pass `scope: \"user\"`: `{ action: \"use\", name: \"\u003Carg>\", scope: \"user\" }`.\n\nOn success, the daemon writes the active-profile marker at the chosen scope (`.eforge\u002F.active-profile` for local, `eforge\u002F.active-profile` for project, `~\u002F.config\u002Feforge\u002F.active-profile` for user). Then call `{ action: \"show\" }` again and report the new active profile plus the resolved harness:\n\n> Switched to `{name}`. Resolved harness: `{resolved.harness}`. The next eforge build will use this profile.\n\nOn error (e.g. the profile does not exist), surface the error message and suggest running `\u002Feforge:profile` with no args to list available profiles, or `\u002Feforge:profile-new` to create a new one.\n\n## Scope Parameter\n\nThe `scope` parameter is available on `list`, `use`, `create`, and `delete` actions:\n\n- **`list`**: `scope` accepts `\"local\"`, `\"project\"`, `\"user\"`, or `\"all\"` (default `\"all\"`) - shows profiles from all scopes when omitted.\n- **`use` \u002F `create` \u002F `delete`**: `scope` accepts `\"local\"`, `\"project\"`, or `\"user\"` (default `\"project\"`) - operates on `.eforge\u002Fprofiles\u002F` and `.eforge\u002F.active-profile` for local scope, `eforge\u002Fprofiles\u002F` and `eforge\u002F.active-profile` for project scope, `~\u002F.config\u002Feforge\u002Fprofiles\u002F` and `~\u002F.config\u002Feforge\u002F.active-profile` for user scope.\n\n## Active Profile Precedence\n\nThe active agent runtime profile is resolved using a 4-step precedence chain (highest to lowest):\n\n1. **Project-local marker** - `.eforge\u002F.active-profile` file in the repo root (gitignored)\n2. **Project marker** - `eforge\u002F.active-profile` file in the project\n3. **User marker** - `~\u002F.config\u002Feforge\u002F.active-profile` file\n4. **None** - no profile configured\n\nWhen 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.\n\n## Error Handling\n\n| Condition | Action |\n|-----------|--------|\n| Profile name does not exist | Show the daemon error and list available profiles |\n| No `eforge\u002Fprofiles\u002F` directory | Suggest `\u002Feforge:profile-new` to create the first profile |\n\n\u003C!-- parity-skip-start -->\n| Tool connection failure | The daemon is not running. Tell the user to start it with `eforge_daemon { action: \"start\" }`, `\u002Feforge:restart`, or `eforge daemon start`. |\n\u003C!-- parity-skip-end -->\n| No config found | Tell the user: \"No eforge config found. Run `\u002Feforge:init` to initialize eforge in this project.\" |\n\n## Related Skills\n\n| Skill | When to suggest |\n|-------|----------------|\n| `\u002Feforge:profile-new` | User wants to create a new named profile |\n| `\u002Feforge:config` | User wants to view or edit `eforge\u002Fconfig.yaml` (the team default fallback) |\n| `eforge_extension_contribution` | User wants to discover or invoke workflows provided by loaded extensions |\n| `\u002Feforge:status` | User wants to check current build status |\n","> **Note:** In Pi, the native `\u002Feforge:profile` command provides a richer interactive experience with TUI selector\u002Fpanel profile browsing and switching. This skill serves as a fallback for non-interactive contexts and as model-readable documentation.\n\n# \u002Feforge:profile\n\nList, inspect, and switch named agent runtime profiles stored in `.eforge\u002Fprofiles\u002F` (project-local scope), `eforge\u002Fprofiles\u002F` (project scope), or `~\u002F.config\u002Feforge\u002Fprofiles\u002F` (user scope). The active profile is tracked by a marker file at any level; resolution follows a 6-step precedence chain (see below).\n\n## Workflow\n\n### Step 1: Branch on arguments\n\nInspect `$ARGUMENTS`:\n\n- If `$ARGUMENTS` is empty or whitespace, go to Step 2 (**inspect mode**).\n- Otherwise treat the argument as a profile name and go to Step 3 (**switch mode**).\n\n### Step 2: Inspect mode\n\nCall the `eforge_profile` tool with `{ action: \"show\" }`.\n\nParse the response (shape: `{ active, source, resolved: { harness, profile, metadata } }`) and report:\n\n- **Active profile**: `{active}` (or \"(none - using team default)\" when `active` is null)\n- **Source**: `{source}` (`local` when the active profile is picked via the `.eforge\u002F.active-profile` marker, `project` when picked via the `eforge\u002F.active-profile` marker, `missing` when the marker points at a profile file that does not exist (stale marker), `none` when no profile is configured at all)\n- **Resolved harness**: `{resolved.harness}` (e.g. `claude-sdk` or `pi`)\n- **Metadata** (when present in `resolved.metadata`):\n  - **Description**: `{resolved.metadata.description}`\n  - **Use when**: `{resolved.metadata.whenToUse}` (as a bullet list)\n  - **Tags**: `{resolved.metadata.tags}` (comma-separated)\n- **Tier toolbelts** (when `tierToolbelts` is present in the response): render a per-tier summary under a `Tier toolbelts:` sub-header:\n  - For each tier in `tierToolbelts`, show `  \u003Ctier>: \u003Ctoolbelt>` followed by the sorted MCP server names in parentheses when non-empty, e.g. `  implementation: browser-ui (playwright)` or `  planning: none` or `  review: all (default)`.\n\nThen call `eforge_profile` with `{ action: \"list\" }` to show the user what other profiles are available, rendering a table with the following columns:\n\n| Name | Scope | Harness | Description | Active |\n|------|-------|---------|-------------|--------|\n| `pi-anthropic` | `local` | `pi` | Fast multi-provider | `●` |\n| `pi-glm` | `project (shadowed)` | `pi` | | |\n| `claude-fast` | `user` | `claude-sdk` | | |\n\n- **Scope**: `local` for profiles in `.eforge\u002Fprofiles\u002F` (gitignored, project-local), `project` for profiles in `eforge\u002Fprofiles\u002F`, `user` for profiles in `~\u002F.config\u002Feforge\u002Fprofiles\u002F`.\n- 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)` or `user (shadowed)` in the Scope column.\n- Mark the active profile with `●`.\n- **Description**: show `resolved.metadata.description` when present (truncated to ~60 chars). Leave blank when absent.\n\nIf no profiles exist, suggest `\u002Feforge:profile-new` to create one.\n\n### Step 3: Switch mode\n\nCall `eforge_profile` with `{ action: \"use\", name: \"\u003Carg>\" }`. To set the active profile at user scope instead of project scope, pass `scope: \"user\"`: `{ action: \"use\", name: \"\u003Carg>\", scope: \"user\" }`.\n\nOn success, the daemon writes the active-profile marker at the chosen scope (`.eforge\u002F.active-profile` for local, `eforge\u002F.active-profile` for project, `~\u002F.config\u002Feforge\u002F.active-profile` for user). Then call `{ action: \"show\" }` again and report the new active profile plus the resolved harness:\n\n> Switched to `{name}`. Resolved harness: `{resolved.harness}`. The next eforge build will use this profile.\n\nOn error (e.g. the profile does not exist), surface the error message and suggest running `\u002Feforge:profile` with no args to list available profiles, or `\u002Feforge:profile-new` to create a new one.\n\n## Scope Parameter\n\nThe `scope` parameter is available on `list`, `use`, `create`, and `delete` actions:\n\n- **`list`**: `scope` accepts `\"local\"`, `\"project\"`, `\"user\"`, or `\"all\"` (default `\"all\"`) - shows profiles from all scopes when omitted.\n- **`use` \u002F `create` \u002F `delete`**: `scope` accepts `\"local\"`, `\"project\"`, or `\"user\"` (default `\"project\"`) - operates on `.eforge\u002Fprofiles\u002F` and `.eforge\u002F.active-profile` for local scope, `eforge\u002Fprofiles\u002F` and `eforge\u002F.active-profile` for project scope, `~\u002F.config\u002Feforge\u002Fprofiles\u002F` and `~\u002F.config\u002Feforge\u002F.active-profile` for user scope.\n\n## Active Profile Precedence\n\nThe active agent runtime profile is resolved using a 4-step precedence chain (highest to lowest):\n\n1. **Project-local marker** - `.eforge\u002F.active-profile` file in the repo root (gitignored)\n2. **Project marker** - `eforge\u002F.active-profile` file in the project\n3. **User marker** - `~\u002F.config\u002Feforge\u002F.active-profile` file\n4. **None** - no profile configured\n\nWhen 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.\n\n## Error Handling\n\n| Condition | Action |\n|-----------|--------|\n| Profile name does not exist | Show the daemon error and list available profiles |\n| No `eforge\u002Fprofiles\u002F` directory | Suggest `\u002Feforge:profile-new` to create the first profile |\n\n\u003C!-- parity-skip-start -->\n| Tool connection failure | The daemon is not running. Tell the user to start it with `eforge_daemon { action: \"start\" }`, `\u002Feforge:restart`, or `eforge daemon start`. |\n\u003C!-- parity-skip-end -->\n| No config found | Tell the user: \"No eforge config found. Run `\u002Feforge:init` to initialize eforge in this project.\" |\n\n## Related Skills\n\n| Skill | When to suggest |\n|-------|----------------|\n| `\u002Feforge:profile-new` | User wants to create a new named profile |\n| `\u002Feforge:config` | User wants to view or edit `eforge\u002Fconfig.yaml` (the team default fallback) |\n| `eforge_extension_contribution` | User wants to discover or invoke workflows provided by loaded extensions |\n| `\u002Feforge:status` | User wants to check current build status |\n",{"name":5,"description":7,"disable-model-invocation":34},true,"main","499776fb979b8166258cdf9bb95b41de703de835","packages\u002Fpi-eforge\u002Fskills\u002Feforge-profile",4,"https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge","https:\u002F\u002Fwww.eforge.build","https:\u002F\u002Fgithub.com\u002Feforge-build","https:\u002F\u002Feforge.build","2026-07-14 04:45:40",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":34},[46,49,52],{"tool":47,"command":48},"npx","npx skills add eforge-build\u002Feforge --skill eforge-profile",{"tool":50,"command":51},"bunx","bunx skills add eforge-build\u002Feforge --skill eforge-profile",{"tool":53,"command":54},"pnpm","pnpm dlx skills add eforge-build\u002Feforge --skill eforge-profile","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-profile\u002FSKILL.md",[57],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"index.json","REFERENCE","参考文档",644,"https:\u002F\u002Fgithub.com\u002FDCx7C5\u002Fai-marketplace\u002Fblob\u002Fmain\u002Fskills\u002Fsoc\u002Ftabletop\u002Fpost\u002Fdetect\u002Findex.json",[64,82,95,109,122,133],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":71,"publishedAt":29},"01M6DZBCECD12JJM3BZMWT3Y4N","eforge-workflow","Set up or reconfigure the eforge workflow preset — landing action, stacking, PR settings, and automatic stack sync","https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-workflow\u002FSKILL.md",[70],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[72,73,74,75,76,77,78,79,80,81],"eforge workflow","workflow","sync","preset","pr","SET","stack","settings","landing","up",{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":29},"01M6DZB994EMFBB6NQY5K2M2FG","eforge-update","Check for eforge updates and guide through updating the CLI package and daemon","https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-update\u002FSKILL.md",[],[89,90,91,92,93,94],"update","eforge update","cli","package","check","guide",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":29},"01M6DZB6MD3FP4X1DNMH2X5RVD","eforge-status","Check eforge run status and queue state via daemon tools","https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-status\u002FSKILL.md",[],[102,103,104,105,106,107,108,93],"eforge status","status","via","state","queue","run","Tools",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":29},"01M6DZB420JCDQPGVBXCE7WWWV","eforge-stack","Synchronize the git-spice stack, preview with dry-run, interpret the sync report, and recover from manual sync conflicts","https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-stack\u002FSKILL.md",[],[116,78,117,74,107,118,119,120,121],"eforge stack","report","git","conflicts","preview","dry",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":29},"01M6DZB15H8P4KR68PDDGA54E4","eforge-restart","Safely restart the eforge daemon, checking for active builds first","https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-restart\u002FSKILL.md",[],[129,130,131,132],"restart","eforge restart","first","active",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":144,"publishedAt":29},"01M6DZAY5M4C2SFV8P6GTZWN85","eforge-recover","Inspect the recovery verdict for a failed PRD and apply the recommended action (retry, continue-repair, abandon, or manual)","https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-recover\u002FSKILL.md",[139],{"categoryNo":140,"categoryName":141,"taxonomyType":142,"taxonomyTypeDesc":143},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[145,146,147,148,149,150],"eforge recover","recovery","continue","repair","verdict","prd"]