[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DZAF2SJ25YBB4Q58X3ZWVC":3,"skill-same:01M6DZAF2SJ25YBB4Q58X3ZWVC":56},{"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":17,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":34,"commitSha":35,"skillDirectory":36,"forksCount":37,"repositoryHtmlUrl":38,"repositoryHomepageUrl":39,"ownerHtmlUrl":40,"ownerBlogUrl":41,"ownerDescription":6,"updatedAt":42,"install":43,"resources":55},"01M6DZAF2SJ25YBB4Q58X3ZWVC","eforge-config",null,"Initialize or edit eforge\u002Fconfig.yaml team-wide settings, with validation via daemon tools","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-config\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27],"config","eforge config","validation","yaml","Tools","team","edit","initialize","settings","via","2026-11-10 10:12:30",false,"---\nname: eforge-config\ndescription: Initialize or edit eforge\u002Fconfig.yaml team-wide settings, with validation via daemon tools\ndisable-model-invocation: true\n---\n\n> **Note:** In Pi, the native `\u002Feforge:config` command provides a richer interactive experience with a structured TUI panel viewer. This skill serves as a fallback for non-interactive contexts and as model-readable documentation.\n\n# \u002Feforge:config\n\nCreate or modify an `eforge\u002Fconfig.yaml` configuration file interactively. Supports two modes - init for new projects and edit for existing configs. Validation uses the eforge daemon.\n\n`eforge\u002Fconfig.yaml` holds **team-wide settings only** (postMergeCommands, agent tuning, hooks, queue config, etc.). Personal dev overrides can be placed in `.eforge\u002Fconfig.yaml` (gitignored, highest priority) - it deep-merges over the project and user tiers. Agent runtime profiles live in named profile files (`.eforge\u002Fprofiles\u002F\u003Cname>.yaml` for project-local scope, `eforge\u002Fprofiles\u002F\u003Cname>.yaml` for project scope, or `~\u002F.config\u002Feforge\u002Fprofiles\u002F\u003Cname>.yaml` for user scope) and are managed by `\u002Feforge:init` and `\u002Feforge:profile-new`.\n\n## Mode Detection\n\nDetermine the mode from arguments and file state:\n\n1. If `$ARGUMENTS` contains `--init`, use **init mode**\n2. If `$ARGUMENTS` contains `--edit`, use **edit mode**\n3. If `eforge\u002Fconfig.yaml` exists in the project root, use **edit mode**\n4. Otherwise, use **init mode**\n\n## Init Mode\n\n### Step 1: Check Existence\n\nIf `eforge\u002Fconfig.yaml` already exists, ask the user whether they want to switch to edit mode or overwrite. Respect their choice.\n\n### Step 2: Require an active agent runtime profile\n\nThis skill does not create agent runtime profiles. Before gathering team-wide settings, confirm a profile is already active by calling `eforge_profile` with `{ action: \"show\" }`. Inspect the response:\n\n- If `active` is `null` (no profile is active for this project) or `resolved.harness` is missing, **stop**. Tell the user:\n  > `\u002Feforge:config` only manages team-wide settings. This project has no active agent runtime profile. Run `\u002Feforge:init` to set up eforge in a fresh project (creates a profile and `config.yaml`), or `\u002Feforge:profile-new` to add a profile to an existing setup. Come back to `\u002Feforge:config` once a profile is active.\n  Do not proceed with the interview and do not write `eforge\u002Fconfig.yaml`.\n- Otherwise note the resolved harness kind (`resolved.harness` is `claude-sdk` or `pi`) and, for Pi, the profile's provider. Use these when suggesting models later.\n\n### Step 3: Gather Context\n\nRead project context to understand the codebase:\n\n- **AGENTS.md \u002F CLAUDE.md** - Project overview, tech stack, build commands\n- **package.json** or equivalent - Dependencies, scripts\n- **Project structure** - Scan top-level directories\n\nShare a brief summary of what you found.\n\n### Step 4: Interview\n\nWalk the user through configuration sections, asking about each one. Only include sections where the user wants non-default behavior. **Do not** collect harness, provider, or Pi-specific tuning here - those belong in agent runtime profile files.\n\nAgent settings resolve through three layers of granularity: **global** (applies to every agent), **tier** (applies to a group of related agents — planning, implementation, review, evaluation), and **per-role** (applies to one named agent). The interview walks them in that order; skip layers you don't want to customize.\n\n**Sections to cover:**\n\n1. **Build settings** - `postMergeCommands` (validation commands to run after merging worktrees, e.g. `pnpm install`, `pnpm type-check`, `pnpm test`), `maxValidationRetries`, landing action: use `landing.action` (`pr` opens a PR from the artifact branch to the resolved base branch; direct non-stacked PRs fetch and rebase onto `origin\u002F\u003CbaseBranch>` before validation and check freshness again immediately before PR creation; `merge` auto-merges the artifact\u002Fworktree branch into the base branch, `leave` exits without merging or opening a PR; default is `merge`; `pr` requires `gh` CLI). `landing.pr.autoMerge` (`ask` (default) | `always` | `never`) — GitHub PR auto-merge policy when `landing.action: pr`: `ask` enables auto-merge only when a per-run `landingAutoMerge: true` override is sent; `always` enables auto-merge on every PR unless `landingAutoMerge: false` is sent per-run; `never` skips auto-merge. This is a post-PR-creation option and is distinct from `landing.action: merge`, which merges the artifact branch directly without opening a PR. `trunkBranch` (trunk branch name; detected from `origin\u002FHEAD` at init time; fallback `main`), `allowLocalMergeToTrunk` (default `false`; set to `true` only for solo\u002Funprotected projects to allow direct merge to trunk without a PR), `trunkSync` (pre-compile trunk freshness gate for queued root builds; `enabled` default `true`, `remote` default `origin`, `strategy: fetchedRemoteRef`, `onDiverged`: `warn` (default, emit diagnostic + fall back to local trunk) | `fail` (fail before compile) | `use-remote` (use fetched SHA with diagnostic); set `enabled: false` for offline\u002Flocal-only workflows)\n2. **Compile planning limits and direct PR base-sync budget** (opt-in - \"Would you like to tune decomposition budgets for unusually large compile inputs or the direct PR base-sync conflict-attempt budget? Most users keep defaults.\") - The `compile.planningUnit*` values only affect context-managed planning for overflow-risk compile inputs; ordinary direct planning does not use planning units. All `compile.planningUnit*` values are positive integers. `planningUnitParallelism` defaults to `2`; `planningUnitMaxObservedTurns` is optional and unset by default. The direct non-stacked PR base-sync budget is `landing.directPrBaseSync.conflictAttempts`; it defaults to `12`, is clamped to `1`-`100`, and is used as a fixed budget rather than scaling with branch size.\n3. **Global agent defaults** (opt-in - \"Would you like to customize thinking or effort settings? Most users keep defaults.\") - Global `agents.thinking` config (`adaptive`, `enabled` with optional `budgetTokens`, or `disabled`), `agents.effort` level (`low`\u002F`medium`\u002F`high`\u002F`xhigh`\u002F`max`). Resolution order (highest → lowest): plan override → per-role config → per-tier config (including built-in tier defaults) → global fallback. Harness and model selection live in the active profile's tier entries — do not configure them here. Whenever you need to suggest a specific model ID (for per-role `model` overrides), **call `eforge_models` first** with `{ action: \"list\", harness: \"\u003Cresolved-harness>\" }` (and `provider: \"\u003Cprofile-provider>\"` for Pi) and pick from the returned list (newest-first). Never propose a model ID from memory.\n4. **Tier tuning** (opt-in - \"Would you like to tune agents by group? eforge organises agents into four groups by what they do: **planning**, **implementation**, **review**, and **evaluation**. You can give each group its own effort level without touching individual roles.\") - Group membership: **planning** — `planner`, `formatter`, `merge-conflict-resolver`, `gap-closer`; **implementation** — `builder`, `review-fixer`, `validation-fixer`, `doc-author`, `doc-syncer`, `test-writer`, `tester`, `recovery-analyst`, `dependency-detector`, `prd-validator`, `staleness-assessor`; **review** — `reviewer`, `plan-reviewer`; **evaluation** — `evaluator`, `plan-evaluator`. Built-in defaults: `implementation` defaults to `effort=medium`; `planning`, `review`, and `evaluation` default to `effort=high`. Harness and model selection come from the active profile's tier entries. Available per-tier knobs in config.yaml: `effort`, `model`, `thinking`, `maxTurns`, `maxBudgetUsd`, `fallbackModel`, `allowedTools`, `disallowedTools`, and runtime-choice `choices`\u002F`routing`. Set them under `agents.tiers.\u003Ctier>`; the existing tier recipe is the implicit `default` choice, named choices inherit from it, and routing rules run after role-to-tier resolution.\n5. **Agent behavior** - Global `maxTurns`, `maxContinuations` (default 3 - max continuation attempts after maxTurns hit), `permissionMode` (`bypass` or `default`), `settingSources`, `bare` (default false)\n6. **Per-role overrides** (opt-in - \"Would you like to tune specific agent roles differently? Most users skip this.\") - Override settings per agent role. Available roles: planning (`planner`, `formatter`, `merge-conflict-resolver`, `gap-closer`), implementation (`builder`, `review-fixer`, `validation-fixer`, `doc-author`, `doc-syncer`, `test-writer`, `tester`, `recovery-analyst`, `dependency-detector`, `prd-validator`, `staleness-assessor`), review (`reviewer`, `plan-reviewer`), evaluation (`evaluator`, `plan-evaluator`). Per-role options: `model` (explicit model ref that overrides the profile tier's model for this role), `thinking`, `effort`, `maxBudgetUsd`, `fallbackModel`, `allowedTools`, `disallowedTools`, `maxTurns`, `promptAppend` (text appended to the agent's prompt - useful for project-specific rules like \"flag raw SQL queries\" for the reviewer). You can also set `roles.\u003Crole>.tier` to reassign a role to a different tier (rare, but supported when one role inside a group needs to behave like another group). Same model-list rule as above: call `eforge_models` with `harness:` before proposing any model ID.\n7. **Prompt customization** (opt-in - \"Would you like to customize agent prompts?\") - `agents.promptDir` points to a directory of `.md` files that shadow bundled prompts by name (e.g. `eforge\u002Fprompts\u002Freviewer.md` replaces the built-in reviewer prompt). Per-role `promptAppend` is safer - it appends instructions without replacing the full prompt.\n8. **Hooks** - Event-driven commands that run on specific eforge events (e.g. `session:start`, `phase:end`). Each hook has `event` (pattern), `command`, and optional `timeout`.\n9. **Langfuse tracing** - Whether to enable Langfuse integration (keys are typically set via env vars)\n10. **Plugin settings** - Enable\u002Fdisable plugin loading, include\u002Fexclude lists\n11. **PRD queue** - Queue directory (`dir`), `autoBuild` (default true - desired daemon auto-build state; scheduler pause is a separate runtime launch gate), `watchPollIntervalMs` (default 5000ms), and top-level `maxConcurrentBuilds` (default 2 - max concurrent PRD builds from the queue)\n12. **Recovery auto-resume** (opt-in - \"Would you like the daemon to auto-queue high-confidence compiled-artifact recovery attempts?\") - `recovery.autoResume.enabled` defaults to `false`, so failed builds keep manual recovery behavior and policy consumers stop before mutation. When enabled, only high-confidence `continue-repair` recommendations that pass compiled-resume artifact eligibility may auto-queue, bounded by `recovery.autoResume.maxAttempts` (default `1`; `0` is audit-only\u002Fnon-mutating).\n13. **Daemon** (opt-in - \"Would you like to customize daemon behavior?\") - `idleShutdownMs` (default 7200000 = 2 hours, set to 0 to run forever)\n14. **Stacking** (opt-in - \"Does this project use stacked PRs with git-spice?\") - `stacking.enabled` (default `false`; set to `true` to enable git-spice-backed stacking where artifact branch PRs normally target the parent artifact branch rather than the feature\u002Ftrunk branch; during landing, eforge can repair a missing integrated parent by choosing trunk as the effective base for an initially untracked child or by retargeting a child that is already tracked, then gates PR submission on provider sync\u002Frestack and a remote-base freshness proof), `stacking.gitSpice.command` (optional path to the `git-spice` binary when it is not on `$PATH`, e.g. `\u002Fusr\u002Flocal\u002Fbin\u002Fgit-spice`; set to `gs` only if you use the optional short alias). The `stacking.provider` is always `git-spice` and need not be set.\n\nFor each section, explain what it controls and suggest values based on the project context gathered in Step 3. Skip sections the user isn't interested in.\n\n### Step 5: Present Draft\n\nShow the user the complete `eforge\u002Fconfig.yaml` content before writing. Confirm it contains no harness-specific keys at the top level (harness configuration belongs only in agent runtime profile files under `eforge\u002Fprofiles\u002F`). Ask for any changes.\n\n### Step 6: Write\n\nSave to `eforge\u002Fconfig.yaml` in the project root.\n\n### Step 7: Validate\n\nCall the `eforge_config` tool with `{ action: \"validate\" }`.\n\nIf validation returns errors, show them to the user and offer to fix them.\n\n## Edit Mode\n\n### Step 1: Read Current Config\n\nRead the existing `eforge\u002Fconfig.yaml` file and summarize its current settings for the user.\n\n### Step 2: Identify Changes\n\nAsk the user what they want to change. If `$ARGUMENTS` contains additional context beyond `--edit`, use that to understand the desired changes. If the requested change is really about the harness (switching harness kind, provider, or the profile's own model\u002Ftuning), stop and redirect them to `\u002Feforge:profile` (switch active profile) or `\u002Feforge:profile-new` (create a new profile) - that configuration does not belong in `eforge\u002Fconfig.yaml`.\n\n### Step 3: Apply Changes\n\nModify the config based on the user's requests. Present the updated content before writing. If the change involves a model ID anywhere (per-role `model`), first resolve the active profile by calling `eforge_profile` with `{ action: \"show\" }`, then call `eforge_models` with `{ action: \"list\", harness: \"\u003Cresolved-harness>\" }` (and `provider` for Pi) to fetch the live list. Pick from that list; do not suggest model IDs from memory.\n\n### Step 4: Write\n\nSave the updated `eforge\u002Fconfig.yaml`.\n\n### Step 5: Validate\n\nCall the `eforge_config` tool with `{ action: \"validate\" }`.\n\nIf validation returns errors, show them to the user and offer to fix them.\n\n## Show Resolved Config\n\nAt any point, you can show the user the fully resolved configuration (all layers merged) by calling:\n\n`eforge_config` with `{ action: \"show\" }`\n\nThis returns the merged result of defaults + global config + project config + active profile. The `\u002Feforge:config` viewer also lists registered `tools.toolbelts` entries and available presets in a dedicated Toolbelts section. Use `\u002Feforge:profile-new` to configure toolbelt presets interactively.\n\n## Configuration Reference\n\nAvailable top-level sections in `eforge\u002Fconfig.yaml`. Note: harness-specific configuration belongs in agent runtime profile files under `eforge\u002Fprofiles\u002F` or `~\u002F.config\u002Feforge\u002Fprofiles\u002F`, not in `config.yaml`.\n\n```yaml\n# Queue concurrency\nmaxConcurrentBuilds: 2                 # Max concurrent PRD builds (default: 2)\n\n# Build settings\nbuild:\n  worktreeDir: \"..\u002Fmy-worktrees\"       # Custom worktree directory\n  postMergeCommands:                   # Commands to run after merge\n    - pnpm install\n    - pnpm type-check\n    - pnpm test\n  maxValidationRetries: 2              # Retry count for validation fixes\n  cleanupPlanFiles: true               # Remove plan files and temporary plan-ID markers after successful build\n  # trunkBranch: main                  # Trunk branch name (default: detected from origin\u002FHEAD, fallback: main)\n  # allowLocalMergeToTrunk: false      # Allow landing.action: merge to land directly on trunk without a PR\n                                       #   Default false; set to true only for solo\u002Funprotected projects\n  # trunkSync:                         # Pre-compile trunk freshness gate (queued root builds only)\n  #   enabled: true                    # Default true; set false for offline or local-only workflows\n  #   remote: origin                   # Remote to fetch trunk from (default: origin)\n  #   strategy: fetchedRemoteRef       # Only 'fetchedRemoteRef' is supported in v1\n  #   onDiverged: warn                 # warn (default) | fail | use-remote\n\n\n# Compile settings: planning-unit limits for overflow-risk context-managed planning.\ncompile:\n  planningUnitParallelism: 2            # Max planning units running at once\n  planningUnitMaxDepth: 3               # Max recursive planning-unit split depth\n  planningUnitMaxPromptSourceBytes: 40000\n  planningUnitMaxPromptBytes: 80000\n  planningUnitMaxObservedInputTokens: 120000\n  # planningUnitMaxObservedTurns: 20    # Optional; unset by default\n  planningUnitMaxCompactHandoffBytes: 12000\n  planningUnitMaxLocalExplorationToolUses: 24\n  planningUnitMaxCriteriaPerUnit: 20\n  planningUnitMaxSubsystemsPerUnit: 2\n  planningUnitMaxSplitAttemptsPerUnit: 2\n\n# Landing action\nlanding:\n  action: pr                           # pr | merge | leave (default: merge)\n                                       # pr: open a PR from the artifact branch targeting the resolved base branch (requires gh CLI)\n                                       #     Direct non-stacked PRs rebase onto origin\u002F\u003CbaseBranch> before validation\n                                       #     and check freshness again immediately before PR creation.\n                                       # merge: auto-merge the artifact branch into the base branch\n                                       # leave: commit to artifact branch and exit without merging or opening a PR\n  directPrBaseSync:\n    conflictAttempts: 12               # Direct non-stacked PR base-sync conflict attempts (clamped 1-100)\n  pr:\n    # autoMerge: ask                   # ask (default) | always | never\n                                       # Only applies when landing.action: pr\n                                       # ask: enable auto-merge only when landingAutoMerge is explicitly true per-run\n                                       # always: enable auto-merge on every PR unless landingAutoMerge is explicitly false per-run\n                                       # never: never enable auto-merge (emits skipped event)\n\n# Stacking (git-spice backed stacked PRs)\n# stacking:\n#   enabled: false                     # Default false. Set to true to enable git-spice stacking.\n#                                      # When enabled, artifact branch PRs normally target the parent artifact branch.\n#                                      # Landing can repair a missing integrated parent by choosing trunk as the effective base\n#                                      # for initially untracked children or retargeting a child that is already tracked,\n#                                      # then gates PR submission on provider sync\u002Frestack and a remote-base freshness proof.\n#                                      # Run 'git-spice repo init' in the repo before enabling.\n#   gitSpice:\n#     command: git-spice               # Default. Set to 'gs' only if you use the optional short alias.\n\n# Agent settings\nagents:\n  maxTurns: 50                         # Global fallback max agent turns\n  maxContinuations: 3                  # Max continuation attempts after maxTurns hit\n  permissionMode: bypass               # bypass or default\n  settingSources:                      # Which settings files agents load\n    - project\n  bare: false                          # Bare mode\n  # model:                             # Global model override for all roles\n  #   id: \u003Cmodel-id>                   # overrides the profile tier's model; call eforge_models first\n  # thinking:                          # Thinking config\n  #   type: adaptive                   # 'adaptive', 'enabled' (+ budgetTokens), or 'disabled'\n  # effort: xhigh                      # 'low', 'medium', 'high', 'xhigh', 'max'\n  # thinkingLevel: xhigh              # Pi only: 'off', 'low', 'medium', 'high', 'xhigh'\n  # --- Prompt customization ---\n  # promptDir: eforge\u002Fprompts           # Directory of .md files that shadow bundled prompts\n  # --- Per-tier overrides ---\n  # tiers:\n  #   planning:\n  #     effort: high           # default; lower this to save tokens on planning\n  #   implementation:\n  #     effort: medium         # default\n  #   review:\n  #     effort: high\n  #   evaluation:\n  #     effort: high\n  # --- Per-role overrides ---\n  # roles:\n  #   builder:\n  #     model:\n  #       id: \u003Cmodel-id>       # overrides the profile tier's model for this role\n  #     maxTurns: 50\n  #     maxBudgetUsd: 10.0\n  #   formatter:\n  #     effort: low\n  #   reviewer:\n  #     promptAppend: |                # Append project-specific rules to the prompt\n  #       ## Project Rules\n  #       - Flag raw SQL queries\n  #   tester:\n  #     tier: review           # Reassign role to a different tier\n\n# Plan output\nplan:\n  outputDir: eforge\u002Fplans              # Where plan artifacts are written\n\n# Langfuse tracing (keys usually via env vars)\nlangfuse:\n  enabled: false\n  host: https:\u002F\u002Fcloud.langfuse.com\n\n# Plugin loading\nplugins:\n  enabled: true\n  include: []                          # Only load these plugins\n  exclude: []                          # Skip these plugins\n  paths: []                            # Additional plugin paths\n\n# PRD queue\nprdQueue:\n  dir: eforge\u002Fqueue\n  autoBuild: true                      # Desired auto-build state; scheduler pause can gate launches\n  watchPollIntervalMs: 5000            # Poll interval for watch mode (ms)\n\n# Recovery auto-resume (disabled by default)\nrecovery:\n  autoResume:\n    enabled: false                     # Opt in to bounded daemon-owned continue-repair automation\n    maxAttempts: 1                     # Automatic attempts per failed PRD; 0 = audit-only\u002Fno mutation\n\n# Daemon\ndaemon:\n  idleShutdownMs: 7200000              # Idle timeout (2h). 0 = run forever.\n\n# Project MCP toolbelts (optional; define named bundles for profile toolbelt: fields)\ntools:\n  toolbelts:\n    browser-ui:                        # Named toolbelt bundle\n      description: Browser automation for UI implementation and review.\n      mcpServers:\n        - playwright                   # Must be present in .mcp.json\n    # docs-research, observability, database-readonly, etc. follow the same pattern\n\n# Event hooks\nhooks:\n  - event: \"session:start\"\n    command: \"echo 'Starting eforge session'\"\n    timeout: 5000\n```\n\n## Error Handling\n\n| Condition | Action |\n|-----------|--------|\n| No active agent runtime profile | Stop and direct the user to `\u002Feforge:init` or `\u002Feforge:profile-new` |\n| `eforge_config` validate returns errors | Show errors, offer to fix |\n| Validation error mentions a backend key is not valid here | Remove the key; harness-specific config lives in profile files, not `config.yaml` |\n| Validation error mentions an unrecognized top-level key | Remove the key (typo or stale feature reference) - the error includes the recognized-key list |\n| YAML syntax error in existing file | Report the error, offer to recreate |\n\n\u003C!-- parity-skip-start -->\n| Daemon 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\n## Related Skills\n\n| Skill | Command | When to suggest |\n|-------|---------|----------------|\n| Init | `eforge_init` | No eforge config found in the project, or no active agent runtime profile |\n| Profile | `eforge_profile` | User wants to list, inspect, or switch agent runtime profiles |\n| Profile (new) | `\u002Feforge:profile-new` | User wants to create a new agent runtime profile (project or user scope) |\n| Build | `eforge_build` | User wants to enqueue work for the daemon to build |\n| Extension contributions | `eforge_extension_contribution` | User wants to discover or invoke workflows provided by loaded extensions |\n| Status | `eforge_status` | User wants to check build progress or queue state |\n| Restart | `eforge_restart` | User wants to restart the eforge daemon |\n| Update | `eforge_update` | User wants to check for or install eforge updates |\n","> **Note:** In Pi, the native `\u002Feforge:config` command provides a richer interactive experience with a structured TUI panel viewer. This skill serves as a fallback for non-interactive contexts and as model-readable documentation.\n\n# \u002Feforge:config\n\nCreate or modify an `eforge\u002Fconfig.yaml` configuration file interactively. Supports two modes - init for new projects and edit for existing configs. Validation uses the eforge daemon.\n\n`eforge\u002Fconfig.yaml` holds **team-wide settings only** (postMergeCommands, agent tuning, hooks, queue config, etc.). Personal dev overrides can be placed in `.eforge\u002Fconfig.yaml` (gitignored, highest priority) - it deep-merges over the project and user tiers. Agent runtime profiles live in named profile files (`.eforge\u002Fprofiles\u002F\u003Cname>.yaml` for project-local scope, `eforge\u002Fprofiles\u002F\u003Cname>.yaml` for project scope, or `~\u002F.config\u002Feforge\u002Fprofiles\u002F\u003Cname>.yaml` for user scope) and are managed by `\u002Feforge:init` and `\u002Feforge:profile-new`.\n\n## Mode Detection\n\nDetermine the mode from arguments and file state:\n\n1. If `$ARGUMENTS` contains `--init`, use **init mode**\n2. If `$ARGUMENTS` contains `--edit`, use **edit mode**\n3. If `eforge\u002Fconfig.yaml` exists in the project root, use **edit mode**\n4. Otherwise, use **init mode**\n\n## Init Mode\n\n### Step 1: Check Existence\n\nIf `eforge\u002Fconfig.yaml` already exists, ask the user whether they want to switch to edit mode or overwrite. Respect their choice.\n\n### Step 2: Require an active agent runtime profile\n\nThis skill does not create agent runtime profiles. Before gathering team-wide settings, confirm a profile is already active by calling `eforge_profile` with `{ action: \"show\" }`. Inspect the response:\n\n- If `active` is `null` (no profile is active for this project) or `resolved.harness` is missing, **stop**. Tell the user:\n  > `\u002Feforge:config` only manages team-wide settings. This project has no active agent runtime profile. Run `\u002Feforge:init` to set up eforge in a fresh project (creates a profile and `config.yaml`), or `\u002Feforge:profile-new` to add a profile to an existing setup. Come back to `\u002Feforge:config` once a profile is active.\n  Do not proceed with the interview and do not write `eforge\u002Fconfig.yaml`.\n- Otherwise note the resolved harness kind (`resolved.harness` is `claude-sdk` or `pi`) and, for Pi, the profile's provider. Use these when suggesting models later.\n\n### Step 3: Gather Context\n\nRead project context to understand the codebase:\n\n- **AGENTS.md \u002F CLAUDE.md** - Project overview, tech stack, build commands\n- **package.json** or equivalent - Dependencies, scripts\n- **Project structure** - Scan top-level directories\n\nShare a brief summary of what you found.\n\n### Step 4: Interview\n\nWalk the user through configuration sections, asking about each one. Only include sections where the user wants non-default behavior. **Do not** collect harness, provider, or Pi-specific tuning here - those belong in agent runtime profile files.\n\nAgent settings resolve through three layers of granularity: **global** (applies to every agent), **tier** (applies to a group of related agents — planning, implementation, review, evaluation), and **per-role** (applies to one named agent). The interview walks them in that order; skip layers you don't want to customize.\n\n**Sections to cover:**\n\n1. **Build settings** - `postMergeCommands` (validation commands to run after merging worktrees, e.g. `pnpm install`, `pnpm type-check`, `pnpm test`), `maxValidationRetries`, landing action: use `landing.action` (`pr` opens a PR from the artifact branch to the resolved base branch; direct non-stacked PRs fetch and rebase onto `origin\u002F\u003CbaseBranch>` before validation and check freshness again immediately before PR creation; `merge` auto-merges the artifact\u002Fworktree branch into the base branch, `leave` exits without merging or opening a PR; default is `merge`; `pr` requires `gh` CLI). `landing.pr.autoMerge` (`ask` (default) | `always` | `never`) — GitHub PR auto-merge policy when `landing.action: pr`: `ask` enables auto-merge only when a per-run `landingAutoMerge: true` override is sent; `always` enables auto-merge on every PR unless `landingAutoMerge: false` is sent per-run; `never` skips auto-merge. This is a post-PR-creation option and is distinct from `landing.action: merge`, which merges the artifact branch directly without opening a PR. `trunkBranch` (trunk branch name; detected from `origin\u002FHEAD` at init time; fallback `main`), `allowLocalMergeToTrunk` (default `false`; set to `true` only for solo\u002Funprotected projects to allow direct merge to trunk without a PR), `trunkSync` (pre-compile trunk freshness gate for queued root builds; `enabled` default `true`, `remote` default `origin`, `strategy: fetchedRemoteRef`, `onDiverged`: `warn` (default, emit diagnostic + fall back to local trunk) | `fail` (fail before compile) | `use-remote` (use fetched SHA with diagnostic); set `enabled: false` for offline\u002Flocal-only workflows)\n2. **Compile planning limits and direct PR base-sync budget** (opt-in - \"Would you like to tune decomposition budgets for unusually large compile inputs or the direct PR base-sync conflict-attempt budget? Most users keep defaults.\") - The `compile.planningUnit*` values only affect context-managed planning for overflow-risk compile inputs; ordinary direct planning does not use planning units. All `compile.planningUnit*` values are positive integers. `planningUnitParallelism` defaults to `2`; `planningUnitMaxObservedTurns` is optional and unset by default. The direct non-stacked PR base-sync budget is `landing.directPrBaseSync.conflictAttempts`; it defaults to `12`, is clamped to `1`-`100`, and is used as a fixed budget rather than scaling with branch size.\n3. **Global agent defaults** (opt-in - \"Would you like to customize thinking or effort settings? Most users keep defaults.\") - Global `agents.thinking` config (`adaptive`, `enabled` with optional `budgetTokens`, or `disabled`), `agents.effort` level (`low`\u002F`medium`\u002F`high`\u002F`xhigh`\u002F`max`). Resolution order (highest → lowest): plan override → per-role config → per-tier config (including built-in tier defaults) → global fallback. Harness and model selection live in the active profile's tier entries — do not configure them here. Whenever you need to suggest a specific model ID (for per-role `model` overrides), **call `eforge_models` first** with `{ action: \"list\", harness: \"\u003Cresolved-harness>\" }` (and `provider: \"\u003Cprofile-provider>\"` for Pi) and pick from the returned list (newest-first). Never propose a model ID from memory.\n4. **Tier tuning** (opt-in - \"Would you like to tune agents by group? eforge organises agents into four groups by what they do: **planning**, **implementation**, **review**, and **evaluation**. You can give each group its own effort level without touching individual roles.\") - Group membership: **planning** — `planner`, `formatter`, `merge-conflict-resolver`, `gap-closer`; **implementation** — `builder`, `review-fixer`, `validation-fixer`, `doc-author`, `doc-syncer`, `test-writer`, `tester`, `recovery-analyst`, `dependency-detector`, `prd-validator`, `staleness-assessor`; **review** — `reviewer`, `plan-reviewer`; **evaluation** — `evaluator`, `plan-evaluator`. Built-in defaults: `implementation` defaults to `effort=medium`; `planning`, `review`, and `evaluation` default to `effort=high`. Harness and model selection come from the active profile's tier entries. Available per-tier knobs in config.yaml: `effort`, `model`, `thinking`, `maxTurns`, `maxBudgetUsd`, `fallbackModel`, `allowedTools`, `disallowedTools`, and runtime-choice `choices`\u002F`routing`. Set them under `agents.tiers.\u003Ctier>`; the existing tier recipe is the implicit `default` choice, named choices inherit from it, and routing rules run after role-to-tier resolution.\n5. **Agent behavior** - Global `maxTurns`, `maxContinuations` (default 3 - max continuation attempts after maxTurns hit), `permissionMode` (`bypass` or `default`), `settingSources`, `bare` (default false)\n6. **Per-role overrides** (opt-in - \"Would you like to tune specific agent roles differently? Most users skip this.\") - Override settings per agent role. Available roles: planning (`planner`, `formatter`, `merge-conflict-resolver`, `gap-closer`), implementation (`builder`, `review-fixer`, `validation-fixer`, `doc-author`, `doc-syncer`, `test-writer`, `tester`, `recovery-analyst`, `dependency-detector`, `prd-validator`, `staleness-assessor`), review (`reviewer`, `plan-reviewer`), evaluation (`evaluator`, `plan-evaluator`). Per-role options: `model` (explicit model ref that overrides the profile tier's model for this role), `thinking`, `effort`, `maxBudgetUsd`, `fallbackModel`, `allowedTools`, `disallowedTools`, `maxTurns`, `promptAppend` (text appended to the agent's prompt - useful for project-specific rules like \"flag raw SQL queries\" for the reviewer). You can also set `roles.\u003Crole>.tier` to reassign a role to a different tier (rare, but supported when one role inside a group needs to behave like another group). Same model-list rule as above: call `eforge_models` with `harness:` before proposing any model ID.\n7. **Prompt customization** (opt-in - \"Would you like to customize agent prompts?\") - `agents.promptDir` points to a directory of `.md` files that shadow bundled prompts by name (e.g. `eforge\u002Fprompts\u002Freviewer.md` replaces the built-in reviewer prompt). Per-role `promptAppend` is safer - it appends instructions without replacing the full prompt.\n8. **Hooks** - Event-driven commands that run on specific eforge events (e.g. `session:start`, `phase:end`). Each hook has `event` (pattern), `command`, and optional `timeout`.\n9. **Langfuse tracing** - Whether to enable Langfuse integration (keys are typically set via env vars)\n10. **Plugin settings** - Enable\u002Fdisable plugin loading, include\u002Fexclude lists\n11. **PRD queue** - Queue directory (`dir`), `autoBuild` (default true - desired daemon auto-build state; scheduler pause is a separate runtime launch gate), `watchPollIntervalMs` (default 5000ms), and top-level `maxConcurrentBuilds` (default 2 - max concurrent PRD builds from the queue)\n12. **Recovery auto-resume** (opt-in - \"Would you like the daemon to auto-queue high-confidence compiled-artifact recovery attempts?\") - `recovery.autoResume.enabled` defaults to `false`, so failed builds keep manual recovery behavior and policy consumers stop before mutation. When enabled, only high-confidence `continue-repair` recommendations that pass compiled-resume artifact eligibility may auto-queue, bounded by `recovery.autoResume.maxAttempts` (default `1`; `0` is audit-only\u002Fnon-mutating).\n13. **Daemon** (opt-in - \"Would you like to customize daemon behavior?\") - `idleShutdownMs` (default 7200000 = 2 hours, set to 0 to run forever)\n14. **Stacking** (opt-in - \"Does this project use stacked PRs with git-spice?\") - `stacking.enabled` (default `false`; set to `true` to enable git-spice-backed stacking where artifact branch PRs normally target the parent artifact branch rather than the feature\u002Ftrunk branch; during landing, eforge can repair a missing integrated parent by choosing trunk as the effective base for an initially untracked child or by retargeting a child that is already tracked, then gates PR submission on provider sync\u002Frestack and a remote-base freshness proof), `stacking.gitSpice.command` (optional path to the `git-spice` binary when it is not on `$PATH`, e.g. `\u002Fusr\u002Flocal\u002Fbin\u002Fgit-spice`; set to `gs` only if you use the optional short alias). The `stacking.provider` is always `git-spice` and need not be set.\n\nFor each section, explain what it controls and suggest values based on the project context gathered in Step 3. Skip sections the user isn't interested in.\n\n### Step 5: Present Draft\n\nShow the user the complete `eforge\u002Fconfig.yaml` content before writing. Confirm it contains no harness-specific keys at the top level (harness configuration belongs only in agent runtime profile files under `eforge\u002Fprofiles\u002F`). Ask for any changes.\n\n### Step 6: Write\n\nSave to `eforge\u002Fconfig.yaml` in the project root.\n\n### Step 7: Validate\n\nCall the `eforge_config` tool with `{ action: \"validate\" }`.\n\nIf validation returns errors, show them to the user and offer to fix them.\n\n## Edit Mode\n\n### Step 1: Read Current Config\n\nRead the existing `eforge\u002Fconfig.yaml` file and summarize its current settings for the user.\n\n### Step 2: Identify Changes\n\nAsk the user what they want to change. If `$ARGUMENTS` contains additional context beyond `--edit`, use that to understand the desired changes. If the requested change is really about the harness (switching harness kind, provider, or the profile's own model\u002Ftuning), stop and redirect them to `\u002Feforge:profile` (switch active profile) or `\u002Feforge:profile-new` (create a new profile) - that configuration does not belong in `eforge\u002Fconfig.yaml`.\n\n### Step 3: Apply Changes\n\nModify the config based on the user's requests. Present the updated content before writing. If the change involves a model ID anywhere (per-role `model`), first resolve the active profile by calling `eforge_profile` with `{ action: \"show\" }`, then call `eforge_models` with `{ action: \"list\", harness: \"\u003Cresolved-harness>\" }` (and `provider` for Pi) to fetch the live list. Pick from that list; do not suggest model IDs from memory.\n\n### Step 4: Write\n\nSave the updated `eforge\u002Fconfig.yaml`.\n\n### Step 5: Validate\n\nCall the `eforge_config` tool with `{ action: \"validate\" }`.\n\nIf validation returns errors, show them to the user and offer to fix them.\n\n## Show Resolved Config\n\nAt any point, you can show the user the fully resolved configuration (all layers merged) by calling:\n\n`eforge_config` with `{ action: \"show\" }`\n\nThis returns the merged result of defaults + global config + project config + active profile. The `\u002Feforge:config` viewer also lists registered `tools.toolbelts` entries and available presets in a dedicated Toolbelts section. Use `\u002Feforge:profile-new` to configure toolbelt presets interactively.\n\n## Configuration Reference\n\nAvailable top-level sections in `eforge\u002Fconfig.yaml`. Note: harness-specific configuration belongs in agent runtime profile files under `eforge\u002Fprofiles\u002F` or `~\u002F.config\u002Feforge\u002Fprofiles\u002F`, not in `config.yaml`.\n\n```yaml\n# Queue concurrency\nmaxConcurrentBuilds: 2                 # Max concurrent PRD builds (default: 2)\n\n# Build settings\nbuild:\n  worktreeDir: \"..\u002Fmy-worktrees\"       # Custom worktree directory\n  postMergeCommands:                   # Commands to run after merge\n    - pnpm install\n    - pnpm type-check\n    - pnpm test\n  maxValidationRetries: 2              # Retry count for validation fixes\n  cleanupPlanFiles: true               # Remove plan files and temporary plan-ID markers after successful build\n  # trunkBranch: main                  # Trunk branch name (default: detected from origin\u002FHEAD, fallback: main)\n  # allowLocalMergeToTrunk: false      # Allow landing.action: merge to land directly on trunk without a PR\n                                       #   Default false; set to true only for solo\u002Funprotected projects\n  # trunkSync:                         # Pre-compile trunk freshness gate (queued root builds only)\n  #   enabled: true                    # Default true; set false for offline or local-only workflows\n  #   remote: origin                   # Remote to fetch trunk from (default: origin)\n  #   strategy: fetchedRemoteRef       # Only 'fetchedRemoteRef' is supported in v1\n  #   onDiverged: warn                 # warn (default) | fail | use-remote\n\n\n# Compile settings: planning-unit limits for overflow-risk context-managed planning.\ncompile:\n  planningUnitParallelism: 2            # Max planning units running at once\n  planningUnitMaxDepth: 3               # Max recursive planning-unit split depth\n  planningUnitMaxPromptSourceBytes: 40000\n  planningUnitMaxPromptBytes: 80000\n  planningUnitMaxObservedInputTokens: 120000\n  # planningUnitMaxObservedTurns: 20    # Optional; unset by default\n  planningUnitMaxCompactHandoffBytes: 12000\n  planningUnitMaxLocalExplorationToolUses: 24\n  planningUnitMaxCriteriaPerUnit: 20\n  planningUnitMaxSubsystemsPerUnit: 2\n  planningUnitMaxSplitAttemptsPerUnit: 2\n\n# Landing action\nlanding:\n  action: pr                           # pr | merge | leave (default: merge)\n                                       # pr: open a PR from the artifact branch targeting the resolved base branch (requires gh CLI)\n                                       #     Direct non-stacked PRs rebase onto origin\u002F\u003CbaseBranch> before validation\n                                       #     and check freshness again immediately before PR creation.\n                                       # merge: auto-merge the artifact branch into the base branch\n                                       # leave: commit to artifact branch and exit without merging or opening a PR\n  directPrBaseSync:\n    conflictAttempts: 12               # Direct non-stacked PR base-sync conflict attempts (clamped 1-100)\n  pr:\n    # autoMerge: ask                   # ask (default) | always | never\n                                       # Only applies when landing.action: pr\n                                       # ask: enable auto-merge only when landingAutoMerge is explicitly true per-run\n                                       # always: enable auto-merge on every PR unless landingAutoMerge is explicitly false per-run\n                                       # never: never enable auto-merge (emits skipped event)\n\n# Stacking (git-spice backed stacked PRs)\n# stacking:\n#   enabled: false                     # Default false. Set to true to enable git-spice stacking.\n#                                      # When enabled, artifact branch PRs normally target the parent artifact branch.\n#                                      # Landing can repair a missing integrated parent by choosing trunk as the effective base\n#                                      # for initially untracked children or retargeting a child that is already tracked,\n#                                      # then gates PR submission on provider sync\u002Frestack and a remote-base freshness proof.\n#                                      # Run 'git-spice repo init' in the repo before enabling.\n#   gitSpice:\n#     command: git-spice               # Default. Set to 'gs' only if you use the optional short alias.\n\n# Agent settings\nagents:\n  maxTurns: 50                         # Global fallback max agent turns\n  maxContinuations: 3                  # Max continuation attempts after maxTurns hit\n  permissionMode: bypass               # bypass or default\n  settingSources:                      # Which settings files agents load\n    - project\n  bare: false                          # Bare mode\n  # model:                             # Global model override for all roles\n  #   id: \u003Cmodel-id>                   # overrides the profile tier's model; call eforge_models first\n  # thinking:                          # Thinking config\n  #   type: adaptive                   # 'adaptive', 'enabled' (+ budgetTokens), or 'disabled'\n  # effort: xhigh                      # 'low', 'medium', 'high', 'xhigh', 'max'\n  # thinkingLevel: xhigh              # Pi only: 'off', 'low', 'medium', 'high', 'xhigh'\n  # --- Prompt customization ---\n  # promptDir: eforge\u002Fprompts           # Directory of .md files that shadow bundled prompts\n  # --- Per-tier overrides ---\n  # tiers:\n  #   planning:\n  #     effort: high           # default; lower this to save tokens on planning\n  #   implementation:\n  #     effort: medium         # default\n  #   review:\n  #     effort: high\n  #   evaluation:\n  #     effort: high\n  # --- Per-role overrides ---\n  # roles:\n  #   builder:\n  #     model:\n  #       id: \u003Cmodel-id>       # overrides the profile tier's model for this role\n  #     maxTurns: 50\n  #     maxBudgetUsd: 10.0\n  #   formatter:\n  #     effort: low\n  #   reviewer:\n  #     promptAppend: |                # Append project-specific rules to the prompt\n  #       ## Project Rules\n  #       - Flag raw SQL queries\n  #   tester:\n  #     tier: review           # Reassign role to a different tier\n\n# Plan output\nplan:\n  outputDir: eforge\u002Fplans              # Where plan artifacts are written\n\n# Langfuse tracing (keys usually via env vars)\nlangfuse:\n  enabled: false\n  host: https:\u002F\u002Fcloud.langfuse.com\n\n# Plugin loading\nplugins:\n  enabled: true\n  include: []                          # Only load these plugins\n  exclude: []                          # Skip these plugins\n  paths: []                            # Additional plugin paths\n\n# PRD queue\nprdQueue:\n  dir: eforge\u002Fqueue\n  autoBuild: true                      # Desired auto-build state; scheduler pause can gate launches\n  watchPollIntervalMs: 5000            # Poll interval for watch mode (ms)\n\n# Recovery auto-resume (disabled by default)\nrecovery:\n  autoResume:\n    enabled: false                     # Opt in to bounded daemon-owned continue-repair automation\n    maxAttempts: 1                     # Automatic attempts per failed PRD; 0 = audit-only\u002Fno mutation\n\n# Daemon\ndaemon:\n  idleShutdownMs: 7200000              # Idle timeout (2h). 0 = run forever.\n\n# Project MCP toolbelts (optional; define named bundles for profile toolbelt: fields)\ntools:\n  toolbelts:\n    browser-ui:                        # Named toolbelt bundle\n      description: Browser automation for UI implementation and review.\n      mcpServers:\n        - playwright                   # Must be present in .mcp.json\n    # docs-research, observability, database-readonly, etc. follow the same pattern\n\n# Event hooks\nhooks:\n  - event: \"session:start\"\n    command: \"echo 'Starting eforge session'\"\n    timeout: 5000\n```\n\n## Error Handling\n\n| Condition | Action |\n|-----------|--------|\n| No active agent runtime profile | Stop and direct the user to `\u002Feforge:init` or `\u002Feforge:profile-new` |\n| `eforge_config` validate returns errors | Show errors, offer to fix |\n| Validation error mentions a backend key is not valid here | Remove the key; harness-specific config lives in profile files, not `config.yaml` |\n| Validation error mentions an unrecognized top-level key | Remove the key (typo or stale feature reference) - the error includes the recognized-key list |\n| YAML syntax error in existing file | Report the error, offer to recreate |\n\n\u003C!-- parity-skip-start -->\n| Daemon 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\n## Related Skills\n\n| Skill | Command | When to suggest |\n|-------|---------|----------------|\n| Init | `eforge_init` | No eforge config found in the project, or no active agent runtime profile |\n| Profile | `eforge_profile` | User wants to list, inspect, or switch agent runtime profiles |\n| Profile (new) | `\u002Feforge:profile-new` | User wants to create a new agent runtime profile (project or user scope) |\n| Build | `eforge_build` | User wants to enqueue work for the daemon to build |\n| Extension contributions | `eforge_extension_contribution` | User wants to discover or invoke workflows provided by loaded extensions |\n| Status | `eforge_status` | User wants to check build progress or queue state |\n| Restart | `eforge_restart` | User wants to restart the eforge daemon |\n| Update | `eforge_update` | User wants to check for or install eforge updates |\n",{"name":5,"description":7,"disable-model-invocation":33},true,"main","499776fb979b8166258cdf9bb95b41de703de835","packages\u002Fpi-eforge\u002Fskills\u002Feforge-config",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":44,"prompt":54,"zipAvailable":33},[45,48,51],{"tool":46,"command":47},"npx","npx skills add eforge-build\u002Feforge --skill eforge-config",{"tool":49,"command":50},"bunx","bunx skills add eforge-build\u002Feforge --skill eforge-config",{"tool":52,"command":53},"pnpm","pnpm dlx skills add eforge-build\u002Feforge --skill eforge-config","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Feforge-build\u002Feforge\u002Fblob\u002Fmain\u002Fpackages\u002Fpi-eforge\u002Fskills\u002Feforge-config\u002FSKILL.md",[],[57,78,91,103,116,127],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":68,"publishedAt":28},"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",[63],{"categoryNo":64,"categoryName":65,"taxonomyType":66,"taxonomyTypeDesc":67},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[69,70,71,72,73,74,75,26,76,77],"eforge workflow","workflow","sync","preset","pr","SET","stack","landing","up",{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":28},"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",[],[85,86,87,88,89,90],"update","eforge update","cli","package","check","guide",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":28},"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",[],[98,99,27,100,101,102,22,89],"eforge status","status","state","queue","run",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":28},"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",[],[110,75,111,71,102,112,113,114,115],"eforge stack","report","git","conflicts","preview","dry",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":28},"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",[],[123,124,125,126],"restart","eforge restart","first","active",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":138,"publishedAt":28},"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",[133],{"categoryNo":134,"categoryName":135,"taxonomyType":136,"taxonomyTypeDesc":137},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[139,140,141,142,143,144],"eforge recover","recovery","continue","repair","verdict","prd"]