Fork Manager Skill
Manage forks where you contribute PRs but also use improvements before they're merged upstream. Includes support for local patches — fixes kept in the production branch even when the upstream PR was closed/rejected.
When to use
- - Sync a fork with upstream
- Check status of open PRs
- Rebase PR branches onto latest upstream
- Build a production branch combining all open PRs + local patches
- Review recently closed/rejected PRs and decide whether to keep locally
- Manage local patches (fixes not submitted or rejected upstream)
When NOT to use
- - General GitHub queries (issues, PRs, CI status on any repo) → use
github skill instead - Triaging/ranking/prioritizing issues → use
issue-prioritizer skill instead - Reviewing code changes before publishing a PR → use
pr-review skill instead - Creating new PRs from scratch (not fork sync) → use
gh pr create directly
Execution Model — Orchestrator + Worker
A skill NUNCA deve ser executada inline pelo agente principal. Sempre usar o padrão orchestrator/worker:
Fluxo
- 1. Orchestrator (agente principal) — prepara o contexto e spawna um subagente:
sessions_spawn(
task: "<prompt completo com contexto do repo, config, último history>",
model: "<model adequado>",
mode: "run"
)
- 2. Worker (subagente) — executa o full-sync/status/rebase/etc. Lê a SKILL.md, segue o fluxo, escreve history.
- Monitoramento — o orchestrator checa progresso a cada 4 minutos via
sessions_list / sessions_history:
- Se o worker estiver ativo e progredindo → aguarda
- Se o worker estiver parado/travado (sem output novo por 2 checks consecutivos) →
subagents kill + spawna novo worker
- Se o worker completou → lê o resultado e reporta ao usuário
- 4. Fallback — se o worker falhar (crash, timeout, erro):
- Orchestrator verifica o estado do repo (
git status, último checkpoint)
- Spawna novo worker com contexto atualizado incluindo o ponto onde parou
- Máximo de
2 retries antes de reportar falha ao usuário
Contexto para o Worker
O orchestrator deve incluir no prompt do worker:
- - Path da SKILL.md (para o worker ler e seguir)
- Config do repo (inline ou path)
- Última entrada do history (resumo ou path)
- Modo de execução (full-sync, status, rebase-all, etc.)
- Se é cron mode ou manual
- Quaisquer instruções específicas do usuário
Por que subagente?
- - Resiliência: se o worker falha, o orchestrator pode recuperar
- Context window: a skill é pesada (145+ PRs = muito output). O worker gasta seu context sem poluir o agente principal
- Paralelismo futuro: permite spawnar workers para repos diferentes simultaneamente
Cron Mode
When invoked by a cron job (automated recurring sync), follow these guidelines for efficient execution:
- 1. Skip interactive prompts — auto-resolve decisions that don't require human input:
- Rebases: attempt automatically, report failures
- Closed PRs: report but defer decision (don't drop or keep without human input)
- Audit findings: report but don't act
- 2. Compact output — use the summary format, not full verbose report:
🍴 Fork Sync Complete — <repo>
Main: synced N commits (old_sha → new_sha)
PRs: X open, Y changed state
- Rebased: A/B clean (C conflicts)
Production: rebuilt clean | N conflicts
Notable upstream: [1-3 bullet highlights]
- 3. Checkpoint on failure — if a rebase fails or production build has conflicts, write state to
repos/<name>/checkpoint.json so the next run (or manual invocation) can resume - Time budget — target <10 minutes total. If rebasing 20+ PRs, batch push at the end instead of per-branch
Configuration
Configs are organized per repository in repos/<repo-name>/config.json relative to the skill directory:
CODEBLOCK2
Formato do config.json:
CODEBLOCK3
Resolução automática de conflitos (autoResolveConflicts)
A resolução automática pode ser ativada de duas formas (qualquer uma basta):
- 1. Flag de invocação (ad-hoc, por execução):
/fork-manager --auto-resolve
/fork-manager full-sync --auto-resolve
- 2. Config persistente (sempre ativo pra aquele repo):
{ "autoResolveConflicts": true }
| Fonte | Comportamento |
|---|
| Nenhuma (default) | Conflitos são reportados mas não resolvidos. Relatório inclui "⚠️ Conflitos requerem aval do desenvolvedor." |
| INLINECODE12 OU INLINECODE13 |
Spawna subagentes Opus para resolver conflitos. Resultados classificados como trivial/semântico/irresolvível. |
Precedência: --auto-resolve na invocação ativa a resolução mesmo se o config diz false. Não existe --no-auto-resolve — se o config diz true e o usuário não quer resolver, basta não rodar o passo manualmente.
Para usuários do ClawHub: basta passar --auto-resolve no comando. Nenhuma configuração de repo necessária.
Campos de localPatches
Cada entry em localPatches é uma branch local mantida na production branch mas sem PR aberto no upstream.
| Campo | Descrição |
|---|
| INLINECODE21 | O que o patch faz |
| INLINECODE22 |
Número do PR original que foi fechado (opcional se criado direto como patch) |
|
closedReason | Por que o PR foi fechado:
rejected (mantenedor recusou),
superseded (outro PR resolve parcialmente mas não totalmente),
duplicate (fechamos nós mesmos),
wontfix (upstream não vai resolver) |
|
keepReason | Por que precisamos manter localmente |
|
addedAt | Data em que foi convertido para local patch |
|
reviewDate | Data para reavaliar se ainda é necessário (upstream pode ter resolvido) |
Histórico de Execuções
Cada repositório gerenciado tem um arquivo history.md que registra todas as execuções da skill como um livro de registro append-only:
CODEBLOCK6
Regra: Ler último output antes de começar
Antes de qualquer operação, ler o history.md do repositório alvo e extrair a última entrada (último bloco ---). Isso dá contexto sobre:
- - O que foi feito na última execução
- Quais PRs tinham problemas
- Quais decisões foram tomadas
- Se ficou alguma ação pendente
CODEBLOCK7
Se o arquivo não existir, criar com o header e prosseguir normalmente.
Regra: Registrar output ao finalizar
Ao final de toda execução, fazer append ao history.md com o resultado completo. Formato:
CODEBLOCK8
Importante: O bloco Full Report contém o relatório completo sem abreviação. Isso garante que o próximo agente que ler o history tenha toda a informação, não apenas o resumo.
Fluxo de Análise
1. Carregar config e histórico
Resolve the skill directory (where SKILL.md lives):
CODEBLOCK9
2. Navegar para o repositório
CODEBLOCK10
3. Fetch de ambos remotes
CODEBLOCK11
4. Analisar estado do main
CODEBLOCK12
5. Verificar PRs abertos via GitHub CLI
CODEBLOCK13
6. Classificar cada PR
Para cada PR no config, verificar:
| Estado | Condição | Ação |
|---|
| open | PR aberto no GitHub | Manter, verificar se precisa rebase |
| merged |
PR foi mergeado | Remover do config, deletar branch local |
|
closed | PR fechado sem merge |
Acionar review-closed (ver abaixo) |
|
conflict | Branch tem conflitos com upstream | Precisa rebase manual |
|
outdated | Branch está atrás do upstream | Precisa rebase |
Comando para verificar se branch precisa rebase:
CODEBLOCK14
7. Revisar PRs recém-fechados (review-closed)
Quando um PR é detectado como fechado sem merge, NÃO remover automaticamente. Iniciar um fluxo de revisão interativo:
7.1. Coletar contexto do fechamento
CODEBLOCK15
7.2. Classificar o motivo do fechamento
| Categoria | Descrição | Ação padrão |
|---|
| resolvedupstream | Upstream corrigiu o problema por outro caminho | INLINECODE38 — não precisamos mais |
| supersededby_ours |
Fechamos nós mesmos em favor de outro PR nosso |
drop — o substituto já está em
openPRs |
|
rejected_approach | Mantenedor não gostou da abordagem, mas o bug/feature existe |
review — considerar resubmeter com abordagem diferente |
|
rejected_need | Mantenedor não concorda que é um problema |
review — avaliar se precisamos localmente |
|
wontfix | Upstream marcou como wontfix |
review — provável candidato a local patch |
7.3. Apresentar ao usuário para decisão
Para cada PR fechado, apresentar:
CODEBLOCK16
7.4. Executar a decisão
Drop:
CODEBLOCK17
Keep as local patch:
CODEBLOCK18
Resubmit:
CODEBLOCK19
Defer:
CODEBLOCK20
8. Auditar PRs abertos (audit-open)
Análise proativa dos PRs ainda abertos para detectar redundâncias e obsolescência. Deve rodar no full-sync depois do update-config.
8.1. Resolved upstream
Verificar se o upstream já resolveu o problema que nosso PR corrige, sem mergear nosso PR:
CODEBLOCK21
Se o diff do PR estiver vazio (upstream absorveu as mudanças): marcar como resolved_upstream.
Se o diff for parcial (upstream resolveu parte): marcar como partially_resolved para revisão.
8.2. Duplicate externo
Verificar se outra pessoa abriu um PR que resolve o mesmo problema:
CODEBLOCK22
Para cada PR encontrado que toca os mesmos arquivos, comparar:
- - Mesmo issue referenciado?
- Mesma área de código?
- Mesmo tipo de fix?
Se houver match forte: marcar como duplicate_external ou superseded_external.
8.3. Self-duplicate
Detectar sobreposição entre nossos próprios PRs abertos:
CODEBLOCK23
Para cada par com overlap de arquivos:
- - Verificar se o diff é similar ou complementar
- Se similar: recomendar fechar o mais antigo/menos limpo
- Se complementar: ok, apenas nota informativa
8.4. Apresentar resultados
CODEBLOCK24
Comandos do Agente
status - Verificar estado atual
- 1. Carregar config
- Fetch remotes
- Contar commits atrás do upstream
- Listar PRs e seus estados
- Reportar ao usuário
sync - Sincronizar main com upstream
CODEBLOCK25
rebase <branch> - Rebase de uma branch específica
CODEBLOCK26
rebase-all - Rebase de todas as branches de PR
Para cada branch em prBranches:
- 1. Checkout da branch
- Rebase no upstream/main
- Push com --force-with-lease
- Reportar sucesso/falha
resolve-conflicts - Resolução automática de conflitos via subagentes
Requer --auto-resolve na invocação OU autoResolveConflicts: true no config do repo. Se nenhum dos dois, este comando não é executado e conflitos são apenas reportados com a nota "⚠️ Conflitos requerem aval do desenvolvedor."
Após rebase-all detectar conflitos, o orchestrator (agente principal) spawna subagentes individuais para tentar resolver cada conflito automaticamente.
Fluxo
- 1. O worker do
rebase-all retorna a lista de branches com conflito - O orchestrator agrupa os conflitos e spawna até 5 subagentes simultâneos (model: Opus)
- Conforme subagentes terminam, novos são lançados até esgotar a fila
- Cada subagente tem timeout de 10 minutos
- Resultados são coletados e integrados no relatório final
Prompt do subagente resolver
Cada subagente recebe:
CODEBLOCK27
Classificação do resultado
| Resultado | Significado | Ação |
|---|
| INLINECODE61 | Conflito mecânico resolvido (imports, formatting, deleted files) | ✅ Push feito, sem necessidade de revisão |
| INLINECODE62 |
Conflito envolvendo lógica de negócio resolvido | ⚠️ Push feito,
marcar no report para revisão humana |
|
UNRESOLVABLE | Subagente não conseguiu resolver sem risco | ❌ Não faz push, escala no report |
Após resolução
Para branches resolvidas com sucesso:
- 1. Verificar que o push foi feito (
git log --oneline <originRemote>/<branch> -1) - Tentar rebase novamente para confirmar que está clean
- Atualizar
notes.conflictBranches no config: remover entries resolvidas
Para branches não resolvidas:
- 1. Manter em
notes.conflictBranches com ciclo incrementado - Incluir no relatório com o motivo do subagente
Integração com build-production
Após resolve-conflicts, o build-production roda normalmente. Branches que foram resolvidas no rebase agora devem mergear clean na production. Se ainda houver conflito de production merge (diferente do conflito de rebase), o build-production trata como sempre: abort e reportar.
update-config - Atualizar config com PRs atuais
CODEBLOCK28
Detecção de PRs reabertos
Ao comparar a lista do GitHub (gh pr list --state open) com o config local, detectar três cenários:
| Cenário | Condição | Ação |
|---|
| PR novo | No GitHub mas não em openPRs, localPatches, nem INLINECODE74 | Adicionar a openPRs + prBranches normalmente |
| PR reaberto (dropped) |
No GitHub como open, encontrado em
notes.closedWithoutMerge ou
notes.droppedPatches |
Restaurar: mover de volta para
openPRs +
prBranches, remover da seção
notes. Fetch da branch:
git fetch <originRemote> <branch>. Logar no relatório como "🔄 Reopened" |
|
PR reaberto (local patch) | No GitHub como open, encontrado em
localPatches (via campo
originalPR) |
Promover: mover de
localPatches para
openPRs +
prBranches. Logar no relatório como "🔄 Reopened (was local patch)" |
Implementação:
CODEBLOCK29
Nota: A restauração é automática (sem interação) porque o mantenedor reabrir um PR é sinal claro de que ele deve voltar ao tracking. O relatório sempre lista os PRs restaurados para visibilidade.
build-production - Criar branch de produção com todos os PRs + local patches
CODEBLOCK30
After rebuilding the production branch, remind the user to run their project's build command if needed.
Ordem de merge: PRs abertos primeiro (ordem crescente por número), local patches depois. Isso garante que patches locais se aplicam sobre a base mais completa possível.
audit-open - Auditar PRs abertos por redundância/obsolescência
Análise proativa de todos os PRs abertos (seção 8 acima):
- 1. Para cada PR aberto, coletar arquivos tocados
- Resolved upstream: verificar se upstream alterou os mesmos arquivos desde último sync; se diff do PR ficou vazio, flaggar
- Duplicate externo: buscar PRs upstream (open + recently merged) que tocam mesmos arquivos
- Self-duplicate: cruzar arquivos entre nossos próprios PRs abertos
- Apresentar findings ao usuário com opções: close / keep / merge-into / defer
- Executar decisões
- Atualizar config
review-closed - Revisar PRs recém-fechados
Detecta PRs que foram fechados/mergeados desde o último sync e guia o usuário na decisão:
- 1. Buscar todos os PRs do config no GitHub
- Identificar os que mudaram de estado (merged ou closed)
- Para merged: mover para
notes.mergedUpstream, deletar branches - Para closed sem merge: iniciar fluxo de revisão interativo (seção 7 acima)
- Para cada closed, apresentar contexto e opções ao usuário
- Executar decisão: drop / keep as local patch / resubmit / defer
- Atualizar config
review-patches - Reavaliar patches locais existentes
Para cada entry em localPatches cuja reviewDate já passou:
- 1. Verificar se upstream resolveu o problema desde a última revisão
- Verificar se o patch ainda aplica limpo (sem conflitos)
- Apresentar ao usuário com opções: manter / drop / resubmit / estender reviewDate
- Atualizar config
full-sync - Sincronização completa
- 1. Stash -
git stash --include-untracked se houver arquivos não-commitados - INLINECODE97 - Atualizar main
-
Before sync: record
OLD_SHA=$(git rev-parse upstream/main)
-
After sync: record
NEW_SHA=$(git rev-parse upstream/main)
- 3.
post-sync hooks (optional, repo-specific) - Run custom post-sync actions
- Skip if
OLD_SHA == NEW_SHA (no upstream changes)
- Hooks are defined per-repo in
config.json under
"postSyncHooks" (array of shell commands or descriptions)
- Example: detect CHANGELOG changes, update downstream skills, trigger CI
- If no hooks configured: skip this step entirely
- 4.
update-config - Atualizar lista de PRs review-closed - Revisar PRs recém-fechados/mergeados (interativo)audit-open - Auditar PRs abertos por redundância/obsolescência (interativo)review-patches - Reavaliar local patches com reviewDate vencida (interativo)- INLINECODE108 - Rebase de todas as branches (PRs + local patches)
resolve-conflicts (only if --auto-resolve flag OR autoResolveConflicts: true in config) - Resolver conflitos de rebase automaticamente via subagentes (Opus, até 5 paralelos, 10min timeout cada). Se nenhum dos dois, pular este passo.- INLINECODE112 - Recriar branch de produção (PRs + local patches)
- Pop stash -
git stash pop para restaurar arquivos locais - Remind user to run their project's build command if needed
Nota sobre ordem: update-config roda antes de review-closed porque é ali que PRs reabertos são detectados e restaurados automaticamente. Depois, review-closed processa PRs que foram genuinamente fechados. Por fim, audit-open roda por último, já com a lista de PRs abertos atualizada (incluindo os reabertos).
Relatório para o Usuário
Após qualquer operação, gerar relatório:
CODEBLOCK31
Notas Importantes
- - Sempre usar
--force-with-lease em vez de --force para push - Sempre fazer backup antes de operações destrutivas
- Use the project's package manager for build commands (bun/npm/yarn/pnpm)
- Manter o config atualizado após cada operação
- Resolução automática de conflitos (requer
--auto-resolve ou autoResolveConflicts: true): Quando ativa, após rebase-all a skill spawna subagentes (Opus, até 5 paralelos, 10min timeout cada) para tentar resolver conflitos. Conflitos triviais (imports, formatting, arquivos deletados) são resolvidos e pushed sem necessidade de revisão. Conflitos semânticos (lógica de negócio) são resolvidos e pushed mas marcados no relatório como ⚠️ para revisão humana. Se o subagente não conseguir resolver, marca como ❌ e não faz push. Quando desativada, conflitos são apenas reportados. - Conflitos persistentes (3+ ciclos): Quando um conflito persiste por 3+ execuções consecutivas (tracked pelo sufixo "Nth cycle" em
notes.conflictBranches), escalar no relatório com seção dedicada "🔴 Conflitos persistentes" e recomendar ação: dropar o PR, recriar a branch, ou resolver manualmente. O ciclo é incrementado a cada execução onde o conflito reaparece, mesmo que a resolução automática tenha sido tentada e falhado. - Local patches são cidadãos de primeira classe: rebase, build e relatório incluem tanto PRs abertos quanto local patches
- Nunca remover automaticamente um PR fechado sem merge. Sempre passar pelo fluxo
review-closed para decisão do usuário - Review dates em local patches: ao criar um local patch, definir uma data de revisão (default: 30 dias). No
full-sync, patches com review vencida são apresentados ao usuário para reavaliação - Naming convention para local patches: prefixo
local/ para distinguir de branches de PR (ex: local/my-custom-fix). A branch original pode ser renomeada ou mantida — o importante é que o config rastreie a branch correta
⚠️ Proteger arquivos não-commitados antes de operações destrutivas
Antes de qualquer operação que troca de branch ou deleta/recria branches (especialmente build-production e full-sync), sempre verificar e preservar arquivos unstaged, untracked e staged:
CODEBLOCK32
Por quê? Ao deletar e recriar a branch de produção (git branch -D <productionBranch>), arquivos que existiam apenas no working directory (não commitados) são perdidos permanentemente. Isso inclui:
- - Arquivos gerados (dashboards, history, state)
- Arquivos de configuração local (serve.ts, .env)
- Dados acumulados (JSON, SQLite)
Regra: Se git status --porcelain retornar qualquer saída, fazer git stash --include-untracked antes de prosseguir. Restaurar com git stash pop ao final.
Security Notice
This skill performs operations that require broad filesystem and network access by design:
- - Git operations: fetch, checkout, merge, rebase, push across multiple remotes and branches
- GitHub CLI: reads PR status, creates PRs, queries repo metadata
Before using this skill on a repository:
- - All git push operations use
--force-with-lease (not --force) to prevent data loss - The skill always stashes uncommitted files before destructive branch operations
These capabilities are inherent to fork management and cannot be removed without breaking core functionality.
Usage Examples
Basic sync
User: "sync my fork of project-x"
Agent:
- 1. Load config from INLINECODE136
- Run
status to assess current state - If main is behind, run INLINECODE138
- If PRs need rebase, run INLINECODE139
- Update
productionBranch if needed - Remind user to rebuild if needed
- Report results to user
Sync with auto-resolve
User: "/fork-manager --auto-resolve" or "/fork-manager full-sync --auto-resolve"
Agent:
- 1. Same as basic sync, but after
rebase-all: - For each conflict, spawn a resolver subagent (Opus)
- Collect results (trivial ✅ / semantic ⚠️ / unresolvable ❌)
- Re-run
build-production with resolved branches - Report includes resolution table with review flags
Fork Manager Skill
管理你贡献了PR但同时也希望在合并到上游之前使用改进的分支。包括对本地补丁的支持——即使上游PR被关闭/拒绝,修复也会保留在生产分支中。
何时使用
- - 将分支与上游同步
- 检查开放PR的状态
- 将PR分支重新基于最新的上游
- 构建包含所有开放PR + 本地补丁的生产分支
- 审查最近关闭/拒绝的PR并决定是否在本地保留
- 管理本地补丁(未提交或被上游拒绝的修复)
何时不使用
- - 通用GitHub查询(问题、PR、任何仓库的CI状态)→ 改用 github 技能
- 分类/排序/优先级排序问题 → 改用 issue-prioritizer 技能
- 在发布PR前审查代码变更 → 改用 pr-review 技能
- 从头创建新PR(非分支同步)→ 直接使用 gh pr create
执行模型 — 编排器 + 工作器
技能绝不应由主代理内联执行。 始终使用编排器/工作器模式:
流程
- 1. 编排器(主代理) — 准备上下文并生成子代理:
sessions_spawn(
task: <包含仓库上下文、配置、最新历史记录的完整提示>,
model: <合适的模型>,
mode: run
)
- 2. 工作器(子代理) — 执行完整同步/状态/重新基等操作。读取SKILL.md,遵循流程,写入历史记录。
- 监控 — 编排器每4分钟通过 sessionslist / sessionshistory 检查进度:
- 如果工作器活跃且正在推进 → 等待
- 如果工作器停止/卡住(连续2次检查无新输出)→ subagents kill + 生成新工作器
- 如果工作器完成 → 读取结果并向用户报告
- 4. 回退 — 如果工作器失败(崩溃、超时、错误):
- 编排器检查仓库状态(git status,最新检查点)
- 使用包含停止点的更新上下文生成新工作器
- 最多
重试2次,然后向用户报告失败
工作器的上下文
编排器应在工作器的提示中包含:
- - SKILL.md的路径(供工作器读取和遵循)
- 仓库配置(内联或路径)
- 历史记录的最新条目(摘要或路径)
- 执行模式(完整同步、状态、全部重新基等)
- 是定时模式还是手动模式
- 用户的任何特定指令
为什么使用子代理?
- - 弹性: 如果工作器失败,编排器可以恢复
- 上下文窗口: 技能很重(145+个PR = 大量输出)。工作器消耗其上下文而不污染主代理
- 未来并行性: 允许同时为不同仓库生成工作器
定时模式
当由定时任务(自动定期同步)调用时,遵循以下指南以实现高效执行:
- 1. 跳过交互式提示 — 自动解决不需要人工输入的决策:
- 重新基:自动尝试,报告失败
- 关闭的PR:报告但推迟决策(不删除也不保留,等待人工输入)
- 审计结果:报告但不采取行动
- 2. 紧凑输出 — 使用摘要格式,而非完整详细报告:
🍴 分支同步完成 — <仓库>
主分支:同步了N个提交 (旧SHA → 新SHA)
PR:X个开放,Y个状态变更
- 已重新基:A/B干净(C个冲突)
生产分支:已重建干净 | N个冲突
值得注意的上游:[1-3条要点]
- 3. 失败时检查点 — 如果重新基失败或生产构建有冲突,将状态写入 repos/<名称>/checkpoint.json,以便下次运行(或手动调用)可以恢复
- 时间预算 — 目标总计<10分钟。如果重新基20+个PR,在最后批量推送而非逐个分支推送
配置
配置按仓库组织在 repos/<仓库名称>/config.json 中,相对于技能目录:
fork-manager/
├── SKILL.md
└── repos/
├── project-a/
│ └── config.json
└── project-b/
└── config.json
config.json 格式:
json
{
repo: owner/repo,
fork: your-user/repo,
localPath: /path/to/local/clone,
mainBranch: main,
productionBranch: main-with-all-prs,
upstreamRemote: upstream,
forkRemote: origin,
autoResolveConflicts: false,
openPRs: [123, 456],
prBranches: {
123: fix/issue-123,
456: feat/feature-456
},
localPatches: {
local/my-custom-fix: {
description: 补丁功能的简要描述,
originalPR: 789,
closedReason: rejected|superseded|duplicate|wontfix,
keepReason: 我们在本地保留的原因,
addedAt: 2026-02-07T00:00:00Z,
reviewDate: 2026-03-07T00:00:00Z
}
},
lastSync: 2026-01-28T12:00:00Z,
notes: {
mergedUpstream: {},
closedWithoutMerge: {},
droppedPatches: {}
}
}
自动冲突解决(autoResolveConflicts)
自动解决可以通过两种方式激活(任一即可):
- 1. 调用标志(临时,按执行):
/fork-manager --auto-resolve
/fork-manager full-sync --auto-resolve
- 2. 持久配置(对该仓库始终激活):
json
{ autoResolveConflicts: true }
| 来源 | 行为 |
|---|
| 无(默认) | 冲突被报告但不解决。报告包含⚠️ 冲突需要开发者批准。 |
| --auto-resolve 或 config.autoResolveConflicts: true |
生成Opus子代理来解决冲突。结果分类为:琐碎/语义/不可解决。 |
优先级: 调用中的 --auto-resolve 即使配置为 false 也会激活解决。不存在 --no-auto-resolve — 如果配置为 true 而用户不想解决,只需不手动运行该步骤。
对于ClawHub用户: 只需在命令中传递 --auto-resolve。无需仓库配置。
localPatches 字段
localPatches 中的每个条目是一个本地分支,保留在生产分支中但没有向上游开放PR。
| 字段 | 描述 |
|---|
| description | 补丁的功能 |
| originalPR |
被关闭的原始PR编号(如果直接作为补丁创建则为可选) |
| closedReason | PR被关闭的原因:rejected(维护者拒绝)、superseded(其他PR部分解决但不完全)、duplicate(我们自己关闭)、wontfix(上游不会解决) |
| keepReason | 我们需要在本地保留的原因 |
| addedAt | 转换为本地补丁的日期 |
| reviewDate | 重新评估是否仍然需要的日期(上游可能已解决) |
执行历史记录
每个管理的仓库都有一个 history.md 文件,记录技能的所有执行,作为仅追加的日志:
fork-manager/
└── repos/
├── project-a/
│ ├── config.json
│ └── history.md
└── project-b/
├── config.json
└── history.md
规则:开始前读取最新输出
在任何操作之前,读取目标仓库的 history.md 并提取最新条目(最后一个 --- 块)。这提供了关于以下内容的上下文:
- - 上次执行做了什么
- 哪些PR有问题
- 做出了哪些决策
- 是否有待处理的操作
bash
读取历史记录的最新条目(最后一个---之后的所有内容)
tail -n +$(grep -n ^---$ $SKILL
DIR/repos/<仓库名称>/history.md | tail -1 | cut -d: -f1) $SKILLDIR/repos/<仓库名称>/history.md
如果文件不存在,创建带有标题的文件并正常继续。
规则:完成时记录输出
每次执行结束时,将完整结果追加到 history.md。格式:
markdown
Y